如何更好地調(diào)試神經(jīng)網(wǎng)絡(luò)?
聲明:本文適合神經(jīng)網(wǎng)絡(luò)初學(xué)者。
神經(jīng)網(wǎng)絡(luò)的調(diào)試比大多數(shù)程序更難,因?yàn)榇蠖鄶?shù)bug不會(huì)導(dǎo)致運(yùn)行錯(cuò)誤,只會(huì)導(dǎo)致不好的收斂。可能有許多看似模糊的錯(cuò)誤消息:
性能錯(cuò)誤:您的神經(jīng)網(wǎng)絡(luò)沒(méi)有訓(xùn)練好(性能:您的神經(jīng)網(wǎng)絡(luò)沒(méi)有訓(xùn)練好)。
如果你有經(jīng)驗(yàn),你應(yīng)該知道這意味著代碼需要大的改變。
第一,對(duì)付南?在大多數(shù)情況下,NaN錯(cuò)誤發(fā)生在前100次迭代中,原因很簡(jiǎn)單:你的學(xué)習(xí)率太高了。當(dāng)學(xué)習(xí)率很高時(shí),在前100次迭代中會(huì)出現(xiàn)NaN錯(cuò)誤。使用系數(shù)3來(lái)降低學(xué)習(xí)率,直到前100次迭代不再出現(xiàn)NaN錯(cuò)誤。一旦這樣做了,你將會(huì)有一個(gè)非常好的學(xué)習(xí)速度。根據(jù)我的經(jīng)驗(yàn),最好的學(xué)習(xí)率是你得到NaN錯(cuò)誤的范圍的十分之一。
如果在100次迭代后遇到NaN錯(cuò)誤,有兩個(gè)常見(jiàn)原因。
如果您使用RNN,確保您使用梯度下降和L2正則化的梯度。RNN在訓(xùn)練初期似乎有一個(gè)梯度,10%以下批次有學(xué)習(xí)高峰,此時(shí)梯度幅度相當(dāng)高。如果不切割梯度,這些峰將產(chǎn)生NaN。
如果寫自定義網(wǎng)絡(luò)層,很有可能NaN是除以0造成的。另一個(gè)已知會(huì)產(chǎn)生Nan誤差的層是Softmax層。Softmax計(jì)算包括分子和分母的exp(x)運(yùn)算,可以將無(wú)窮大除以無(wú)窮大,得到NaN。確保使用穩(wěn)定的Softmax實(shí)現(xiàn)。
第二,神經(jīng)網(wǎng)絡(luò)可以不學(xué)?一旦你沒(méi)有NaN誤差,你的神經(jīng)網(wǎng)絡(luò)可以平滑運(yùn)行上千次迭代,也不會(huì)減少前幾百次迭代后的訓(xùn)練損失。當(dāng)你第一次構(gòu)建代碼庫(kù)時(shí),你最好不要使用2000次迭代。這并不是因?yàn)樗械木W(wǎng)絡(luò)都可以從少于2000次的迭代中學(xué)習(xí)。相反,從一開(kāi)始就對(duì)網(wǎng)絡(luò)進(jìn)行編碼很可能會(huì)有bug,在達(dá)到高迭代次數(shù)之前,您會(huì)希望過(guò)早地對(duì)其進(jìn)行調(diào)試。現(xiàn)在的目標(biāo)是一次又一次地縮小問(wèn)題的范圍,直到你得到一個(gè)在2000次迭代下訓(xùn)練出來(lái)的網(wǎng)絡(luò)。幸運(yùn)的是,有兩種方法可以降低復(fù)雜性。
將訓(xùn)練集的大小減少到10個(gè)實(shí)例。在數(shù)百次迭代中,在這10個(gè)實(shí)例中,神經(jīng)網(wǎng)絡(luò)通常出現(xiàn)過(guò)度擬合。許多編碼錯(cuò)誤不會(huì)導(dǎo)致過(guò)擬合。如果你的網(wǎng)絡(luò)沒(méi)有。;不要過(guò)度適應(yīng)10個(gè)示例的訓(xùn)練集,請(qǐng)確保您使用的數(shù)據(jù)標(biāo)記正確。將批次大小減少到1,以檢查批次計(jì)算錯(cuò)誤。將print語(yǔ)句添加到代碼中可以確保輸出符合您的預(yù)期。通常可以通過(guò)上面介紹的純蠻力找出錯(cuò)誤。一旦可以在10個(gè)實(shí)例上訓(xùn)練網(wǎng)絡(luò),就可以嘗試在100個(gè)實(shí)例上訓(xùn)練它。如果這種方常工作,但效果不是很好,可以嘗試以下方法。
解決你感興趣的最簡(jiǎn)單的問(wèn)題。如果要翻譯句子,可以先建立一個(gè)特定語(yǔ)言的語(yǔ)言模型。如果你已經(jīng)完成了,試著用三個(gè)單詞預(yù)測(cè)第一個(gè)翻譯的單詞。如果要檢測(cè)圖像中的物體,可以在訓(xùn)練回歸網(wǎng)絡(luò)之前對(duì)圖像中的物體數(shù)量進(jìn)行分類。在網(wǎng)絡(luò)可以解決的棘手問(wèn)題和使用最少的時(shí)間為代碼獲取適當(dāng)?shù)臄?shù)據(jù)之間有一個(gè)權(quán)衡。這是發(fā)揮你創(chuàng)造力的時(shí)候了。
將神經(jīng)網(wǎng)絡(luò)應(yīng)用到其他新場(chǎng)景的技巧就是合理使用上面介紹的兩個(gè)步驟。這是一種協(xié)調(diào)機(jī)制,效果不錯(cuò)。首先,你表明這個(gè)神經(jīng)網(wǎng)絡(luò)至少能記住幾個(gè)例子。然后這個(gè)神經(jīng)網(wǎng)絡(luò)可以推廣到更簡(jiǎn)單問(wèn)題的驗(yàn)證集。你在穩(wěn)步前進(jìn)的同時(shí)也在慢慢增加難度。It沒(méi)有卡帕西專家第一次使用的風(fēng)格,但至少它是有效的。有時(shí)候你會(huì)遇到一個(gè)棘手的問(wèn)題,你會(huì)發(fā)現(xiàn)它不會(huì)在2000次迭代中繼續(xù)學(xué)習(xí)。那個(gè)太棒了!但是迭代次數(shù)很少是這個(gè)問(wèn)題之前復(fù)雜度的10倍。如果您發(fā)現(xiàn)是這種情況,請(qǐng)嘗試搜索中等復(fù)雜程度。
第三,調(diào)整參數(shù)。現(xiàn)在你的網(wǎng)絡(luò)可以學(xué)習(xí)東西,你可能會(huì)忘乎所以。你可能還會(huì)發(fā)現(xiàn)你訓(xùn)練的網(wǎng)絡(luò)可以不能解決大多數(shù)復(fù)雜的問(wèn)題。超參數(shù)調(diào)整是解決問(wèn)題的關(guān)鍵。有些人直接下載CNN軟件包并在他們的數(shù)據(jù)集上運(yùn)行,然后告訴你使用超參數(shù)調(diào)整并不沒(méi)什么區(qū)別。這是因?yàn)樗麄兪褂矛F(xiàn)有的架構(gòu)來(lái)解決現(xiàn)有的問(wèn)題。如果你想解決的問(wèn)題需要一個(gè)新的架構(gòu),就需要通過(guò)超參數(shù)調(diào)整來(lái)得到一個(gè)好的設(shè)置。你d最好確定你已經(jīng)看了你要解決的問(wèn)題的超參數(shù)教程,不過(guò)我下面會(huì)列出一些基本思路。
可視化:唐不要害怕在培訓(xùn)期間花時(shí)間編寫定制的可視化工具。如果你的可視化方法不。;如果行不通,考慮另一種方法。
權(quán)重初始化:一般來(lái)說(shuō),較大的初始化權(quán)重是一個(gè)不錯(cuò)的選擇,但是過(guò)大會(huì)導(dǎo)致NaN。
確保重量看起來(lái)"健康"。為了理解這意味著什么,我建議在IPython的筆記本。花點(diǎn)時(shí)間觀察在標(biāo)準(zhǔn)數(shù)據(jù)集(如Imag
怎樣在Linux下編程?需要什么技術(shù)?
Linux下編程其實(shí)很方便。Linux下有完整的編輯、調(diào)試、編譯、打包的棧工具。
當(dāng)然需要熟悉常見(jiàn)的linux命令,熟悉shell環(huán)境,能夠適應(yīng)純命令行終端的使用(Xwindows環(huán)境不是很成熟,不推薦)。然后BugBug就給大家講講Linux編程的一些技術(shù):
終端編輯器和插件vim:Vim是最常用的Linux編輯工具,是linuxIDE環(huán)境的矩陣。使用Vim配合一些插件,完全可以實(shí)現(xiàn)現(xiàn)代IDE環(huán)境下的大部分功能。
推薦組合:
主題:莫洛凱島(github:/tomasr/莫洛凱島),vim-colors-日曬。
插件:YouCompleteM自動(dòng)完成(github:/valloric/YouCompleteM)
瀏覽目錄結(jié)構(gòu)插件nerdtree(GitHub:/croolose/nerdtree)
推薦的其他有用的vim工具:
Vim-surround:刪除、修改和添加括號(hào)、引號(hào)和XML操作。
Matchit:使用%在字符之間跳轉(zhuǎn)。
TComment:快速注釋和取消注釋代碼。
表格:對(duì)齊。
:代碼段。
Vim-easymotion:定位。
即時(shí)降價(jià):降價(jià)時(shí)預(yù)覽文件。
Emacs:emacs是*unix系統(tǒng)中最大最強(qiáng)大的編輯器和操作系統(tǒng)(它幾乎可以做任何事情)。
emacs中常用的推薦插件
spacemacsvim和emacs功能的優(yōu)勢(shì)集:
德古拉主題是一個(gè)美麗的主題;
更多信息可以在github中看到倉(cāng)庫(kù)Awesome-Emacs(Github:/Emacs-TW/Awesome-Emacs)。
調(diào)試debuglinux有強(qiáng)大的調(diào)試功能。工具gdb。GDB允許你調(diào)試程序,包括在你想的地方停止程序,這時(shí)你可以查看變量,寄存器,內(nèi)存和堆棧。此外,您可以修改變量和內(nèi)存值。對(duì)C、C、Fortran、rust、golang等語(yǔ)言的原生支持可以通過(guò)插件來(lái)實(shí)現(xiàn)。比如基于瀏覽器的擴(kuò)展GDBGUI(GitHub:/CS01/GDBGUI)。
鏈接編譯工具M(jìn)akemake是*nix下最強(qiáng)大的鏈接編譯工具。基于Makefiles的配置可以實(shí)現(xiàn)大型項(xiàng)目的自動(dòng)編譯和編譯,減少開(kāi)發(fā)人員的編譯勞動(dòng)。
screen、Tmux、byobu等窗口和分屏工具也是碼農(nóng)不可或缺的工具。這些昆蟲(chóng)的文章有專門介紹,所以我贏了這里不再贅述。
基于需求和編碼農(nóng)民的語(yǔ)言環(huán)境,Linux下也有大量的工具來(lái)滿足需求,這也是昆蟲(chóng)篇所涵蓋的領(lǐng)域之一。關(guān)注昆蟲(chóng)可以學(xué)習(xí)和接受昆蟲(chóng)的最新文章介紹。