【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

相关文章

AI hospital 论文Idea

一、Benchmarking Large Language Models on Communicative Medical Coaching: A Dataset and a Novel System论文地址含代码 大多数现有模型和工具主要迎合以患者为中心的服务。这项工作深入探讨了LLMs在提高医疗专业人员的沟通能力。目标是构建一个模拟实践环境,人类医生(即医学学习者)可以在其中与患者代理进行医学

论文翻译:arxiv-2024 Benchmark Data Contamination of Large Language Models: A Survey

Benchmark Data Contamination of Large Language Models: A Survey https://arxiv.org/abs/2406.04244 大规模语言模型的基准数据污染:一项综述 文章目录 大规模语言模型的基准数据污染:一项综述摘要1 引言 摘要 大规模语言模型(LLMs),如GPT-4、Claude-3和Gemini的快

论文阅读笔记: Segment Anything

文章目录 Segment Anything摘要引言任务模型数据引擎数据集负责任的人工智能 Segment Anything Model图像编码器提示编码器mask解码器解决歧义损失和训练 Segment Anything 论文地址: https://arxiv.org/abs/2304.02643 代码地址:https://github.com/facebookresear

论文翻译:ICLR-2024 PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS

PROVING TEST SET CONTAMINATION IN BLACK BOX LANGUAGE MODELS https://openreview.net/forum?id=KS8mIvetg2 验证测试集污染在黑盒语言模型中 文章目录 验证测试集污染在黑盒语言模型中摘要1 引言 摘要 大型语言模型是在大量互联网数据上训练的,这引发了人们的担忧和猜测,即它们可能已

OmniGlue论文详解(特征匹配)

OmniGlue论文详解(特征匹配) 摘要1. 引言2. 相关工作2.1. 广义局部特征匹配2.2. 稀疏可学习匹配2.3. 半稠密可学习匹配2.4. 与其他图像表示匹配 3. OmniGlue3.1. 模型概述3.2. OmniGlue 细节3.2.1. 特征提取3.2.2. 利用DINOv2构建图形。3.2.3. 信息传播与新的指导3.2.4. 匹配层和损失函数3.2.5. 与Super

BERT 论文逐段精读【论文精读】

BERT: 近 3 年 NLP 最火 CV: 大数据集上的训练好的 NN 模型,提升 CV 任务的性能 —— ImageNet 的 CNN 模型 NLP: BERT 简化了 NLP 任务的训练,提升了 NLP 任务的性能 BERT 如何站在巨人的肩膀上的?使用了哪些 NLP 已有的技术和思想?哪些是 BERT 的创新? 1标题 + 作者 BERT: Pre-trainin

[论文笔记]LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale

引言 今天带来第一篇量化论文LLM.int8(): 8-bit Matrix Multiplication for Transformers at Scale笔记。 为了简单,下文中以翻译的口吻记录,比如替换"作者"为"我们"。 大语言模型已被广泛采用,但推理时需要大量的GPU内存。我们开发了一种Int8矩阵乘法的过程,用于Transformer中的前馈和注意力投影层,这可以将推理所需

MonoHuman: Animatable Human Neural Field from Monocular Video 翻译

MonoHuman:来自单目视频的可动画人类神经场 摘要。利用自由视图控制来动画化虚拟化身对于诸如虚拟现实和数字娱乐之类的各种应用来说是至关重要的。已有的研究试图利用神经辐射场(NeRF)的表征能力从单目视频中重建人体。最近的工作提出将变形网络移植到NeRF中,以进一步模拟人类神经场的动力学,从而动画化逼真的人类运动。然而,这种流水线要么依赖于姿态相关的表示,要么由于帧无关的优化而缺乏运动一致性

2024 年高教社杯全国大学生数学建模竞赛 C 题 农作物的种植策略 参考论文 无水印

持续更新中,2024年数学建模比赛思路代码论文都会发布到专栏内,只需订阅一次!  完整论文+代码+数据结果链接在文末!  订阅后可查看参考论文文件 第一问 1.1 问题重述 这个问题围绕的是华北山区的某乡村,在有限的耕地条件下,如何制定最优的农作物种植策略。乡村有 34 块露天耕地和 20 个大棚,种植条件包括粮食作物、蔬菜、水稻和食用菌。除了要考虑地块的面积、种植季节等,还要确保

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes

论文精读-Supervised Raw Video Denoising with a Benchmark Dataset on Dynamic Scenes 优势 1、构建了一个用于监督原始视频去噪的基准数据集。为了多次捕捉瞬间,我们手动为对象s创建运动。在高ISO模式下捕获每一时刻的噪声帧,并通过对多个噪声帧进行平均得到相应的干净帧。 2、有效的原始视频去噪网络(RViDeNet),通过探