去掉乘法的加法神经网络

AdderNet: Do We Really Need Multiplications in Deep Learning?

核心贡献

  • 用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操作,只是有了更多的加法,效率应该显著提高。

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.[BUU][极客大挑战 2019]EasySQL1

1.了解万能密码--》1 or 11# 这是一种常见的SQL注入攻击。在一个SQL查询中,这个语句会导致条件始终为真(11),因此查询会返回所有的结果。#表示注释,可以用来结束SQL语句,防止后续的部分执行。因此&#xf…

HTML_CSS的基本选择器的使用及其作用范围和优先级

目录 ✨CSS的使用:行内样式内部样式外部样式 ✨CSS基本选择器:id选择器class选择器标签选择器 ✨优先级:选择器的优先级样式表的优先级 ✨CSS的使用: 根据定义CSS的位置不同,分为行内样式、内部样式和外部样式 行内样…

【目标检测】视频输出体积太大?分析视频的编码与码率问题

在做视频目标检测时,发现一个问题,检测输出完的视频时大时小,有时输出体积过大,造成播放器播放时严重卡顿现象。本文就这一情况进行分析,并就该问题提出相关解决方案。 视频基础知识 隔行扫描和逐行扫描 早期电视台在…

Unity与Android交互通信系列(2)

在上一篇文章中,我们介绍了Unity和Android交互通信的原理及在Unity中直接调用Java代码的方式,但没有给出代码示例,下面通过实际例子演示上篇文章中AndroidJavaClass、AndroidJavaObject两个类的基本用法,由于交互通信涉及到两端&a…

Rust与python联动进行多线程跑数据

最近有个学弟想请教我联动多线程爬取数据的案例,看了以前的模版没有合适的,我就利用空闲时间,专门给他写了一段模版作为参考。这里遇到注意的是需要代理IP介入,才能让多线程爬取减少网站风控限制。 以下是一个使用 Rust 编写的爬虫…

传统软件集成AI大模型——Function Calling

传统软件和AI大模型的胶水——Function Calling 浅谈GPT对传统软件的影响Function Calling做了什么,为什么选择Function CallingFunction Calling简单例子,如何使用使用场景 浅谈GPT对传统软件的影响 目前为止好多人对chatGPT的使用才停留在OpenAI自己提…

打响指针的第一枪:指针家族

前言 指针其实是我们学习C语言中最难的知识点,很多人在学习指针的时候会被绕晕,包括博主也是,当初百思不得其解,脑袋都要冒烟了,本来打算在学习指针的时候就写一篇博客,但是当初自己的能力还是没有办法去完…

【具身智能评估7】ProcTHOR: Large-Scale Embodied AI Using Procedural Generation

论文标题:ProcTHOR: Large-Scale Embodied AI Using Procedural Generation 论文作者:Matt Deitke, Eli VanderBilt, Alvaro Herrasti, Luca Weihs, Jordi Salvador, Kiana Ehsani, Winson Han, Eric Kolve, Ali Farhadi, Aniruddha Kembhavi, Roozbeh M…

【TI毫米波雷达】上电时序、串口回环BUG及SOP模式不正常工作的解决方案(LP87524电源PMIC芯片的BUCK供电时序配置)

【TI毫米波雷达】雷达上电时序及SOP模式不正常工作的解决方案(LP87524电源PMIC芯片的BUCK供电时序配置) 文章目录 上电时序上电以后的雷达串口回环问题延迟上电时序LP87524电源PMIC芯片的BUCK供电时序LP87524电源PMIC芯片的BUCK默认供电输出附录&#x…

早期的OCR是怎么识别图片上的文字的?

现在的OCR技术融合了人工智能技术,通过深度学习,无论是识别的准确率还是效果都非常不错,那您知道在早期的OCR是通过什么技术来实现的吗?如果您不知道,那么,就让我来告诉您:它主要是基于字符的几…

LibreNMS:从docker出发

引言 LibreNMS 是一个免费开源的网络监控和自动化工具,用于监视网络设备、服务器和应用程序的性能和状态。它提供了一个集中的管理平台,帮助管理员实时监控和管理整个网络基础设施。 以下是 LibreNMS 的一些主要特点和功能: 自动发现&#…

【.NET】控制台应用程序的各种交互玩法

关于控制台交互,大伙伴们也许见得最多的是进度条,就是输出一行但末尾不加 \n,而是用 \r 回到行首,然后输出新的内容,这样就做出进度条了。不过这种方法永远只能修改最后一行文本。 于是,有人想出了第二种方…