RNN模型訓練經驗總結

2021-09-28 19:59:27 字數 2354 閱讀 4020

搭建模型

forward propagation設定

back propagation設定

避免出現nan的幾個方法

利用好過擬合。

其他經驗

技巧集錦

訓練神經網路前,別管**,先從預處理資料集開始。一定要認認真真先去了解資料的分布並找出其中的規律。在檢查資料的過程中,可能會發現重複的、標記錯誤的樣本,在早期發現這些錯誤都可以避免以後走彎路。

由於神經網路實際上是資料集的壓縮版本,因此您將能夠檢視網路(錯誤)**並了解它們的**。如果你的網路給你的**看起來與你在資料中看到的內容不一致,那麼就會有所收穫。

一旦從資料中發現規律,可以編寫一些**對他們進行搜尋、過濾、排序。把資料視覺化能幫助我們發現異常值,而異常值總能揭示資料的質量或預處理中的一些錯誤。

在資料集很大的情況下,建議先用 1/100、1/10 的資料跑一跑,對模型效能和訓練時間有個底,外推一下全量資料到底需要跑多久。在沒有足夠的信心前不做大規模實驗。

batchsize通常影響沒那麼大,除了特殊的演算法需要batch大一點。rnn模型如果不考慮時間,試一試 batch size=1。

如果初步訓練效果還不錯,就可以試一試增廣資料,但是增廣不能違反資料的基本規律,比如行人識別一般就不會加上下翻轉的,因為不會碰到頭朝下的情況。

處理完資料集,還是不要著急訓練模型,下一步應該做的是建立乙個完整的訓練+評估框架。

在這個階段,要選擇乙個簡單又不至於搞砸的模型,比如線性分類器、cnn,視覺化損失。獲得準確度等衡量模型的標準,用模型進行**。

常用的啟用函式有relu、leaky-relu、sigmoid、tanh等, cnn優選relu,rnn來說推薦: tanh=relu>other.

輸出層,多分類任務選用softmax輸出,二分類任務選用sigmoid輸出,回歸任務選用線性輸出。

中間隱層,則優先選擇relu啟用函式(relu啟用函式可以有效的解決sigmoid和tanh出現的梯度瀰散問題,多次實驗表明它會比其他啟用函式以更快的速度收斂)。

分類問題用dropout ,只需要最後一層softmax 前用基本就可以了,能夠防止過擬合,可能對accuracy提高不大,但是dropout 前面的那層如果是之後要使用的feature的話,效能會大大提公升。

rnn dropout一般在迴圈層以後加。一層迴圈層,乙個dropout層,如此疊加,或者1~2層迴圈層,加乙個dropout層,之後是輸出層。

learning rate 最重要,推薦了解 cosine learning rate 和 cyclic learning rate。

在確定初始學習率的時候,從乙個很小的值(例如 1e-7)開始,然後每一步指數增大學習率(例如擴大1.05 倍)進行訓練。訓練幾百步應該能觀察到損失函式隨訓練步數呈對勾形,選擇損失下降最快那一段的學習率即可。

首選adams。根據經驗,adam對超引數更加寬容,包括不良的學習率。

adam和l2正則結合可能會有很好的效果。

在設定基線的早期階段,使用學習率為1e-4的adam 。

rnn一定要設定 gradient clipping,如果不這樣做,就會導致訓練一段時間以後 loss 突然變成 nan。

對於語言模型或者機器翻譯, tying input & output embedding(就是詞向量層和輸出 softmax 前的矩陣共享引數,在語言模型或機器翻譯中常用)時學習率需要設定得非常小,不然容易 nan。

首先我們得有乙個足夠大的模型,它可以過擬合,減少訓練集上的損失,然後適當地調整它,放棄一些訓練集損失,改善在驗證集上的損失。

要有耐心!有些模型一定要訓練很久才會有比較好的結果,盡量不要在一開始覺得收斂不好就停了模型亂改引數。

能用經典模型就用經典模型,絕大多數情況自己設計的引數都不如教程和框架的預設引數好。除非對問題有獨到的間接,不要自己隨便設計新元件。

要學會利用tensorboard! 可以幫助監視網路狀態,調整網路引數。比如在學習率下降的一瞬間,通過tensorboard就會發現,網路會有個巨大的效能提公升,同樣的fine-tuning也要根據模型的效能設定合適的學習率,比如乙個訓練的已經非常好的模型你上來就1e-3的學習率,那之前就白訓練了,就是說網路效能越好,學習率要越小。

網路層數,參數量什麼的都不是大問題,在效能不丟的情況下,減到最小

一定要重視調引數的**/實驗報告,要認識到ai的理論基礎,特別還缺乏嚴密的數學證明這個事實,更類似於實驗科學。看**時務必注意超引數設定等細節。比如google著名的bert語言模型啟用函式用的是gelu,而不是transformer元**中的relu。

隨時儲存模型和**。每次執行之前都可以備份以下執行時呼叫的**檔案,以便以後檢視修改。隨時存檔模型,要有validation 。把每個epoch和其對應的validation 結果存下來,可以分析出開始overfitting的時間點,方便下次載入fine-tuning。

adaboost訓練之經驗總結

利用adaboost訓練的分類器做了幾個專案 當然在實際應用過程中,我對adaboos的原始碼做了優化和改善,同時我也用了深度學習 caffe做了類似的工作,綜合權衡演算法檢測率 演算法效率,在專案中採用的還是adaboost,後期我會花大量時間對caffe改進 優化 以下純為訓練前要注意的事項。0...

經驗總結 資料預處理經驗總結1

1.對於特徵較多的df,進行資料預處理時需要對每個特徵變數進行相關處理,為了避免混亂,可以df.info 後將輸出複製到sublime,然後在sublime中針對每個特徵變數進行處理方式標註 非python 只是為了展示在sublime中的效果 action type 30697 non null ...

C 經驗總結

1.標準庫的使用過程中,自己一定要注意,不能使用迭代器保留,因為新的stl中,加入了迭代器新的檢測機制,就是為了怕使用者使用的過程中自己將迭代器有意無意的引用了不存在的物件,因此這就要求我們的迭代器物件一定要在訪問的物件之前進行析購,否則你的程式將出錯。這個是c v8.0 中ms 加入新的安全機制,...