二值化神经网络(BNN)综述

【深度学习——BNN】:二值神经网络BNN——学习与总结 最近一直在做深度学习的FPGA布署,偶然研读到Bengio大神的著作《Binarized Neural Networks: Training Neural Networks with Weights and Activations Constrained to +1 or −1》: 链接:https://arxiv.org/abs/1602.02830 关于BNN,已经有不少前辈做了mark,... 阅读详情
AI摘要

二值化神经网络(BNN)因极高的压缩比和加速效果成为推动AI模型在资源受限设备上应用的关键技术。尽管面临诸多挑战,如精度较低、泛化能力有限等,BNN在五年间取得了显著进步,从ImageNet上27%的Top-1准确率提升到71.4%。文章总结了BNN的主要发展脉络和技术突破。

 

人工智能学习离不开实践的验证,推荐大家可以多在FlyAI-AI竞赛服务平台多参加训练和竞赛,以此来提升自己的能力。FlyAI是为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台。每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。

摘要: 二值化神经网络BNN由于可以实现极高的压缩比和加速效果,所以它是推动以深度神经网络为代表的人工智能模型在资源受限和功耗受限的移动端设备,嵌入式设备上落地应用的一门非常有潜力的技术。虽然目前的BNN仍然存在着 ...

二值化神经网络BNN由于可以实现极高的压缩比和加速效果,所以它是推动以深度神经网络为代表的人工智能模型在资源受限和功耗受限的移动端设备,嵌入式设备上落地应用的一门非常有潜力的技术。虽然目前的BNN仍然存在着很多不足,如模型精度仍然比全精度低了不少,无法有效地泛化到更复杂的任务上,依赖于特定的硬件架构和软件框架......,但我们同时也能看到BNN从最初的2015年ImageNet上只有27%的Top-1准确率发展到2020年ReActNet-C的71.4%的进步,这五年时间众多研究人员在这条道路上不断推动着BNN朝着更准更快更稳的方向发展,所以我们有理由相信,BNN未来可期!

 

英文原文 : Simons T, Lee D J. A review of binarized neural networks[J]. Electronics, 2019, 8(6): 661.

 

下载链接:

