去掉乘法运算的加法移位神经网络架构

[CVPR 2020] AdderNet: Do We Really Need Multiplications in Deep Learning?

代码:https://github.com/huawei-noah/AdderNet/tree/master

核心贡献

  • 用filter与input feature之间的L1-范数距离作为“卷积层”的输出
  • 为了提升模型性能,提出全精度梯度的反向传播方法
  • 根据不同层的梯度级数,提出自适应学习率策略

研究动机

  • 加法远小于乘法的计算开销,L1-距离(加法)对硬件非常友好
  • BNN效率高,但是性能难以保证,同时训练不稳定,收敛慢
  • 几乎没有工作尝试用其他更高效的仅包含加法的相似性度量函数来取代卷积

传统卷积
在这里插入图片描述

其中, S S S是相似度(距离)衡量指标,如果定义为内积,则是传统卷积算法。

AdderNet
用L1-距离作为距离衡量指标:
在这里插入图片描述

从而,计算中不存在任何乘法计算。Adder层的输出都是负的,所以网络中引入batch normalization(BN)层和激活函数层。注意BN层虽然有乘法,但是其开销相比于卷积可以忽略不计。

为什么可以将卷积替换为加法?作者的解释是第一个公式类似于图像匹配领域,在这个领域中 S S S可以被替换为不同的函数,因此在卷积神经网络中把内积换成L1-距离也是很自然的想法。

优化方法
传统卷积的梯度:
在这里插入图片描述

signSGD梯度:
在这里插入图片描述

其中,sgn是符号函数。但是,signSGD几乎没有采取最陡的下降方向,随着维度的增长,下降方向只会变得更糟,所以不适用于大参数量的模型优化。

于是本文提出通过利用全精度梯度,精确地更新filter:
在这里插入图片描述

在形式上就是去掉了signSGD的sgn函数。

为了避免梯度爆炸的问题,提出将梯度裁剪到[-1, 1]范围内:
在这里插入图片描述
在这里插入图片描述

自适应学习率
传统CNN的输出方差:
在这里插入图片描述

AdderNet的输出方差:
在这里插入图片描述

CNN中filter的方差非常小,所以Y的方差很小;而AdderNet中Y的方差则非常大。

计算损失函数对x的梯度:
在这里插入图片描述

这个梯度的级数应该很小,本文对不同层weight梯度的L2-norm值进行了统计:
在这里插入图片描述

发现AdderNet的梯度确实相比于CNN非常小,这会严重减慢filter更新的过程。

一种最直接的思路就是采用更大的学习率,本文发现不同层的梯度值差异很大,所以为了考虑不同层的filter情况,提出了不同层的自适应学习率。

在这里插入图片描述

其中, γ \gamma γ是全局学习率, ∆ L ( F l ) ∆L(F_l) L(Fl)是第 l l l层filter梯度, α l \alpha_l αl是对应层的本地学习率。

在这里插入图片描述

k k k F l F_l Fl中元素的数量, η \eta η是超参数。于是,不同adder层中的filter可以用几乎相同的step进行更新。

训练算法流程
感觉没有什么特别需要注意的地方。
在这里插入图片描述

主要实验结果
在这里插入图片描述

在这里插入图片描述

可以看到,AdderNet在三个CNN模型上都掉点很少,并且省去了所以乘法,也没有BNN中的XNOR操作,只是有了更多的加法,效率应该显著提高。

核心代码
Adder层:

X_col = torch.nn.functional.unfold(X.view(1, -1, h_x, w_x), h_filter, dilation=1, padding=padding, stride=stride).view(n_x, -1, h_out*w_out)
X_col = X_col.permute(1,2,0).contiguous().view(X_col.size(1),-1)
W_col = W.view(n_filters, -1)

output = -(W_col.unsqueeze(2)-X_col.unsqueeze(0)).abs().sum(1)

反向传播优化:

