神经网络不收敛的 11 个原因及其解决办法
原文:http://theorangeduck.com/page/neural-network-not-working
原文標(biāo)題:My Neural Network isn’t working! What should I do?
譯文作者:kbsc13
聯(lián)系方式:
Github:https://github.com/ccc013
知乎專欄:機(jī)器學(xué)習(xí)與計(jì)算機(jī)視覺,AI 論文筆記
微信公眾號:AI 算法筆記
前言
如果你的神經(jīng)網(wǎng)絡(luò)不收斂,應(yīng)該怎么辦呢?一般來說,神經(jīng)網(wǎng)絡(luò)不收斂的原因有以下 11 種原因:
接下來將一一解釋以上11 種原因并給出對應(yīng)的解決辦法;
1. 忘記對你的數(shù)據(jù)進(jìn)行歸一化
問題描述
在神經(jīng)網(wǎng)絡(luò)訓(xùn)練中,如何對你的數(shù)據(jù)進(jìn)行歸一化是非常重要的。這是一個不能省略的步驟,幾乎不可能在不進(jìn)行歸一化的前提下可以訓(xùn)練得到一個很好的網(wǎng)絡(luò)模型。不過正因?yàn)檫@個步驟非常重要,而且在深度學(xué)習(xí)社區(qū)也很有名,所以很少人會提到它,但是對于初學(xué)者則是可能會犯下的一個錯誤。
原因
我們需要對數(shù)據(jù)進(jìn)行歸一化操作的原因,主要是我們一般假設(shè)輸入和輸出數(shù)據(jù)都是服從均值為 0,標(biāo)準(zhǔn)差為 1 的正態(tài)分布。這種假設(shè)在深度學(xué)習(xí)理論中非常常見,從權(quán)重初始化,到激活函數(shù),再到對訓(xùn)練網(wǎng)絡(luò)的優(yōu)化算法。
解決辦法
常用的歸一化方法主要是零均值歸一化,它會將原始數(shù)據(jù)映射到均值為 0,標(biāo)準(zhǔn)差為 1 的分布上。假設(shè)原始特征的均值是μ\muμ、方差是σ\sigmaσ,則公式如下:
z=x?μσz = \frac{x-\mu}{\sigma} z=σx?μ?
另一種常用的歸一化方法是線性函數(shù)歸一化(Min-Max Scaling)。它對原始數(shù)據(jù)進(jìn)行線性變換,使得結(jié)果映射到[0,1]的范圍,實(shí)現(xiàn)對原始數(shù)據(jù)的等比縮放,公式如下:
Xnorm=X?XminXmax?XminX_{norm}=\frac{X-X_{min}}{X_{max}-X_{min}} Xnorm?=Xmax??Xmin?X?Xmin??
其中 X 是原始數(shù)據(jù),Xmax,XminX_{max}, X_{min}Xmax?,Xmin?分別表示數(shù)據(jù)最大值和最小值。
未經(jīng)訓(xùn)練的神經(jīng)網(wǎng)絡(luò)通常輸出的值大致在-1到1之間。如果希望它輸出一些其他范圍的值(例如RGB圖像,存儲為字節(jié)的范圍是0到255),那將會有一些問題。當(dāng)開始訓(xùn)練時,網(wǎng)絡(luò)將非常不穩(wěn)定,因?yàn)楫?dāng)預(yù)期值為255時,它將產(chǎn)生-1或1,這個錯誤被用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)的大多數(shù)優(yōu)化算法認(rèn)為是巨大的。這將產(chǎn)生巨大的梯度,你的訓(xùn)練誤差可能會爆發(fā)。如果你的訓(xùn)練沒有爆炸,那么訓(xùn)練的前幾個階段仍然是浪費(fèi),因?yàn)榫W(wǎng)絡(luò)將學(xué)習(xí)的第一件事是縮放和轉(zhuǎn)移輸出值到大致期望的范圍。如果你規(guī)范化你的數(shù)據(jù)(在這種情況下你可以簡單地除以128減去1),那么這些都不是問題。
一般來說,神經(jīng)網(wǎng)絡(luò)中特征的規(guī)模也會決定它們的重要性。如果你在輸出中有一個大尺度的特征,那么與其他特征相比,它會產(chǎn)生更大的錯誤。同樣,輸入中的大尺度特征會主導(dǎo)網(wǎng)絡(luò),導(dǎo)致下游更大的變化。由于這個原因,使用許多神經(jīng)網(wǎng)絡(luò)庫的自動歸一化并不總是足夠的,這些庫盲目地減去平均值,然后除以每個特征的標(biāo)準(zhǔn)差。你可能有一個輸入特征一般范圍在0.0和0.001之間,這個特性的范圍如此之小,因?yàn)樗且粋€重要的特性(在這種情況下,也許你不想對它再縮放),或因?yàn)樗幸恍┬⌒蛦挝幌啾绕渌匦?#xff1f;
同樣地,要小心那些有如此小范圍的特性,它們的標(biāo)準(zhǔn)偏差接近或精確地接近于零——如果規(guī)范化它們,這些特性將產(chǎn)生nan的不穩(wěn)定性。仔細(xì)考慮這些問題是很重要的——考慮你的每個特性真正代表了什么,并將標(biāo)準(zhǔn)化視為制作“單元”的過程。所有輸入特征都相等。這是我認(rèn)為在深度學(xué)習(xí)中真正需要人類參與的少數(shù)幾個方面之一。
2. 忘記檢查輸出結(jié)果
問題描述
當(dāng)你開始訓(xùn)練你的網(wǎng)絡(luò)幾個 epoch 后,發(fā)現(xiàn)誤差在減小了。這表示成功訓(xùn)練網(wǎng)絡(luò)了嗎?很不幸這并不是,這說明你的代碼中很可能還有一些
問題,可能是在數(shù)據(jù)預(yù)處理、訓(xùn)練代碼或者推理部分有問題。僅僅因?yàn)檎`差在減小并不意味著你的網(wǎng)絡(luò)正在學(xué)習(xí)有用的信息。
原因
與傳統(tǒng)編程不同,機(jī)器學(xué)習(xí)系統(tǒng)幾乎在所有情況下都會悄無聲息地失敗。在傳統(tǒng)的編程中,我們習(xí)慣于電腦在出現(xiàn)問題時拋出一個錯誤,并
以此作為返回和檢查錯誤的信號。
不幸的是在機(jī)器學(xué)習(xí)中并不是這樣的機(jī)制,所以我們應(yīng)該非常小心檢查的通過人眼來觀察每個階段的處理過程,這樣當(dāng)一個錯誤已經(jīng)產(chǎn)生的
時候,我們可以及時發(fā)現(xiàn)并且可以更徹底的檢查代碼。
解決辦法
在管道的每個階段檢查數(shù)據(jù)是否正確是非常重要的。通常這意味著找到一些方法使結(jié)果形象化。如果你有圖像數(shù)據(jù),那么很容易,動畫數(shù)據(jù)也可以可視化,沒有太多的麻煩。
如果你有一些更奇特的東西,必須找到一種方法來檢查它,以確保它在預(yù)處理、訓(xùn)練和推理管道的每個階段看起來都是正確的,并將其與地面真實(shí)數(shù)據(jù)進(jìn)行比較。
有許多方法可以檢查你的網(wǎng)絡(luò)是否正常工作。其中一部分是找出報告的訓(xùn)練錯誤的真正含義。可視化應(yīng)用于訓(xùn)練集數(shù)據(jù)的輸出結(jié)果,可以觀察到網(wǎng)絡(luò)的輸出結(jié)果和真實(shí)標(biāo)簽的對比
在訓(xùn)練的時候,可能會看到誤差從 1.0 到 0.01,但如果 0.01仍然是一個不可接受的結(jié)果,那么輸出結(jié)果仍可能無法使用。如果它在訓(xùn)練集上是有用的,那請?jiān)隍?yàn)證集上檢查它,看看它仍然適用于以前從未見過的數(shù)據(jù)嗎?
我的建議是,從一開始就習(xí)慣于可視化一切,不要只在網(wǎng)絡(luò)不收斂的時候才開始,并且確保在開始嘗試不同的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)之前,已經(jīng)準(zhǔn)備了通完最終用戶的完整管道,并一路進(jìn)行完整的檢查。這是準(zhǔn)確評估許多潛在不同方法的唯一方法。
3. 沒有對數(shù)據(jù)進(jìn)行預(yù)處理
問題描述
大部分的數(shù)據(jù)都是棘手的——通常我們知道的相似的東西,其數(shù)據(jù)可以有非常不同的數(shù)字表示。舉個例子,以角色動畫為例,如果我們使用角色關(guān)節(jié)相對于運(yùn)動捕捉工作室中心的 3D 位置表示我們的數(shù)據(jù),然后在一個位置或朝向一個方向執(zhí)行運(yùn)動,則可能具有與在不同位置執(zhí)行相同運(yùn)動或朝向不同方向執(zhí)行相同運(yùn)動截然不同的數(shù)字表示。相反,我們需要做的是以不同的方式表示數(shù)據(jù) - 例如,在某些本地參考幀中(例如相對于字符的質(zhì)量中心),以便我們知道兩個動作相似,獲得類似的數(shù)字表示。
原因
神經(jīng)網(wǎng)絡(luò)只對它們作為輸入的數(shù)據(jù)做出幾個基本假設(shè),但這些基本假設(shè)之一是數(shù)據(jù)所處的空間有些連續(xù)性,對于大多數(shù)空間來說,兩個數(shù)據(jù)點(diǎn)之間的點(diǎn)至少在某種程度上是這兩個數(shù)據(jù)點(diǎn)的"混合",而附近的兩個數(shù)據(jù)點(diǎn)在某種程度上代表著"類似"的東西。數(shù)據(jù)空間中出現(xiàn)大的不連續(xù)性,或者代表同一事物的大組分離數(shù)據(jù),將使學(xué)習(xí)任務(wù)更加困難。
解決辦法
想想使用的特征所表示的意思,是否可以對它們進(jìn)行一些簡單的轉(zhuǎn)換,以確保代表我們知道的相似內(nèi)容的數(shù)據(jù)點(diǎn)始終獲得相似的數(shù)字表示?是否有一個本地坐標(biāo)系統(tǒng)來表示數(shù)據(jù)使得事情更自然,比如可能是一個更好的顏色空間,或者其他不同的格式?
另一種考慮數(shù)據(jù)預(yù)處理的方法是嘗試減少可能需要的數(shù)據(jù)變化導(dǎo)致的組合爆炸。例如,如果一個受過角色動畫數(shù)據(jù)訓(xùn)練的神經(jīng)網(wǎng)絡(luò)必須學(xué)習(xí)每個位置和方向中針對角色的相同動作集,那么網(wǎng)絡(luò)的大部分容量就會被浪費(fèi),許多學(xué)習(xí)過程就會重復(fù)。
4. 沒有使用任何的正則化方法
問題描述
正則化是現(xiàn)在訓(xùn)練神經(jīng)網(wǎng)絡(luò)一個非常重要的方法,通常是以 dropout、噪音或者其他某種隨機(jī)過程的形式來加入到網(wǎng)絡(luò)中。
即便數(shù)據(jù)維度比參數(shù)更多,或者是在某種情況下不需要在意過擬合或者不可能出現(xiàn)過擬合,加入 dropout 或者某些形式的噪音仍然是很有幫助的。
原因
正則化方法不僅僅是用于控制過擬合,通過在訓(xùn)練過程中引入一些隨機(jī)過程,在某種程度上是"平滑"了成本格局。這可以加快訓(xùn)練收斂的速度,幫助處理數(shù)據(jù)中的噪聲或異常值,并防止網(wǎng)絡(luò)的極端權(quán)值配置。
解決辦法
最常用的正則化方法就是在卷積層或者全連接層之前采用 dropout 。一般會采用一個較高的概率,比如 0.75 或者 0.9,然后基于網(wǎng)絡(luò)可能過擬合的概率來調(diào)整這個概率值,比如覺得不太可能出現(xiàn)過擬合,那么就把保留神經(jīng)元的概率設(shè)置得非常高,比如 0.99。
數(shù)據(jù)增強(qiáng)或其他類型的噪音也可以像dropout一樣實(shí)現(xiàn)正則化,有時候使用了足夠的數(shù)據(jù)增強(qiáng)就可以不用 dropout。通常 dropout 被認(rèn)為是將許多隨機(jī)子網(wǎng)絡(luò)的預(yù)測相結(jié)合的技術(shù),但也可以將它視為一種數(shù)據(jù)增強(qiáng)的形式,在訓(xùn)練期間產(chǎn)生許多相似的輸入數(shù)據(jù)變化。正如我們所知,避免過度擬合的最好方法是擁有足夠多的數(shù)據(jù),使得神經(jīng)網(wǎng)絡(luò)永遠(yuǎn)不會看到同樣的數(shù)據(jù)兩次!
最后,像訓(xùn)練神經(jīng)網(wǎng)絡(luò)其他方面一樣,你需要小心你使用的正規(guī)化。請記住,在預(yù)測期間將其關(guān)閉,并注意,一旦它被關(guān)閉,您通常會得到略有不同的結(jié)果。在你需要極其精確的數(shù)字預(yù)測的情況下,某些形式的正則化有時會使這一切變得困難。
5.使用了一個太大的 batch size
問題描述
使用一個太大的 batch size 會因?yàn)榻档土颂荻认陆档碾S機(jī)性,導(dǎo)致降低了網(wǎng)絡(luò)的準(zhǔn)確率。
原因
使用較小的batch大小會產(chǎn)生波動更大,更隨機(jī)的權(quán)值更新。這有兩個好處:
解決辦法
在訓(xùn)練的時候,找到一個可以容忍的最小的 batch 大小。可以讓 GPU 并行使用最優(yōu)的 batch 大小并不一定可以得到最好的準(zhǔn)確率,因?yàn)楦蟮?batch 可能需要訓(xùn)練更多時間才能達(dá)到相同的準(zhǔn)確率。所以大膽的從一個很小的 batch 大小開始訓(xùn)練,比如 16,8,甚至是 1。
數(shù)據(jù)中的某些其他元素有時可以有效地像 batch 大小一樣工作。例如,以兩倍的分辨率處理圖像,其效果與使用 4 倍的 batch 大小相似。
簡單的說明這個原因,考慮在 CNN 中,每個濾波器的權(quán)值更新將平均顯示在輸入圖像中應(yīng)用的所有像素以及 batch 中的每一個圖像上。將圖像分辨率提高 2 倍,平均效果將提高 4 倍以上,其效果與將batch大小增加 4 倍的方式非常相似。
總體而言,重要的是考慮每次迭代中最終梯度更新的平均值,并確保您平衡其不利影響與盡可能多地使用 GPU 潛在并行性的必要性。
6. 使用一個錯誤的學(xué)習(xí)率
問題描述
學(xué)習(xí)率對訓(xùn)練網(wǎng)絡(luò)的容易程度有很大的影響,如果你是新手,幾乎可以肯定你的設(shè)置是錯誤的,這是因?yàn)樵诔R姷纳疃葘W(xué)習(xí)框架中使用的各種默認(rèn)選項(xiàng)。
原因
許多深度學(xué)習(xí)框架在默認(rèn)情況下啟用梯度裁剪。這個操作是通過在訓(xùn)練中的每一步中改變一個最大數(shù)量的權(quán)值來防止出現(xiàn)梯度爆炸的情況。
這可能很有用——特別是當(dāng)你的數(shù)據(jù)包含許多異常值,這會產(chǎn)生很大的誤差,從而產(chǎn)生很大的梯度和權(quán)重更新,但默認(rèn)設(shè)置也會使手工找到最佳學(xué)習(xí)率變得非常困難。我發(fā)現(xiàn)大多數(shù)剛接觸深度學(xué)習(xí)的人都將學(xué)習(xí)速率設(shè)置得過高,并通過梯度裁剪來解釋這一點(diǎn),使整體訓(xùn)練速度變慢,并且改變學(xué)習(xí)率的效果不可預(yù)測。
解決辦法
不采用梯度裁剪。找出在訓(xùn)練過程中不會導(dǎo)致誤差爆炸的最大學(xué)習(xí)率。將學(xué)習(xí)率設(shè)置為比這個低一個數(shù)量級,這可能是非常接近最佳學(xué)習(xí)率。
如果你已經(jīng)正確地清理了你的數(shù)據(jù),刪除了大部分的異常值,并正確地設(shè)置了學(xué)習(xí)速率,那么你真的不應(yīng)該需要梯度剪裁。如果沒有它,你會發(fā)現(xiàn)你的訓(xùn)練誤差偶爾變得非常大,那么請使用梯度裁剪,但是請記住,看到你的訓(xùn)練錯誤爆發(fā)幾乎總是表明你的一些數(shù)據(jù)有其他錯誤,梯度裁剪只是一個臨時措施。
7. 在最后一層使用錯誤的激活函數(shù)
問題描述
在最后一層使用激活函數(shù)有時候會導(dǎo)致網(wǎng)絡(luò)不能生成要求數(shù)值的完整范圍,比如最常見的錯誤就是在最后一層采用 ReLU ,它會導(dǎo)致網(wǎng)絡(luò)只能輸出正數(shù)。
原因
想想你的數(shù)據(jù)值實(shí)際代表什么,以及標(biāo)準(zhǔn)化后其范圍是什么。最有可能的情況是,你的輸出值是無限的正數(shù)或負(fù)數(shù),在這種情況下,不應(yīng)該在最后一層使用激活功能。如果輸出值可能只在某個范圍內(nèi)有意義,例如它由范圍 0-1 中的概率組成,則很可能在最后一層(如 sigmoid 激活功能)上應(yīng)使用特定的激活功能。
解決辦法
如果是在做回歸任務(wù),大部分情況下是不需要在最后一層使用任何激活函數(shù),除非是你知道希望輸出的數(shù)值的一些信息。
在最后一層上使用激活函數(shù)有許多微妙之處。在神經(jīng)網(wǎng)絡(luò)產(chǎn)生輸出后,系統(tǒng)最終將把輸出裁剪到 [-1,1] 范圍內(nèi)。那么添加這個裁剪過程作為最終層的激活似乎是有意義的,因?yàn)檫@將確保你的網(wǎng)絡(luò)誤差函數(shù)不會懲罰大于1或小于-1的值。
但是,沒有誤差意味著這些大于或小于 1 的數(shù)值也不會有梯度,在某些情況下,這會使得網(wǎng)絡(luò)無法訓(xùn)練。或者,可能很想在最后一層使用 Tanh,因?yàn)橹来思せ詈瘮?shù)輸出的值在 -1 到 1 范圍內(nèi),但這也會導(dǎo)致問題,因?yàn)樵摵瘮?shù)接近 1 或 -1 的梯度變得非常小,這可能導(dǎo)致權(quán)值增長巨大,試圖產(chǎn)生 -1 或 1。
一般來說,你最好的選擇是謹(jǐn)慎行事,在最后一層不使用任何激活功能,而不是嘗試一些可能適得其反的聰明做法。
8. 網(wǎng)絡(luò)包含壞的梯度
問題描述
使用 ReLU激活函數(shù)的神經(jīng)網(wǎng)絡(luò)經(jīng)常會遇到一些因?yàn)閴牡奶荻葘?dǎo)致的“死亡神經(jīng)元”的情況。它會導(dǎo)致網(wǎng)絡(luò)性能下降,甚至某些情況下導(dǎo)致網(wǎng)絡(luò)無法繼續(xù)訓(xùn)練。
原因
對于 ReLU 激活函數(shù)來說,其梯度對于正數(shù)和負(fù)數(shù)分別是 1 和 0。這是因?yàn)檩斎氲奈⑿「牟粫绊懶∮诹愕妮斎胼敵觥_@對于正數(shù)的大梯度來說似乎不是一個問題,但與許多網(wǎng)絡(luò)層堆疊在一起,負(fù)權(quán)重能夠?qū)⒋蟮恼蹬c強(qiáng)梯度變成負(fù)值與零梯度,通常情況下,如果無論輸入是什么,網(wǎng)絡(luò)中有一部分或者所有的權(quán)值對于損失函數(shù)的梯度都是,這種情況就是網(wǎng)絡(luò)是死了,權(quán)值是沒辦法更新,也就是無法繼續(xù)訓(xùn)練下去了。
解決辦法
如果你發(fā)現(xiàn)你的訓(xùn)練誤差沒有隨著迭代次數(shù)的增加而變化,那么很可能就是出現(xiàn)了因?yàn)槭?ReLU 激活函數(shù)導(dǎo)致的神經(jīng)元死亡的情況。可以嘗試使用如 leaky ReLU 或者 ELUs 等激活函數(shù),看看是否還出現(xiàn)這種情況。
任何帶有零梯度的操作,如裁剪、舍入或取最大/最小值,如果在計(jì)算損失函數(shù)對權(quán)值的導(dǎo)數(shù)時使用它們,也會產(chǎn)生糟糕的梯度。如果這些元素出現(xiàn)在你的符號圖中,你必須非常小心,因?yàn)樗鼈兘?jīng)常會導(dǎo)致不可預(yù)見的困難,例如,如果它們被用于作為損失函數(shù)的一部分的自定義錯誤度量中。
9. 網(wǎng)絡(luò)權(quán)重沒有正確的初始化
問題描述
如果你不能正確初始化你的神經(jīng)網(wǎng)絡(luò)的權(quán)值,那么你的神經(jīng)網(wǎng)絡(luò)就不太可能進(jìn)行訓(xùn)練。神經(jīng)網(wǎng)絡(luò)中的許多其他組件假定某種形式的正確或標(biāo)準(zhǔn)化的權(quán)值初始化,并將權(quán)值設(shè)置為零,一般使用自己的自定義隨機(jī)初始化是行不通的。
原因
可能你聽說過可以使用“小的隨機(jī)的數(shù)值”來初始化網(wǎng)絡(luò)的權(quán)值,但并沒有這么簡單。常用的“he”,“xaiver”和“l(fā)ecun”等權(quán)值初始化方式都是使用了很復(fù)雜和詳細(xì)的數(shù)學(xué)公式并證明了它們?yōu)槭裁词亲顑?yōu)的方法。更重要的是,其他的神經(jīng)網(wǎng)絡(luò)組件經(jīng)常是圍繞著這些初始化方式建立并根據(jù)經(jīng)驗(yàn)來測試它們,因此如果使用自定義的初始化方式會增加了復(fù)現(xiàn)其他研究者成果的難度。
解決辦法
目前比較常用而且在任何情況下效果都不錯的初始化方式包括了“he”,“xaiver”和“l(fā)ecun”。所以可以任意選擇其中一種,但是可以先進(jìn)行實(shí)驗(yàn)來找到最適合你的任務(wù)的權(quán)值初始化方式。
其他網(wǎng)絡(luò)層可能也需要小心的初始化。網(wǎng)絡(luò)偏差被初始化為零,而其他更復(fù)雜的層,如參數(shù)激活函數(shù),可能會有它們自己的初始化,這些初始化對于得到正確的結(jié)果同樣重要。
10. 使用了一個太深的神經(jīng)網(wǎng)絡(luò)
問題描述
網(wǎng)絡(luò)是越深越好嗎?實(shí)際上并總是這樣的,越深越好一般是在做基準(zhǔn)實(shí)驗(yàn)或者是希望在某些任務(wù)上嘗試增加 1%甚至更多的準(zhǔn)確率,但是如果 3,4,5 層的網(wǎng)絡(luò)都學(xué)不到任何東西,那么使用 100+的網(wǎng)絡(luò)層也會同樣失敗, 甚至更加糟糕。
原因
雖然看起來是這樣,但神經(jīng)網(wǎng)絡(luò)并不是在某人決定堆疊數(shù)百層的時候就突然開始獲得突破性的結(jié)果的。過去十年里對神經(jīng)網(wǎng)絡(luò)所做的所有改進(jìn)都是微小的、根本性的改變,這些改變既適用于深度網(wǎng)絡(luò),也適用于小型網(wǎng)絡(luò)。如果你的網(wǎng)絡(luò)不工作,更有可能是其他問題,而不是深度問題。
解決辦法
從一個3到8層的神經(jīng)網(wǎng)絡(luò)開始。只有當(dāng)訓(xùn)練的網(wǎng)絡(luò)有不錯的性能,并開始研究如何提高準(zhǔn)確性時,才開始嘗試更深層次的網(wǎng)絡(luò)。
從小處開始也意味著訓(xùn)練你的網(wǎng)絡(luò)會更快,推理會更快,迭代不同的設(shè)計(jì)和設(shè)置會更快。最初,所有這些東西對網(wǎng)絡(luò)的準(zhǔn)確性的影響要比簡單地堆疊更多的網(wǎng)絡(luò)層大得多。
11. 隱藏層神經(jīng)元數(shù)量設(shè)置不正確
問題描述
在某些情況下,使用過多或過少的隱藏神經(jīng)元會讓網(wǎng)絡(luò)難以訓(xùn)練。神經(jīng)元數(shù)量過少,它可能無法表達(dá)所需的任務(wù),而神經(jīng)元數(shù)量過多,它可能變得緩慢而笨拙,難以去除殘余噪聲進(jìn)行訓(xùn)練。
原因
在決定要使用的隱藏神經(jīng)元的數(shù)量時,關(guān)鍵是要大致考慮你認(rèn)為表達(dá)你希望通過網(wǎng)絡(luò)傳遞的信息所需的實(shí)際值的最少數(shù)量。然后你應(yīng)該把這個數(shù)字放大一點(diǎn)。這將允許 dropout,以便網(wǎng)絡(luò)使用更冗余的表示,并在你的估計(jì)中有一點(diǎn)余地。如果你在做分類,你可能會使用類數(shù)量的5到10倍作為一個好的初始猜測,而如果你在做回歸,你可能會使用輸入或輸出變量數(shù)量的 2 到 3 倍。當(dāng)然,所有這些都高度依賴于環(huán)境,并且不存在簡單的自動解決方案,良好的直覺仍然是決定隱藏單位數(shù)量的最重要因素。
解決辦法
從256到1024個隱藏神經(jīng)元數(shù)量開始。然后,看看其他研究人員在相似應(yīng)用上使用的數(shù)字,并以此為靈感。如果其他研究人員使用的數(shù)字與上面給出的數(shù)字有很大不同,那么可能有一些具體的原因,這可能對你來說很重要。
在現(xiàn)實(shí)中,與其他因素相比,隱藏神經(jīng)元的數(shù)量往往對神經(jīng)網(wǎng)絡(luò)的性能有相當(dāng)小的影響,在很多情況下,高估所需的隱藏神經(jīng)元的數(shù)量只會使訓(xùn)練變慢,而沒有什么負(fù)面影響。一旦網(wǎng)絡(luò)開始工作,如果你仍然擔(dān)心,就嘗試一大堆不同的數(shù)字,并測量其準(zhǔn)確性,直到找到最有效的一個。
在公眾號“AI 算法筆記”后臺回復(fù)以下文字,可以獲取對應(yīng)資料:
總結(jié)
以上是生活随笔為你收集整理的神经网络不收敛的 11 个原因及其解决办法的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: pdf全文翻译
- 下一篇: 如何能出令自己满意的代码