本文是对中科院两位科研工作者的文章的理解翻译:
就目前而言,深度神经网络的层数和训练时间变得越来越多。一方面,人们想要在处理器上面下功夫,但是处理器的处理速度也十分有限。造成目前一个比较深的神经网络的训练时间有时候往往需要一到两周,基于目前的困难,就有人提出了解决方式。
首先,在神经网络训练的整个训练过程中,最占用时间的无疑是乘法操作。是浮点型数据的乘法尤其消耗计算量,往往需要很多个Clock。那么,如果把所有全连接的权值全部变成1,或者-1的话,乘法运算就变成了简单的加减法,这无疑是非常节约计算时间的。目前的权值简化策略大概分为两种,Binary和Ternary。Binary是把权值简化为1和-1,而Ternary是把权值简化为1,-1,0两者的区别是什么呢?Binary在比较简单的库表现比较好比如说MNIST, CIFAR-10,但是在比较复杂的库比如说ImageNet上表现相对于Ternary有差距。
其次,讲一下三值神经网络的具体的实现,算法见下图:
这个算法的核心是只在前向和后向过程中使用使用权值简化,但是在update是仍然是使用连续的权值。
简单的说就是先利用公式计算出三值网络中的阈值:
也就是说,将每一层的权值绝对值求平均值乘以0.7算出一个deta作为三值网络离散权值的阈值,具体的离散过程如下:
这样,我们就可以把连续的权值变成离散的(1,0,-1),那么,接下来我们还需要一个
alpha参数,具体干什么用后面会说:这个参数的计算方式如下:
|I(deta)|这个参数指的是权值的绝对值大于deta的权值个数,计算出这个参数我们就可以简化前向计算了,具体简化过程如下:
可以看到,在把alpha乘到前面以后,我们把复杂的乘法运算变成了简单的加法运算,从而加快了整个的训练速度。下面我们可以看看我们做得三值神经网络的效果如何: