神经网络不学习的原因
Neural Network Check List
聲明:
?
- Neural Network Check List
- 如何使用這個(gè)指南
- 數(shù)據(jù)問題
- 檢查輸入數(shù)據(jù)
- 試一下隨機(jī)輸入
- 檢查數(shù)據(jù)加載單元
- 確保輸入和輸出是一一對(duì)應(yīng)的
- 輸入和輸出之間的關(guān)系映射的隨機(jī)性會(huì)不會(huì)太強(qiáng)了
- 數(shù)據(jù)集中的噪聲
- 打亂數(shù)據(jù)集
- 控制類別不平衡現(xiàn)象
- 會(huì)不會(huì)是訓(xùn)練數(shù)據(jù)不足
- 盡量你的訓(xùn)練批次中的樣本標(biāo)簽多樣化
- 減小batch size
- 嘗試經(jīng)典數(shù)據(jù)集MNISTCIFAR10
- 數(shù)據(jù)歸一化正則化
- 特征向量的標(biāo)準(zhǔn)化
- 過量的正則化
- 使用預(yù)訓(xùn)練網(wǎng)絡(luò)時(shí)注意數(shù)據(jù)處理方式
- 檢查訓(xùn)練驗(yàn)證測(cè)試集的預(yù)處理
- 網(wǎng)絡(luò)的構(gòu)建問題
- 先嘗試解決當(dāng)前問題的簡(jiǎn)單版本
- 搞定損失函數(shù)
- 檢查損失函數(shù)
- 核查損失函數(shù)的輸入
- 調(diào)整損失權(quán)重
- 注意其他的模型評(píng)價(jià)標(biāo)準(zhǔn)
- 測(cè)試自定義層
- 檢查frozen層和變量
- 增加網(wǎng)絡(luò)規(guī)模
- 檢測(cè)隱藏層的維度錯(cuò)誤
- 檢查梯度
- 訓(xùn)練問題
- 先處理小數(shù)據(jù)集
- 檢查權(quán)重初始化
- 調(diào)整超參數(shù)
- 減少正則化
- 多多迭代
- 注意訓(xùn)練和測(cè)試模式之間的切換
- 可視化訓(xùn)練過程
- 試一下不同的優(yōu)化算法
- 梯度爆炸和梯度彌散
- 調(diào)整學(xué)習(xí)率
- 空值問題
?
有一個(gè)訓(xùn)練了12個(gè)小時(shí)的神經(jīng)網(wǎng)絡(luò),各方面看起來都不錯(cuò):梯度緩慢下降、損失也在逐漸降低,但是預(yù)測(cè)結(jié)果卻不好:輸出全是0值(全都預(yù)測(cè)為背景),沒有檢測(cè)出任何標(biāo)簽。“到底是什么地方出錯(cuò)了?”——叫天天不應(yīng)叫地地不靈╮(╯▽╰)╭
對(duì)于上述情況,或者另一種垃圾輸出的情況——預(yù)測(cè)值只是所有標(biāo)簽的平均值,再或者更差的情況,模型準(zhǔn)確率非常低…我們應(yīng)該從什么地方開始檢查模型呢?
如何使用這個(gè)指南
網(wǎng)絡(luò)訓(xùn)練效果差,問題可能出在很多很多地方,但有些地方出問題的概率較大。所以,通常我會(huì)從以下幾點(diǎn)開始:
數(shù)據(jù)問題
1 檢查輸入數(shù)據(jù)
保證你提供給網(wǎng)絡(luò)的輸入數(shù)據(jù)是有意義的。比如:我有時(shí)候弄混了圖片的高和寬;或者不小心用全零的數(shù)據(jù)來訓(xùn)練網(wǎng)絡(luò);或者一直使用了同一個(gè)batch來不停的迭代訓(xùn)練。所以,你應(yīng)該打印一組(輸入,輸出)并確保它們沒有問題。
2 試一下隨機(jī)輸入
如果網(wǎng)絡(luò)對(duì)隨機(jī)輸入的預(yù)測(cè)結(jié)果跟之前真實(shí)數(shù)據(jù)的預(yù)測(cè)結(jié)果差不多,那多半是網(wǎng)絡(luò)某一層除了問題。這時(shí),你需要一層一層的debug自己的網(wǎng)絡(luò)。
3 檢查數(shù)據(jù)加載單元
可能你的數(shù)據(jù)集沒有問題,但是在數(shù)據(jù)的讀取和預(yù)處理中除了問題,所以要檢查網(wǎng)絡(luò)第一層的輸入。
4 確保輸入和輸出是一一對(duì)應(yīng)的
也就是說,訓(xùn)練集中的輸入不能(或者盡可能少的)有錯(cuò)誤的標(biāo)定。同時(shí)記得在打亂數(shù)據(jù)集的時(shí)候,輸入和輸出的打亂方式相同。
5 輸入和輸出之間的關(guān)系映射的隨機(jī)性會(huì)不會(huì)太強(qiáng)了?
用機(jī)器學(xué)習(xí)里的術(shù)語來說就是,y=f(x)y=f(x)中ff的假設(shè)空間(模型空間)太大了。
比如說股票數(shù)據(jù),想學(xué)習(xí)這個(gè)太難了。因?yàn)楣善钡碾S機(jī)性太大了,雖然通過數(shù)據(jù)獲得的股票走勢(shì)有一定的參考意義,但因?yàn)殡S機(jī)性大于數(shù)據(jù)內(nèi)部的規(guī)律,光憑數(shù)據(jù)很難做出正確的預(yù)測(cè)。
6 數(shù)據(jù)集中的噪聲
數(shù)據(jù)集不是完美的,比如對(duì)于MNIST手寫數(shù)字識(shí)別數(shù)據(jù)集來說,可能有50%的樣本時(shí)正確的可以學(xué)習(xí)的,而另外的50%的樣本亂標(biāo)定的噪聲,那么這些亂標(biāo)定的噪聲會(huì)干擾網(wǎng)絡(luò)的學(xué)習(xí),應(yīng)該實(shí)現(xiàn)被剔除。
當(dāng)用網(wǎng)上爬來的數(shù)據(jù)進(jìn)行機(jī)器學(xué)習(xí)或深度學(xué)習(xí)的時(shí)候,很容易出現(xiàn)這種問題。
7 打亂數(shù)據(jù)集
不打亂數(shù)據(jù)集的話,會(huì)導(dǎo)致網(wǎng)絡(luò)在學(xué)習(xí)過程中的偏向問題。
8 控制類別不平衡現(xiàn)象
對(duì)于類別不平衡的分類問題,常規(guī)武器有:過采樣、欠采樣(不太好用)、調(diào)整損失函數(shù)等。
9 會(huì)不會(huì)是訓(xùn)練數(shù)據(jù)不足?
小樣本學(xué)習(xí)時(shí)深度學(xué)習(xí)應(yīng)用的一個(gè)重要問題。常規(guī)武器有遷移學(xué)習(xí)和生成網(wǎng)絡(luò)(如GAN、VAE)法。如果是因?yàn)橛?xùn)練數(shù)據(jù)不足造成的網(wǎng)絡(luò)學(xué)習(xí)效果不好,那將需要很大的精力來解決這個(gè)問題。
10 盡量你的訓(xùn)練批次中的樣本標(biāo)簽多樣化
如果一個(gè)訓(xùn)練批次中只有一類的樣本,網(wǎng)絡(luò)將很難收斂到最優(yōu)。一般來說只要隨機(jī)打亂的訓(xùn)練集就不會(huì)出現(xiàn)這個(gè)問題。再保險(xiǎn)一點(diǎn)可以將batch_size搞大一點(diǎn),比如128,但不要太大。
我在實(shí)驗(yàn)中,就經(jīng)常會(huì)出現(xiàn)用同一數(shù)據(jù)集和網(wǎng)絡(luò)得到的準(zhǔn)確率忽高忽低,比如70%-90%。所以,時(shí)間允許的話,建議每次實(shí)驗(yàn)過程中多訓(xùn)練幾次。
11 減小batch size
(?◇?)?上面剛說batch size可以搞大一點(diǎn),這里又要調(diào)小????
研究表明:太大的batch size會(huì)降低模型的泛化能力。詳見論文——戳我跳轉(zhuǎn)
12 嘗試經(jīng)典數(shù)據(jù)集(MNIST,CIFAR10)
當(dāng)使用一種新型的網(wǎng)絡(luò)結(jié)構(gòu)式,應(yīng)該先用經(jīng)典數(shù)據(jù)集測(cè)試一下,而不是直接應(yīng)用于自己的真實(shí)數(shù)據(jù)。因?yàn)檫@些經(jīng)典數(shù)據(jù)集都有參考標(biāo)準(zhǔn)(baseline,或者說是準(zhǔn)確率的最低要求),而且沒有數(shù)據(jù)方面的問題(如噪聲、不平衡、隨機(jī)性過大導(dǎo)致難以學(xué)習(xí)的問題等等)
數(shù)據(jù)歸一化/正則化
13 特征向量的標(biāo)準(zhǔn)化
記得以下二選一:
- 標(biāo)準(zhǔn)化:均值為0方差為1
- 歸一化:數(shù)據(jù)大小位于0~1之間
14 過量的正則化
正則化可以防止模型過擬合,但過量的正則化會(huì)導(dǎo)致欠擬合。
15 使用預(yù)訓(xùn)練網(wǎng)絡(luò)時(shí)注意數(shù)據(jù)處理方式
預(yù)處理的方式要跟你加載的預(yù)訓(xùn)練的網(wǎng)絡(luò)一致,比如圖片像素的大小是[0, 1], [-1, 1]還是[0, 255]?
16 檢查訓(xùn)練/驗(yàn)證/測(cè)試集的預(yù)處理
引用斯坦福課程CS231n:
… any preprocessing statistics (e.g. the data mean) must only be computed on the training data, and then applied to the validation/test data. E.g. computing the mean and subtracting it from every image across the entire dataset and then splitting the data into train/val/test splits would be a mistake.
也就是說,預(yù)處理方法下面二選一:
- 先對(duì)訓(xùn)練集預(yù)處理,再將該預(yù)處理函數(shù)應(yīng)用到驗(yàn)證/測(cè)試集中。
- 對(duì)全部數(shù)據(jù)做預(yù)處理,再將全部數(shù)據(jù)集合劃分為訓(xùn)練/驗(yàn)證/測(cè)試集。
網(wǎng)絡(luò)的構(gòu)建問題
17 先嘗試解決當(dāng)前問題的簡(jiǎn)單版本
比如說,如果目標(biāo)輸出是object class and coordinates, 先試一下解決object class。
18 搞定損失函數(shù)
引用斯坦福課程CS231n:
Initialize with small parameters, without regularization. For example, if we have 10 classes, at chance means we will get the correct class 10% of the time, and the Softmax loss is the negative log probability of the correct class so: -ln(0.1) = 2.302.
損失函數(shù)一般包括兩部分:誤分類的懲罰項(xiàng)和正則化項(xiàng)。我們應(yīng)該先根據(jù)問題選擇合適的懲罰項(xiàng),然后在嘗試正則化項(xiàng)
19 檢查損失函數(shù)
如果你自定義了損失函數(shù),一定要檢查它,還要進(jìn)行單元測(cè)試。因?yàn)樽远x的損失函數(shù)經(jīng)常會(huì)有細(xì)小的錯(cuò)誤,導(dǎo)致網(wǎng)絡(luò)出現(xiàn)學(xué)習(xí)問題,而且這通常很難發(fā)現(xiàn)。
20 核查損失函數(shù)的輸入
使用神經(jīng)網(wǎng)絡(luò)框架中的損失函數(shù)時(shí),一定要注意損失函數(shù)的輸入。比如,在PyTorch中,我經(jīng)常會(huì)弄混NLLLoss和CrossENtropyLoss,前者的輸入是一個(gè)softmax輸入(即在0到1之間),而后者不是。
21 調(diào)整損失權(quán)重
如果你的損失函數(shù)由多個(gè)子損失加權(quán)而成,那就要注意它們的關(guān)聯(lián)關(guān)系和權(quán)重。
22 注意其他的模型評(píng)價(jià)標(biāo)準(zhǔn)
有時(shí)候,損失函數(shù)的值并不是評(píng)價(jià)網(wǎng)絡(luò)訓(xùn)練好壞的最好方式。如果可以的話,可以使用其他的評(píng)價(jià)標(biāo)準(zhǔn),如準(zhǔn)確率。
23 測(cè)試自定義層
如果網(wǎng)絡(luò)中有你自定義的網(wǎng)絡(luò)層,多檢查幾遍…
24 檢查frozen層和變量
可能你無意間關(guān)閉了某些層的權(quán)重更新。
25 增加網(wǎng)絡(luò)規(guī)模
有時(shí)候網(wǎng)絡(luò)訓(xùn)練效果不好是因?yàn)榫W(wǎng)絡(luò)的容量太小,增加全連接層數(shù)或隱藏層神經(jīng)元數(shù)目。
26 檢測(cè)隱藏層的維度錯(cuò)誤
如果你的輸入數(shù)據(jù)維度(k, H, W) = (64, 64, 64),那確實(shí)很容易在維度上弄混。如果不放心維度上的問題,可義用幾個(gè)容易分辨的數(shù)值試一下,檢查一下它們?cè)诟鱾€(gè)網(wǎng)絡(luò)層中傳遞時(shí)的變化。不過這里一般不會(huì)出問題。
27 檢查梯度
如果反向傳遞的求導(dǎo)是你自己算的,確實(shí)需要反復(fù)檢查。
訓(xùn)練問題
28 先處理小數(shù)據(jù)集
從當(dāng)前數(shù)據(jù)集中選擇極其少量的數(shù)據(jù),用自己的網(wǎng)絡(luò)模型過擬合這些數(shù)據(jù),確定網(wǎng)絡(luò)沒有問題。
例如,先用2個(gè)樣本訓(xùn)練,觀察你的網(wǎng)絡(luò)能否學(xué)到這兩個(gè)樣本之間的不同,然后逐步擴(kuò)展到更多數(shù)據(jù)。
29 檢查權(quán)重初始化
保險(xiǎn)起見,可以使用Xavier或He初始化。有時(shí)候,不好的初始化確實(shí)會(huì)是網(wǎng)絡(luò)的學(xué)習(xí)陷入一個(gè)局部最優(yōu)解,所以也可以試一下其他的初始化方法,看看是否有用。
30 調(diào)整超參數(shù)
超參數(shù)的最優(yōu)值可以通過經(jīng)驗(yàn)或多次實(shí)驗(yàn)獲得。如果時(shí)間允許的話,還可以通過交叉驗(yàn)證選擇最優(yōu)超參數(shù)。
31 減少正則化
過多的正則化會(huì)導(dǎo)致網(wǎng)絡(luò)欠擬合。Dropout,?batchnormalization, L2正則化作為正則化手段,當(dāng)網(wǎng)絡(luò)欠擬合時(shí)候應(yīng)該先去掉這些方法。
32 多多迭代
可能你的網(wǎng)絡(luò)需要更多的迭代次數(shù)才能獲得有意義的預(yù)測(cè)。如果網(wǎng)絡(luò)的損失函數(shù)值還在下降,務(wù)必讓它繼續(xù)迭代下去;如果網(wǎng)絡(luò)的損失函數(shù)不再下降,也應(yīng)該繼續(xù)觀察幾輪確保訓(xùn)練沒有卡在局部最小點(diǎn)。
33 注意訓(xùn)練和測(cè)試模式之間的切換
有些網(wǎng)絡(luò)層如BatchNormalization和Dropout層在訓(xùn)練模式和測(cè)試模式下是不一樣的。
34 可視化訓(xùn)練過程
- 監(jiān)視每一層的權(quán)重和輸出,確保激活函數(shù)和每一層的權(quán)重更新正常。
- 可以使用Tensorboard或Crayon等可視化庫
- 如果有一層激活函數(shù)后的平均值遠(yuǎn)大于0,可以嘗試BatchNormalization或ELU激活函數(shù)
- 權(quán)重和偏執(zhí)的數(shù)值分布:權(quán)重應(yīng)該近似服從標(biāo)準(zhǔn)高斯分布,偏執(zhí)應(yīng)該從0開始逐漸過渡到近似高斯分布(除了個(gè)別網(wǎng)絡(luò)外,如LSTM)。也就是說權(quán)重的正負(fù)分布應(yīng)該相似,偏執(zhí)一般不會(huì)過大,要不然可能就是網(wǎng)絡(luò)的訓(xùn)練除了問題。
For weights, these histograms should have an approximately Gaussian (normal) distribution, after some time. For biases, these histograms will generally start at 0, and will usually end up being approximately Gaussian (One exception to this is for LSTM). Keep an eye out for parameters that are diverging to +/- infinity. Keep an eye out for biases that become very large. This can sometimes occur in the output layer for classification if the distribution of classes is very imbalanced
35 試一下不同的優(yōu)化算法
一般來說優(yōu)化器的選擇不會(huì)導(dǎo)致網(wǎng)絡(luò)訓(xùn)練的結(jié)果太差,除非你選擇的優(yōu)化器超參數(shù)太糟了。當(dāng)然,合適的優(yōu)化器可以是網(wǎng)絡(luò)訓(xùn)練的更快。常用的優(yōu)化器有Adam,SGD,?RMSprop。
36 梯度爆炸和梯度彌散
梯度爆炸和梯度彌散產(chǎn)生的根本原因是深度學(xué)習(xí)中多層梯度累積。如1.1的n次方無窮大,0.9的n次方無窮小。
- 網(wǎng)絡(luò)中某些層過大的輸出會(huì)造成梯度爆炸,此時(shí)應(yīng)該為該輸出取一個(gè)上界。
- 激活函數(shù)的梯度應(yīng)該在0.5到2之間。
37 調(diào)整學(xué)習(xí)率
學(xué)習(xí)率決定了網(wǎng)絡(luò)訓(xùn)練的速度,但學(xué)習(xí)率不是越大越好,當(dāng)網(wǎng)絡(luò)趨近于收斂時(shí)應(yīng)該選擇較小的學(xué)習(xí)率來保證找到更好的最優(yōu)點(diǎn)。
一般學(xué)習(xí)率的調(diào)整是乘以/除以10的倍數(shù)。
空值問題
首先訓(xùn)練集中不能有空值!!其次,網(wǎng)絡(luò)訓(xùn)練過程中也不能出現(xiàn)空值,幾點(diǎn)建議:
- 降低學(xué)習(xí)率,尤其是在前100次迭代中出現(xiàn)了NAN
- 分母上的空值或者非正數(shù)的對(duì)數(shù)會(huì)導(dǎo)致NAN出現(xiàn)
- 一層一層的檢查空值是否出現(xiàn),比如通過Python中的assert
總結(jié)
以上是生活随笔為你收集整理的神经网络不学习的原因的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: java HashMap问题
- 下一篇: 通过组策略找回“网上邻居”