當前位置: 華文問答 > 數位

深度學習調參有哪些技巧?

2016-10-22數位

四年前寫的,好像RNN CNN啥的還能用。(如果覺得有用贊和關註幫點下,感謝)

  1. 不管什麽模型,先在一個較小的訓練集上train和test,看看它能不能過擬合。如果不能過擬合,可能是學習率太大,或者程式碼寫錯了。先調小學習率試一下,如果還不行就去檢查程式碼,先看dataloader輸出的數據對不對,再看模型每一步的size是否符合自己期待。
  2. 看train/eval的loss曲線,正常的情況應該是train loss呈log狀一直下降最後趨於穩定,eval loss開始時一直下降到某一個epoch之後開始趨於穩定或開始上升,這時候可以用early stopping保存eval loss最低的那個模型。如果loss曲線非常不正常,很有可能是數據處理出了問題,比如label對應錯了,回去檢查程式碼。
  3. 不要一開始就用大數據集,先在一個大概2w訓練集,2k測試集的小數據集上調參。
  4. 盡量不要自己從頭搭架子(新手和半新手)。找一個已經明確沒有bug能跑通的其它任務的架子,在它的基礎上修改。否則debug過程非常艱難,因為有時候是版本叠代產生的問題,修改起來很麻煩。
  5. 最佳化器優先用adam,學習率設1e-3或1e-4,再試Radam(LiyuanLucasLiu/RAdam)。不推薦sgdm,因為很慢。
  6. lrscheduler用torch.optim.lr_scheduler.CosineAnnealingLR,T_max設32或64,幾個任務上試效果都不錯。(用這個lr_scheduler加上adam系的optimizer基本就不用怎麽調學習率了)
  7. 有一些任務(尤其是有RNN的)要做梯度裁剪,torch.nn.utils.clip_grad_norm。
  8. 參數初始化,lstm的h用orthogonal,其它用he或xavier。
  9. 啟用函式用relu一般就夠了,也可以試試leaky relu。
  10. batchnorm和dropout可以試,放的位置很重要。優先嘗試放在最後輸出層之前,以及embedding層之後。RNN可以試layer_norm。有些任務上加了這些層可能會有負作用。
  11. metric learning中先試標label的分類方法。然後可以用triplet loss,margin這個參數的設定很重要。
  12. batchsize設定小一點通常會有一些提升,某些任務batchsize設成1有奇效。
  13. embedding層的embedsize可以小一些(64 or 128),之後LSTM或CNN的hiddensize要稍微大一些(256 or 512)。(ALBERT論文裏面大概也是這個意思)
  14. 模型方面,可以先用2或3層LSTM試一下,通常效果都不錯。
  15. weight decay可以試一下,我一般用1e-4。
  16. 有CNN的地方就用shortcut。CNN層數加到某一個值之後對結果影響就不大了,這個值作為參數可以調一下。
  17. GRU和LSTM在大部份任務上效果差不多。
  18. 看論文時候不要全信,能復現的盡量復現一下,許多論文都會做低baseline,但實際使用時很多baseline效果很不錯。
  19. 對於大多數任務,數據比模型重要。面對新任務時先分析數據,再根據數據設計模型,並決定各個參數。例如nlp有些任務中的padding長度,通常需要達到數據集的90%以上,可用pandas的describe函式進行分析。

LLM 論文list:https:// github.com/zepingyu0512 /awesome-llm-papers-interpretability