【QNN】——Binarized Neural Networks论文

2024-06-13 08:32

本文主要是介绍【QNN】——Binarized Neural Networks论文,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

转载自:https://blog.csdn.net/liujianlin01/article/details/80917646
使用micronet
论文:https://arxiv.org/pdf/1602.02830.pdf
亮点:NIPS2016

[NIPS ‘16]论文地址:https://arxiv.org/pdf/1602.02830.pdf
代码地址:https://github.com/MatthieuCourbariaux/BinaryNet
这篇文章提出了一个新的网络:二值化网络(BNN),在运行时使用二值权重和激活。在训练时,二值权重和激活用于计算参数梯度。

摘要
我们介绍了一种训练二值化神经网络(BNNs)的方法——在运行时具有二值权值和激活的神经网络。在训练时,使用二值权值和激活值来计算参数梯度。在前向传递过程中,bnn大大减少了内存大小和访问次数,并将大部分算术操作替换为位操作,预计将大幅提高能效。为了验证bnn的有效性,我们在Torch7和Theano框架上进行了两组实验。在这两方面,BNNs都在MNIST、CIFAR-10和SVHN数据集上取得了几乎最先进的结果。最后但并非最不重要的是,我们编写了一个二进制矩阵乘法GPU内核,它可以比使用未优化的GPU内核运行MNIST BNN的速度快7倍,而不会损失任何分类精度。培训和运行BNNs的代码可以在线获得。

1. 二值化准则

文章给出了2种二值化函数。 第一种是决策式二值化:
这里写图片描述

第二种是随机二值化:
在这里插入图片描述
在这里插入图片描述

看公式第二种随机二值化更合理,但是每次生成随机数的时候非常耗时,所以文章中采用的第一种方法。

2. 梯度计算

如果采用上面的第一种二值化函数求导的话,那么求导后的值都是0。所以文章采用了一种方法,将sign(x)进行宽松。这样,函数就变成可以求导的了。
在这里插入图片描述
2.1 code

  • 梯度反向训练的时候,权重和激活值采用了不同的反向策略。权重采用了"直通估计器",激活值采用了Htanh
class BinaryActivation(Function):@staticmethoddef forward(self, input):self.save_for_backward(input)output = torch.sign(input)# ******************** A —— 1、0 *********************#output = torch.clamp(output, min=0)return output@staticmethoddef backward(self, grad_output):input, = self.saved_tensors# *******************ste*********************grad_input = grad_output.clone()# ****************saturate_ste***************grad_input[input.ge(1.0)] = 0grad_input[input.le(-1.0)] = 0'''#******************soft_ste*****************size = input.size()zeros = torch.zeros(size).cuda()grad = torch.max(zeros, 1 - torch.abs(input))#print(grad)grad_input = grad_output * grad'''return grad_input# weight
class BinaryWeight(Function):@staticmethoddef forward(self, input):output = torch.sign(input)return output@staticmethoddef backward(self, grad_output):# *******************ste*********************grad_input = grad_output.clone()return grad_input

3. pytorch中网络定义

可以看到网络的第一层conv是没有二值化的,是在第一层relu的时候才对激活值进行输出二值化。最后一个模块的Conv+bn+relu是没有做量化的。
if layer_counter[0] > 1 and layer_counter[0] < layer_num: # 第一层和最后一层不进行二值化

