ASPLOS'17論文導讀——SC-DCNN: Highly-Scalable Deep Convolutional Neural Network using Stochastic Computing

今年去參加了ASPLOS 2017大會,這個會議整體來講我感受偏系統和偏軟一點,涉及硬件的相對少一些,對我這個喜歡算法以及硬件架構的菜鳥來講並不算很是契合。中間記錄了幾篇相對比較有趣的paper,今天簡單寫一篇。算法

SC-DCNN: Highly-Scalable Deep Convolutional Neural Network using Stochastic Computing
單位做者:
這裏寫圖片描述markdown

咱們知道在神經網絡計算中,最主要的計算就是乘加,本篇重點就是解釋了什麼是Stochastic Computing(隨機計算),以及怎麼用邏輯電路來實現Stochastic Computing。網絡

Neural Network計算背景

這一塊就很少說了,做者畢竟是在作一些早期研究,先解決有無問題,因此在MNIST這樣規模的數據集上作的神經網絡,能夠轉化爲Stochastic Computing。(不過我要說一句,MNIST數據畢竟比較簡單,用LENET這樣規模的網絡就能夠搞定,實際上,其餘研究中已經把LENET變成Binary的網絡,識別準確率徹底不成問題,所以能夠用Stochastic Computing彷佛也是瓜熟蒂落,可是其推廣性就有待商榷了。事實上,在本次ASPLOS上,在本篇oral的提問環節,就有一個MM質疑了做者的Stochastic Computing只在這麼小的網絡上成功,徹底不能說服你們是否在大網絡上也能夠採用,否則意義就不大了。我我的附議。)架構

這裏寫圖片描述

Stochastic Computing定義與表示

Stochastic Computing (SC) is a paradigm that represents a probabilistic number by counting the number of ones in a bit-stream.atom

做者給出了兩種形式的表示形式:spa

(1)能夠表示[0,1]數據的unipolar encoding:
圖片

P(X=1)=x

好比0100110100就表示P(X = 1) = 4=10 = 0.4

(2)能夠表示[-1,1]數據的bipolar encoding:
ip

P(X=1)=(x+1)/2,

因此,0.4 能夠表示爲1011011101, P(X = 1) = (0.4 + 1)/2 = 7/10

這樣看彷佛很是簡單,可是有幾點須要注意:input

  1. SC表示的數據不是惟一的,好比上面第一種,0100110100和1111000000表示都是0.4,由於SC只考慮bit stream中1的比例,而不考慮位置;
  2. SC的數據不是固定的,而是經過stochastic number generators生成的,所以也更加增長了不肯定性;
  3. 表示同一個數據能夠用不一樣的bit length;

實際上,SC計算是有偏差的,不精確的,其準確率受到stochastic number generators以及bit length的影響很大。generator

Stochastic Computing計算乘、加

乘法Multiplication.

通常的數字電路二進制fix point計算中,乘法的代價是遠大於加法的,而SC的一個優點就是,乘法實現很是容易。

這裏寫圖片描述

如上圖,針對兩種encoding,都只要很是簡單的門電路就能夠完成計算——unipolar是用AND,unipolar是用XNOR。(由於A和B是不肯定的,因此計算A*B的結果也是不徹底肯定的,好比(a)狀況,若是變成11110000 * 11001111的話,計算出來就是2/8。固然,結果仍是在正確的範圍以內的,因此要球NN能夠容忍這樣的計算偏差,而NN也確實有這樣的容錯性,因此NN確實是SC很好的一個應用場景,但願之後能夠在計算理論上再有突破)。

加法Addition.

加法要稍微複雜一點,但也比通常的邏輯運算單元簡單不少。論文中介紹瞭如下四種加法器的實現。、
這裏寫圖片描述

  • (a)OR門,這個是最簡單的實現,可是相對來講偏差較大,由於1 OR 1 = 1,沒有辦法捕捉進位的操做。
  • (b)MUX多路選擇器,這個方法是最受歡迎的,實現也很簡單。只要從輸入中選取一個就能夠了。原理以下:c = 2P(C = 1) - 1 = 2(1/2P(A = 1) + 1/2P(B = 1)) - 1 = 1/2[2P(A = 1) - 1 + 2P(B = 1) - 1] =
    1/2(a+b).意思是說,反過來看,若是要計算a+b,是要把a和b的bipolar encoding中挑一個就能夠了(即1/2P(A = 1) + 1/2P(B = 1),這一句看起來像取平均值,可是若是有不少個輸入A,B,C…,最後平均值就差很少用其中一個數值來代替),而後這個選出來的bipolar encoding所表示的c正好就是a+b的1/2,做者另外沒有再講,如何取消這個1/2的做用呢?MUX的結果算出的c再*2(<<1),獲得a+b,在經過隨機數生成器生成出對應的bipolar encoding。若是是3個數據a,b,d,就是3選1,而後表示出來的數據是1/3(a+b+d),隨機數生成部分只要最後作一次就能夠了,理論上多少個數據相加都是一次。
  • (c)Approximate parallel counter (APC),計數input的1個數,而後表示成一個binary number。
  • (d)把一個數據表示成兩部分:符號部分和數值部分,是另一種隨機數的表示方法,

這裏寫圖片描述

實驗部分

這一塊只貼一個圖,你們有興趣的去下載原文看一下吧:
這裏寫圖片描述

能夠看到,bit stream仍是比較長的,這個也是另一個問題,要保持較高的精度,須要較長的bit,這樣帶來的開銷也比較大。好在加法的實現是多輸入的。


總的來講,SC要實際可用還有很長的路,不僅是實現上的,我認爲更可能是在理論上須要突破。若是隻是來和現有的普通精確的二進制邏輯運算對比,好比標準的乘法加法,那麼優點看來並不大。可是若是一個網絡在構建結構以及訓練的時候,就是用隨機計算單元的,那可能其價值會顯著提升。

參考資料

[1] SC-DCNN: Highly-Scalable Deep Convolutional Neural Network using Stochastic Computing, ASPLOS 2017.

相關文章
相關標籤/搜索