掃二維碼與項(xiàng)目經(jīng)理溝通
我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流
基于神經(jīng)網(wǎng)絡(luò)的項(xiàng)目瓶頸通常并非對(duì)網(wǎng)絡(luò)的實(shí)現(xiàn)。有時(shí)候,在編寫(xiě)了所有代碼并嘗試了一大堆超參數(shù)配置之后,網(wǎng)絡(luò)就是無(wú)法正常工作。尤其是面對(duì)著數(shù)百萬(wàn)的參數(shù), 任何一個(gè)小變動(dòng)都有可能前功盡棄。

在面對(duì)各種各樣的問(wèn)題后,有人總結(jié)了一些幫助調(diào)試神經(jīng)網(wǎng)絡(luò)的實(shí)用 tips,希望能夠減少大家調(diào)試神經(jīng)網(wǎng)絡(luò)的成本。
有時(shí)梯度是引發(fā)問(wèn)題的原因。下面是幾種與梯度相關(guān)的調(diào)試方法:
經(jīng)常檢查網(wǎng)絡(luò)的訓(xùn)練進(jìn)度可以節(jié)省時(shí)間。以訓(xùn)練貪吃蛇游戲?yàn)槔?,不是?xùn)練網(wǎng)絡(luò)好幾天,然后再檢查網(wǎng)絡(luò)是否學(xué)到了什么,而是每十分鐘用當(dāng)前學(xué)到的權(quán)重運(yùn)行游戲。幾個(gè)小時(shí)后,如果我們注意到每次都在做同樣的事情并且獲得零獎(jiǎng)勵(lì),就知道可能有問(wèn)題了,而這節(jié)省了幾天的訓(xùn)練時(shí)間。
如果只查看定量輸出,我們可能會(huì)錯(cuò)過(guò)有用的調(diào)試信息。例如,在訓(xùn)練語(yǔ)音翻譯網(wǎng)絡(luò)時(shí),比起只檢查評(píng)估函數(shù)是否在減少,更重要的是閱讀翻譯后的語(yǔ)音以確保它有意義;當(dāng)訓(xùn)練一個(gè)用于圖像識(shí)別的網(wǎng)絡(luò)時(shí),一定要確保手動(dòng)檢查網(wǎng)絡(luò)提供的標(biāo)簽。
不應(yīng)該依賴(lài)定量輸出的原因有兩個(gè):首先,評(píng)估函數(shù)中可能存在錯(cuò)誤。如果只查看錯(cuò)誤評(píng)估函數(shù)輸出的數(shù)字,可能需要數(shù)周時(shí)間才能意識(shí)到出現(xiàn)問(wèn)題。其次,在神經(jīng)網(wǎng)絡(luò)輸出中可能存在無(wú)法定量顯示的錯(cuò)誤模式。我們可能會(huì)意識(shí)到某個(gè)特定單詞總是被錯(cuò)誤翻譯,或者在左上象限的圖像識(shí)別網(wǎng)絡(luò)總是錯(cuò)誤的。這些觀察結(jié)果反過(guò)來(lái)可以幫助找到數(shù)據(jù)處理部分的代碼 bug,否則這些 bug 將被忽視。
確定代碼是否存在 bug 或數(shù)據(jù)是否難以訓(xùn)練的另一種方法是首先擬合較小的數(shù)據(jù)集,比如將數(shù)據(jù)集中 100000 個(gè)訓(xùn)練示例修剪成只有 100 個(gè)甚至 1 個(gè)訓(xùn)練示例。如果在一個(gè)訓(xùn)練示例的情況下,網(wǎng)絡(luò)仍然有很高的測(cè)試錯(cuò)誤,不能夠非常好地?cái)M合數(shù)據(jù),那么幾乎可以肯定網(wǎng)絡(luò)代碼有問(wèn)題。
如果全尺寸網(wǎng)絡(luò)在訓(xùn)練時(shí)遇到問(wèn)題,可以嘗試使用層數(shù)較少的較小網(wǎng)絡(luò),這樣可以更快地訓(xùn)練。如果較小的網(wǎng)絡(luò)在全尺寸網(wǎng)絡(luò)失敗的情況下成功了,則表明全尺寸模型的網(wǎng)絡(luò)架構(gòu)過(guò)于復(fù)雜。如果簡(jiǎn)單網(wǎng)絡(luò)和全尺寸網(wǎng)絡(luò)都失敗,則代碼中可能存在 bug。
如果沒(méi)有使用機(jī)器學(xué)習(xí)框架編寫(xiě)神經(jīng)網(wǎng)絡(luò)的代碼,那么可以通過(guò)在機(jī)器學(xué)習(xí)框架中編寫(xiě)相同的網(wǎng)絡(luò)架構(gòu)來(lái)檢查問(wèn)題何在。然后將打印語(yǔ)句放入非框架版本和框架版本中逐層比較輸出,直到找到打印語(yǔ)句出現(xiàn)差異的位置,即錯(cuò)誤所在。如果在反向傳播期間發(fā)生錯(cuò)誤,則可以從最后一層開(kāi)始逐層打印權(quán)重的漸變,直到找到差異。但是此方法僅適用于網(wǎng)絡(luò)的第一次迭代,因?yàn)橛捎诘谝淮蔚敵龅牟町?,第二次及以后的迭代將具有不同的起點(diǎn)。
參考內(nèi)容:https://towardsdatascience.com/debugging-tips-for-neural-networks-f7dc699d6845
【本文是專(zhuān)欄機(jī)構(gòu)“機(jī)器之心”的原創(chuàng)譯文,微信公眾號(hào)“機(jī)器之心( id: almosthuman2014)”】
戳這里,看該作者更多好文

我們?cè)谖⑿派?4小時(shí)期待你的聲音
解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流