深度學習模型訓練全流程!

文章推薦指數: 80 %
投票人數:10人

深度學習模型訓練全流程! 語言: CN / TW / HK. 時間 2020-06-11 20:03:02 Datawhale. 主題: 深度學習. ↑↑↑關注後" 星標 "Datawhale. 每日干貨& 每月組隊學習 ,不 ... MdEditor 深度學習模型訓練全流程! 語言:CN/TW/HK 時間 2020-06-1120:03:02 Datawhale 主題: 深度學習 ↑↑↑關注後" 星標 "Datawhale 每日干貨&  每月組隊學習 ,不錯過 Datawhale乾貨  作者:黃星源、奉現,Datawhale優秀學習者 本文 從構建資料驗證集、模型訓練、模型載入和模型調參四個部分對深度學習中模型訓練的全流程進行講解。

一個成熟合格的深度學習訓練流程至少具備以下功能:在訓練集上進行訓練;在驗證集上進行驗證;模型可以儲存最優的權重,並讀取權重;記錄下訓練集和驗證集的精度,便於調參。

本文CNN模型構建參考: https://mp.weixin.qq.com/s/JhFun5I_8Kjkbz6S4613Xw 資料及背景 https://tianchi.aliyun.com/competition/entrance/531795/introduction(阿里天池-零基礎入門CV賽事) 構建驗證集 在機器學習模型(特別是深度學習模型)的訓練過程中,模型是非常容易過擬合的。

深度學習模型在不斷的訓練過程中訓練誤差會逐漸降低,但測試誤差的走勢則不一定。

在模型的訓練過程中,模型只能利用訓練資料來進行訓練,並不能接觸到測試集上的樣本,故需要構建驗證資料集對模型進行驗證。

過擬合與欠擬合 擬合(Fitting) :就是說這個曲線能不能很好的描述某些樣本,並且有比較好的泛化能力。

過擬合(Overfitting) :模型把資料學習的太徹底,以至於把噪聲資料的特徵也學習到了,這樣就會導致在後期測試的時候不能夠很好地識別資料,即不能正確的分類,模型泛化能力太差。

欠擬合(UnderFitting) :模型沒有很好地捕捉到資料特徵,不能夠很好地擬合數據,或者是模型過於簡單無法擬合或區分樣本。

防止過擬合方法 正則化方法 。

正則化方法包括L0正則、L1正則和L2正則,而正則一般是在目標函式之後加上對於的範數。

但是在機器學習中一般使用L2正則。

資料增強 (Dataaugmentation),增大資料的訓練量,還有一個原因就是我們用於訓練的資料量太小導致的,訓練資料佔總資料的比例過小。

重新清洗資料 ,導致過擬合的一個原因也有可能是資料不純導致的,如果出現了過擬合就需要我們重新清洗資料。

提前終止法 (Earlystopping),對模型進行訓練的過程即是對模型的引數進行學習更新的過程,這個引數學習的過程往往會用到一些迭代方法,如梯度下降(Gradientdescent)學習演算法。

提前終止法便是一種迭代次數截斷的方法來防止過擬合的方法,即在模型對訓練資料集迭代收斂之前停止迭代來防止過擬合。

丟棄法 (Dropout)。

這個方法在神經網路裡面很常用。

丟棄法是ImageNet中提出的一種方法,通俗一點講就是丟棄法在訓練的時候讓神經元以一定的概率不工作。

具體看下圖: 左側為全連線網路,右側的網路以0.5的概率丟棄神經元。

輸出層並沒有應用Dropout 方法1:L1正則化 在原始的代價函式後面加上一個L1正則化項,即全部權重 的絕對值的和,再乘以 (這裡不像L2正則化項那樣,須要再乘以1/2)。

先計算導數: 上式中 表示 的符號,那麼權重w的更新規則為: 比原始的更新規則多出了 這一項。

當為正時,,則更新後的變小; 當 為負時, >0,則更新後的 變大——因此它的效果就是讓 往0靠,使網路中的權重儘可能為0,也就相當於減小了網路複雜度,防止過擬合。

另外,上面沒有提到一個問題,當為0時怎麼辦?當等於0時,是不可導的。

所以我們僅僅能依照原始的未經正則化的方法去更新,這就相當於去掉這一項,所以我們能夠規定,這樣就把的情況也統一進來了。

(程式設計時,令 方法2:L2正則化(權重衰減) L2正則化就是在代價函式後面再加上一個正則化項: 前一項代表原始的代價函式,後面那一項就是L2正則化項。

它是這樣來的:全部引數 的 平方和,除以訓練集的樣本大小n。

就是正則項係數,權衡正則項與項的比重。

另外另一個係數1/2,1/2經常會看到,主要是為了後面求導的結果方便,後面那一項求導會產生一個2,與1/2相乘剛好湊整。

L2正則化項是怎麼避免過擬合的呢?我們推導一下看看,先求導: 能 夠 發現L2正則化項對b的更新沒有影響,可是對於w的更新有影響: 在不使用L2正則化時。

求導結果中前係數為1,經變化後前面係數為,由於都是正的。

所以小於1,它的效果是減小,這也就是權重衰減(weightdecay)的由來。

當然考慮到後面的導數項,終於的值可能增大也可能減小。

另外,必須提一下,對於基於mini-batch的隨機梯度下降,w和b更新的公式跟上面給出的有點不同: 對照上面引數 的更新公式。

能夠發現後面那一項變了,變成全部導數加和,乘以 再除以 , 是一個mini-batch中樣本的個數。

在此我們僅僅是解釋了L2正則化項有讓“變小”的效果,可是還沒解釋為什麼“變小”能夠防過擬合? 一個所謂“顯而易見”的解釋就是:更小的權值,從某種意義上說,表示網路的複雜度更低,對資料的擬合剛剛好(這個法則也叫做奧卡姆剃刀),而在實際應用中,也驗證了這一點,L2正則化的效果往往好於未經正則化的效果。

當然,對於非常多人(包含我)來說,這個解釋似乎不那麼顯而易見,所以這裡加入一個略微數學一點的解釋(引自知乎): 過擬合的時候,擬合函式的係數往往非常大,為什麼?過擬合,就是擬合函式須要顧忌每個點。

終於形成的擬合函式波動非常大。

在某些非常小的區間裡,函式值的變化非常劇烈。

這就意味著函式在某些小區間裡的導數值(絕對值)非常大,由於自變數值可大可小,所以僅僅有係數足夠大,才幹保證導數值非常大。

而L2正則化是通過約束引數的範數使其不要太大,所以能夠在一定程度上降低過擬合情況。

方法3:資料增強(Dataaugmentation) 在深度學習方法中,海量的訓練資料,意味著能夠用更深的網路,訓練出更好的模型。

所以,能夠在原始資料上做些改動,得到很多其它的資料,以圖片資料集舉例,能夠做各種變換,如: 將原始圖片旋轉一個小角度 加入隨機噪聲 一些有彈性的畸變(elasticdistortions),論文《Bestpracticesforconvolutionalneuralnetworksappliedtovisualdocumentanalysis》對MNIST做了各種變種擴增。

擷取(crop)原始圖片的一部分,比方DeepID中,從一副人臉圖中,截取出了100個小patch作為訓練資料,極大地添加了資料集。

方法4:提前終止法(Earlystopping) 對模型進行訓練的過程即是對模型的引數進行學習更新的過程,這個引數學習的過程往往會用到一些迭代方法,如梯度下降(Gradientdescent)學習演算法。

提前終止法便是一種迭代次數截斷的方法來防止過擬合的方法,即在模型對訓練資料集迭代收斂之前停止迭代來防止過擬合。

提前終止法的具體做法是,在每一個Epoch結束時(一個Epoch集為對所有的訓練資料的一輪遍歷)計算驗證集的正確率,當正確率不再提高時,就停止訓練。

這種做法很符合直觀感受,因為正確率都不再提高了,在繼續訓練也是無益的,只會提高訓練的時間。

那麼該做法的一個重點便是怎樣才認為驗證集正確率不再提高了呢?並不是說驗證集正確率一降下來便認為不再提高了,因為可能經過這個Epoch後,正確率降低了,但是隨後的Epoch又讓正確率又上去了,所以不能根據一兩次的連續降低就判斷不再提高。

一般的做法是,在訓練的過程中,記錄到目前為止最好的驗證集正確率,當連續10次Epoch(或者更多次)沒達到最佳正確率時,則可以認為正確率不再提高了。

此時便可以停止迭代了(EarlyStopping)。

這種策略也稱為“No-improvement-in-n”,n即Epoch的次數,可以根據實際情況取。

方法5:丟棄法(Dropout) L1、L2正則化是通過改動代價函式來實現的,而丟棄法則是通過改動神經網路本身來實現的,它是在訓練網路時用的一種技巧(trike),它的流程例如以下: 假設我們要訓練上圖這個網路,在訓練開始時,我們隨機地“刪除”一部分的隱層單元,視它們為不存在。

保持輸入輸出層不變,如上圖所示,依照BP演算法更新上圖神經網路中的權值(虛線連線的單元不更新,由於它們被“暫時刪除”了)。

以上就是一次迭代的過程,在第二次迭代中,也用相同的方法,僅僅只是這次刪除的那一部分隱層單元,跟上一次刪除掉的肯定是不一樣的。

我們每一次迭代都是“隨機”地去刪掉一部分,直至訓練結束。

以上就是丟棄法t,它為什麼有助於防止過擬合呢?能夠簡單地這樣解釋,運用了丟棄法的訓練過程,相當於訓練了非常多個僅僅有部分隱層單元的神經網路,每個這種半數網路,都能夠給出一個分類結果,這些結果有的是正確的,有的是錯誤的。

隨著訓練的進行,大部分半數網路都能夠給出正確的分類結果。

那麼少數的錯誤分類結果就不會對終於結果造成大的影響。

刪除神經單元,不工作,通常keep_prob取0.5,在程式設計時可以利用TensorFlow中DropoutWrappera函式。

在訓練過程引入丟棄策略,其Dropout層保留節點比例(keep_prob),每批資料輸入時神經網路中的每個單元會以1-keep_prob的概率不工作,防止過擬合。

lstmCell=tf.contrib.rnn.DropoutWrapper(cell=lstmCell,output_keep_prob=0.5) 防止欠擬合方法 新增其他特徵項 ,有時候我們模型出現欠擬合的時候是因為特徵項不夠導致的,可以新增其他特徵項來很好地解決。

例如,“組合”、“泛化”、“相關性”三類特徵是特徵新增的重要手段,無論在什麼場景,都可以照葫蘆畫瓢,總會得到意想不到的效果。

除上面的特徵之外,“上下文特徵”、“平臺特徵”等等,都可以作為特徵新增的首選項。

新增多項式特徵 ,這個在機器學習演算法裡面用的很普遍,例如將線性模型通過新增二次項或者三次項使模型泛化能力更強。

例如上面的圖片的例子。

減少正則化引數 ,正則化的目的是用來防止過擬合的,但是現在模型出現了欠擬合,則需要減少正則化引數。

資料集劃分 訓練集(TrainSet):模型用於訓練和調整模型引數。

驗證集(ValidationSet):用來驗證模型精度和調整模型超引數。

測試集(TestSet):驗證模型的泛化能力。

因為訓練集和驗證集是分開的,所以模型在驗證集上面的精度在一定程度上可以反映模型的泛化能力。

在劃分驗證集的時候,需要注意驗證集的分佈應該與測試集儘量保持一致,不然模型在驗證集上的精度就失去了指導意義。

既然驗證集這麼重要,那麼如何劃分本地驗證集呢。

在一些比賽中,賽題方會給定驗證集;如果賽題方沒有給定驗證集,那麼參賽選手就需要從訓練集中拆分一部分得到驗證集。

驗證集的劃分有如下幾種方式: 留出法(Hold-Out) 直接將訓練集劃分成兩部分,新的訓練集和驗證集。

這種劃分方式的優點是最為直接簡單;缺點是隻得到了一份驗證集,有可能導致模型在驗證集上過擬合。

留出法應用場景是資料量比較大的情況。

交叉驗證法(CrossValidation,CV) 將訓練集劃分成K份,將其中的K-1份作為訓練集,剩餘的1份作為驗證集,迴圈K訓練。

這種劃分方式是所有的訓練集都是驗證集,最終模型驗證精度是K份平均得到。

這種方式的優點是驗證集精度比較可靠,訓練K次可以得到K個有多樣性差異的模型;CV驗證的缺點是需要訓練K次,不適合資料量很大的情況。

自助取樣法(BootStrap) 通過有放回的取樣方式得到新的訓練集和驗證集,每次的訓練集和驗證集都是有區別的。

這種劃分方式一般適用於資料量較小的情況。

這些劃分方法是從資料劃分方式的角度來講的,在現有的資料比賽中一般採用留出法和交叉驗證法。

如果資料量比較大,留出法還是比較合適的。

當然任何的驗證集劃分得到的驗證集都是要保證訓練集-驗證集-測試集的分佈一致,所以如果不管劃分何種的劃分方式都是需要注意的。

(這裡的分佈一般指的是與標籤相關的統計分佈,如果標籤是帶有時序資訊,則驗證集和測試集的時間間隔應該保持一致。

) 模型訓練和驗證 訓練神經網路的流程 1.好好檢查資料 訓練神經網路的第一步是完全不接觸任何神經網路程式碼,而是從徹底檢查資料開始。

此步驟至關重要。

花時間去檢查資料是一件比較重要的工作。

因為資料中往往可能存在異常值,而且瞭解它們的分佈可以有利於我們找到一個更好的模型。

2.評估框架並得到一個並不完美的baseline 此階段的提示和技巧: 固定隨機種子:始終使用固定的隨機種子來確保兩次執行程式碼時您將獲得相同的結果。

簡化:在此階段,請務必關閉任何資料擴充功能。

資料擴充是我們稍後可能會採用的一種正則化策略,但是目前這只是引入一種錯誤的嘗試。

驗證損失:驗證您的損失是否從正確的損失值開始。

設定一個好的初始化 人類基線:監控除損失之外的指標,這些指標是人類可以解釋和檢查的(例如準確性)。

儘可能評估自己(人類)的準確性並與之進行比較。

視覺化預測動態。

我喜歡在培訓過程中視覺化固定測試批次上的模型預測。

這些預測如何運動的“動力”將使您對培訓的進行方式有非常好的直覺。

如果網路以某種方式過度擺動,可能會感覺網路“努力”以適應您的資料,這表明不穩定。

抖動量也很容易注意到非常低或非常高的學習率。

3.過度擬合 找到一個好的模型的方法有兩個階段:首先獲得一個足夠大的模型以使其可以過度擬合(即專注於訓練損失),然後適當地對其進行正則化(放棄一些訓練損失以提高驗證損失)。

此階段的一些提示和技巧: 選擇模型:為了減少訓練損失,您需要為資料選擇合適的體系結構。

Adam是安全的。

在設定基準的早期階段,我喜歡以3e-4的學習率使用Adam。

以我的經驗,亞當更寬容超引數,包括不良的學習速度。

對於ConvNets,調整良好的SGD幾乎總是比Adam稍勝一籌,但是最佳學習率區域要狹窄得多且針對特定問題。

一次只使一個複雜化。

如果您有多個訊號要插入您的分類器,我建議您將它們一個接一個地插入,並每次確保獲得預期的效能提升。

不要相信學習率衰減的預設值。

如果您要重新使用其他領域的程式碼,請務必小心學習率。

4.正則化 此階段的一些提示和技巧: 獲取更多資料 資料擴充 創意增強:如果半假資料沒有做到這一點,偽造資料也可能會有所作為。

人們正在尋找擴充套件資料集的創新方法。

例如,領域隨機化,模擬的使用,巧妙的混合,例如將(潛在模擬的)資料插入場景,甚至GAN。

使用預訓練網路 堅持監督學習 減小輸入維數 減小模型尺寸 減小批量大小 Dropout 提早停止訓練。

根據您測得的驗證損失提前停止訓練,以在模型快要過擬合的時候捕獲模型。

嘗試更大的模型。

大型模型大多數最終會過擬合,但是它們的“早期停止”效能通常會比小型模型好得多。

5.微調 此階段的一些提示和技巧: 隨機網格搜尋 超引數優化 6.進一步提高精確率 模型整合 本節目標是使用Pytorch來完成CNN(卷積神經網路)的訓練和驗證過程,CNN網路結構。

需要完成的邏輯結構如下: 構造訓練集和驗證集; 每輪進行訓練和驗證,並根據最優驗證集精度儲存模型。

#將自定義的Dataset封裝成一個BatchSize大小的Tensor,用於後面的訓練。

#訓練集封裝批量處理資料train_loader=torch.utils.data.DataLoader(train_dataset,#資料載入batch_size=10,#批處理大小設定shuffle=True,#是否進項洗牌操作num_workers=10,#是否進行多程序載入資料設定)#驗證集封裝val_loader=torch.utils.data.DataLoader(val_dataset,batch_size=10,shuffle=False,num_workers=10,)model=SVHN_Model1()criterion=nn.CrossEntropyLoss(size_average=False)#計算交叉熵(交叉熵損失函式optimizer=torch.optim.Adam(model.parameters())#Adam優化演算法best_loss=1000.0forepochinrange(20):train(train_loader,model,criterion,optimizer,epoch)val_loss=validate(val_loader,model,criterion)#儲存驗證集精度ifval_loss>>your_data=#plugyourawesomedatasethere>>>model=SuperCrossValidator(SuperDuper.fit,your_data,ResNet50,SGDOptimizer)#conquerworldhere 比如說,以上程式碼給人一種假象,即只通過一行程式碼就可以完成對神經網路的訓練。

但事實上神經網路的訓練是一件很複雜的事情。

如果您堅持使用該技術而不瞭解其工作原理,則很可能會失敗。

2.神經網路的訓練不知道怎麼的就失敗了 當你錯誤配置程式碼時,通常會遇到某種異常:插入了一個整數,該整數應為字串;該函式僅需要3個引數;匯入失敗;該金鑰不存在;兩個列表中的元素數量不相等。

此外,通常可以為某些功能建立單元測試。

這只是訓練神經網路的開始。

可能在語法上,所有內容都是正確的,但還是會訓練失敗,而且也很難看出來到底哪裡錯了。

例如,也許在資料增強過程中左右翻轉影象時忘記了翻轉標籤。

網路仍然可以工作良好,因為網路可以在內部學習檢測翻轉的影象,然後左右翻轉預測;也許由於一個錯誤,自迴歸模型意外地將它試圖預測的東西作為輸入;或者,嘗試修剪漸變,但修剪了損失,導致在訓練過程中忽略了異常示例;或者,從預先訓練的檢查點初始化了權重,但未使用原始均值;或者,只是搞砸了正則化強度,學習率,其衰減率,模型大小等設定。

在大多數情況下,它會訓練,但默默地工作會更糟。

訓練神經網路的快速而暴力的方法行不通,這往往會令人感到難受。

事實上,使得神經網路正常工作本身就是一件比較困難的事情,可以通過縝密的思考,提高警惕,利用視覺化幫助我們訓練神經網路。

延伸閱讀: 書籍:《深度實踐OCR:基於深度學習的文字識別》 作者: 劉樹春阿里巴巴本地生活研究院演算法專家,前復旦七牛雲聯合實驗室OCR演算法負責人 本文電子版教程後臺回覆  模型訓練  下載 :point_down:點選 閱讀原文 ,學習實踐 「其他文章」 發了6篇SCI的師兄告訴我的祕密:科研工具推薦合集! 周志華:“資料、演算法、算力”人工智慧三要素,在未來要加上“知識”! 我的機器學習之路! 廈門大學厲行:從金融專業到永安期貨研究中心! 一場冠軍兩場Top,我的CCF比賽總結! 稱霸Kaggle的十大深度學習技巧! 時間序列預測一定需要深度學習模型嗎? 機器學習模型融合大法! 最新開源的目標檢測演算法來了! 上海交大ACM班俞勇團隊出新書了! worklifebalance 連續舉辦四屆,最熱門的NLP賽事來了! 資料專案總結--深圳租房資料分析! 我用2年時間從財務到資料分析師! 人工智慧的學習經驗總結! 尹伊:我的學習成長路徑 用機器學習神器sklearn做特徵工程! 我的Pandas學習經歷及動手實踐 我的機器學習入門清單及路線! 機器學習必知必會10大演算法! 「深度學習」 最優的純文字模型?GPT-4蓄勢待發 斯坦福NLP課程|第20講-NLP與深度學習的未來 CUDA優化之PReLU效能調優 致初學者的深度學習入門系列(五)——深度學習影象分割篇 致初學者的深度學習入門系列(三)——深度學習目標檢測篇(上) TVM加速模型,優化推斷 深度小例子程式碼學習深度學習好幫手 深度學習3使用keras進行遷移學習 手把手推導BackPropagation 沙利文:百度飛槳位居2021中國深度學習框架綜合競爭力第一



請為這篇文章評分?