grad_W_col = ((X_col.unsqueeze(0)-W_col.unsqueeze(2))*grad_output.unsqueeze(1)).sum(2)
grad_W_col = grad_W_col/grad_W_col.norm(p=2).clamp(min=1e-12)*math.sqrt(W_col.size(1)*W_col.size(0))/5
grad_X_col = (-(X_col.unsqueeze(0)-W_col.unsqueeze(2)).clamp(-1,1)*grad_output.unsqueeze(1)).sum(0)

[NeurIPS 2020] ShiftAddNet: A Hardware-Inspired Deep Network

代码:https://github.com/GATECH-EIC/ShiftAddNet

主要贡献

  • 受到硬件设计的启发,提出bit-shift和add操作,ShiftAddNet具有完全表达能力和超高效率
  • 设计训练推理算法,利用这两个操作的不同的粒度级别,研究ShiftAddNet在训练效率和精度之间的权衡,例如,冻结所有的位移层

研究动机

  • Shift和add比乘法更高效
  • Add层学习的小粒度特征,shift层被认为可以提取大粒度特征提取

ShiftAddNet结构设计
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

反向传播优化
Add层的梯度计算
在这里插入图片描述

Shift层的梯度计算
在这里插入图片描述

冻结shift层
冻结ShiftAddNet中的shift层意味着 s , p s, p s,p在初始化后一样,然后进一步剪枝冻结的shift层以保留必要的大粒度anchor weight。

[NeurIPS 2023] ShiftAddViT: Mixture of Multiplication Primitives Towards Efficient Vision Transformers

代码:https://github.com/GATECH-EIC/ShiftAddViT

核心贡献

  • 用混合互补的乘法原语(shift和add)来重参数化预训练ViT(无需从头训练),得到“乘法降低”网络ShiftAddViT。Attention中所有乘法都被add kernel重参数化,剩下的线性层和MLP被shift kernel重参数化
  • 提出混合专家框架(MoE)维持重参数化后的ViT,其中每个专家都代表一个乘法或它的原语,比如移位。根据给定输入token的重要性,会激活合适的专家,例如,对重要token用乘法,并对不那么重要的token用移位
  • 在MoE中引入延迟感知和负载均衡的损失函数,动态地分配输入token给每个专家,这确保了分配的token数量与专家的处理速度相一致,显著减少了同步时间

研究动机

  • 乘法可以被替换为shift和add
  • 如果重参数化ViT?ShiftAddNet是级联结构,需要双倍的层数/参数Shift和add层的CUDA内核比PyTorch在CUDA上的训练和推理慢得多
  • 如何保持重参数化后ViT的性能?对于ViT,当图像被分割成不重叠token时,我们可以利用输入token之间固有的自适应敏感性。原则上包含目标对象的基本token需要使用更强大的乘法来处理(这个idea和token merging很类似)

总体框架设计

  • 对于attention,将4个linear层和2个矩阵乘转换为shift和add层
  • 对于MLP,直接替换为shift层会大幅降低准确率,因此设计了MoE框架合并乘法原语的混合,如乘法和移位
  • 注意:linear->shift, MatMul->add

在这里插入图片描述

Attention重参数化
考虑二值量化,于是两个矩阵之间的乘累加(MAC)运算将高效的加法运算所取代。
( Q K ) V (QK)V (QK)V改为 Q ( K V ) Q(KV) Q(KV)以实现线性复杂度, Q , K Q, K Q,K进行二值量化,而更敏感的 V V V保持高精度,并插入轻量级的DWConv增强模型局部性。

在这里插入图片描述

可以看到,实际上ShiftAddViT就是把浮点数乘法简化为了2的幂次的移位运算和二值的加法运算。
在这里插入图片描述

其中, s , P s, P s,P都是可以训练的。

敏感性分析
在attention层应用线性注意力、add或shift对ViT准确性影响不大,但是在MLP层应用shift影响很明显!同时,使MLP更高效,对能源效率有很大贡献,因此需要考虑新的MLP重参数化方法。

在这里插入图片描述

MLP重参数化
MLP同样主导ViT的延迟,所以用shift层替换MLP的linear层,但是性能下降明显,所以提出MoE来提升其性能。

