|
前言 作為一名每天與神經(jīng)網(wǎng)絡(luò)訓(xùn)練/測試打交道的同學(xué),是否經(jīng)常會遇到以下這幾個問題,時常懷疑人生:
總而言之,當(dāng)模型效果不如預(yù)期的時候去調(diào)試深度學(xué)習(xí)網(wǎng)絡(luò)是一件頭疼且繁瑣的事情,為了讓這件麻煩事情更加僅僅有條,筆者結(jié)合實際經(jīng)驗簡單整理了一些checklist,方便廣大煉丹師傅掌握火候。 1. 從最簡單的數(shù)據(jù)/模型開始 現(xiàn)在開源社區(qū)做的很好,同學(xué)們用模型也十分方便,但也有相應(yīng)的問題。以句子情感識別為例,新入手的同學(xué)可能一上來就調(diào)出HuggingFace/transformers代碼庫,然后一股腦BERT/Roberta啥的跑個結(jié)果,當(dāng)然文檔做好的開源代碼一般都能照著跑個好結(jié)果,但改到自己數(shù)據(jù)集上往往就懵逼了,啊這?51%的二分類準(zhǔn)確率(可能夸張了點,但如果任務(wù)要比二分類稍微復(fù)雜點,基本結(jié)果不會如預(yù)期),也太差了吧,HuggingFace/transofmrers這些模型不行啊。算了,咱換一個庫吧,再次求助github和谷歌搜索。其實可能都還不清楚數(shù)據(jù)輸入格式對不對?數(shù)據(jù)量夠不夠?評測指標(biāo)含義是否清楚?Roberta的tokenizer是咋做的?模型結(jié)構(gòu)是什么樣子? 所以第1個checklist是:請盡量簡單!
模型簡單:解決一個深度學(xué)習(xí)任務(wù),最好是先自己搭建一個最簡單的神經(jīng)網(wǎng)絡(luò),就幾層全連接的那種。 數(shù)據(jù)簡單:一般來說少于10個樣本做調(diào)試足夠了,一定要做過擬合測試(特別是工作的同學(xué),拿過來前人的代碼直接改個小結(jié)構(gòu)就跑全量數(shù)據(jù)訓(xùn)練7-8天是可能踩坑的哦,比如某tensorflow版本 GPU embedding查表,輸入超出了vocab size維度甚至可能都不報錯哦,但cpu又會報錯)!如果你的模型無法在7、8個樣本上過擬合,要么模型參數(shù)實在太少,要么有模型有bug,要么數(shù)據(jù)有bug。為什么不建議1個樣本呢?多選幾個有代表性的輸入數(shù)據(jù)有助于直接測試出非法數(shù)據(jù)格式。但數(shù)據(jù)太多模型就很難輕松過擬合了,所以建議在10個以下,1個以上,基本ok了。 2. loss設(shè)計是否合理? loss決定了模型參數(shù)如何更新,所以記得確定一下你的loss是否合理?
3. 網(wǎng)絡(luò)中間輸出檢查、網(wǎng)絡(luò)連接檢查 Pytorch已經(jīng)可以讓我們像寫python一樣單步debug了,所以輸入輸出shape對齊這步目前還挺好做的,基本上單步debug走一遍forward就能將網(wǎng)絡(luò)中間輸出shape對齊,連接也能對上,但有時候還是可能眼花看漏幾個子網(wǎng)絡(luò)的連接。 所以最好再外部測試一下每個參數(shù)的梯度是否更新了,訓(xùn)練前后參數(shù)是否都改變了。
讀者可以參考stanford cs231n中的Gradient checking: https://cs231n./neural-networks-3/#gradcheck https://cs231n./optimization-1/#gradcompute 另外用tensorboard來檢查一下網(wǎng)絡(luò)連接/輸入輸出shape和連接關(guān)系也是不錯的。 4. 時刻關(guān)注著模型參數(shù) 所謂模型參數(shù)也就是一堆矩陣/或者說大量的數(shù)值。如果這些數(shù)值中有些數(shù)值異常大/小,那么模型效果一般也會出現(xiàn)異常。一般來說,讓模型參數(shù)保持正常有這么幾個方法:
統(tǒng)計梯度下降中,我們需要的batch size要求是:1、batch size足夠大到能讓我們在loss反向傳播時候正確估算出梯度;2、batch size足夠小到統(tǒng)計梯度下降(SGD)能夠一定程度上regularize我們的網(wǎng)絡(luò)結(jié)構(gòu)。batch size太小優(yōu)化困難,太大又會導(dǎo)致:Generalization Gap和Sharp Minima(具體參考:論文https:///abs/1609.04836,On Large-Batch Training for Deep Learning: Generalization Gap and Sharp Minima)。 Tensorflow: https://www./api_docs/python/tf/train/exponential_decay Keras: https:///callbacks/#learningratescheduler。 5. 詳細(xì)記錄調(diào)試/調(diào)參數(shù)過程 可能這會兒換了一個learning rate,過會兒增大了dropout,過會兒又加了一個batch normalization,最后也不知道自己改了啥。
由于要實驗或者改的地方太多,通常就時不時忘記/不方便使用git了,而是copy一大堆名字相似的文件,這個時候,請千萬注意你的代碼結(jié)構(gòu)/命名規(guī)則,當(dāng)然使用好bash腳本將使用的參數(shù),訓(xùn)練過程一一存放起來也是不錯的選擇。
模型對數(shù)據(jù)/超參數(shù),甚至是隨機種子、GPU版本,tensorflow/pytorch版本,所以請盡可能記錄好每個部分,并且最好時刻可以復(fù)現(xiàn)。最后小時候?qū)W的控制變量法也很重要哦。 總結(jié) 將以上內(nèi)容做一個總結(jié):
參考文獻(xiàn): https:///checklist-for-debugging-neural-networks-d8b2a9434f21 |
|
|