中文字幕在线观看,亚洲а∨天堂久久精品9966,亚洲成a人片在线观看你懂的,亚洲av成人片无码网站,亚洲国产精品无码久久久五月天

教你編寫一個(gè)機(jī)器學(xué)習(xí)代碼也能使用的單元測(cè)試

2018-07-04    來源:raincent

容器云強(qiáng)勢(shì)上線!快速搭建集群,上萬Linux鏡像隨意使用
注:這篇文章自從發(fā)布出來,就受到讀者的好評(píng)和關(guān)注,因此,我編寫了一個(gè)機(jī)器學(xué)習(xí)測(cè)試庫(kù),請(qǐng)點(diǎn)擊鏈接查看!

在過去的一年里,我花了很多時(shí)間來研究深度學(xué)習(xí),并且也犯過很多錯(cuò)誤,這些錯(cuò)誤不僅幫助我對(duì)機(jī)器學(xué)習(xí)有了更加深入的理解,也讓我學(xué)會(huì)了如何正確合理的設(shè)計(jì)這些系統(tǒng)。在Google Brain工作期間,我學(xué)到了很多設(shè)計(jì)原則,其中之一就是單元測(cè)試可以制定或打破原有的算法,并且能夠節(jié)省數(shù)周的調(diào)試和訓(xùn)練時(shí)間。

然而,到目前為止,似乎還沒有為神經(jīng)網(wǎng)絡(luò)代碼編碼測(cè)試單元的比較可靠的教程。即使是在OpenAI上,也只是通過一行行的盯著代碼來發(fā)現(xiàn)bug,然后再思考導(dǎo)致這一bug的原因到底是什么。顯然,大部分人都不愿意這么耗費(fèi)時(shí)間,因此,我希望看完這個(gè)教程,你就可以開始著手測(cè)試你的系統(tǒng)!

我們從一個(gè)簡(jiǎn)單的例子開始:試試在這段代碼中找到bug。

 

 

有找到bug嗎?實(shí)際上,這個(gè)神經(jīng)網(wǎng)絡(luò)并沒有進(jìn)行堆疊。我在編寫代碼的時(shí)候,只是對(duì)slim.conv2d(...)代碼行做了簡(jiǎn)單的復(fù)制粘貼,然后對(duì)內(nèi)核大小進(jìn)行修改,而并沒有實(shí)際的輸入。

略微尷的來說,這其實(shí)是我上周編寫的代碼……這也是個(gè)很重要的教訓(xùn)!但是由于某些原因,這些bug很難被發(fā)現(xiàn):

1.這段代碼永遠(yuǎn)不會(huì)崩潰,或者引發(fā)錯(cuò)誤,又或者是運(yùn)行速度變慢。

2.這個(gè)神經(jīng)網(wǎng)絡(luò)仍在訓(xùn)練,并且損失函數(shù)會(huì)越來越小。

3.幾個(gè)小時(shí)后,會(huì)收斂到某一數(shù)值,結(jié)果非常糟糕,但是,你又不知道應(yīng)該修改哪里。

當(dāng)唯一的反饋只有最終那個(gè)錯(cuò)誤驗(yàn)證時(shí),那么,你只有一個(gè)辦法——就是搜索整個(gè)網(wǎng)絡(luò)架構(gòu)。不用再多說了,你需要的是一個(gè)更好的網(wǎng)絡(luò)系統(tǒng)。

在我們對(duì)數(shù)據(jù)進(jìn)行了一整天的訓(xùn)練以后,該如何發(fā)現(xiàn)這一bug呢? 我們發(fā)現(xiàn),最容易注意到的是,層的值實(shí)際上從未到達(dá)函數(shù)外的任何其他張量。因此,假設(shè)我們有某種類型的損失函數(shù)和優(yōu)化器,這些張量永遠(yuǎn)都不會(huì)得到優(yōu)化,它們將始終保持為默認(rèn)值。

通過簡(jiǎn)單的訓(xùn)練,我們來比較訓(xùn)練之前和訓(xùn)練之后的結(jié)果:

 

 

在這不到15行的代碼中,我們基本上驗(yàn)證了訓(xùn)練過的所有的變量。

