文章代碼來源:《deep learning on keras》,非常好的一本書,大家如果英語好,推薦直接閱讀該書,如果時間不夠,可以看看此系列文章,文章為我自己翻譯的內容加上自己的一些思考,水平有限,多有不足,請多指正,翻譯版權所有,若有轉載,請先聯系本人。
個人方向為數值計算,日后會向深度學習和計算問題的融合方面靠近,若有相近專業人士,歡迎聯系。
系列文章:
一、搭建屬于你的第一個神經網絡
二、訓練完的網絡去哪里找
三、【keras實戰】波士頓房價預測
四、keras的function API
五、keras callbacks使用
六、機器學習基礎Ⅰ:機器學習的四個標簽
七、機器學習基礎Ⅱ:評估機器學習模型
八、機器學習基礎Ⅲ:數據預處理、特征工程和特征學習
九、機器學習基礎Ⅳ:過擬合和欠擬合
十、機器學習基礎Ⅴ:機器學習的一般流程十一、計算機視覺中的深度學習:卷積神經網絡介紹
十二、計算機視覺中的深度學習:從零開始訓練卷積網絡
十三、計算機視覺中的深度學習:使用預訓練網絡
十四、計算機視覺中的神經網絡:可視化卷積網絡所學到的東西
這次我們要講的東西是一個一般的攻擊和解決任何機器學習問題的藍圖,將你在本章學到的:問題定義、評估、特征工程、解決過擬合全部聯系起來。
定義問題和組裝數據集
首先,你必須這樣定義手頭的問題:
- 你要輸入的數據是什么樣子?你想要預測的是什么?你只能預測某些事情,例如你在電影評論和感情注釋數據都有的時候可以來對電影的評論進行分類。常常數據是限制因素(除非你有方法去讓被人幫你手機數據)
- 你手頭面臨的是什么類型的問題,是二分類嗎?多分類嗎?標量回歸問題嗎?向量回歸問題嗎?多分類多標簽分類問題嗎?還有一些其它的,如積累,泛化或是強化學習?弄清這些問題類型將會引導你選擇模型框架,損失函數等等。
在你弄清輸入輸出是什么和你要用什么數據之前, 你是無法到下一階段的。注意下面這些假設: - 你假設你的輸出能被你所給的輸入所預測
- 你假設你的數據已經足以解釋輸入和輸出之間的關系。
在你有有效的模型之前,這些都只不過是假設罷了,等到被證實或是被證偽。不是所有的問題都能被解決;因為你將輸入X和預測Y相組裝,這不意味著X包含足夠的用來預測Y的信息。舉個例子,如果你嘗試股票的動態通過股票市場所給出的最近的價格歷史,你是不太可能會成功的,因為價格歷史就沒包含什么可預測信息。
一種你需要特別注意的未解決的問題是非平穩問題。假設你試著做一款衣服推薦引擎,你訓練了一個月的數據,八月的,然后你就像開始泛化推薦冬天的。一個大的問題是人們買的衣服的類型隨著季節在變,也就是說一幅購買在很少的月份來看不是一個固定的現象。你嘗試改變模型。這樣一來最好的的方法是不斷地訓練你最近采集到的數據,或者將問題固定的數據聚起來。對于一些周期問題,例如買衣服,只需要幾年的數據就足以捕獲到季節的變化,但是你應當記住讓時間成為你模型輸入的一部分。
記?。簷C器學習只能記住你在訓練數據里面表達的特征。你也只能識別你見過的東西。使用機器學習訓練過去的數據來預測將來是基于假設:未來和過去表現會比較相似。然而常常并不是醬紫的。
選擇成功的度量
為了控制某個東西,你需要觀察它。為了獲得成功,你需要定義成功的度量,是準確率?召回精度?客戶保留率?你的成功的度量將會指導你選擇損失函數,也就是你模型要優化的東西。這度量應當和你高級目標相對齊,比如說你企業的成功。
對于平衡分類問題,每一個類都是等可能的,準確率和roc-auc是常用的度量。對于非均衡分類問題,可能會使用準確率召回。對于排序問題或是多樣本分類,將會用平均預測。用你度量成功的方法來定義你的客戶的度量并不少見。為了得到機器學習的成功度量的意義以及他們是如何和不同領域的問題聯系起來的,在kaggle.com
決定評估方案
一旦你知道你的目標,你就必須建立如何衡量當前的進度。我們有三種常見的評估方案:
- 保持一個不變的驗證集;這當你有很多數據的時候這是一個方法。
- 做k-fold交叉驗證;這是當你的數據樣本太少的時候采取的方法。
- 做循環k-fold驗證;這是為了少樣本時提高模型估計。
直接選其中一個;在大多數情況,第一種就已經表現得足夠好了。
準備你的數據
一旦你知道你在訓練什么數據,你在優化什么,以及如何評估你的方法,你已經準備好開始訓練模型了。但是,你首先應當把你的數據的格式處理到能夠喂進機器學習模型——這里我們假設是深度神經網絡。
- 正如我們之前看到的,你的數據應當格式化成張量。
- 這些張量中的值應當被化為小的值。
- 如果不同的特征在不同的范圍變化,那么應當標準化。
- 你或許想要做一些特征工程,特別是對于小數據問題。
一旦你的輸入張量和目標數據準備好了,你就可以開始訓練模型了。
發展一個模型使得比基礎的做得好
你的目標是達到“統計功效”,即弄一個小模型來對抗原來的小的。在MNIST數字分類例子中,任何準確率高于0.1的都可以說是具有統計功效的;在我們IMDB例子中就需要高于0.5。
注意,不是總是能達到統計功效。如果你不能擊敗原來的基礎版本的,在試了很多可能的結構以后,這可能是問題的答案在輸入數據中就沒有。記住你做了兩個假設:
- 你假設你的輸出能夠被你的輸入預測
- 你假設你給的數據已經足夠學習輸入和輸出之間的關系了。
可能這些假設是錯的,這樣的話,你就必須回頭回到原來的畫板上。
假設一切順利,這里有三個關鍵的選擇,你需要做的,來建立你的第一個模型:
- 最后一層激活函數的選擇。這對網絡的輸出做了有用的限制:例如我們的IMDB分類例子中我們使用sigmoid在最后一層,在回歸例子中,我們沒有用任何激活函數。
- 選擇損失函數。這就應當匹配你試圖解決的問題的類型了:在IMDB分類例子中我們使用二交叉,在回歸例子中我們使用最小均方誤差。
- 選擇優化模塊:用什么樣的優化器?學習率是什么?在大多數情況,使用rmsprop和其學習率很安全。
說到選擇損失函數:注意直接優化度量問題成功的很亮不總是可行的。有時沒有捷徑來將度量轉化為損失函數;損失函數只有在少量樣本數據可以被計算(理想情況下,一個損失函數應當對于像一個點那樣少的數據都可計算)并且需要可區分。(否則你無法使用向后傳播來訓練你的網絡)。舉個例子,廣泛用于分類度量的roc-auc不能直接被優化。因此在分類任務中去優化roc-auc的替代品很常見,比如交叉熵。一般的,交叉熵越低,roc-auc就越高。
這里給了一張表格,來幫助你選擇最后一層的激活函數和損失函數在一些常見的問題類型上。
Problem type | Last-layer activation | Loss function |
---|---|---|
Binary classification | sigmoid | binary_crossentropy |
Multi-class, single-label classification | softmax | categorical_crossentropy |
Multi-class, multi-label classification | sigmoid | binary_crossentropy |
Regression to arbitrary values | None | mse |
Regression to values between 0 and 1 | sigmoid | mse or binary_crossentropy |
按比例放大:改進過擬合模型
一旦你得到了一個有統計功效的模型,這問題就變成了:你的模型是否足夠有效?手頭有足夠多的層數和參數來適當的對問題建模嗎?例如,一個有單個隱藏層,兩個獨立單元的網絡對MNIST具有統計功效,但還不足以很好的解決問題。記住,一般的機器學習中的張力介于優化和泛化之間;理想的模型是在過擬合和欠擬合的邊界上,同時也在容量不足和容量冗余的邊界上。為了弄清楚邊界在哪里,你必須通過它。
為了弄清楚你究竟需要多大的模型,你必須改進一個過擬合的模型,這相當的簡單:
- 加層數
- 讓你的層更大
- 訓練更多的批次
持續監察訓練損失和驗證損失,以及在任意你關心的度量下訓練和驗證值。當你看到模型在驗證數據開始下降時,你就已經開始過擬合了。
正則化你的模型并調節超參數
這將是花你最多時間的部分:你將會反復修改你的模型,訓練它,在驗證集上評估,再修改直到你的模型能表現得如它能做到的那么好為止。
這里有很多事情你應當去嘗試:
- 加dropout
- 嘗試不同的結構,加或者移除層
- 加L1/L2正則化
- 嘗試不同的超參數(例如每一層的單元數,優化器的學習速率)來尋找優化結構
- 在特征工程的基礎上優化迭代:加新的特征,移除那些看著沒有信息量的特征。
時刻牢記如下:每次你使用你驗證集的帶的反饋來調節你的模型的時候,你就在將驗證集的數據滲透進你的模型。重復少數幾次,無傷大雅,但是系統地循環了很多次以后最終就會導致你的模型對于驗證集來說過擬合(盡管沒有任何驗證數據直接在模型上訓練)這將會使你的評估不再那么可靠,記住這個。
一旦你改進出了一個足夠好的模型,你能在訓練集和驗證集上訓練并在最后放在測試集上評估。如果在測試集上的表現明顯比在驗證集上的表現差,這就說明的你的驗證集不是那么可靠的,或者說在調參的時候使得模型在驗證集上過擬合了。在這種情況下,你可能想要改用一些更加可靠的評估方法(如循環k-fold驗證)
總的來說,這是機器學習的一般流程:
- 1)定義手頭你要去訓練的問題和數據;收集數據或標注標簽如果需要的話。
- 2)選擇如何成功衡量你的問題,什么樣的度量是你的驗證集需要監控的。
- 3)弄清楚你的評價協議:持續驗證?k-flod驗證?你應當拿哪一部分來驗證?
- 4)改進模型使得比原始模型表現好,讓模型具有統計功效。
- 5)改進過擬合的模型
- 6)正則化你的模型,并調節其超參數,基于驗證集的表現。
大多數的機器學習研究都傾向于集中注意力在最后一步——但需要牢記這個大的框架。