使用深度神經網路為什麼8位足夠?
深度學習是一種非常奇怪的技術。幾十年來,它的發展軌跡與人工智慧的主流完全不同,在少數信徒的努力下得以生存。幾年前當我開始使用它時,它讓我想起了第一次玩iPhone——感覺我得到了未來送回我們的東西,或者外星人的技術。
其結果之一是,我對它的工程直覺往往是錯誤的。當我遇到im2col時,根據我對影象處理的經驗,記憶體冗餘似乎很瘋狂,但事實證明這是解決這個問題的一種有效方法。雖然有更復雜的方法可以產生更好的結果,但它們不是我的圖形背景所預測的。
另一個似乎讓很多人困惑的關鍵領域是你需要神經網路內的計算精度。在我職業生涯的大部分時間裡,精確損失是相當容易估計的。我幾乎從來不需要超過32位的浮點數,如果我這樣做了,那肯定是因為用了一個脆弱的演算法,即使是64位,很快也會出錯。16位浮點數適合許多圖形操作,只要它們不被太緊密地連線在一起。我可以使用8位值來顯示最終輸出,或者在演算法的結尾,但它們對其他方面沒有什麼用處。
結果證明,神經網路是不同的。您可以使用8位引數和中間緩衝區執行它們,並且在最終結果中不會遭受明顯的損失。這讓我感到驚訝,但它被一遍又一遍地重新發現。我發現的唯一一篇關於這個結果的論文中(在段末),它在我嘗試過的每個應用程式中都是正確的。我還必須說服幾乎所有我說的工程師我不是瘋,看著他們通過自己的測試來證明這一點,所以這篇文章試圖短路其中一些!
關注公眾號CV技術指南,及時獲取更多計算機視覺的內容
論文名稱:
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位的。只要在執行長點產品是完全連線和卷積操作的核心(佔用絕大多數時間),您就不需要浮動,就可以將所有輸入和輸出保持為8位。我甚至看到證據表明你可以在8以下下降一兩個而不會損失!池化層在8位上也很好,我通常已經看到過以更高的精度完成的偏置新增和啟用函式(除了簡單的relu),但即使對於這些精度來說,16位似乎也很好。
我通常使用經過全浮點訓練的網路,然後再向下轉換,因為我專注於推理,但訓練也可以以低精度完成。通過對啟用層的範圍進行限制,可以實現用浮點數訓練的情況下,仍然可以做到低精度的部署。
為什麼可以工作?
我看不出任何基本的數學原因為什麼結果能如此精確地保持,所以我開始相信這是一個成功訓練過程的副作用。當我們試圖教授一個網路時,其目的是讓它理解作為有用證據的模式,並拋棄這些毫無意義的變化和不相關的細節。這意味著我們期望這個網路在噪聲很大的情況下還是能夠產生良好的結果。Dropout是一個很好的例子,所以即使有非常不利的資料,最終的網路也可以執行。
從這個過程中產生的網路在數值上必須非常魯棒,在計算中有大量的冗餘,因此輸入樣本中的小差異不會影響結果。與姿態、位置和方向的差異相比,影象中的噪聲實際上是一個相對較小的問題。所有的層在一定程度上都受到這些微小的輸入變化的影響,所以它們都發展了對微小變化的容忍性。這意味著低精度計算引入的差異完全在網路學會處理的公差範圍之內。直觀上看,它們感覺就像哭泣者,無論你推了多少它們,它們都不會倒塌。
我是一名工程師,所以我很高興看到它在實踐中工作,而不用太擔心為什麼,因為我不想看滿嘴跑火車!有研究人員對這點做了研究。下面是論文。
論文名稱:
Training deep neural networks with low precision multiplications
論文地址:
https://arxiv.org/abs/1412.7024
在公眾號中回覆“0001”即可獲取此論文
這意味著什麼?
這對任何試圖優化深度神經網路的人來說都是一個非常好訊息。在一般CPU方面,現代SIMD指令集通常面向浮動的,因此8位計算在最近的x86或ARM晶片上沒有提供巨大的計算優勢。但是DRAM訪問需要很多的電力,而且也很慢,所以僅僅減少75%的頻寬就可以是一個很大的幫助。能夠將更多的值壓縮到快速、低功耗的SRAM快取和暫存器中也是一個勝利。
GPU最初的設計目的是取8位紋理值,以更高的精度進行計算,然後再以8位重新寫入,所以它們非常適合我們的需要。它們通常有非常寬的管道到DRAM,所以收益並不那麼直接地實現,但可以通過一些工作來利用。我也學會了欣賞DSP是低功耗解決方案,它們的指令集面向我們所需要的固定點操作。像Movidius’Myriad這樣的定製視覺晶片也很適合使用。
深度網路的魯棒性意味著它們可以在非常廣泛的硬體上有效地實現。結合這種靈活性和它們在許多幾十年來一直看不到的人工智慧任務上幾乎神奇的效果,你可以明白為什麼我對它們將在未來幾年改變我們的世界感到如此興奮!
原文連結:
https://petewarden.com/2015/05/23/why-are-eight-bits-enough-for-deep-neural-networks/
本文來源於公眾號 CV技術指南 的論文分享系列。
歡迎關注公眾號 CV技術指南 ,專注於計算機視覺的技術總結、最新技術跟蹤、經典論文解讀。
在公眾號中回覆關鍵字“技術總結” 可獲取以下文章的彙總pdf。
其它文章
經典論文系列 | 目標檢測--CornerNet & 又名 anchor boxes的缺陷
在做演算法工程師的道路上,你掌握了什麼概念或技術使你感覺自我提升突飛猛進?