這個(gè)測(cè)試非常簡(jiǎn)單、實(shí)用,F(xiàn)在,假設(shè)我們已經(jīng)修復(fù)了上一個(gè)問題,現(xiàn)在,添加一些批量?jī)?yōu)化,看看是否能發(fā)現(xiàn)這一bug。

 

 

看到了沒?這個(gè)非常微妙。在tensorflow中,batch_norm實(shí)際上將is_training默認(rèn)為False,所以添加這行代碼并不能在訓(xùn)練期間將輸入規(guī)范化!值得慶幸的是,我們編寫的最后一個(gè)單元測(cè)試將會(huì)立刻找到這個(gè)問題!

我們來看看另外一個(gè)例子,來自于reddit的一個(gè)帖子:該作者想創(chuàng)建一個(gè)分組器,其輸出范圍為(0,1),你是否能夠找出其中的bug?

 

 

這個(gè)bug很難發(fā)現(xiàn),并且稍不注意就會(huì)導(dǎo)致特別混亂的結(jié)果。基本上,這個(gè)預(yù)測(cè)只有一個(gè)輸出,當(dāng)你使用softmax交叉熵時(shí),總會(huì)導(dǎo)致?lián)p失函數(shù)為0。

測(cè)試這段代碼最簡(jiǎn)單的方法就是——確保損失函數(shù)永遠(yuǎn)不為0。

 

 

這個(gè)測(cè)試類似于我們的第一個(gè)測(cè)試,唯一不同的就是回退。在這個(gè)測(cè)試中,你可以確保只訓(xùn)練你想要訓(xùn)練的變量。拿生成對(duì)抗網(wǎng)絡(luò)來(GAN)說,常常出現(xiàn)的bug就是忘記在優(yōu)化期間訓(xùn)練了哪些變量,類似這種的bug經(jīng)常會(huì)發(fā)生。

 

 

這其中最大的問題就是:優(yōu)化器有一個(gè)默認(rèn)設(shè)置來優(yōu)化所有的變量。對(duì)于類似于對(duì)抗生成網(wǎng)絡(luò)的架構(gòu)來說,這是對(duì)所有訓(xùn)練時(shí)間判了一個(gè)死刑。在這里,使用下面的測(cè)試代碼,你就可以輕松檢測(cè)到這些bug:

 

 

同樣,我們也可以為鑒別器或其它強(qiáng)化學(xué)習(xí)算法編寫類似的測(cè)試代碼。很多演員-評(píng)論模型都有自己相對(duì)獨(dú)立的網(wǎng)絡(luò),需要通過不同的損失進(jìn)行優(yōu)化。

為了你在閱讀完本文后,能夠更好的進(jìn)行測(cè)試,我認(rèn)為以下幾個(gè)建議很重要:

1.保證測(cè)試的確定性。如果你真的想要隨機(jī)輸入數(shù)據(jù),那么,請(qǐng)確保輸入的隨機(jī)性,以便于輕松的完成測(cè)試。

2.保證測(cè)試的簡(jiǎn)短性。一定要有能夠訓(xùn)練收斂并檢查驗(yàn)證集的單元測(cè)試,否則你就是在浪費(fèi)時(shí)間。

3.確保在每次測(cè)試前重置圖表。

總之,還會(huì)有很多測(cè)試方法可以測(cè)試這些算法;ㄒ粋(gè)小時(shí)的時(shí)間來編寫一個(gè)測(cè)試代碼,不僅可以幫你節(jié)省重新訓(xùn)練的時(shí)間,還能夠大大改善你的研究成果!

以上為譯文。

文章原標(biāo)題《How to unit test machine learning code》,譯者:Mags

標(biāo)簽: Google 代碼 搜索 網(wǎng)絡(luò)

版權(quán)申明:本站文章部分自網(wǎng)絡(luò),如有侵權(quán),請(qǐng)聯(lián)系:west999com@outlook.com
特別注意:本站所有轉(zhuǎn)載文章言論不代表本站觀點(diǎn)!
本站所提供的圖片等素材,版權(quán)歸原作者所有,如需使用,請(qǐng)與原作者聯(lián)系。

上一篇:智能電源分配PDU應(yīng)用

下一篇:GDPR到底是如何影響機(jī)器學(xué)習(xí)的?