使用深度神經(jīng)網(wǎng)絡為什么8位足夠?
點擊下方卡片,關注“新機器視覺”公眾號
視覺/圖像重磅干貨,第一時間送達
作者:Pete Warden
翻譯:仿佛若有光
深度學習是一種非常奇怪的技術。幾十年來,它的發(fā)展軌跡與人工智能的主流完全不同,在少數(shù)信徒的努力下得以生存。幾年前當我開始使用它時,它讓我想起了第一次玩iPhone——感覺我得到了未來送回我們的東西,或者外星人的技術。
其結果之一是,我對它的工程直覺往往是錯誤的。當我遇到im2col時,根據(jù)我對圖像處理的經(jīng)驗,內(nèi)存冗余似乎很瘋狂,但事實證明這是解決這個問題的一種有效方法。雖然有更復雜的方法可以產(chǎn)生更好的結果,但它們不是我的圖形背景所預測的。
另一個似乎讓很多人困惑的關鍵領域是你需要神經(jīng)網(wǎng)絡內(nèi)的計算精度。在我職業(yè)生涯的大部分時間里,精確損失是相當容易估計的。我?guī)缀鯊膩聿恍枰^32位的浮點數(shù),如果我這樣做了,那肯定是因為用了一個脆弱的算法,即使是64位,很快也會出錯。16位浮點數(shù)適合許多圖形操作,只要它們不被太緊密地連接在一起。我可以使用8位值來顯示最終輸出,或者在算法的結尾,但它們對其他方面沒有什么用處。
結果證明,神經(jīng)網(wǎng)絡是不同的。您可以使用8位參數(shù)和中間緩沖區(qū)運行它們,并且在最終結果中不會遭受明顯的損失。這讓我感到驚訝,但它被一遍又一遍地重新發(fā)現(xiàn)。我發(fā)現(xiàn)的唯一一篇關于這個結果的論文中(在段末),它在我嘗試過的每個應用程序中都是正確的。我還必須說服幾乎所有我說的工程師我不是瘋,看著他們通過自己的測試來證明這一點,所以這篇文章試圖短路其中一些!
論文名稱:
Improving the speed of neural networks on CPUs
論文地址:
http://static.googleusercontent.com/media/research.google.com/en/us/pubs/archive/37631.pdf
在公眾號中回復“0001”即可獲取此論文
它是如何工作的?

您可以在Jetpac移動框架中看到一個低精度方法的例子,但是為了保持簡單,我將中間計算保持浮動,只使用8位來壓縮權重。Nervana的NEON庫也支持fp16,盡管它還不是8位的。只要在執(zhí)行長點產(chǎn)品是完全連接和卷積操作的核心(占用絕大多數(shù)時間),您就不需要浮動,就可以將所有輸入和輸出保持為8位。我甚至看到證據(jù)表明你可以在8以下下降一兩個而不會損失!池化層在8位上也很好,我通常已經(jīng)看到過以更高的精度完成的偏置添加和激活函數(shù)(除了簡單的relu),但即使對于這些精度來說,16位似乎也很好。
我通常使用經(jīng)過全浮點訓練的網(wǎng)絡,然后再向下轉換,因為我專注于推理,但訓練也可以以低精度完成。通過對激活層的范圍進行限制,可以實現(xiàn)用浮點數(shù)訓練的情況下,仍然可以做到低精度的部署。
為什么可以工作?

我看不出任何基本的數(shù)學原因為什么結果能如此精確地保持,所以我開始相信這是一個成功訓練過程的副作用。當我們試圖教授一個網(wǎng)絡時,其目的是讓它理解作為有用證據(jù)的模式,并拋棄這些毫無意義的變化和不相關的細節(jié)。這意味著我們期望這個網(wǎng)絡在噪聲很大的情況下還是能夠產(chǎn)生良好的結果。Dropout 是一個很好的例子,所以即使有非常不利的數(shù)據(jù),最終的網(wǎng)絡也可以運行。
從這個過程中產(chǎn)生的網(wǎng)絡在數(shù)值上必須非常魯棒,在計算中有大量的冗余,因此輸入樣本中的小差異不會影響結果。與姿態(tài)、位置和方向的差異相比,圖像中的噪聲實際上是一個相對較小的問題。所有的層在一定程度上都受到這些微小的輸入變化的影響,所以它們都發(fā)展了對微小變化的容忍性。這意味著低精度計算引入的差異完全在網(wǎng)絡學會處理的公差范圍之內(nèi)。直觀上看,它們感覺就像哭泣者,無論你推了多少它們,它們都不會倒塌。
我是一名工程師,所以我很高興看到它在實踐中工作,而不用太擔心為什么,因為我不想看滿嘴跑火車!有研究人員對這點做了研究。下面是論文。
論文名稱:
Training deep neural networks with low precision multiplications
論文地址:
https://arxiv.org/abs/1412.7024
在公眾號中回復“0001”即可獲取此論文
這意味著什么?

這對任何試圖優(yōu)化深度神經(jīng)網(wǎng)絡的人來說都是一個非常好消息。在一般CPU方面,現(xiàn)代SIMD指令集通常面向浮動的,因此8位計算在最近的x86或ARM芯片上沒有提供巨大的計算優(yōu)勢。但是DRAM訪問需要很多的電力,而且也很慢,所以僅僅減少75%的帶寬就可以是一個很大的幫助。能夠?qū)⒏嗟闹祲嚎s到快速、低功耗的SRAM緩存和寄存器中也是一個勝利。
GPU最初的設計目的是取8位紋理值,以更高的精度進行計算,然后再以8位重新寫入,所以它們非常適合我們的需要。它們通常有非常寬的管道到DRAM,所以收益并不那么直接地實現(xiàn),但可以通過一些工作來利用。我也學會了欣賞DSP是低功耗解決方案,它們的指令集面向我們所需要的固定點操作。像 Movidius’ Myriad這樣的定制視覺芯片也很適合使用。
深度網(wǎng)絡的魯棒性意味著它們可以在非常廣泛的硬件上有效地實現(xiàn)。結合這種靈活性和它們在許多幾十年來一直看不到的人工智能任務上幾乎神奇的效果,你可以明白為什么我對它們將在未來幾年改變我們的世界感到如此興奮!
原文鏈接:
https://petewarden.com/2015/05/23/why-are-eight-bits-enough-for-deep-neural-networks/
—版權聲明—
僅用于學術分享,版權屬于原作者。
若有侵權,請聯(lián)系微信號:yiyang-sy 刪除或修改!