OrderedDict([('model', Sequential((0): ConvBNReLU((conv): Conv2d(3, 256, kernel_size=(5, 5), stride=(1, 1), padding=(2, 2))(bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ActivationQuantizer((relu): ReLU(inplace=True)))(1): ConvBNReLU((conv): QuantConv2d(256, 256, kernel_size=(1, 1), stride=(1, 1), groups=2(weight_quantizer): WeightQuantizer())(bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ActivationQuantizer((relu): ReLU(inplace=True)))(2): ConvBNReLU((conv): QuantConv2d(256, 256, kernel_size=(1, 1), stride=(1, 1), groups=2(weight_quantizer): WeightQuantizer())(bn): BatchNorm2d(256, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ActivationQuantizer((relu): ReLU(inplace=True)))(3): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(4): ConvBNReLU((conv): QuantConv2d(256, 512, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=16(weight_quantizer): WeightQuantizer())(bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ActivationQuantizer((relu): ReLU(inplace=True)))(5): ConvBNReLU((conv): QuantConv2d(512, 512, kernel_size=(1, 1), stride=(1, 1), groups=4(weight_quantizer): WeightQuantizer())(bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ActivationQuantizer((relu): ReLU(inplace=True)))(6): ConvBNReLU((conv): QuantConv2d(512, 512, kernel_size=(1, 1), stride=(1, 1), groups=4(weight_quantizer): WeightQuantizer())(bn): BatchNorm2d(512, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ActivationQuantizer((relu): ReLU(inplace=True)))(7): MaxPool2d(kernel_size=2, stride=2, padding=0, dilation=1, ceil_mode=False)(8): ConvBNReLU((conv): QuantConv2d(512, 1024, kernel_size=(3, 3), stride=(1, 1), padding=(1, 1), groups=32(weight_quantizer): WeightQuantizer())(bn): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ActivationQuantizer((relu): ReLU(inplace=True)))(9): ConvBNReLU((conv): QuantConv2d(1024, 1024, kernel_size=(1, 1), stride=(1, 1), groups=8(weight_quantizer): WeightQuantizer())(bn): BatchNorm2d(1024, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ActivationQuantizer((relu): ReLU(inplace=True)))(10): ConvBNReLU((conv): Conv2d(1024, 10, kernel_size=(1, 1), stride=(1, 1))(bn): BatchNorm2d(10, eps=1e-05, momentum=0.1, affine=True, track_running_stats=True)(relu): ReLU(inplace=True))(11): AvgPool2d(kernel_size=8, stride=1, padding=0)
))])

总结

  • 训练后模型的参数还是浮点数,只是在前向计算的时候,多了一步将conv2d的weight,relu的激活值二值化为{-1,1}的操作,可能计算更快。
  • 这样的操作需要推理框架,实际硬件的支持才能加速,不然利用现有的框架与硬件推理速度应该是差不多的。

这篇关于【QNN】——Binarized Neural Networks论文的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1056788

相关文章

康奈尔大学之论文审稿模型Reviewer2及我司七月对其的实现(含PeerRead)

前言 自从我司于23年7月开始涉足论文审稿领域之后「截止到24年6月份,我司的七月论文审稿GPT已经迭代到了第五版,详见此文的8.1 七月论文审稿GPT(从第1版到第5版)」,在业界的影响力越来越大,所以身边朋友如发现业界有相似的工作,一般都会第一时间发给我,比如本部分要介绍的康奈尔大学的reviewer2 当然,我自己也会各种看类似工作的论文,毕竟同行之间的工作一定会互相借鉴的,我们会学他们

【论文精读】分类扩散模型:重振密度比估计(Revitalizing Density Ratio Estimation)

文章目录 一、文章概览(一)问题的提出(二)文章工作 二、理论背景(一)密度比估计DRE(二)去噪扩散模型 三、方法(一)推导分类和去噪之间的关系(二)组合训练方法(三)一步精确的似然计算 四、实验(一)使用两种损失对于实现最佳分类器的重要性(二)去噪结果、图像质量和负对数似然 论文:Classification Diffusion Models: Revitalizing

【python】python葡萄酒国家分布情况数据分析pyecharts可视化(源码+数据集+论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C++/Python语言 👉公众号👈:测试开发自动化【获取源码+商业合作】 👉荣__誉👈:阿里云博客专家博主、51CTO技术博主 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 python葡萄酒国家分布情况数据分析pyecharts可视化(源码+数据集+论文)【独一无二】 目录 python葡

论文阅读--Efficient Hybrid Zoom using Camera Fusion on Mobile Phones

这是谷歌影像团队 2023 年发表在 Siggraph Asia 上的一篇文章,主要介绍的是利用多摄融合的思路进行变焦。 单反相机因为卓越的硬件性能,可以非常方便的实现光学变焦。不过目前的智能手机,受制于物理空间的限制,还不能做到像单反一样的光学变焦。目前主流的智能手机,都是采用多摄的设计,一般来说一个主摄搭配一个长焦,为了实现主摄与长焦之间的变焦,目前都是采用数字变焦的方式,数字变焦相比于光学

【LLM之KG】CoK论文阅读笔记

研究背景 大规模语言模型(LLMs)在许多自然语言处理(NLP)任务中取得了显著进展,特别是在零样本/少样本学习(In-Context Learning, ICL)方面。ICL不需要更新模型参数,只需利用几个标注示例就可以生成预测。然而,现有的ICL和链式思维(Chain-of-Thought, CoT)方法在复杂推理任务上仍存在生成的推理链常常伴随错误的问题,导致不真实和不可靠的推理结果。

【python】python基于akshare企业财务数据对比分析可视化(源码+数据集+论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C++/Python语言 👉公众号👈:测试开发自动化【获取源码+商业合作】 👉荣__誉👈:阿里云博客专家博主、51CTO技术博主 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 系列文章目录 目录 系列文章目录一、设计要求二、设计思路三、可视化分析 一、设计要求 选取中铁和贵州茅

AIGC-Animate Anyone阿里的图像到视频 角色合成的框架-论文解读

Animate Anyone: Consistent and Controllable Image-to-Video Synthesis for Character Animation 论文:https://arxiv.org/pdf/2311.17117 网页:https://humanaigc.github.io/animate-anyone/ MOTIVATION 角色动画的

【python】python股票量化交易策略分析可视化(源码+数据集+论文)【独一无二】

👉博__主👈:米码收割机 👉技__能👈:C++/Python语言 👉公众号👈:测试开发自动化【获取源码+商业合作】 👉荣__誉👈:阿里云博客专家博主、51CTO技术博主 👉专__注👈:专注主流机器人、人工智能等相关领域的开发、测试技术。 【python】python股票量化交易策略分析可视化(源码+数据集+论文)【独一无二】 目录 【python】pyt

springboot+vue+mybatis旅游管理+PPT+论文+讲解+售后

随着人民生活水平的提高,旅游业已经越来越大众化,而旅游业的核心是信息,不论是对旅游管理部门、对旅游企业,或是对旅游者而言,有效的获取旅游信息,都显得特别重要.旅游管理系统将使旅游相关信息管理工作规范化、信息化、程序化,提供旅游景点、旅游线路,旅游新闻等服务本文以jsp为开发技术,实现了一个旅游网站系统。旅游网站系统的主要使用者分为管理员和用户,管理员权限如下;主页、个人中心、景点分类管理、景点信息

【论文复现|智能算法改进】一种基于多策略改进的鲸鱼算法

目录 1.算法原理2.改进点3.结果展示4.参考文献5.代码获取 1.算法原理 SCI二区|鲸鱼优化算法(WOA)原理及实现【附完整Matlab代码】 2.改进点 混沌反向学习策略 将混沌映射和反向学习策略结合,形成混沌反向学习方法,通过该方 法生成鲸鱼算法的初始种群。混沌序列采用 Tent 混沌映射: x i + 1 = { δ x i 0 < x i < 0.5