A review of binarized neural networks(https://www.mdpi.com/2079-9292/8/6/661/pdfwww.mdpi.com)

 

注:本文主要是对上述英文综述论文的部分中文翻译和一些对BNN的个人理解,这篇综述的发表日期是2019年6月份,个人感觉这篇综述写的很好,语言简洁,内容详实。后续2020年3月北航发表了一篇更新的二值化综述,但因为已经有人翻译过了,所以不再重复造轮子,原文链接贴在下面,中文翻译知乎随便一搜就能找到。

 

Binary Neural Networks: A Survey(https://arxiv.org/pdf/2004.03333)

 

闲扯淡

自大四毕业进入课题组以来,在模型压缩与优化加速领域的学习也有一年多了。过去的一年虽然主要是做的模型8-bit量化方面的工程实践(给硬件组当狗),但是同时也看了很多论文,陆陆续续也对整个领域其他方面如剪枝,知识蒸馏,矩阵低秩分解等,和一些基本的轻量级网络如SqueezeNet, ShuffleNet系列,MobileNet系列,EfficientNet系列的结构设计有了一定的了解。其中,二值化神经网络(BNN)尤为引起我的兴趣,因为它有着更为极端的压缩率和极低的计算量。虽然BNN仍受限于复杂数据集/任务上很不理想的准确率和对特定硬件架构或软件框架的依赖,而模型压缩领域真正能应用于实处且算得上通用的技术仍然限于通道剪枝,8bit量化和轻量级网络设计(如果可以归类为模型压缩领域的话),但是我仍然认为BNN是模型压缩领域皇冠上的明珠,因为大道至简。

 

开始正文

二值化神经网络(BNN)指的是仅使用+1和-1两个值来表示weights和activations的神经网络,相比于全精度的神经网络,它可以用XNOR+popcount这样极简单的组合代替float32的乘累加来实现卷积操作,从而节省了大量的内存和计算,大大方便了模型在资源受限设备上的部署。但同时,由于二值所能表达的信息量有限,所以BNN在模型精度方面一直都是远低于全精度模型,虽然最近的研究如MeliusNet,IRNet和ReActNet已经努力地将BNNs在ImageNet数据集上的Top-1拉到了0.70以上,与相应的全精度模型差距拉到3个点左右,但他们同时也增加了不少计算量,并且暂时还难以有效地推广到目标检测,语义分割等复杂任务上,所以BNN的升级打怪之路仍然道阻且长。目前有关BNN的研究从大的方面来说就是两个:如何提升BNN的精度和如何有效地部署在低功耗且资源受限的平台上。

 

本篇综述主要从以下几个方面进行的阐述:

二值化神经网络的基本介绍;

二值化神经网络的主要发展;

提升二值化神经网络精度和推理速度的技巧;

二值化神经网络在不同数据集上的精度表现;

二值化神经网络的硬件实现;

 

特意说明,因为本篇综述是2019年6月发表的,所以这个时间点之后的相关论文的贡献并没有被总结在内,而我发现这段时间出现了不少优秀的论文,如Bi-real Net, MeliusNet,IRNet, ReActNet等等,他们提出了很多巧妙的技术来解决目前二值化神经网络中存在的问题,所以我会将自己对这些论文的一些总结穿插在接下来的阐述中,其中势必有一些理解不正确的地方,希望能够指出,我们共同进步!

 

基本介绍

二值化神经网络的idea最初源于2016年深度学习三巨头之一Yoshua Bengio的论文《BinaryNet: Training Deep Neural Networks with Weights and Activations Constrained to +1 or -1.》,它首次提出一种方法,可以用随机梯度下降的方式训练同时使用二值化的weights和activations的神经网络。为了解决二值化weights中梯度的传递问题,作者提出在训练过程中保持一个实值(float32)的weights,然后使用信号函数sign来获得二值化的weights

前向和反向计算的流程如下图所示

 

STE的可视化

使用了STE之后,实值的weights就可以使用如SGD和Adam这样常见的优化器来进行更新了,同时考虑到这个实值weights是没有设置边界的,这样它就有可能会一直累加到特别大的值,从而与二值化的weights之间的量化误差越来越大,积重难返,所以作者对实值的weights还单独加了一个截断函数clip(x,-1,1),将其限制在-1和+1之间,这样使得实值weights和二值化weights的距离更近。对于activations的二值化和weights是相似的,并且在实验中作者发现,当sign函数的输入的值大于1的时候,将梯度置0可以得到更好的实验结果,即:

简单总结一下,我们可以看到作者在训练过程中对weights和activations做了不同的设置,两个在梯度更新上都是遵照STE的原则,直接将sign函数跳过,而实值weights在更新之后会裁剪到[-1,1]之间,从而减小实值weights和二值化weights之间的距离,而activations的梯度在更新的时候,当实值activations的值大于1时会将梯度置0,避免特别大的梯度向下传递使得训练时候出现震荡。

 

花这么大的力气来训练这个BNN,然而最后实验结果看起来与全精度相比也没有什么任何优势,肯定是这个模型存在什么惊喜?我来翻译翻译,作者设计BNN的初衷还是为了加速模型的前向推理,这里面较大的功劳就是用1bit数的XNOR和popcount代替了传统卷积的float32乘累加操作,用脚想也能理解这个在理论上不仅能减少32倍的参数存储,还能跑的比曹操快。虽然在BNN各个数据集上的实验都是强差人意,但快不快就完事了。同时也有些亟待毕业的博士研究发现BNN在对抗攻击方面有很强的鲁棒性,除了快,还稳,好家伙,直呼BNN牛逼。

 

主要发展

Yoshua Bengio作为BNN的开山祖师,不仅给众多人指明了山的方向 —— 更快更准更泛化,还在一路上留下了数不清的果实让后来者去慢慢摘 —— STE的优化,二值友好结构的设计,更细致的training tricks......,于是这个领域开始了轰轰烈烈的刷榜竞赛,以下将介绍一些在BNN发展道路上带来创新的模型,其中综述中谈到的DeReFa-Net,个人认为它主要是为低比特量化及训练设计的,将乘法用多个bitwise+shift的操作代替,梯度也可以用低比特数来表示,但如果把它的W/A的位宽设置为1/1,并没有看出很多结构上的创新,故在此处不阐述。

 

XNOR-Net

在第一篇BNN发表不久,XNOR-Net横空出世,这篇论文其实提出了两个模型,一个是BWN(Binary Weight Networks),另一个才是XNOR-Net,BWN只使用了二值化的weights,而activation仍然采取的float32全精度,按照BNN的定义其实BWN不能算在二值化网络的范畴,但它的效果那是杠杠的,跟全精度相差不大,看来神经网络对weights的二值化还挺不敏感的。而该文的主角XNOR-Net是正儿八经不掺水的二值化神经网络,weights和activations都采取的二值化。它主要是在原始BNN基础上考虑了量化误差,并且提出了对实值weights每个输出通道方向上提取出一个scaling factor,用于恢复二值化weights的信息,同时对activation在HW方向上每个pixel上提取一个scaling factor,用于恢复二值化activations的信息,这两种scaling factor都无需学习,直接计算相应的L-1范数就能得到,且不影响二值化高效的卷积计算过程。最后的实验也比原始的BNN要好不少,并且首次展示了BNN在ImageNet这种大型数据集上的实验结果,还声称在卷积计算上可以达到58倍的加速效果,节省32倍的内存。

 

本文是BNN领域一个非常重要的工作,用scaling factor恢复量化误差来提升精度的思想一直被沿用至今,在各个论文中都能看到。但同时该文也有一些诟病的地方,如计算结果无法复现(我翻译的这篇英文综述说的,不是我说的),没有真正部署在硬件上实测加速效果,只是阐述了一个理论值,毕竟在前向推理过程中每层activation在HW方向每个pixel上计算scaling factor的操作是非常耗时的。

 

ABC-Net

这是大疆创新被NIPS2017收录的论文,论文中主要针对二值化数据表达信息太弱的问题,提出使用多个二值化weights和activations线性加权求和的方式来近似表示全精度的weights和activations,如下面的公式所示。为了得到不同的二值化的bases,作者通过在sign函数中加入变量u,结合weights的均值和方差,通过改变u的值就可以获得不同的二值化tensor。而对于activations来说,使用相同的二值化操作会和XNOR-Net一样在前向推理过程中为了计算均值方差增加大量计算,所以这里选择在sign函数中使用N个可学习的变量u来进行二值化。其实可以看出,这篇论文的思想和DoReFa-Net还是挺相似的,只不过DoReFa-Net是低比特量化,而ABC-Net使用的更巧妙一些,本质还是BNN,但我们一眼也能看出,这个ABC-Net比之前的BNN在计算量上增加了很多,相当于是用时间和空间换取精度。论文说用5个bases可以达到非常好的实验效果,但实际上消耗的资源比W/A=2/2还多了。

MeliusNet

这是一篇BNN结构设计的论文,作者从两大经典的网络结构ResNet和DenseNet获得启发,针对在此之前的二值化feature map信息表达很弱的问题提出了两个概念:Quality(质量)和Capacity(数量),即ResNet的shortcut可以增强了每个通道的feature map的信息表达,DenseNet中的concat可以增加feature map的通道数,从而增强整体的信息表达。其实这两个想法在前作Bi-real Net和BinaryDenseNet中也分别提到了,本来打算单独讲这两篇,但是考虑到和MeliusNet思想的重合,就只单独把这一篇拎出来讲一下,但实际上述两篇论文的BNN结构上个人觉得更加的简洁,有兴趣的可以下下来看一下。

 

Bi-Real Net

BinaryDenseNet

话题转回来,MeliusNet根据用shotcut和concat增强Quality和Capacity的指导思想设计了两个二值友好的模块,如下图所示,一个是Dense Block,另一个是Improvement Block,这两个模块在网络中每次都是交错出现,在整个信息流中不断地增强二值化feature map的信息表达,从而提升精度。这篇论文除了这个核心思想之外,还提出了一个我觉得比较有意思的思路,那就是二值化网络应该有一套自己的网络结构,这种二值化友好结构的效果要优于相似FLOPs下全精度模型二值化后的结构,并且做了相应的实验进行验证,通俗地来讲就是倡导大家要走二值化特色社会主义道路。

 

IR-Net

这是一篇很有意思,我非常喜欢的一篇论文,它的作者就是最开始我提到另一篇综述的作者,2020年上半年也有机会在商汤的泰坦公开课中聆听了主创们对这篇论文的解读。这篇论文主要针对的是二值化在前向计算和反向梯度传播中带来的信息损失问题,作者分别提出了两个技术,一个是 Libra-PB(Libra Parameter Binarization),用于在前向计算中同时最小化weights的量化损失和信息熵损失,另一个是EDE(Error Decay Estimator),通过渐进近似sign函数来最小化反向传播过程中梯度的信息损失。Libra-PB简单来说就是在weights被二值化之前,先对它做归一化处理,即减均值除方差,这样的话在二值化之前,就大概有一半的weights是大于0,一半的weights小于0,从而使得二值化之后的weights信息熵损失最小。

 

而EDE则是利用k×tanh(t×x)在不同训练阶段渐进近似sign函数,并用其梯度来代替sign函数的梯度进行反向传播,从而使得整个训练过程可以更加的平滑,从而减少信息损失。

 

之所以喜欢这篇论文,是因为它提出的两个技术非常的简洁有效,一下子就能让人理解,一点都不花里胡哨,然后得到的结果也非常的好。

 

ReActNet

这篇论文的一座和Bi-Real Net是同一个人——刘泽春,作者之前还在知乎上和另一个未经作者允许就直接发表了Bi-Real Net V2的研究人员发生了争辩,快来一起吃瓜呀!

 

ICLR 2021 有什么值得关注的投稿?

并且从这个争论中才了解到ReActNet这篇论文,于是赶忙去下载下来,焚香沐浴,仔细拜读了大佬的作品。这篇论文是延续Bi-Real Net的一篇二值化神经网络研究的工作,作者首先利用Bi-Real Net的思路,即在原始网络中增加shortcut层来改造了MobileNetV1,然后通过大量的实验发现BNN的性能对activations的分布变化特别敏感,即对Activations进行平移/缩放对BNN的性能影响很明显,那么作者思考的是肯定每一层的Activations都各自有一个最适合的偏移值和缩放值使得整个模型的性能最优,于是作者提出了对sign函数和PReLU函数进行改造,加入可学习的参数变量,让模型自动去学每一层较佳的偏移值和缩放值,命名为ReAct-Sign(简称RSign)和ReAct-PReLU(简称RPReLU),另外需要说明的是这些参数都是channel-wise的,计算量其实还是有些的哈,但是因为选的模型是MobileNetV1,参数量较小,所以相比其他的BNN模型在整个计算量上还是少了很多,且精度还高了不少。

 

另外基于之前的观测结果,作者将最后一层输出经过softmax的结果与label的cross entropy 换成了与全精度模型的最后一层输出经过softmax的cross entropy,以此来学习全精度模型最后一层输出的数据分布,称之为distributional loss,有知识蒸馏那味了,并且作者强调相比于之前一些论文将二值化模型每一层输出都与全精度模型对应层输出进行匹配的做法,这个distributional loss更加简洁,且效果非也很好。

 

以上就是个人结合本篇英文综述和自己看过的一些论文总结的二值化神经网络发展史上一些重要进展的论文。因为本人水平有限,势必不够完整,如有遗漏请多多见谅!

 

提升性能的技术总结

现在来总结一下自最初的BNNs论文出来之后,为了提升性能用到的技术总结:

 

1. Gain term 增益项

这个主要指的是一些为了减少数据二值化损失而增加的一些额外的项,如XNOR-Net首次提出的在weights二值化之前计算一个channel-wise的scaling factors(一般是每个通道权重的均值)用于恢复量化损失,这个思想被沿用至今简单有效。还有各种在activations上增加的可学习的参数,如ReActNet提到的RSign和RPReLU,这些增益项虽然增加一点点的计算,但对模型精度却有大幅度的提升。另外要说明的XNOR-Net里面对activations在HW方向上每个pixel计算一个scale,这个虽然可以减少二值化的信息损失,但是在前向过程中对推理速度的影响很严重,所以暂不列入其中,这也说明了一点,weights上的增益项无论是可学习的还是在线计算的都不会对推理速度有较大影响,因为训练结束之后可以得到固定的系数。而activations的增益项较好是用可学习的,因为在前向推理过程中,每次输入数据不同,在线计算的增益项都需要重新计算,这个对推理速度影响很大。

 

2.  多个二值化base

这个特指ABC-Net的做法,用多个二值化的base线性加权近似全精度的weights和activations,性能不错,典型的以时间和空间换取精度的做法。

 

3.  二值友好的结构设计

Bi-Real Net,BinaryDenseNet和MeliusNet三篇论文验证了在BNNs网络结构中加入shortcut和concat操作能够大大增强模型的Quality和Capacity,从而大大提升性能。

 

4. 关键层的设计

神经网络中关键层一般指的第一层,下采样层和最后一层,这些层相对于其他普通层对模型性能影响更大,所以需要额外注意。

 

第一层

第一层的输入是原始数据,且卷积核的参数量较少,如果第一层出现了巨大的信息损失,那么后面层基本上也学不到啥了,原始BNN论文没有对输入直接二值化,因为输入的图像数据是UINT8类型,范围[0,255],二值化基本都是1了,信息损失殆尽,所以作者直接输入原始的数据与二值weights进行卷积计算。为了提升计算效率,作者将输入按比特位切片出来,用移位和XNOR代替乘法,如下图所示。

 

但这个做法不太妥当的是,输入数据虽然没有丢失信息,但是没有做数据的归一化。在主流的模型训练中我们可以知道,数据的normalize对结果影响还蛮大的,所以目前主流的BNNs基本上第一层都是使用全精度的卷积层,输入数据正常归一化处理后输入网络,因为通常认为这块计算量不大。但是MeliusNet在实验中发现目前很多BNNs计算中,浮点计算占了60%以上,第一层很多人使用的7×7的卷积核,计算量还是蛮大的,所以MeliusNet用三个3×3的卷积进行了代替,节省了一半的计算。

 

输入数据需要做normalize和二值化结构真的就无缘了吗?在FBNA论文中我们发现,可以使用如下技巧,输入数据正常归一化之后,缩放到[-128,128]的范围并取整,然后每个pixel的值用一个长度为256的一维二值化向量表示,两者关系是这个二值化向量累加求和之后的结果除以2等于这个整数值,如下所示:

 

下图中(a,b,c)以2Bit的数据为例再次展示了上述分解过程。输入数据假设为CIFAR10,分辨率是(32,32,3),那么经过分解之后就会变成(32,32,256,3),这个时候我们会发现输入数据巨大无比,第一层计算量指数级增加,于是作者将原图像8bit数据的高位截掉,在分解向量中的体现就是直接去掉右侧的正负1的数,如下图所示,我们可以发现pruning之后的图像其实仍然保留了大多数的信息,且可以大大降低计算量,整个过程如下图(d)所示。

下采样层

下采样层的特点是图像分辨率会直接减少一半,这个过程是一个不可逆的信息损失的过程。早期的BNNs都倾向于使用MaxPooling来进行下采样操作,但是存在一个问题是,如果在每一层activations二值化之后进行MaxPooling,会导致梯度反传到这块的时候将梯度均匀的分给多个+1或者多个-1,然而实际上只有real-value较大的那个值真正起了作用,这样的分配是不公平的,所以比较好的做法是遇到MaxPooling操作的时候,将activations的二值化延后,对实值的weights进行下采样,这样可以得到更好的效果。但目前的网络设计人员通常认为MaxPooling是不可学习的算子,倾向于使用stride=2的卷积层来进行下采样,这样可以保留更多的信息,所以在目前的BNNs当中,这块通常也是使用全精度的卷积来计算,避免造成较大精度损失,同时可以利用组卷积+channel shuffle的方式来进一步降低浮点的计算量。

 

输出层

这一层在分类任务中通常是全连接的结构,输出最后的预测结果,为了避免二值化的影响,通常也是采取全精度的计算,本来想提一下很多人对FC做的random pruning能降低计算,但又仔细想了想,这中任意剪枝方式在硬件上实现尤为麻烦,估计很难加速。

 

5. 渐进式地学习

如IR-Net中的EDE,用其他可微的函数来代替sign函数,并且在训练过程中不断地逼近真正的sign,使得整个训练过程梯度传递更加的平滑。还有一些论文在训练的时候渐进地对weights和activations进行二值化,根据一些原则,一开始的时候二值化部分数据,然后在训练过程中渐渐增大二值化的比例,最后将整个模型二值化,这个过程也是相对平滑的,比直接二值化更有效,这让我想起了老本行模型量化中的INQ。

 

6. padding策略

在实值卷积神经网络中,我们通常在输入四周padding的0,但是在BNN当中并没有0这种数的存在,所以大家大多数选择全-1或者全+1。有研究者发现这种padding策略对结果是有影响的,毕竟使得整个输入数据朝着1或者-1发生了偏移,上述的ReActNet也说过activations的发生偏移对结果影响还是很明显的,所以有人提出了Odd-Even padding的方式,即奇偶填充,1和-1间隔填充,如下图所示,并且发现这种填充方式可以达到填充0的效果。

 

7. 其他训练技巧

使用全精度模型在数据集上训练好的参数作为对应BNN的初始化参数;

Batch Normlization 和输入数据的normalize是必要操作;

损失函数增加正则项,如下图中的L-1 norm和L-2 norm,将α设为1,可以使得weights在训练过程中值更加趋近于1,有利于减少量化误差;

 

使用较小的学习率,然后累计梯度,间隔更新的方式;

 

8. 前向加速

用INT4/INT8/FP16的卷积代替全精度卷积计算的部分;

将Batch Normalization和sign函数合并起来,将浮点计算变成符号判断和数值大小比较;

 

不同数据集上的精度表现

 

由于BNN的模型实在是太多,而每一篇论文的实验结果也非常丰富,故我从两篇综述中截取出CIFAR10,ImageNet,PASCAL VOC2007和MS COCO2017较好的一些结果,如下所示:(注意:其中MS COCO2017的结果我似乎没有在论文原文中找到依据,所以大家就图个乐,不要较真)

 

硬件实现

由于我不是搞硬件的,所以这块只能简述一下。由于BNN的主要加速原因就是用XNOR+bitcount操作来代替了传统卷积中昂贵的乘累加操作,而我们使用的x86计算架构基本上都是对float32类型数据的计算做了很大程度的优化,所以直接将BNN部署在现有的x86计算平台上是很吃亏的,有可能不仅没有加速效果,甚至比同等的全精度模型跑的还慢。在我的调研中,硬件部署实现有如下两种方式:

 

ARM CPU,可以部署在手机端

BMXNet框架,来自于德国的Hasso Plattner Institute,MeliusNet的作者,支持ios和Android的部署;

daBNN框架,来自京东AI研究院,目前仅支持Android手机上的部署;

 

2. FPGA和ASIC

相比于传统的CPU,FPGA在硬件架构设计方面很灵活,可以支持bitswise的高效运算,而且功耗很低,其对应的终极版的专用集成电路ASIC更是如此,可以比FPGA运算更高效,更节能。目前用FPGA设计AI加速器基本都是以Xilinx的器件和开发工具为主,而他们也为二值化神经网络专门设计了一款架构FINN,开发者可以利用高层次综合工具(HLS),用C语言进行开发,直接将二值化模型部署到FPGA上,下图是一些对比结果。而Intel的Accelerator Architecture Lab也为BNN设计了一款layer accelerator的ASIC,不过并没有找到很多的相关数据,就不赘述。

 

最后的总结

二值化神经网络BNN由于可以实现极高的压缩比和加速效果,所以它是推动以深度神经网络为代表的人工智能模型在资源受限和功耗受限的移动端设备,嵌入式设备上落地应用的一门非常有潜力的技术。虽然目前的BNN仍然存在着很多不足,如模型精度仍然比全精度低了不少,无法有效地泛化到更复杂的任务上,依赖于特定的硬件架构和软件框架......,但我们同时也能看到BNN从最初的2015年ImageNet上只有27%的Top-1准确率发展到2020年ReActNet-C的71.4%的进步,这五年时间众多研究人员在这条道路上不断推动着BNN朝着更准更快更稳的方向发展,所以我们有理由相信,BNN未来可期!

 


 

更多精彩内容请访问FlyAI-AI竞赛服务平台;为AI开发者提供数据竞赛并支持GPU离线训练的一站式服务平台;每周免费提供项目开源算法样例,支持算法能力变现以及快速的迭代算法模型。

挑战者,都在FlyAI!!!

二值二值神经网络(Binary Neural Networks) 二值化权重和激活传播:重复步骤2和步骤4,将隐藏层1的二值化激活值与隐藏层2之间的权重进行点乘运算,得到隐藏层2的输入。假设我们的隐藏层2与隐藏层1之间的权重被二值化为{-1, +1},表示为W2,隐藏层2的输入为H2,大小为128。假设我们的输出层与隐藏层2之间的权重被二值化为{-1, +1},表示为W3,输出层的输入为O,大小为10。二值化激活函数:将隐藏层1的加权和输入到二值化的激活函数中,如硬件阈值函数。二值化激活函数:将隐藏层2的加权和输入到二值化的激活函数中,得到隐藏层2的二值化激活值。 阅读详情

相关推荐

二值神经网络(BNN)

二值神经网络不是一种新的网络模型,实际上它是一种极致的量化方法——将神经网络的权重和激活量化为1bit。随着神经网络的发展,神经网络的性能越来越高,但是同时,模型的大小也越来越大。对于资源有限,功耗又有要求的边沿设备,多数神经网络模型不适合进行部署,这限制了深度学习的发展。因此出现了许多模型压缩的方法,比如知识蒸馏、剪枝、量化等等。二值神经网络(BNN)的前身可以追溯到BWN,他只是将神经网络的权值进行二值量化,激活还是浮点的形式,实现了不错的性能。

m0_52889836的博客 1799

基于随机效应贝叶斯神经网络(RE-BNN)的多区域出行模式选择分析

1.文章信息本次介绍的文章为《A Random Effect Bayesian Neural Network (RE-BNN) for travel mode choice analysis across multiple regions》,发表在Travel Behaviour and Society上。该工作在经济学的随机效用理论下,利用深度学习进行了跨区域的出行行为选择的预测,并且对于英国不...

zuiyishihefang的博客 1847

PYNQ-Z2初识(四)——BNN(二值化神经网络)

文章目录BNN神经网络二值化PYNQ上的BNN导入BNN压缩包通过python脚本实现解压缩案例1:MNIST数字识别基本加载载入图像格式转换通过PL端(Programmable Logic)硬件识别通过PS端(Processing System)软件识别进行自定义识别案例2:交通标志识别打开图片进行识别单个图像中的多个标志 BNN神经网络 二值神经网络是在浮点神经网络的基础上,对权值和激活值(特征值)做二值化处理,即取值是+1或-1。BNN网络结构与CNN相同,主要在梯度下降、权值更新、卷积运算上做了一些

战斗果冻的训练中心 4807

二值神经网络的原理、代码实现、训练测试等相关学习笔记

二值神经网络的原理、代码实现、训练测试等相关学习笔记

m0_49663564的博客 6137

基于PYNQ-Z2实现BNN硬件加速

用HLS工具在PYNQ-Z2开发板上实现BNN(二值神经网络)硬件加速——毕设小结 传统的图像识别算法已经较难适应新形势下的图像检测与识别的需求,基于深度学习的人工神经网络技术可以深度挖掘图像的特征信息,有广阔的应用前景。但是卷积神经网络的冗余性较高,二值神经网络作为其变体,大大简化了神经网络,便于硬件实现。因此,本文主要对二值神经网络各模块的加速设计进行研究。

谦豫 8034

二值化网络的发展——从原始BNN到MeliusNet

二值化网络的发展 一.开山之作——Binarized Neural Networks 本文题目为《Binarized Neural Networks: Training Neural Networks with Weights and Activations Constrained to +1 or −1》 文章主要内容 本文提出了一种新的轻量级网络——二值化网络。二值化网络即将网络中权重固定为-...

weixin_43082868的博客 2697

二值化_二值化神经网络(BNN)综述

作者:Ironboy来源:微信公众号:GiantPandaCV出处:https://mp.weixin.qq.com/s?__biz=MzA4MjY4NTk0NQ==&mid=2247490696&idx=1&sn=3b8132af1ddd918ff8fc69629214b59a二值化神经网络BNN由于可以实现极高的压缩比和加速效果,所以它是推动以深度神经网络为代表的人工智...

weixin_28040125的博客 3355

使用Eggjs做服务端获取微信小程序云开发数据库的access_token

最近自己想写了一个微信小程序,恰巧里面有个云开发,恰巧里面有个数据库,那懒人的我,就直接用云开发里面的数据库了,做测试或者正式也好,对于刚开始来说,免费的配额是够用的。 后来想到在小程序云开发上面的数据怎么看才方便?刚好微信小程序有一个服务端API,那就方便很多了,那就直接敲个服务端来获取云开发上数据库的数据出来到自己的后台上面,那以后管理起来也方便很多。 看了一下服务端api之后,发现有三个重要...

kalenE992的博客 1705

二值神经网络(Binary Neural Networks)最新综述

作者|秦浩桐、龚睿昊、张祥国单位|北京航空航天大学研究方向|网络量化压缩本文介绍了来自北京航空航天大学刘祥龙副教授研究团队的最新综述文章 Binary ...

Paper weekly 8367

C#实现跨域访问共享文件夹的账号密码验证方案

本文详细介绍了在C#中实现跨域访问共享文件夹的账号密码验证方案。通过调用Windows API LogonUser函数,结合LOGON32_LOGON_NEW_CREDENTIALS登录类型,可安全模拟指定用户身份,有效解决工作组与域环境间的文件共享访问难题。文章提供了完整的工具类封装、多种实战场景示例及详细的错误排查指南。

pea55的博客 540

【DIY】使用STM32及PID算法实现一个磁悬浮玩具

今天教大家来做一个磁悬浮玩具。

小白白学电子 1万+

二值化神经网络的发展现状:从BNN到Bi-Real Net的精度与效率权衡

二值化神经网络在七年时间里(2016-2023)将ImageNet精度从27.9%提升到70%+,缩小了与全精度网络的差距。每一次重要改进——缩放因子(XNor-Net)、残差适配(Bi-Real Net)、分布重塑(ReActNet)、自适应阈值(AdaBin)——都在解决精度损失的不同来源。但二值化的根本局限仍然存在:1-bit的表示空间无法承载复杂任务的语义需求。当前二值化网络的最佳位置是作为"精度略低但功耗极低"的边缘推理方案,而非全精度网络的通用替代。

lady_mumu的博客 4638

RK3568 解决MIPI屏幕开机只显示uboot logo的问题

之前写过一篇文章介绍了RK3568驱动MIPI屏幕的方法,这次产品迭代,硬件改版,选型的新的屏幕了。所以再次开启调试屏幕的过程。本以为会和上次一样会轻车熟路,事情总是事与愿违,同样的路,遇到新的坑。

fhqlongteng的博客 5426

二值化神经网络——BNN

二值化神经网络——BNN 前言: 最近在研究FBN的时候看到了BNN这个概念,论文中有很多的概念都和BNN相关,这里记录一下对于BNN的理解 什么BNN? BNN全称Binarized Neural Networks中文译作二值化神经网络。其核心的思想就算把权重矩阵中权重值和各个激活函数的函数值同时二值化得到的神经网络。我们通过有两个二值化函数可以用来完成这个过程。 第一个是Sign函数 xb=...

python_LC_nohtyp的博客 2739

CA(载波聚合)

文章目录CA基本概念1. CA分类2. Pcell、Scell以及Serving CellPcell(Primary Cell)Scell(Secondary Cell)3. Pcell、Scell部署场景场景1场景2场景3场景44. CA的协议控制4.1 Camping/Connetion Establishment:4.2 CC Management/SCell Addition/Release:4.3 Handover/Measurements:4.4 SCell激活 CA基本概念 CA也就是我们中文

你又来看我了,一起学习吧 4万+

克里金插值(Kriging)在MATLAB中的实现(克里金工具箱)

一,直接献上克里金插值MATLAB工具箱 链接:https://pan.baidu.com/s/1p0lt2G8KQ-els7Dyw5jPFg 提取码:wcss 下载后将该程序添加到MATLAB安装文件夹中的/toolbox下,然后在设置路径中添加该程序文件为默认路径即可调用程序。 资源中内附程序使用说明PDF。 二、本人实际操作代码如下所示,标注如下 load data1 %载入数据 %模型参...

qq_40937675的博客 6万+

BNN领域开山之作——不得错过的训练二值化神经网络的方法

BNN领域入门必读:《Binarized Neural Networks: Training Neural Networks with Weights and Activations Constrained to +1 or −1》

limingmin2020的博客 2691

DSI3协议介绍

分布式系统接口(DSI)是一种通用且功能强大的总线协议,旨在将多个遥感器和执行器设备互连到中央控制模块。该网络的主要目标应用是汽车安全系统。这种应用的一些特点是需要低成本、高鲁棒性、中速互连,仅限于两根导线。此外,它必须具有故障安全性、确定性和良好的EMC特性。即使具有所有级别的智能和可编程性的设备都可以连接到网络,远程设备也必须能够通过简单的状态机实现。由于模块尺寸非常重要,因此中央模块和远程单元中的最小组件至关重要。

汽车电子软件领域知识分享 1万+

二值化神经网络(BNN)基础学习(一)

目录 1.简介 2.优点 3.基本原理 3.1 权重和激活值二值化[3] 3.2 乘法优化 3.3 权重和激活值更新 4.结论[3] 参考资料 1.简介 ​ 二值化神经网络,在...

weixin_30929011的博客 1756

Windows 上 openclaw onboard --install-daemon 命令的安装位置和启动配置

摘要:Windows系统中,执行openclaw-cnonboard--install-daemon命令会创建计划任务OpenClawGateway,该任务在用户登录时自动运行位于%USERPROFILE%.openclaw\gateway.cmd的脚本文件来启动服务。管理方法包括通过任务计划程序或命令行(schtasks)查看/启停任务,使用openclaw gateway命令操作服务,或通过删除计划任务和脚本文件完全卸载服务。该机制确保OpenClawGateway服务随系统登录自动启动。(149字)

大坡3D软件开发 1375

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

二值化网络(BNN)如何训练?这篇ICML 2021论文给你答案

二值化网络(Binary Neural Networks)是一种神经网络压缩方法,把原本需要32 bit 表示的神经网络参数值和激活值二值化到只需要用 1 bit 表示,即 -1/+1 表...

Paper weekly 2705

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【Paper Reading】二值化网络——BNN

Binarized Neural Networks: Training Neural Networks withWeights and Activations Constrained to +1 or -1 论文链接:https://arxiv.org/abs/1602.02830 代码地址:https://github.com/MatthieuCourbariaux/BinaryNet 2016...

小铁匠的博客 1180

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

二值化网络:BNN 论文阅读笔记

论文:《Binarized Neural Networks: Training Neural Networks with Weights and Activations Constrained to +1 or -1》 连接:https://arxiv.org/pdf/1602.02830.pdf 摘要 我们介绍了一种训练二进制神经网络(BNN)的方法-在运行时,神经网络具有二...

weixin_40671425的博客 2792

BNN Pytorch代码阅读笔记

BNN Pytorch代码阅读笔记 这篇博客来写一下我对BNN(二值化神经网络)pytorch代码的理解,我是第一次阅读项目代码,所以想仔细的自己写一遍,把细节理解透彻,希望也能帮到大家! 论文链接:https://papers.nips.cc/paper/6573-binarized-neural-networks 代码链接: https://github.com/itayhubara/Bina...

Crayonshin的博客 5300

【论文笔记】二值化神经网络(Binarized Neural Network)

文章链接:Binarized Neural Networks: Training Deep Neural Networks with Weights and Activations Constrained to +1 or -1 是2016年2月份新出的一篇文章。文章的主要思想是通过二值化weights和activations,来提高NN的速度和减少其内存占用。

elaine_bao的专栏 1万+

深度神经网络中的BNN和DNN:基于存内计算的原理、实现与能量效率

基于二值化值和激活的MNIST分类的BNN实现,利用标准6T SRAM位单元进行内存计算。通过使用这种方法,将神经网络中通常需要的MAC操作减少为逐位操作,从而大大减小了模型的大小,节约了能量,同时保持了存储在内存中的重量不变随着人工智能和大数据时代的到来,深度神经网络(DNN)在计算机领域中得到了广泛应用。DNN具有较高的准确度和广泛的应用领域,如语音识别、图像识别等。然而,DNN的计算成本较高,需要大量的标记样本和计算时间。为了解决这一问题,随机梯度优化算法被提出,用于加快DNN的训练速度。

m0_58966968的博客 1556
上一篇: OpenCV计算机视觉学习(8)——图像轮廓处理(轮廓绘制,轮廓检索,轮廓填充,轮廓近似)
下一篇: OpenCV计算机视觉学习(9)——图像直方图 & 直方图均衡化
iFlyAI
博客等级 码龄9年 238粉丝 134原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值