今年去参加了ASPLOS 2017大会,这个会议整体来讲我感受偏系统和偏软一点,涉及硬件的相对少一些,对我这个喜欢算法以及硬件架构的菜鸟来讲并不算很是契合。中间记录了几篇相对比较有趣的paper,今天简单写一篇。算法
SC-DCNN: Highly-Scalable Deep Convolutional Neural Network using Stochastic Computing
单位做者:
markdown
咱们知道在神经网络计算中,最主要的计算就是乘加,本篇重点就是解释了什么是Stochastic Computing(随机计算),以及怎么用逻辑电路来实现Stochastic Computing。网络
这一块就很少说了,做者毕竟是在作一些早期研究,先解决有无问题,因此在MNIST这样规模的数据集上作的神经网络,能够转化为Stochastic Computing。(不过我要说一句,MNIST数据毕竟比较简单,用LENET这样规模的网络就能够搞定,实际上,其余研究中已经把LENET变成Binary的网络,识别准确率彻底不成问题,所以能够用Stochastic Computing彷佛也是瓜熟蒂落,可是其推广性就有待商榷了。事实上,在本次ASPLOS上,在本篇oral的提问环节,就有一个MM质疑了做者的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:
图片
(2)能够表示[-1,1]数据的bipolar encoding:
ip
这样看彷佛很是简单,可是有几点须要注意:input
实际上,SC计算是有偏差的,不精确的,其准确率受到stochastic number generators以及bit length的影响很大。generator
乘法Multiplication.
通常的数字电路二进制fix point计算中,乘法的代价是远大于加法的,而SC的一个优点就是,乘法实现很是容易。
如上图,针对两种encoding,都只要很是简单的门电路就能够完成计算——unipolar是用AND,unipolar是用XNOR。(由于A和B是不肯定的,因此计算A*B的结果也是不彻底肯定的,好比(a)状况,若是变成11110000 * 11001111的话,计算出来就是2/8。固然,结果仍是在正确的范围以内的,因此要球NN能够容忍这样的计算偏差,而NN也确实有这样的容错性,因此NN确实是SC很好的一个应用场景,但愿之后能够在计算理论上再有突破)。
加法Addition.
加法要稍微复杂一点,但也比通常的逻辑运算单元简单不少。论文中介绍了如下四种加法器的实现。、
这一块只贴一个图,你们有兴趣的去下载原文看一下吧:
能够看到,bit stream仍是比较长的,这个也是另一个问题,要保持较高的精度,须要较长的bit,这样带来的开销也比较大。好在加法的实现是多输入的。
总的来讲,SC要实际可用还有很长的路,不仅是实现上的,我认为更可能是在理论上须要突破。若是只是来和现有的普通精确的二进制逻辑运算对比,好比标准的乘法加法,那么优点看来并不大。可是若是一个网络在构建结构以及训练的时候,就是用随机计算单元的,那可能其价值会显著提升。
[1] SC-DCNN: Highly-Scalable Deep Convolutional Neural Network using Stochastic Computing, ASPLOS 2017.