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