Andrej Karpathy提到的神經網路六大坑
來自專欄機器學習演算法與自然語言處理501 人贊了文章
最近,李飛飛老師得意門生Andrej Karpathy大神在推特上連發幾條twitter,細數了六種神經網路研究中的常見錯誤。
下面我總結一下我學習過程中遇到下面6條中的4條。
1、you didnt try to overfit a single batch first
正確解釋@張楠 這句話是說在用大數據集訓練之前先用小數據集試一下,排除一些明顯的錯誤。
之前的我誤解的解釋如下:
沒有先試過所有訓練數據作為一個大batch訓練,我們都知道,在訓練神經網路的過程中,對於數據會有三個方法處理,一個是min-batch,一個是SGD,一個是Andrej Karpathy提到的所有數據作為一個batch。雖然將所有訓練數據作為一個大batch訓練能夠保證梯度是往正確的方向移動,但是我們絕大部分都是min-batch,然後調節其中的batch-size這個超參數,我個人也沒有嘗試過將所有訓練數據作為一個大batch訓練,之後可以試試。(這裡額外說一句,batch-size是很重要的超參數,需要仔細調節)
2、you forgot to toggle train/eval mode for the net
忘了為網路切換訓練/評估模式
這個理由主要是針對model 在訓練時和評價時不同的 Batch Normalization 和 Dropout 方法模式。
3、you forgot to .zero_grad()(in pytorch) before .backward()
忘了在.backward()之前.zero_grad()(在pytorch中)這個錯誤我真正碰到過,忘記了寫.zero_grad()各種nan,導致結果非常差,最後找了一天才找到。大家可以在實在找不到原因的是,列印梯度出來看看,是不是有某些層參數為0,幾乎沒有學習,有些為nan了,去逐步找原因。
4、you passed softmaxed ouputs to a loss that expects raw logits
將softmaxed輸出傳遞給損失函數,本來期望是logits值,而不是過了softmax之後的值。大白話講就是給函數傳進去的參數錯啦!!我們在編寫代碼的時候很容易犯這種錯誤,因為最後run起來的時候,它不報錯啊,哥,不報錯,只是結果很差,這很難受啊,我們很難發現錯誤,第一感覺,我去,idea不work,所以大家效果不好的時候,不要放棄啊,仔細看看有沒有常見的bug!!
5、使用BatchNorm時,您沒有對線性/ 二維卷積層使用bias = False,或者反過來忘記將其包含在輸出層中。 這個倒不會讓你失敗,但它們是虛假的參數
答案來自@陳明jian 如果卷積層後面跟著BatchNormalization的話,卷積層就不需要偏置參數b,只需要w參數。
6、以為view()和permute()是一樣的事情(不正確地使用view)
答案來自@深度學習修汽車 舉例說明:比如要將一個(2, 12)的tensor改為(4, 2, 3)的tensor。這樣就不能直接用view而需要多次用permute()來交換axis(轉置2D的matrix)來達到目的。
tc.manual_seed(1)x = tc.randn(2, 12)print(x)y = x.permute(1, 0)print(y)z = y.view(4, 3, 2)print(z)a = z.permute(0, 2, 1)print(a)
大家可以踴躍討論。
推薦閱讀:
TAG:深度學習DeepLearning | 機器學習 | 神經網路 |