MoE框架

  • 假设: 假设重要但敏感的输入token,需要更强大的网络,否则会显著精度下降

  • 乘法原语的混合: 考虑两种专家(乘法和shift)。根据router中gate值 p i = G ( x ) p_i=G(x) pi=G(x),每个输入token表示 x x x将被传递给一位专家,输出定义如下:
    在这里插入图片描述
    在这里插入图片描述
    其中, n , E i n, E_i n,Ei表示专家数和第 i i i个专家。

  • 延迟感知和负载均衡的损失函数: MoE框架的关键是设计一个router函数,以平衡所有专家有更高的准确性和更低的延迟。乘法高性能但慢,shift快但低性能,如何协调每个专家的工作负荷,以减少同步时间?
    在这里插入图片描述
    其中,SCV表示给定分布对专家的平方变异系数(本文没介绍)。通过设计的损失函数,可以满足(1)所有专家都收到gate值的预期加权和;(2)为所有专家分配预期的输入token数。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/258051.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python之math模块常用方法汇总

python中math模块常用的方法整理 ceil:取大于等于x的最小的整数值,如果x是一个整数,则返回x copysign:把y的正负号加到x前面,可以使用0 cos:求x的余弦,x必须是弧度 degrees:把x从弧度转换成角度 e:表示一个常量 exp:返回mat…

docker制作php5.4运行环境镜像

1.下载镜像 docker pull centos:7或者在控制面板下 2.运行centos7镜像的容器,edncenos7 是新生成的容器名称 ## --name 新名字 docker run -it --name edncenos7 c9a1fdca3387 /bin/bash3.在容器内下载php5.4等插件,以便提交成为新镜像 wget --no-ch…

亚信安慧AntDB数据库——助力5G计费核心替换,全面自主可控

数字经济时代,5G以更快、更丰富、更智能的连接方式服务于各行各业。AntDB数据库,源于亚信科技,自2008年起成功落地全国24个省份的中国移动、中国电信、中国联通和中国广电等运营商项目,为数字化服务和信息化基础建设提供支持。 在…

精选猫咪最爱:五款性价比超高的猫罐头品牌大PK!

新手养猫很容易陷入疯狂购买的模式,但有些品牌真的不能乱买!现在的大环境不太好,我们需要学会控制自己的消费欲望,把钱花在刀刃上!现在宠物市场真的很内卷,很多品牌都在比拼产品的数据和营养成分。很多铲屎…

大数据讲课笔记5.1 初探MapReduce

文章目录 零、学习目标一、导入新课二、新课讲解(一)MapReduce核心思想(二)MapReduce编程模型(三)MapReduce编程实例——词频统计思路1、Map阶段(映射阶段)2、Reduce阶段&#xff08…

STM32启动流程详解(超全,startup_stm32xx.s分析)

单片机上电后执行的第一段代码 1.初始化堆栈指针 SP_initial_sp 2.初始化 PC 指针Reset_Handler 3.初始化中断向量表 4.配置系统时钟 5.调用 C 库函数_main 初始化用户堆栈,然后进入 main 函数。 在正式讲解之前,我们需要了解STM32的启动模式。 STM32的…

透视数据:数据可视化工具的多重场景应用

数据可视化工具已经成为了许多领域中的重要利器,它们在各种场景下发挥着重要作用。下面我就以可视化从业者的角度简单谈谈数据可视化工具在不同场景下的应用: 企业数据分析与决策支持 在企业层面,数据可视化工具被广泛应用于数据分析和决策…

27jd网卡丢失IP地址问题追踪

一、问题描述及复现步骤 问题描述 启用network服务,关闭NetworkManager服务后,(通过 ip a 查看) em1网卡丢失IP地址 网络相关组件信息 glib-networking-2.58.0-7.ky10.x86_64 network-scripts-10.01-6.ky10.x86_64 dracut-…

MapReduce综合应用案例 — 电信数据清洗

