機器學習基礎概論

本文將是一篇長文,是關於機器學習相關內容的一個總體敘述,會總結之前三個例子中的一些關鍵問題,讀完此文將對機器學習有一個更加深刻和全面的認識,那麼讓我們開始吧。

我們前面三篇文章分別介紹了 二分類問題多分類問題標量回歸問題,這三類問題都是要將輸入數據與目標結果之間建立聯繫。同時,這三類問題都屬於監督學習的範疇,監督學習是機器學習的一個分支,還包括三個其他的主要分支:無監督學習、自監督學習 和 強化學習。

監督學習

這是目前最常見的機器學習類型,除了上面提到的分類和迴歸問題,還包括一些其他的類別,包括如下幾點:

  1. 語法樹預測:對於句子分析其生成的語法樹;

  2. 目標檢測:在圖片中對目標對象畫一個邊界框;

  3. 序列生成:給定一張圖片,預測描述圖片的文字;

  4. 圖像分割:給定一張圖片,在特定目標上找到一個遮罩。

無監督學習

無監督學習通常包括降維和聚類兩種方式,目的是對一些初始數據進行無目的的處理或訓練,將數據進行可視化、壓縮或去噪等,以便更好的理解數據的內在聯繫等,往往是監督學習的前置步驟。

自監督學習

這是一種特殊的監督學習方法,監督學習的標籤是人工手動標註,自監督學習的標籤是由輸入數據經由 啓發式算法 自動生成的。比如 Google 郵件中的的自動聯想,輸入前一個單詞自動預測後一個單詞,給出視頻過去的幀,去預測後一幀等,都是沒有標註經過大量數據學習出來的。

強化學習

強化學習現階段幾乎都用在了遊戲方面,比如下圍棋,一個智能系統通過反饋,會學習使其某種獎勵最大化的方法,如圍棋中圍出面積最大的區域等。

接下來,我們思考一下究竟我們把一個網絡訓練成什麼樣算是一個好的網絡呢?用專業點的術語就是說如何評估機器學習的模型。查看我們之前的示例,都是最後用一個測試集去測試一次,看最終的效果怎麼樣來評估網絡的好壞,這是沒有問題的,我們同意這一點,但問題是我們爲什麼在訓練的過程中,把數據分爲了訓練集和驗證集,用驗證集去提供反饋調整網絡的參數,而不是說用訓練集去訓練網絡,然後用測試集去驗證,這就不需要驗證集了。

原因是假如我們把數據分爲了訓練集和測試集,沒有驗證集,我們用訓練數據訓練網絡,測試集提供反饋,這就會把測試集的信息泄露給訓練網絡,雖然沒有用測試集去訓練網絡,網絡沒有直接從測試集獲取信息,但是泄露了數據的特徵,就會導致網絡會向測試集的數據去傾斜,最終會導致過擬合,因此如果判斷網絡的好壞,必須要用從來沒有給網絡提供任何信息的數據進行一次測試,這樣的結論纔是可靠的。

現在,我們都同意了整體數據集一定要分爲 訓練集,驗證集 和 測試集 三個部分,但這三個部分集合的數據怎樣去劃分呢?測試集是單獨的一部分數據,這一部分是獨立的,這是我們上面論證的觀點。那整體數據除去了測試集,剩下的數據我們如何去劃分訓練集和驗證集呢?如果數據量較大,我們可以簡單的把數據分爲兩部分,較大的一份訓練數據和較小的一份驗證數據,因爲數據量足夠大,因此各種特徵信息均勻分佈,這樣就可以滿足條件了。

那數據量較小呢?由於數據量較小,訓練集上不管如何劃分,都會導致數據的特徵劃分不均勻,自然也會導致訓練出的網絡有較大的偏差,由於這個原因,我們就需要用到前面文章提到的 K 折驗證的方法。

image

在這一種方法中,我們將這部分數據,分成了 K 份,每次把 K 份中的一份當做驗證集,其餘的 K-1 份數據當做訓練集,進行 K 次訓練,然後計算平均值,這種方法會儘可能彌補數據量不足的缺陷,當然代價就是會進行更多次的訓練,更多的運算,更長的時間。如果這樣數據量或精度仍然不能滿足要求,我們甚至會進行打亂的數據多次 K 折訓練:將數據隨機重新排序--K 折訓練--再次打亂數據--再次 K 折計算,代價也更大,這就需要根據實際情況進行選擇了。

我們需要注意,對於數據集,我們要注意三個問題:第一,數據要有代表性要隨機,測試集包含的數據特徵在訓練集中應該包含,不能是兩位數的手寫數字測試集和一位數的手寫數字訓練集,這沒有辦法得到正確的結論;第二,如果數據集是有序的,如股票的價格走勢,就不能隨意將數據打亂去進行訓練;第三,如果訓練集和驗證集如果有交集,會導致訓練出的網絡不準確,需要注意。

數據的預處理

