首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

嵌入式深度学习之神经网络二值化(1)

在深度学习的时代,神经网络的应用如火如荼,CPU已经渐渐满足不了卷积神经网络的高并发性高计算量,GPU虽然可以部分解决高并发性高计算量的问题,但是较大的功耗和较高的价格也限制它在移动端的应用。一般都是企业或者科研院所能购买高端的GPU做神经网络的training和testing。而嵌入式设备上最多使用一些轻量级的神经网络加速器。

目前,一些移动端手机芯片已经集成了神经网络加速器,比如华为的麒麟970和苹果的A11。但是相对PC来说运算力还是比较弱。那么如何能够嵌入式设备上达到功耗和性能的平衡呢?二值化神经网络应运而生。

里先把普通CNN和二值化CNN进行对比来看二值化都做了哪些改变

如下图所示,上面的是一个全精度的卷积神经网络,使用了10-64bits的权重和浮点类型的激活函数,下面的是一个二值化神经网络,将权重和激活函数转化为二值,比如+1或者-1。另外一个显著的区别就是在全精度神经网络中,输入和权重是点乘(dot product)操作,而二值神经网络中用按位异或非(bitwise XNOR)来实现的。这样主要是减小内存的消耗和加快处理速度。注:XNOR若两个输入的数不同,则输出为假。若两个相同,则输出真

对于权重和激活函数的二值化操作,一般有两种方法,

一种是确定型二值化(Deterministic Binarization),也就是设定一个阈值,当输入比阈值大,设为1,否则设为-1。

另一种是随机型二值化(Stochastic Binarization),这个是基于概率来进行二值化处理的,只有当概率等于1时,设为1,其他情况设为。概率是由hard sigmoid函数计算得到。尽管随机型二值化比确定型二值化更符合实际情况,但是由于在量化时生成随机位,不利于硬件化。

当二值化神经网络做训练的时候,会使用二值化的权重和激活函数。但是随机梯度下降是在一个小的并且有噪声的范围内使用一个小的步进单位来实现的。为了保证高精度,所以对于步进长度来说就需要达到更高的分辨率。所以当计算和累计梯度的时候,使用实数来实现。直通估计量(straight-through estimator)被用来传递梯度。从公式上看,它既保留了梯度信息,又消除了当r很大的时候的梯度。它的导数是一个hard tanh函数。

来就是批标准化(Batch Normalization),对于全精度的卷积神经网络,批标准化要计算出标准差而且要除以批的方差,如下图所示,计算批正则化的过程中,有乘除操作。对于二值化网络而言,用2的次方和按位位移来实现乘除的近似操作,这个被称为位移批标准化(Shift Batch Normalization)。

批标准化

位移批标准化

对于第一层输入的改变就比较简单了,既然输入是RGB的图像,一共包含3个通道,每个通道的值是0-255之间,是一个8位的整数。这里可以将输入的8位整数转换为定点型的数,这里我们用符号函数和按位位移操作来代替输入图像和权重的乘法。

基于以上解释,二值化神经网络和传统的卷积神经网络在网络结构上几乎没有什么差异,只是在处理卷积操作或者反向传递梯度时会有些区别。二值化神经网络的核心在于在保持精度下降不多的情况下,有效的减少了乘加运算,缩减了权重的存储空间,给嵌入式的部署提供了有效的可行性。下图是二值神经网络和全精度神经网络的实验对比。可以看出,相比于非二值化网络,二值化的权重和激活函数在MINST,SVHN,CIFAR-10数据集的测试上面并没有带来多大的损失(BNN by Theano vs. Maxout Networks)。

如在CIFAR-10数据集上的训练曲线如下图所示,相比于全精度神经网络,二值化神经网络会需要更多的迭代来达到高的精度。因为二值化神经网络的权重和激活函数会带来比较大的噪声,在反向传递梯度的时候也会限制梯度的大小,这些都给二值化神经网络的收敛带来了一定的影响。

最后我们从三个方面来评估二值化神经网络的性能,功耗,内存大小,执行时间。从下图可以看出,随着比特位数的减少,乘法器和加法器的功耗也随之减少。内存访问功耗跟内存大小是成正比的。二值化神经网络相比于全精度神经网络内存大小减少了32倍,随之访问存储器也少了32倍。从执行时间来看,二值化神经网络也是最快的。因此二值化神经网络相比传统的CNN更适合在嵌入式系统中使用

内存消耗

运行速度

本文所参考的论文和代码

Paper: M,Courbariaux etc. Binarized Neural Networks: Training Deep Neural Networks withWeights and Activations Constrained to +1 or -1 [NIPS 2015,arXiv:1602.02830]

SourceCode:https://github.com/MatthieuCourbariaux/BinaryNet

这篇之后我们会继续本篇的文章针对二值神经网络进行更深入的介绍。希望大家能够继续关注。

请大家通过下面二维码关注大话计算机视觉公众号。关注发送“资源共享” 可以获得电子书,论文,训练数据集等持续更新的共享资源

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180513G09XFU00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券