文章代碼來源:《deep learning on keras》球碉,非常好的一本書,大家如果英語好仓蛆,推薦直接閱讀該書睁冬,如果時間不夠,可以看看此系列文章,文章為我自己翻譯的內(nèi)容加上自己的一些思考豆拨,水平有限直奋,多有不足,請多指正施禾,翻譯版權(quán)所有脚线,若有轉(zhuǎn)載,請先聯(lián)系本人弥搞。
個人方向為數(shù)值計算邮绿,日后會向深度學習和計算問題的融合方面靠近,若有相近專業(yè)人士攀例,歡迎聯(lián)系船逮。
系列文章:
一、搭建屬于你的第一個神經(jīng)網(wǎng)絡(luò)
二粤铭、訓(xùn)練完的網(wǎng)絡(luò)去哪里找
三挖胃、【keras實戰(zhàn)】波士頓房價預(yù)測
四、keras的function API
五梆惯、keras callbacks使用
六酱鸭、機器學習基礎(chǔ)Ⅰ:機器學習的四個標簽
七、機器學習基礎(chǔ)Ⅱ:評估機器學習模型
八垛吗、機器學習基礎(chǔ)Ⅲ:數(shù)據(jù)預(yù)處理凛辣、特征工程和特征學習
九、機器學習基礎(chǔ)Ⅳ:過擬合和欠擬合
十职烧、機器學習基礎(chǔ)Ⅴ:機器學習的一般流程十一、計算機視覺中的深度學習:卷積神經(jīng)網(wǎng)絡(luò)介紹
十二防泵、計算機視覺中的深度學習:從零開始訓(xùn)練卷積網(wǎng)絡(luò)
十三蚀之、計算機視覺中的深度學習:使用預(yù)訓(xùn)練網(wǎng)絡(luò)
十四、計算機視覺中的神經(jīng)網(wǎng)絡(luò):可視化卷積網(wǎng)絡(luò)所學到的東西
這次我們要講的東西是一個一般的攻擊和解決任何機器學習問題的藍圖捷泞,將你在本章學到的:問題定義足删、評估、特征工程锁右、解決過擬合全部聯(lián)系起來失受。
定義問題和組裝數(shù)據(jù)集
首先,你必須這樣定義手頭的問題:
- 你要輸入的數(shù)據(jù)是什么樣子咏瑟?你想要預(yù)測的是什么拂到?你只能預(yù)測某些事情,例如你在電影評論和感情注釋數(shù)據(jù)都有的時候可以來對電影的評論進行分類码泞。常常數(shù)據(jù)是限制因素(除非你有方法去讓被人幫你手機數(shù)據(jù))
- 你手頭面臨的是什么類型的問題兄旬,是二分類嗎?多分類嗎余寥?標量回歸問題嗎领铐?向量回歸問題嗎悯森?多分類多標簽分類問題嗎?還有一些其它的绪撵,如積累瓢姻,泛化或是強化學習?弄清這些問題類型將會引導(dǎo)你選擇模型框架音诈,損失函數(shù)等等幻碱。
在你弄清輸入輸出是什么和你要用什么數(shù)據(jù)之前, 你是無法到下一階段的改艇。注意下面這些假設(shè): - 你假設(shè)你的輸出能被你所給的輸入所預(yù)測
- 你假設(shè)你的數(shù)據(jù)已經(jīng)足以解釋輸入和輸出之間的關(guān)系收班。
在你有有效的模型之前,這些都只不過是假設(shè)罷了谒兄,等到被證實或是被證偽摔桦。不是所有的問題都能被解決;因為你將輸入X和預(yù)測Y相組裝承疲,這不意味著X包含足夠的用來預(yù)測Y的信息邻耕。舉個例子,如果你嘗試股票的動態(tài)通過股票市場所給出的最近的價格歷史燕鸽,你是不太可能會成功的兄世,因為價格歷史就沒包含什么可預(yù)測信息。
一種你需要特別注意的未解決的問題是非平穩(wěn)問題啊研。假設(shè)你試著做一款衣服推薦引擎御滩,你訓(xùn)練了一個月的數(shù)據(jù),八月的党远,然后你就像開始泛化推薦冬天的削解。一個大的問題是人們買的衣服的類型隨著季節(jié)在變,也就是說一幅購買在很少的月份來看不是一個固定的現(xiàn)象沟娱。你嘗試改變模型氛驮。這樣一來最好的的方法是不斷地訓(xùn)練你最近采集到的數(shù)據(jù),或者將問題固定的數(shù)據(jù)聚起來济似。對于一些周期問題矫废,例如買衣服,只需要幾年的數(shù)據(jù)就足以捕獲到季節(jié)的變化砰蠢,但是你應(yīng)當記住讓時間成為你模型輸入的一部分蓖扑。
記住:機器學習只能記住你在訓(xùn)練數(shù)據(jù)里面表達的特征台舱。你也只能識別你見過的東西赵誓。使用機器學習訓(xùn)練過去的數(shù)據(jù)來預(yù)測將來是基于假設(shè):未來和過去表現(xiàn)會比較相似。然而常常并不是醬紫的。
選擇成功的度量
為了控制某個東西俩功,你需要觀察它幻枉。為了獲得成功,你需要定義成功的度量诡蜓,是準確率熬甫?召回精度?客戶保留率蔓罚?你的成功的度量將會指導(dǎo)你選擇損失函數(shù)椿肩,也就是你模型要優(yōu)化的東西。這度量應(yīng)當和你高級目標相對齊豺谈,比如說你企業(yè)的成功郑象。
對于平衡分類問題,每一個類都是等可能的茬末,準確率和roc-auc是常用的度量厂榛。對于非均衡分類問題,可能會使用準確率召回丽惭。對于排序問題或是多樣本分類击奶,將會用平均預(yù)測。用你度量成功的方法來定義你的客戶的度量并不少見责掏。為了得到機器學習的成功度量的意義以及他們是如何和不同領(lǐng)域的問題聯(lián)系起來的柜砾,在kaggle.com
決定評估方案
一旦你知道你的目標,你就必須建立如何衡量當前的進度换衬。我們有三種常見的評估方案:
- 保持一個不變的驗證集痰驱;這當你有很多數(shù)據(jù)的時候這是一個方法。
- 做k-fold交叉驗證瞳浦;這是當你的數(shù)據(jù)樣本太少的時候采取的方法担映。
- 做循環(huán)k-fold驗證;這是為了少樣本時提高模型估計术幔。
直接選其中一個;在大多數(shù)情況湃密,第一種就已經(jīng)表現(xiàn)得足夠好了诅挑。
準備你的數(shù)據(jù)
一旦你知道你在訓(xùn)練什么數(shù)據(jù),你在優(yōu)化什么泛源,以及如何評估你的方法拔妥,你已經(jīng)準備好開始訓(xùn)練模型了。但是达箍,你首先應(yīng)當把你的數(shù)據(jù)的格式處理到能夠喂進機器學習模型——這里我們假設(shè)是深度神經(jīng)網(wǎng)絡(luò)没龙。
- 正如我們之前看到的,你的數(shù)據(jù)應(yīng)當格式化成張量。
- 這些張量中的值應(yīng)當被化為小的值硬纤。
- 如果不同的特征在不同的范圍變化解滓,那么應(yīng)當標準化。
- 你或許想要做一些特征工程筝家,特別是對于小數(shù)據(jù)問題洼裤。
一旦你的輸入張量和目標數(shù)據(jù)準備好了,你就可以開始訓(xùn)練模型了溪王。
發(fā)展一個模型使得比基礎(chǔ)的做得好
你的目標是達到“統(tǒng)計功效”腮鞍,即弄一個小模型來對抗原來的小的。在MNIST數(shù)字分類例子中莹菱,任何準確率高于0.1的都可以說是具有統(tǒng)計功效的移国;在我們IMDB例子中就需要高于0.5酥诽。
注意墓毒,不是總是能達到統(tǒng)計功效鸥跟。如果你不能擊敗原來的基礎(chǔ)版本的急黎,在試了很多可能的結(jié)構(gòu)以后睦刃,這可能是問題的答案在輸入數(shù)據(jù)中就沒有臣缀。記住你做了兩個假設(shè):
- 你假設(shè)你的輸出能夠被你的輸入預(yù)測
- 你假設(shè)你給的數(shù)據(jù)已經(jīng)足夠?qū)W習輸入和輸出之間的關(guān)系了刻坊。
可能這些假設(shè)是錯的院促,這樣的話娜汁,你就必須回頭回到原來的畫板上嫂易。
假設(shè)一切順利,這里有三個關(guān)鍵的選擇掐禁,你需要做的怜械,來建立你的第一個模型:
- 最后一層激活函數(shù)的選擇。這對網(wǎng)絡(luò)的輸出做了有用的限制:例如我們的IMDB分類例子中我們使用sigmoid在最后一層傅事,在回歸例子中缕允,我們沒有用任何激活函數(shù)。
- 選擇損失函數(shù)蹭越。這就應(yīng)當匹配你試圖解決的問題的類型了:在IMDB分類例子中我們使用二交叉障本,在回歸例子中我們使用最小均方誤差。
- 選擇優(yōu)化模塊:用什么樣的優(yōu)化器响鹃?學習率是什么驾霜?在大多數(shù)情況,使用rmsprop和其學習率很安全买置。
說到選擇損失函數(shù):注意直接優(yōu)化度量問題成功的很亮不總是可行的粪糙。有時沒有捷徑來將度量轉(zhuǎn)化為損失函數(shù);損失函數(shù)只有在少量樣本數(shù)據(jù)可以被計算(理想情況下忿项,一個損失函數(shù)應(yīng)當對于像一個點那樣少的數(shù)據(jù)都可計算)并且需要可區(qū)分蓉冈。(否則你無法使用向后傳播來訓(xùn)練你的網(wǎng)絡(luò))城舞。舉個例子,廣泛用于分類度量的roc-auc不能直接被優(yōu)化寞酿。因此在分類任務(wù)中去優(yōu)化roc-auc的替代品很常見家夺,比如交叉熵。一般的熟嫩,交叉熵越低秦踪,roc-auc就越高。
這里給了一張表格掸茅,來幫助你選擇最后一層的激活函數(shù)和損失函數(shù)在一些常見的問題類型上椅邓。
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 |
按比例放大:改進過擬合模型
一旦你得到了一個有統(tǒng)計功效的模型,這問題就變成了:你的模型是否足夠有效昧狮?手頭有足夠多的層數(shù)和參數(shù)來適當?shù)膶栴}建模嗎景馁?例如,一個有單個隱藏層逗鸣,兩個獨立單元的網(wǎng)絡(luò)對MNIST具有統(tǒng)計功效合住,但還不足以很好的解決問題。記住撒璧,一般的機器學習中的張力介于優(yōu)化和泛化之間透葛;理想的模型是在過擬合和欠擬合的邊界上,同時也在容量不足和容量冗余的邊界上卿樱。為了弄清楚邊界在哪里僚害,你必須通過它。
為了弄清楚你究竟需要多大的模型繁调,你必須改進一個過擬合的模型萨蚕,這相當?shù)暮唵危?/p>
- 加層數(shù)
- 讓你的層更大
- 訓(xùn)練更多的批次
持續(xù)監(jiān)察訓(xùn)練損失和驗證損失,以及在任意你關(guān)心的度量下訓(xùn)練和驗證值蹄胰。當你看到模型在驗證數(shù)據(jù)開始下降時岳遥,你就已經(jīng)開始過擬合了。
正則化你的模型并調(diào)節(jié)超參數(shù)
這將是花你最多時間的部分:你將會反復(fù)修改你的模型裕寨,訓(xùn)練它浩蓉,在驗證集上評估,再修改直到你的模型能表現(xiàn)得如它能做到的那么好為止宾袜。
這里有很多事情你應(yīng)當去嘗試:
- 加dropout
- 嘗試不同的結(jié)構(gòu)捻艳,加或者移除層
- 加L1/L2正則化
- 嘗試不同的超參數(shù)(例如每一層的單元數(shù),優(yōu)化器的學習速率)來尋找優(yōu)化結(jié)構(gòu)
- 在特征工程的基礎(chǔ)上優(yōu)化迭代:加新的特征试和,移除那些看著沒有信息量的特征讯泣。
時刻牢記如下:每次你使用你驗證集的帶的反饋來調(diào)節(jié)你的模型的時候纫普,你就在將驗證集的數(shù)據(jù)滲透進你的模型阅悍。重復(fù)少數(shù)幾次好渠,無傷大雅,但是系統(tǒng)地循環(huán)了很多次以后最終就會導(dǎo)致你的模型對于驗證集來說過擬合(盡管沒有任何驗證數(shù)據(jù)直接在模型上訓(xùn)練)這將會使你的評估不再那么可靠节视,記住這個拳锚。
一旦你改進出了一個足夠好的模型,你能在訓(xùn)練集和驗證集上訓(xùn)練并在最后放在測試集上評估寻行。如果在測試集上的表現(xiàn)明顯比在驗證集上的表現(xiàn)差霍掺,這就說明的你的驗證集不是那么可靠的,或者說在調(diào)參的時候使得模型在驗證集上過擬合了拌蜘。在這種情況下杆烁,你可能想要改用一些更加可靠的評估方法(如循環(huán)k-fold驗證)
總的來說,這是機器學習的一般流程:
- 1)定義手頭你要去訓(xùn)練的問題和數(shù)據(jù)简卧;收集數(shù)據(jù)或標注標簽如果需要的話兔魂。
- 2)選擇如何成功衡量你的問題,什么樣的度量是你的驗證集需要監(jiān)控的举娩。
- 3)弄清楚你的評價協(xié)議:持續(xù)驗證析校?k-flod驗證?你應(yīng)當拿哪一部分來驗證铜涉?
- 4)改進模型使得比原始模型表現(xiàn)好智玻,讓模型具有統(tǒng)計功效。
- 5)改進過擬合的模型
- 6)正則化你的模型芙代,并調(diào)節(jié)其超參數(shù)吊奢,基于驗證集的表現(xiàn)。
大多數(shù)的機器學習研究都傾向于集中注意力在最后一步——但需要牢記這個大的框架链蕊。