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.

相关文章
相关标签/搜索