深度學習是一種非常奇怪的技術。幾十年來,它的發展軌迹與人工智能的主流完全不同,在少數信徒的努力下得以生存。幾年前當我開始使用它時,它讓我想起了第一次玩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
這意味着什麼?
這對任何試圖優化深度神經網絡的人來說都是一個非常好消息。在一般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的缺陷
如何看待人工智能的泡沫
使用Dice loss實作清晰的邊界檢測
PVT--無卷積密集預測的多功能backbone
CVPR2021 | 開放世界的目标檢測
Siamese network總結
視覺目标檢測和識别之過去,現在及可能
在做算法工程師的道路上,你掌握了什麼概念或技術使你感覺自我提升突飛猛進?
計算機視覺專業術語總結(一)建構計算機視覺的知識體系
欠拟合與過拟合技術總結
歸一化方法總結
論文創新的常見思路總結
CV方向的高效閱讀英文文獻方法總結
計算機視覺中的小樣本學習綜述
知識蒸餾的簡要概述
優化OpenCV視訊的讀取速度
NMS總結
損失函數技術總結
注意力機制技術總結
特征金字塔技術總結
池化技術總結
資料增強方法總結
CNN結構演變總結(一)經典模型
CNN結構演變總結(二)輕量化模型
CNN結構演變總結(三)設計原則
如何看待計算機視覺未來的走向
CNN可視化技術總結(一)特征圖可視化
CNN可視化技術總結(二)卷積核可視化
CNN可視化技術總結(三)類可視化
CNN可視化技術總結(四)可視化工具與項目