文章目录 第1关:数据清洗 第1关:数据清洗 测试说明 平台会对你编写的代码进行测试: 评测之前先在命令行启动hadoop:start-all.sh; 点击测评后MySQL所需的数据库和表会自动创建好。 PhoneLog:封装对象 L…

Android定制ROM简介

Android定制ROM简介 这篇文章是为对自定义ROM、AOSP等词汇不太熟悉的技术爱好者和好奇的人写的。我希望通过向您介绍这个世界来开始博客写作。 在我们将注意力转向定制ROM之前,让我们先了解一些基础知识。 什么是操作系统? 维基百科对此的定义简洁而…

探讨二维半导体的概念、应用前景及其与传统半导体的差异

当探讨二维半导体时,我们置身于科技革新的前沿。这种材料以其纳米级薄度和独特电学性质区别于传统半导体,引发了科学界的广泛兴趣。本文将深入探讨二维半导体的概念、应用前景及其与传统半导体的差异。 什么是二维半导体? 二维半导体是由单…

计算机网络 网络层下 | IPv6 路由选择协议,P多播,虚拟专用网络VPN,MPLS多协议标签

文章目录 5 IPv65.1 组成5.2 IPv6地址5.3 从IPv4向IPv6过渡5.3.1 双协议栈5.3.2 隧道技术 6 因特网的路由选择协议6.1 内部网关协议RIP6.2 内部网关协议 OSPF基本特点 6.3 外部网关协议 BGP6.3.1 路由选择 6.4 路由器组成6.4.1 基本了解6.4.2 结构 7 IP多播7.1 硬件多播7.2 IP多…

0062-Java运算符

文章目录 1.运算符介绍2.算术运算符2.1 介绍2.2 细节说明 3.关系运算符(比较运算符)3.1 介绍3.2 细节说明 4.逻辑运算符4.1 介绍4.2 逻辑运算规则4.3 && 和 & 基本规则4.4 && 和 & 使用区别4.5 || 和 | 基本规则4.6 || 和 | 使用区别 5. ! 取反 基本规…

Logback简介与配置详解

在开发和维护Spring Boot应用程序时,一个强大而灵活的日志框架是至关重要的。Spring Boot默认集成了Logback,一个高性能的Java日志框架。本文将介绍如何配置Logback以满足你的日志记录需求。 Logback简介 官方网址:https://logback.qos.ch/ …

Kafka核心参数(带完善)

客户端 api Kafka提供了以下两套客户端API HighLevel(重点)LowLevel HighLevel API封装了kafka的运行细节,使用起来比较简单,是企业开发过程中最常用的客户端API。 而LowLevel API则需要客户端自己管理Kafka的运行细节,Partition&#x…

RocketMQ系统性学习-SpringCloud Alibaba集成RocketMQ以及消费收发实战

文章目录 Spring Cloud Alibaba 集成 RocketMQ 最佳实践集成依赖DashBoard消息收发实战 Spring Cloud Alibaba 集成 RocketMQ 最佳实践 SpringBoot 相对于 SSM 来说已经很大程度上简化了开发,但是使用 SpringBoot 集成一些第三方的框架,还是需要花费一些…

Node.js 工作线程与子进程:应该使用哪一个

Node.js 工作线程与子进程:应该使用哪一个 并行处理在计算密集型应用程序中起着至关重要的作用。例如,考虑一个确定给定数字是否为素数的应用程序。如果我们熟悉素数,我们就会知道必须从 1 遍历到该数的平方根才能确定它是否是素数&#xff…

搭建知识付费平台?明理信息科技为你提供全程解决方案

明理信息科技saas知识付费平台 在当今数字化时代,知识付费已经成为一种趋势,越来越多的人愿意为有价值的知识付费。然而,公共知识付费平台虽然内容丰富,但难以满足个人或企业个性化的需求和品牌打造。同时,开发和维护…

Python Pandas Excel/csv文件的保存与读取(第14讲)

Python Pandas Excel/csv文件的读取于保存(第14讲)         🍹博主 侯小啾 感谢您的支持与信赖。☀️ 🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔ꦿ🌹꧔…
最新文章