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

教你編寫一個機器學習代碼也能使用的單元測試

2018-07-04    來源:raincent

容器云強勢上線!快速搭建集群,上萬Linux鏡像隨意使用
注:這篇文章自從發(fā)布出來,就受到讀者的好評和關注,因此,我編寫了一個機器學習測試庫,請點擊鏈接查看!

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

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

我們從一個簡單的例子開始:試試在這段代碼中找到bug。

 

 

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

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

1.這段代碼永遠不會崩潰,或者引發(fā)錯誤,又或者是運行速度變慢。

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

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

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

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

通過簡單的訓練,我們來比較訓練之前和訓練之后的結果:

 

 

在這不到15行的代碼中,我們基本上驗證了訓練過的所有的變量。

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

 

 

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

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

 

 

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

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

 

 

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

 

 

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

 

 

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

為了你在閱讀完本文后,能夠更好的進行測試,我認為以下幾個建議很重要:

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

2.保證測試的簡短性。一定要有能夠訓練收斂并檢查驗證集的單元測試,否則你就是在浪費時間。

3.確保在每次測試前重置圖表。

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

以上為譯文。

文章原標題《How to unit test machine learning code》,譯者:Mags

標簽: Google 代碼 搜索 網(wǎng)絡

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

上一篇:智能電源分配PDU應用

下一篇:GDPR到底是如何影響機器學習的?