在將數據輸入網絡進行訓練前,數據的預處理是另外一個需要解決的問題。這裏有三種方法進行數據的預處理。如下分別進行說明:

向量化

由於訓練網絡只能處理浮點數的張量,因此對於類似於文本類的數據,都需要通過 one-hot 編碼將其轉化爲張量。

值標準化

如果數據的各維度數據取值範圍相差較大,需要將其進行值標準化,避免導致網絡無法收斂或偏差較大等問題。

處理缺失值

網絡無法判斷 0 或者是某項數據缺失,因此如果數據缺失時,需要進行處理。

過擬合與欠擬合

我們多次提到過過擬合了,欠擬合很好理解,訓練的不夠沒有找到合適的模型去解決問題,解決辦法就是優化算法,進行更多次的訓練就好了。而對於過擬合,有幾種常見的解決辦法:

減小網絡的大小

這跟我們的直覺不相符合,減小網絡的大小會有更好的訓練結果嗎?我們這麼思考這個問題,在手寫數字識別的問題中,訓練集有五萬個訓練數據,我們可以構建一個五萬維的網絡,每一張訓練集的數據,都剛好通過網絡中某一個節點,我們可以讓這五萬個數據損失降爲 0,百分百的判斷出這張圖片上的數字是幾,但是很顯然,我們的測試集放到這個網絡中,得到正確答案的感覺就是隨機的,相當於通過一個完全沒有訓練的網絡,這當然不是我們想要的,因此我們需要減小網絡的維度,減小到 1000 或 100,這樣的網絡訓練出來的結果纔可能在測試集上得到更好的準確率。網絡進行數據的擬合很容易,難的是找到好的 泛化 模型,這也是網絡訓練的核心。我們可以再開始的時候用較小的網絡進行訓練,然後逐漸增加層的大小或增加新層。(當然也可以開始用一個較大的網絡逐步減小網絡,都是一樣的,但前一種更好)

添加權重正則化

如果兩個網絡都可以解釋一個數據集的數據,那麼較小的那個網絡更不容易過擬合。就像日心說就避免了金星那些逆行、本輪和均輪的各種問題,簡單的可能是更好的。如下的 kernel_regularizer 就是在訓練的時候擴大了損失,使其減小了損失導致的過擬合。

model.add(layers.Dense(16, kernel_regularizer=regularizers.l2(0.001), activation='relu', input_shape=(10000,)))

添加 dropout 正則化

對於這個方法,我一直覺得很有趣,這個方法的邏輯是引入噪聲。具體做法就是在使用 dropout 的訓練網絡的層中,使其輸出值按照一定概率進行捨棄或者說是設置爲 0,這就是人爲的引入一些錯誤,是不是很奇怪,但是確實有用,因爲這會在各層之間數據傳遞避免了一些不突出的關聯模式。換句話說,數據間有的數據關聯性很強,而另外一些不強,這種人爲引入的噪聲會抹平一些沒有那麼強的關聯,避免過擬合。

終於到這裏了!

我們前面介紹總結了太多機器學習的概念或者是回答了一些問題,現在我們就可以結合之前的例子,總結梳理一下,概括出一個較通用的機器學習模板:

  1. 定義問題,收集標註數據:我們提出問題,然後獲取足夠多的好的數據,然後明確數據是否是有用的,就像再多夏天可樂的銷量數據也沒辦法訓練出今年冬天可樂的銷量數據;

  2. 選擇衡量成功的指標:需要確定是分類正確,或者是預測準確等,究竟需要得出什麼樣的結果,已經這些結果如何去衡量;

  3. 確定評估方法:直接留出驗證集、K 折交叉驗證或者是重複 K 折交叉驗證;

  4. 準備數據:對數據進行預處理,用 one-hot 方法擴展爲張量,或者是數據標準化等;

  5. 開發比基準更好的模型:用一個小型的網絡,做出比純隨機更好的效果,判斷是否的概率大於 50%,手寫數字判斷概率大於 1/10 等;

  6. 擴大規模,開發過擬合模型:添加更多的層、每一層添加更多的參數,使其訓練結果過擬合,如果沒辦法過擬合,你就沒辦法確定什麼是較好的參數值;

  7. 調參:這一個過程往往也是機器學習開發者耗時最多、最讓人崩潰的環節,對參數進行無休無止的調節,尋找更好的參數層數配置等,直到逼近到目標。

如此七個步驟,就是一個訓練一個網絡需要的七個環節,我們進行網絡的訓練,幾乎都需要經過這些步驟。

到此,對於機器學習——在這裏我們討論的主要是其中的深度學習——的基礎知識或整體概況,我們都有了一個比較深入的瞭解,這篇文章概括並總結了一些關鍵的問題。後續我們就需要進行更多的實踐,瞭解框架中各種 api 的使用了,具體的細節我們到時候再逐步分析與討論。

恭喜你:完成了機器學習基礎知識的學習。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章