【技术综述】深度学习新手如何开始合适的“调参”任务
言有三
畢業于中國科學院,計算機視覺方向從業者,有三工作室等創始人
作者 | 言有三
編輯 | 言有三
深度學習工程師被稱為“煉丹工程師”,自然是因為在日常工作中需要各種各樣的調參工作。雖然因為Google的研究使得AutoML這兩年大熱,但是對于大部分人來說,還沒有機器玩得起AutoML,而且手動調參數也是一門必備的技能。
試問:連調試參數都要交給電腦了,就你那三腳貓的python語言基礎和弱不禁風的數學基礎,端得起一碗高薪的飯嗎!
1
任務選擇
要學習調試參數,必須有一個比較好的任務,它一定是要有一定的難度,但是不能太難。它能體現出不同參數的差異,但又不能太敏感。
這里我給大家選了一個任務,細粒度圖像分類,方法選擇雙線性網絡,參考git鏈接
https://github.com/gy20073/compact_bilinear_pooling。
所謂細粒度圖像分類,就是要將不同子類區分,通常來說,有不同種類的貓,不同種類的花等等,這里我們選擇了一個公開數據集,選擇的數據集為Caltech-UCSD Birds-200-2011,它包括200類鳥,共11788張圖片,每一個類約60個樣本,圖片的分辨率大小不等,長度都在400分辨率左右。
將數據集均勻分為訓練集和測試集,各10597和1192張圖。
它的任務就是要區分上面的鳥,特點就是有效的信息只存在于很細小的局部區域中。關于分類任務,更多的信息請關注我們上一篇文章,圖像分類絕對不是一個簡單的任務,請重視。
【技術綜述】你真的了解圖像分類嗎?
話不多說,開始吧。
2
開始調參
深度學習參數真的太多了,這個參數不是說神經元的參數,而是說用于訓練網絡的參數。
上圖只是展示了其中一些比較重要的參數,實際上隨便數數20個以上是沒有問題的。咱們時間機器有限不可能所有的都調試,今天就來調試其中的幾個最重要的,遷移學習,分辨率以及正則項。
2.1 遷移學習
如果你想快速訓練好一個任務,那么請從遷移學習開始,不要從頭開始訓練,尤其是新手。
一個好的初始化太重要了,遷移學習就是給你提供了一個絕佳的初始化。
咱們這個任務是非常難的,因為類別多,數據少,而且類內方差很大,所以我們開始進行遷移學習的時候,不妨保守一點,只學習全連接層。
注意這個任務的最后幾層如上,分別是一個雙線性網絡層和兩個歸一化層,一個全連接層,訓練參數如下,完整的網絡配置請參照git。
test_iter: 300
test_interval: 600
display: 100
max_iter: 60000
?
lr_policy: "multistep"
base_lr: 0.1
gamma: 0.25
stepvalue: 20000
stepvalue: 30000
stepvalue: 40000
stepvalue: 50000
?
momentum: 0.9
weight_decay: 0
snapshot: 10000
snapshot_prefix: "snapshot/ft_last_layer"
net: "ft_last_layer.prototxt"
iter_size: 4
經過了60000次迭代后,查看下訓練的準確率迭代曲線和損失迭代曲線如下
可以看出,網絡發生了過擬合,這也是在預料之中,因為訓練集中每一類的圖像只有60張左右,而數據增強只做了隨機裁剪,而且是在全圖經過了縮放之后的裁剪操作。
最后,我們對數據集進行了測試,準確率為74.5%。
我們再放開所有網絡層進行學習,具體配置如下
test_iter: 300
test_interval: 100
display: 100
max_iter: 20000
lr_policy: "fixed"
base_lr: 0.001
momentum: 0.9
weight_decay: 0.0005
snapshot: 10000
snapshot_prefix: "snapshot/ft_all"
net: "ft_all.prototxt"
結果如下
可以看到,損失繼續降低,同時精度也繼續提升,20000次迭代后準確率從74.5%提升到86.8%。當然,模型仍然是過擬合的,這是因為樣本數據集是在太小,只有增加數據集,實驗更多的數據增強方法才能更好的解決這個問題。
關于數據集和數據增強方法,請查看往期文章。
【數據】深度學習從“數據集”開始
[綜述類] 一文道盡深度學習中的數據增強方法(上)
【技術綜述】深度學習中的數據增強(下)
那可不可以直接對所有層進行學習呢,沒問題,可以收斂的。
但是效果就要差一些了,最終只能到0.79。
那不用雙線性模型,直接使用分類模型如何?我的實驗結果是很差,慘不忍睹,這里就不放出來了,而且非常難調參。
從這一次的調參至少可以得到一個結論,遷移學習是很重要的,妥妥的提升性能。而且其中的技巧非常多,只能多去練手了,看文章是學不到的。
2.2 輸入輸出分辨率
如果你的模型沒毛病,但是效果始終不好,不如提高分辨率,當然這意味著更大的計算量。
通常來說,更大的輸入分辨率總是可以取得更好的效果,尤其是對于檢測和分割等任務。在我們這個任務中,還可以調整雙線性網絡的輸出特征維度大小,這可以認為是輸出維度,也可能是一個比較關鍵的參數。
所以我們同時對輸入分辨率和雙線性網絡的輸出層的維度進行一系列實驗,輸入尺度分別選用448,336,224這3個,輸出維度分別選用8192,4096,2048,1024,保持其他參數不變,迭代60000次,測試結果如下:
可以看出,圖像的分辨率對模型性能的影響非常大,從448降低到224之后,準確率下降將近10%。雙線性輸出特征層的維度,從8192降低到1024后,只有微小的下降,幾乎對性能沒有影響,當然這并不意味著其他的任務也是如此,事實上對于圖像分割和目標檢測任務來說,最后一層卷積輸出的特征圖大小是最重要的參數。
2.3 正則化因子
當模型在訓練集上的表現明顯優于測試集的時候,說明發生了過擬合,緩解過擬合最簡單的方法是增加數據。當增加數據的方案行不通的時候,可以通過添加L1,L2,dropout等正則化方案,這分別是隱式正則化和顯式正則化方法。
在caffe框架中,通過調整Weight_decay來實現,默認使用的是L2正則化方法。Weight_decay是乘在正則化項的因子,這一般可以提高模型的能力,一定程度上緩解模型的過擬合,但是視不同任務而定,我們在前面訓練模型的時候沒有加正則項。
分別比較weight_decay=0,weight_decay=0.00001, weight_decay=0.001對結果的影響,其中weight_decay=0對應的就是第一個訓練的基準模型。
沒有取得我們預期的效果,可能是wr的參數試的不夠多,可能是其他的參數需要調試。
wr=0.001的時候曲線如上,可以看到模型相比于上面的一些更好的模型,提前收斂了,但是卻收斂到了不好的效果,過擬合情況更加嚴重。
這個時候應該怎么做呢?在數據集不能變的情況下,調節學習率?還是繼續調節正則化因子,只有實驗結果才能驗證了。
除去上面這些參數,還有學習率大小與迭代方法,batch size大小,初始化方法與各種優化方法,數據增強等各種參數,其中有一些參數對結果還是很有影響的,就留著讀者自己去調試吧。
更多任務與參數調試,可以參考以前的一篇文章。
如何步入深度學習刷榜第一重境界
最后說一下我的感受,紙上得來終覺淺,絕知此事要躬行,雖然調參數有一定的指導,但是唯有多練手才能熟能生巧。
時間原因,以后我不可能每天產出高質量文章,還請大家耐心等待,另外更多的經歷在一對一指導學習“濟”劃和“稷”劃,感興趣可以了解。
有三AI“【濟】劃”,從圖像基礎到深度學習
有三AI“十一月【稷】劃”,從調參大法到3D重建
有三AI“十月【稷】劃”,從自動駕駛到模型優化
不愿關注公眾號,可移步知乎。
深度學習網易公開課已經上線,看有三從不一樣的視角來解讀深度學習,特價2折,僅限今天。
如果想加入我們,后臺留言吧
微信
Longlongtogo
公眾號內容
1 圖像基礎|2 深度學習|3 行業信息
有三精選
【技術綜述】“看透”神經網絡
【有三說圖像】圖像簡史與基礎
【技術綜述】閑聊圖像分割這件事兒
【技術綜述】一文道盡softmax loss及其變種
【總結】這半年,有三AI都做了什么
往期學員分享
【技術綜述】人臉表情識別研究
一課道盡人臉圖像算法,你值得擁有
如何降低遮擋對人臉識別的影響
【技術綜述】人臉顏值研究綜述
往期開源框架
【pytorch速成】Pytorch圖像分類從模型自定義到測試
【paddlepaddle速成】paddlepaddle圖像分類從模型自定義到測試
【caffe速成】caffe圖像分類從模型自定義到測試
【tensorflow速成】Tensorflow圖像分類從模型自定義到測試
往期行業分析
【行業進展】國內自動駕駛發展的怎么樣了?
【行業進展】AI:新藥研發的新紀元
【行業進展】哪些公司在搞“新零售”
【行業趨勢】國內這10個AI研究院,你想好去哪個了嗎?
往期模型解讀
【模型解讀】“全連接”的卷積網絡,有什么好?
【模型解讀】“不正經”的卷積神經網絡
【模型解讀】resnet中的殘差連接,你確定真的看懂了?
【模型解讀】pooling去哪兒了?
總結
以上是生活随笔為你收集整理的【技术综述】深度学习新手如何开始合适的“调参”任务的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【学习求职必备】百度AI和它的7大AI黑
- 下一篇: 【资源放送】机器学习/深度学习最全公开视