深度學(xué)習(xí)的這些坑你都遇到過嗎咏连?神經(jīng)網(wǎng)絡(luò) 11 大常見陷阱及應(yīng)對(duì)方法
如果你的神經(jīng)網(wǎng)絡(luò)不工作敏弃,該怎么辦冰垄?本文作者列舉了搭建神經(jīng)網(wǎng)絡(luò)時(shí)可能遇到的11個(gè)常見問題,包括預(yù)處理數(shù)據(jù)权她、正則化虹茶、學(xué)習(xí)率、激活函數(shù)隅要、網(wǎng)絡(luò)權(quán)重設(shè)置等蝴罪,并提供解決方法和原因解釋,是深度學(xué)習(xí)實(shí)踐的有用資料步清。
如果你的神經(jīng)網(wǎng)絡(luò)不工作要门,該怎么辦?作者在這里列出了建神經(jīng)網(wǎng)絡(luò)時(shí)所有可能做錯(cuò)的事情廓啊,以及他自己的解決經(jīng)驗(yàn)欢搜。
忘記規(guī)范化數(shù)據(jù)
忘記檢查結(jié)果
忘記預(yù)處理數(shù)據(jù)
忘記使用正則化
使用的batch太大
使用了不正確的學(xué)習(xí)率
在最后層使用了錯(cuò)誤的激活函數(shù)
你的網(wǎng)絡(luò)包含了Bad Gradients
初始化網(wǎng)絡(luò)權(quán)重不正確
你使用的網(wǎng)絡(luò)太深了
使用隱藏單元的數(shù)量不對(duì)
忘記規(guī)范化數(shù)據(jù)了
問題描述
在使用神經(jīng)網(wǎng)絡(luò)時(shí),思考如何正確地規(guī)范化數(shù)據(jù)是非常重要的谴轮。這是一個(gè)無法改變的步驟——假如這一步驟沒有小心炒瘟、正確地做,你的網(wǎng)絡(luò)就幾乎不可能工作第步。由于這個(gè)步驟非常重要疮装,在深度學(xué)習(xí)社區(qū)中也是眾所周知的,所以它很少在論文中被提及粘都,因此初學(xué)者常常在這一步出錯(cuò)廓推。
怎樣解決?
一般來說翩隧,規(guī)范化(normalization)的意思是:將數(shù)據(jù)減去均值樊展,再除以其方差。通常這是對(duì)每個(gè)輸入和輸出特征單獨(dú)做的堆生,但你可能經(jīng)常會(huì)希望對(duì)特征組做或特別主翼處理某些特征的規(guī)范化专缠。
為什么?
我們需要對(duì)數(shù)據(jù)進(jìn)行規(guī)范化的主要原因是大部分的神經(jīng)網(wǎng)絡(luò)流程假設(shè)輸入和輸出數(shù)據(jù)都以一個(gè)約是1的標(biāo)準(zhǔn)差和約是0的均值分布顽频。這些假設(shè)在深度學(xué)習(xí)文獻(xiàn)中到處都是藤肢,從權(quán)重初始化、激活函數(shù)到訓(xùn)練網(wǎng)絡(luò)的優(yōu)化算法糯景。
還需要注意
未訓(xùn)練的神經(jīng)網(wǎng)絡(luò)通常會(huì)輸出約在-1到1范圍之間的值嘁圈。如果你希望輸出其他范圍的值(例如RBG圖像以0-255范圍的字節(jié)存儲(chǔ))會(huì)出現(xiàn)一些問題省骂。在開始訓(xùn)練時(shí),網(wǎng)絡(luò)會(huì)非常不穩(wěn)定最住,因?yàn)楸热缯f預(yù)期值是255钞澳,網(wǎng)絡(luò)產(chǎn)生的值是-1或1——這會(huì)被大多數(shù)用于訓(xùn)練神經(jīng)網(wǎng)絡(luò)的優(yōu)化算法認(rèn)為是嚴(yán)重的錯(cuò)誤。這會(huì)產(chǎn)生過大的梯度涨缚,可能導(dǎo)致梯度爆炸轧粟。如果不爆炸,那么訓(xùn)練的前幾個(gè)階段就是浪費(fèi)的脓魏,因?yàn)榫W(wǎng)絡(luò)首先學(xué)習(xí)的是將輸出值縮小到大致是預(yù)期的范圍兰吟。如果規(guī)范化了數(shù)據(jù)(在這種情況下,你可以簡單地將數(shù)值除以128再減去1)茂翔,就不會(huì)發(fā)生這些問題混蔼。
一般來說,神經(jīng)網(wǎng)絡(luò)中特征的規(guī)模也決定了其重要性珊燎。如果輸出中的有一個(gè)特征規(guī)模很大惭嚣,那么與其他特征相比它會(huì)產(chǎn)生更大的錯(cuò)誤。類似地悔政,輸入中的大規(guī)模特征將主導(dǎo)網(wǎng)絡(luò)并導(dǎo)致下游發(fā)生更大的變化晚吞。因此,使用神經(jīng)網(wǎng)絡(luò)庫的自動(dòng)規(guī)范化往往是不夠的谋国,這些神經(jīng)網(wǎng)絡(luò)庫會(huì)在每個(gè)特征的基礎(chǔ)上盲目地減去平均值并除以方差槽地。你可能有一個(gè)輸入特征,通常范圍在0.0到0.001之間——這個(gè)特征的范圍如此之小烹卒,因?yàn)樗且粋€(gè)不重要的特征(在這種情況下闷盔,你可能不想重新scale)弯洗,或者因?yàn)榕c其他特征相比它有一些小的單元(在這種情況下旅急,你可能想重新scale)?類似地牡整,要小心具有這樣一個(gè)較小范圍的特征藐吮,它們的方差接近或等于0,如果將它們規(guī)范化逃贝,則會(huì)導(dǎo)致NaN不穩(wěn)定谣辞。仔細(xì)考慮這些問題很重要——考慮你的每個(gè)特征真正代表什么,并將所有輸入特征的“units”相等沐扳,將這一過程視為規(guī)范化泥从。這是我認(rèn)為深度學(xué)習(xí)中人在這個(gè)loop中真正需要的幾個(gè)方面之一。
你忘記檢查結(jié)果了
問題描述
你已經(jīng)訓(xùn)練了幾個(gè)epochs的網(wǎng)絡(luò)沪摄,也看到錯(cuò)誤在減少躯嫉。這是否意味著已經(jīng)完成了纱烘?不幸地告訴你,幾乎可以肯定你的代碼中還有某些問題祈餐。在數(shù)據(jù)預(yù)處理擂啥、訓(xùn)練代碼、甚至inference中都可能有bug帆阳。只是因?yàn)殄e(cuò)誤率下降了并不意味著你的網(wǎng)絡(luò)在學(xué)習(xí)有用的東西哺壶。
怎樣解決?
在流程的每個(gè)階段都檢查數(shù)據(jù)是否正確是非常重要的蜒谤。通常山宾,你需要找到一些可視化結(jié)果的方法。如果是圖像數(shù)據(jù)鳍徽,那么這很簡單塌碌,動(dòng)畫數(shù)據(jù)也不需要很麻煩就能可視化。但如果是其他類型的數(shù)據(jù)旬盯,你必須找到能夠檢查結(jié)果的方法台妆,以確保在預(yù)處理、訓(xùn)練和推斷的每個(gè)流程都正確胖翰,并將結(jié)果與ground truth數(shù)據(jù)進(jìn)行比較接剩。
為什么?
與傳統(tǒng)的編程不同萨咳,機(jī)器學(xué)習(xí)系統(tǒng)幾乎在所有情況下都會(huì)悄悄地發(fā)生失敗懊缺。傳統(tǒng)編程過程中,我們習(xí)慣了計(jì)算機(jī)在發(fā)生錯(cuò)誤時(shí)拋出錯(cuò)誤培他,并將其作為信號(hào)返回去檢查bug鹃两。不幸的是,這個(gè)過程不適用于機(jī)器學(xué)習(xí)舀凛,因此俊扳,我們應(yīng)該非常小心,在每個(gè)階段用人眼去檢查流程猛遍,以便知道何時(shí)出現(xiàn)bug馋记,何時(shí)需要返回并更徹底地檢查代碼。
還需要注意
有很多方法可以檢查網(wǎng)絡(luò)是否正常工作懊烤。一部分方法是為了確切地說明所報(bào)告的訓(xùn)練錯(cuò)誤是什么意思梯醒。可視化應(yīng)用于訓(xùn)練集的網(wǎng)絡(luò)的結(jié)果——你的網(wǎng)絡(luò)的結(jié)果與實(shí)踐中的ground truth 相比較如何腌紧?你可能會(huì)在訓(xùn)練期間將錯(cuò)誤從100降到1茸习,但是如果1的錯(cuò)誤仍然是不可接受的結(jié)果,那結(jié)果仍然無法使用壁肋。如果網(wǎng)絡(luò)在訓(xùn)練集上工作号胚,那就檢查驗(yàn)證集——它仍然適用于以前沒有見過的數(shù)據(jù)嗎代箭?我的建議是從一開始就習(xí)慣于可視化所有內(nèi)容——不要只在網(wǎng)絡(luò)不工作時(shí)才可視化——要確保在開始嘗試使用不同的神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)之前,你已經(jīng)檢查過完整的流程涕刚。這是準(zhǔn)確評(píng)估一些潛在的不同方法的唯一方法嗡综。
你忘記預(yù)處理數(shù)據(jù)了
問題描述
大多數(shù)數(shù)據(jù)是很棘手的——通常我們知道的數(shù)據(jù)是類似的,可以用非常不同的數(shù)字表示杜漠。以角色動(dòng)畫( character animation)為例:如果我們使用角色的關(guān)節(jié)相對(duì)于運(yùn)動(dòng)捕捉的studio的中心的3D位置來表示數(shù)據(jù)极景,那么在某個(gè)位置或面向某個(gè)方向執(zhí)行動(dòng)作時(shí),相較于在不同的位置驾茴、或不同的方向執(zhí)行同一個(gè)動(dòng)作盼樟,可能會(huì)產(chǎn)生大量不同的數(shù)字表示。那么我們需要以不同的方式表示數(shù)據(jù)——例如在一些局部reference框架(例如相對(duì)于角色的質(zhì)量中心)锈至,以便相似的動(dòng)作有相似的數(shù)值表示晨缴。
怎樣解決?
思考你的特征表示什么——是否有一些簡單的transformation峡捡,可以確保表示相似東西的數(shù)據(jù)點(diǎn)總是得到相似的數(shù)值表示击碗?是否有一個(gè)局部的坐標(biāo)系統(tǒng)可以更自然地表示數(shù)據(jù)——或許是更好的顏色空間——不同的格式?
為什么们拙?
對(duì)于作為輸入的數(shù)據(jù)稍途,神經(jīng)網(wǎng)絡(luò)僅作一些基本的假設(shè),其中之一是數(shù)據(jù)所處空間是連續(xù)的——對(duì)于大部分空間來說砚婆,兩個(gè)數(shù)據(jù)點(diǎn)之間的點(diǎn)至少有一些“mix”械拍,兩個(gè)相鄰的數(shù)據(jù)點(diǎn)某種意義上表示“相似”的東西。在數(shù)據(jù)空間中存在較大的不連續(xù)性(discontinuities)装盯,或存在表示同樣事物的大量分離數(shù)據(jù)(separated data)坷虑,將使得學(xué)習(xí)任務(wù)變得更加困難。
還需要注意
數(shù)據(jù)預(yù)處理的另一種方法是試著減少所需數(shù)據(jù)變化的組合爆炸埂奈。例如迄损,如果在角色動(dòng)畫數(shù)據(jù)訓(xùn)練的神經(jīng)網(wǎng)絡(luò)必須在每個(gè)位置和每個(gè)方向?qū)W習(xí)相同的動(dòng)作組合,那么網(wǎng)絡(luò)有大量容量被浪費(fèi)了挥转,并且大部分的學(xué)習(xí)過程是重復(fù)的海蔽。
忘記使用正則化了
問題描述
正則化(Regularization)——通常以dropout、noise或網(wǎng)絡(luò)隨機(jī)過程的某種形式進(jìn)行绑谣,是訓(xùn)練神經(jīng)網(wǎng)絡(luò)的另一個(gè)無法改變的方面。即使你認(rèn)為你擁有比參數(shù)多得多的數(shù)據(jù)量拗引,或過擬合不重要的情況借宵,或沒出現(xiàn)過擬合,你仍然應(yīng)該添加dropout或其他形式的noise矾削。
怎樣解決壤玫?
正則化神經(jīng)網(wǎng)絡(luò)的最基本方法是在網(wǎng)絡(luò)的每個(gè)線性層(卷積層或dense層)之前添加dropout豁护。從中等到高的retainment probability開始,例如0.75或0.9欲间。根據(jù)過擬合的可能性進(jìn)行調(diào)整楚里。如果你仍然認(rèn)為不可能出現(xiàn)過擬合,那么可以將retainment probability設(shè)置到很高猎贴,例如0.99班缎。
為什么?
正則化不僅僅是有關(guān)控制過擬合她渴。通過在訓(xùn)練過程中引入一些隨機(jī)過程达址,你在某種意義上是“平滑”(smoothing)了損失格局。這可以加快訓(xùn)練速度趁耗,幫助處理數(shù)據(jù)中的異常值沉唠,并防止網(wǎng)絡(luò)的極端權(quán)重配置。
還需要注意
數(shù)據(jù)增強(qiáng)(data augmentation)或其他類型的noise也可以像dropout一樣作為正則化的方式苛败。雖然通常dropout被認(rèn)為是將序偶多隨機(jī)子網(wǎng)絡(luò)的預(yù)測結(jié)合起來的技術(shù)满葛,但也可以將dropout視為通過在訓(xùn)練過程中產(chǎn)生許多類似輸入數(shù)據(jù)的變化來動(dòng)態(tài)地?cái)U(kuò)展訓(xùn)練集大小的方法。而且我們知道罢屈,避免過擬合和提高網(wǎng)絡(luò)準(zhǔn)確性的最佳方式是擁有更多網(wǎng)絡(luò)未見過的數(shù)據(jù)纱扭。
使用的Batch太大
問題描述
使用太大的batch可能會(huì)對(duì)網(wǎng)絡(luò)在訓(xùn)練過程中的準(zhǔn)確性產(chǎn)生負(fù)面影響,因?yàn)檫@樣會(huì)降低梯度下降的隨機(jī)性儡遮。
怎樣解決乳蛾?
找到在訓(xùn)練時(shí)你能接受的最小的batch。在訓(xùn)練時(shí)能夠最大限度利用GPU并行性的批量大小鄙币,對(duì)于準(zhǔn)確性來說可能并不是最好的肃叶,因?yàn)樵谀承r(shí)候,更大的batch需要訓(xùn)練更多回(epoch)才能達(dá)到相同的準(zhǔn)確度十嘿。不要擔(dān)心從非常小的batch開始因惭,比如16、8甚至是1绩衷。
為什么蹦魔?
使用更小的batch生產(chǎn)更方便(choppier)、更隨機(jī)的權(quán)重更新咳燕。這樣做有兩大好處勿决。首先,能幫助訓(xùn)練“跳出”原本可能被卡住的局部最小值招盲;其次低缩,可以使訓(xùn)練在“更平坦”的最小值結(jié)束,一般而言曹货,后者會(huì)代表更好的泛化性能咆繁。
還需要注意
數(shù)據(jù)中的其他元素有時(shí)也能像批量大小一樣生效讳推。例如,在處理圖像時(shí)玩般,將分辨率翻倍银觅,可能會(huì)有把批量大小×4類似的效果。直觀一點(diǎn)看坏为,在CNN中究驴,每個(gè)濾波器的權(quán)重更新將在輸入圖像的所有像素以及批處理中的每個(gè)圖像上進(jìn)行平均。將圖像分辨率翻番久脯,將產(chǎn)生超過四倍像素的平均效果纳胧,就像將批量大小提高了4倍一樣×弊總之跑慕,重要的是考慮在每次迭代中最終的漸變更新將被平均多少,并在負(fù)面影響與盡可能多地利用GPU并行性之間保持平衡摧找。
學(xué)習(xí)率不正確
問題描述
學(xué)習(xí)率可能會(huì)對(duì)網(wǎng)絡(luò)好不好訓(xùn)練有很大的影響核行。如果你剛剛?cè)胄校诔R娚疃葘W(xué)習(xí)框架各種默認(rèn)選項(xiàng)的影響下蹬耘,幾乎可以肯定你沒有把學(xué)習(xí)率設(shè)置對(duì)芝雪。
怎樣解決?
把梯度剪裁(gradient clipping)關(guān)掉综苔。找到在訓(xùn)練時(shí)不會(huì)發(fā)生錯(cuò)誤的最高的學(xué)習(xí)率的值惩系。然后將學(xué)習(xí)率設(shè)置得比這個(gè)值低一點(diǎn)點(diǎn)——這很可能非常接近最佳學(xué)習(xí)率了。
為什么如筛?
許多深度學(xué)習(xí)框架默認(rèn)會(huì)啟用梯度裁剪堡牡。這個(gè)選項(xiàng)可以防止訓(xùn)練過程中過度優(yōu)化,它會(huì)在每個(gè)步驟中強(qiáng)制改變權(quán)重杨刨,讓權(quán)重發(fā)生最大限度的改變晤柄。這可能有用,特別是當(dāng)數(shù)據(jù)中含有許多異常值的時(shí)候妖胀,因?yàn)楫惓V禃?huì)產(chǎn)生很大的錯(cuò)誤芥颈,從而導(dǎo)致大的梯度和權(quán)重更新。但是赚抡,默認(rèn)開啟這個(gè)選項(xiàng)也會(huì)讓用戶很難手動(dòng)找到最佳的學(xué)習(xí)率爬坑。我發(fā)現(xiàn)大多數(shù)深度學(xué)習(xí)的新手都因?yàn)樘荻炔眉舻脑驅(qū)W(xué)習(xí)率設(shè)得太高,使得整體訓(xùn)練行為變慢怕品,也使改變學(xué)習(xí)率的效果不可預(yù)測妇垢。
還需要注意
如果你正確清理了數(shù)據(jù),刪除了大部分異常值并且正確設(shè)置學(xué)習(xí)率肉康,那么你實(shí)際上并不需要梯度裁剪闯估。在關(guān)閉梯度裁剪后,如果你發(fā)現(xiàn)訓(xùn)練錯(cuò)誤偶爾會(huì)爆發(fā)吼和,那么你完全可以重新打開梯度裁剪這個(gè)選項(xiàng)涨薪。但是,需要記住炫乓,訓(xùn)練錯(cuò)誤頻發(fā)的原因幾乎總是表明你數(shù)據(jù)的一些其他異掣斩幔——裁剪只是一種臨時(shí)的補(bǔ)救方法。
在最后一層使用了錯(cuò)誤的激活函數(shù)
問題描述
在最后一層使用激活函數(shù)末捣,有時(shí)可能意味著你的網(wǎng)絡(luò)無法產(chǎn)生所需的全部范圍的值侠姑。最常見的錯(cuò)誤是在最后一層使用ReLU,從而導(dǎo)致網(wǎng)絡(luò)只能輸出正值箩做。
怎樣解決莽红?
如果你做一個(gè)回歸,那么在絕大多數(shù)時(shí)候你不會(huì)想在最后一層使用任何類型的激活函數(shù)邦邦,除非你確切地知道你想要輸出的值的種類是什么安吁。
為什么?
再想想你的數(shù)據(jù)值實(shí)際代表什么燃辖,以及它們在標(biāo)準(zhǔn)化以后的范圍鬼店。最可能的情況是,你的輸出值為unbounded正數(shù)或負(fù)數(shù)——在這種情況下黔龟,你不應(yīng)在最終層使用激活函數(shù)妇智。如果你的輸出值只在某些范圍內(nèi)有意義,例如由0-1內(nèi)的概率組成氏身,那么最終層應(yīng)該有使用特定的激活函數(shù)巍棱,例如Sigmoid激活函數(shù)。
還需要注意
在最后一層使用激活函數(shù)有許多需要注意的地方观谦。也許你知道你的系統(tǒng)最終會(huì)將輸出裁剪到 [-1拉盾,1]。那么豁状,將這個(gè)裁剪過程添加到最終層的激活當(dāng)中就是有意義的捉偏,因?yàn)檫@將確保你的網(wǎng)絡(luò)錯(cuò)誤函數(shù)不會(huì)懲罰大于1或小于-1的值。但是泻红,沒有錯(cuò)誤也意味著這些大于1或小于-1的值也不會(huì)有梯度——這在某些情況下會(huì)使你的網(wǎng)絡(luò)無法訓(xùn)練夭禽。或者谊路,你可能會(huì)嘗試在最后一層使用tanh讹躯,因?yàn)檫@個(gè)激活函數(shù)輸出的值的范圍是 [-1, 1],但這也可能帶來問題,因?yàn)檫@個(gè)函數(shù)的梯度在1或-1附近變得非常小潮梯,而為了產(chǎn)生-1或1可能使你的權(quán)重變得非常大骗灶。一般來說,最好保險(xiǎn)起見秉馏,不要在最后一層使用激活函數(shù)耙旦。有時(shí)候聰明反被聰明誤。
網(wǎng)絡(luò)里有壞的梯度
問題描述
使用ReLU激活函數(shù)的深層網(wǎng)絡(luò)通常會(huì)受所謂“死神經(jīng)元”的影響萝究,而后者是由不良梯度引起的免都。這可能會(huì)對(duì)網(wǎng)絡(luò)的性能產(chǎn)生負(fù)面影響,在某些情況下甚至完全無法訓(xùn)練帆竹。
怎樣解決绕娘?
如果你發(fā)現(xiàn)訓(xùn)練誤差經(jīng)過多個(gè)epoch后都沒有變化,可能是使用了ReLU激活函數(shù)栽连,讓所有的神經(jīng)元都死掉了险领。嘗試切換到另一個(gè)激活函數(shù),例如leaky ReLU或ELU,然后再看看是否還存在這樣的情況。
為什么?
ReLU激活函數(shù)的梯度對(duì)于正值為1,負(fù)值為0。這是因?yàn)楫?dāng)輸入小于0時(shí),輸入的一個(gè)很小變化不會(huì)影響輸出渗蟹。短期看,這可能不是一個(gè)問題召庞,因?yàn)檎档奶荻群艽笞缬铡5桥阢澹瑢优c層可以疊在一起翔试,負(fù)的權(quán)重可以將那些梯度很大的正值變?yōu)樘荻葹?的負(fù)值;通常情況下垦缅,一些乃至所有隱藏單元對(duì)于成本函數(shù)都具有零梯度,無論輸入是什么凡恍。在這種情況下咳焚,我們說網(wǎng)絡(luò)是“死的”革半,因?yàn)闄?quán)重完全無法更新又官。
還需要注意
任何具有零梯度的運(yùn)算(如裁剪、舍入或最大/最械饫怠)普泡,在被用于計(jì)算成本函數(shù)相對(duì)于權(quán)重的導(dǎo)數(shù)時(shí)撼班,都將產(chǎn)生不良梯度砰嘁。如果它們在符號(hào)圖里有出現(xiàn)矮湘,那么一定要非常小心缅阳,因?yàn)樗鼈兺鶗?huì)帶來意外的問題券时。
沒有正確地初始化網(wǎng)絡(luò)權(quán)重
問題描述
如果你沒有正確地初始化你的神經(jīng)網(wǎng)絡(luò)權(quán)重橘洞,那么神經(jīng)網(wǎng)絡(luò)根本就不太可能訓(xùn)練炸枣。神經(jīng)網(wǎng)絡(luò)中的許多其他組件都有某些正確或標(biāo)準(zhǔn)化的權(quán)重初始化适肠,并將權(quán)重設(shè)置為零侯养,或者使用你自己的自定義隨機(jī)初始化不起作用逛揩。
怎樣解決辩稽?
“he”逞泄,“l(fā)ecun”或“xavier”的權(quán)重初始化都是很受歡迎的選擇喷众,在幾乎所有情況下都能很好地工作侮腹。你選一個(gè)就好(我最喜歡的是“l(fā)ecun”)父阻,當(dāng)你的神經(jīng)網(wǎng)絡(luò)正常運(yùn)作以后加矛,你也可以自由地進(jìn)行實(shí)驗(yàn)呀斟览。
為什么苛茂?
你可能已經(jīng)知道妓羊,可以使用“小的隨機(jī)數(shù)”初始化神經(jīng)網(wǎng)絡(luò)權(quán)重躁绸,但事情并沒有那么簡單净刮。所有上述初始化都是使用復(fù)雜和詳細(xì)的數(shù)學(xué)發(fā)現(xiàn)的硅则,這些數(shù)學(xué)基礎(chǔ)說明了它們?yōu)槭裁从闷饋碜詈檬钊稀8匾氖乔钏保瑖@這些初始化構(gòu)建了其他神經(jīng)網(wǎng)絡(luò)組件捡鱼,并根據(jù)經(jīng)驗(yàn)使用它們進(jìn)行測試——使用你自己的初始化可能會(huì)使其他研究人員的結(jié)果復(fù)現(xiàn)得更加困難驾诈。
還需要注意
其他層可能也需要仔細(xì)地進(jìn)行初始化管引。網(wǎng)絡(luò)biases被初始化為零褥伴,而其他更復(fù)雜的層(如參數(shù)激活函數(shù))可能會(huì)帶有自己的初始化重慢,把這個(gè)弄對(duì)也同樣重要似踱。
你用的神經(jīng)網(wǎng)絡(luò)太深
問題描述
更深更好嗎核芽?嗯,情況并非總是如此……當(dāng)我們拼命刷新基準(zhǔn)吉懊,把某些任務(wù)的精度1%借嗽、1%地提升時(shí),更深的神經(jīng)網(wǎng)絡(luò)一般來說更好惨寿。但是顺囊,如果你只有3~5層的小網(wǎng)絡(luò)沒有學(xué)習(xí)任何東西特碳,那么我可以保證你用100層的也會(huì)失敗午乓,如果不是更糟糕的話。
怎樣解決蒸其?
從3到8層的淺層神經(jīng)網(wǎng)絡(luò)開始。只有當(dāng)你的神經(jīng)網(wǎng)絡(luò)跑起來學(xué)東西以后,再探索提升精度的方法湿蛔,并嘗試加深網(wǎng)絡(luò)。
為什么察迟?
在過去十年中,神經(jīng)網(wǎng)絡(luò)的所有改進(jìn)都是小的fundamental的變化概荷,這些改變只適用于較小型網(wǎng)絡(luò)作為深層次的性能。如果您的網(wǎng)絡(luò)不工作遏考,除深度之外更有可能是其他的問題像棘。
還需要注意
從小的網(wǎng)絡(luò)開始也意味著訓(xùn)練速度更快截歉,推理更快,迭代不同的設(shè)計(jì)和設(shè)置將會(huì)更快。最初壳嚎,所有這些事情都將對(duì)準(zhǔn)確性產(chǎn)生更大的影響然磷,而不僅僅是堆疊幾層寡润。
使用隱藏單元的數(shù)量不對(duì)
問題描述
在某些情況下业踢,使用太多或太少的隱藏單元(hidden units)都可能使網(wǎng)絡(luò)難以訓(xùn)練太伊。隱藏單元太少,可能沒有能力表達(dá)所需任務(wù)曙痘,而隱藏單元太多芳悲,可能會(huì)變得緩慢而難以訓(xùn)練,殘差噪音很難消除边坤。
怎樣解決名扛?
從256至1024個(gè)之間的隱藏單元開始。然后茧痒,看看類似應(yīng)用的其他研究使用多少肮韧,并參考使用。如果其他研究人員使用的與你使用的數(shù)字非常不同旺订,那么可能需要有一些具體的原因來解釋弄企。
為什么?
在決定隱藏單元的數(shù)量時(shí)区拳,關(guān)鍵要考慮你認(rèn)為對(duì)網(wǎng)絡(luò)傳遞信息所需最少數(shù)量的真實(shí)值拘领。你應(yīng)該把這個(gè)數(shù)字弄大一點(diǎn)。對(duì)于使用更多冗余表示的網(wǎng)絡(luò)樱调,dropout可以约素。如果你要做分類,可以使用五到十倍的class的數(shù)量笆凌,而如果你做回歸业汰,可能需要使用輸入或輸出變量數(shù)量的兩到三倍。當(dāng)然菩颖,所有這些都是高度依賴于環(huán)境的,沒有簡單的自動(dòng)解決方案——擁有很好的直覺對(duì)于決定隱藏單元數(shù)量是最重要的为障。
還需要注意
實(shí)際上晦闰,與其他因素相比,隱藏單元的數(shù)量通常對(duì)神經(jīng)網(wǎng)絡(luò)性能影響很小鳍怨,而在許多情況下呻右,高估所需隱藏單位的數(shù)量不會(huì)使訓(xùn)練變慢。一旦你的網(wǎng)絡(luò)工作了鞋喇,如果你仍然擔(dān)心声滥,只需嘗試很多不同的數(shù)字,并測量準(zhǔn)確性,直到找到最適合你的網(wǎng)絡(luò)的數(shù)值落塑。