机器之心报道

参与:思、一鸣

深度学习对算力要求太高,怎么简化计算复杂度呢?北大、华为诺亚方舟实验室等提出完全用加法代替乘法,用 L1 距离代替卷积运算,从而显著减少计算力消耗。

和加法运算相比,乘法运算在计算复杂度上要高很多。 在深度学习中,被广泛使用的卷积运算相当于是衡量输入特征和卷积滤波器之间相似度的交叉相关计算。 在这一过程中需要很大规模的浮点乘法,因此很多研究都在考虑将乘法运算换成等价的加法运算。 近日,北大、华为诺亚方舟实验室等的研究者提出了一个名为 AdderNets 的网络,用于将深度神经网络中,特别是卷积神经网络中的乘法,转换为更简单的加法运算,以便减少计算成本。 在 AdderNets 中,研究者采用了 L1 正则距离,用于计算滤波器和输入特征之间的距离,并作为输出的反馈。 为了取得更好的性能,研究者构建了一种特殊的反向传播方法,并发现这种几乎完全采用加法的神经网络能够有效收敛,速度与精度都非常优秀。 从结果来看,AdderNets 在 ResNet-50 上 对 ImageNet 数据集进行训练后,能够取得 74.9% 的 top-1 精确度和 91.7% 的 top-5 精确度,而且在卷积层上不使用任何乘法操作。 这一研究引起了深度学习社区的热议。 一些网友认为这是一个不错的研究,如果通过简化计算复杂度,让 CPU 运行本应当由 GPU 运行的计算,则是一个很好的改进了。

但是一些人也提出了质疑,比如无法完全展示性能提升和功耗下降的定量表现。

当然,考虑到一些 CUDA 对某些运算进行了特别的优化,因此即使有计算改进,通过这些硬件可能也无法展示真实的性能提升。

至于论文是否如声称的性能和优势,机器之心在此对论文进行了节选和解读,感兴趣的读者们可以在评论区讨论。

论文地址: https://arxiv.org/pdf/1912.13200v2.pdf 为什么需要替代乘法 有了 GPU 进行加速,即使是有着上亿浮点数乘法计算的卷积神经网络也可以得到加速。 然而,高端 GPU 显卡具有很高的能耗,使得在移动设备上部署深度学习系统变得很困难。 加法、减法、乘法和除法是四种基本的数学运算。 我们都知道,乘法比加法运行速度更慢,但是在前向计算中,深度神经网络中的大部分计算都来自浮点值权重和浮点激活值的乘法操作,因此许多研究都在探索如何将乘法换成加法。 其中一项开创性的工作便是 BinaryConnect。 这一算法强制网络权重为二值化(如 -1 或 1),因此许多乘积运算被替换为简单的加法计算。 尽管通过二值化过滤器的深度神经挽留过极大地减少了计算量,但是网络也通常不太可能维持原来的识别精确度。 此外,训练二值网络的过程也不是稳定的,经常会需要更慢的收敛速度和很小的学习率。 但实际上,经典 CNN 中的卷积计算实际上是对两个输入(输入特征和滤波器)之间进行互相关性的计算。 这一点认知非常重要,这也是整篇论文的出发点。 既然卷积操作的实质是输入特征和给定滤波器之间进行的相似度度量计算,那么是否可以使用加法的方式代替乘法进行相似度计算呢? 本文的研究者遵循这一思路想到了一种方法。 没有乘法的神经网络 在这篇论文中,研究者提出了一种名为 AdderNet 的神经网络,他们希望尽可能使用加法,而不像卷积运算那样大量使用乘法。 想象一下,如果给定一系列微小的模式,并将它们作为神经网络中的「滤波器」,那么 L1 距离能很好地度量输入数据与模式之间的绝对差异。

图 1: AdderNet 和 CNN 的特征可视化。 如上图 1 所示,对于卷积网络来说,不同的类别可以通过角度来确定。 而对于 AdderNet,因为采用 L1 距离度量不同类别的绝对误差,它的特征会像聚类那样聚集在不同的集群中心。 研究者表示,这样的可视化旨在说明 L1 距离可以像卷积网络中的「滤波器」一样,它们都可以作为一种度量输入特征与特定模式之间距离的方法。 因为减法可以通过加法的补码(补码: 用二进制进行正负变号的方法)来实现,因此 L1 距离同样对硬件非常友好,相当于它只会用了加法。 这样只包含加法的运算,是替代卷积运算的一种好方法。 当然,采用了 L1 距离,反向传播也需要修正,研究者设计了一种带正则梯度的方法以确保不同的「模式」能够有充足的更新,并构建更好的网络收敛行为。 研究者表示,他们设计的 AdderNet 已经在多种基准上做了充足的实验,令人惊喜的是,AdderNet 不仅能收敛到与传统 CNN 相近的准确率,同时推断速度还快得多。 从乘法到加法的卷积计算 原始的卷积计算如下所示,假设有一组滤波器 , 它会对输入

执行卷积运算。其中 c_in、c_out 为输入和输出的通道数,H、W 分别为特征的高和宽。输出特征 Y 便是滤波器和输入特征的相似度度量,如下所示:

在这里,S(·,·) 表示为两者之间的相似度度量函数。 如果我们采用互相关作为度量标准,那么 S() 就是乘法运算,常规的卷积运算就是采用这种方法。 论文中,研究者将互相关性换成了 L1 距离,L1 距离是一种加法操作——用于计算两个向量表示之间所有点的绝对距离之和。

根据这一定义,如上所示公式 1 可以被改写为 X 和 F 之间的减法计算,而减法的补码直接是加法,因此也相当于只有加法运算。 这样一来,卷积计算中最消耗算力的部分被代替,因此极大地加快了运算速度。 反向传播如何设计 原始的反向传播公式如下所示,其中 i ∈ [m,m+d],j ∈ [n,n+d]。 要更新「滤波器」F,就要计算距离 Y 对 F 的偏导数,因为相似性是靠乘法 X*F 来计算的,因此偏导就为 X。

由于在 AdderNet 中,距离 Y 是由 X 和 F 之间的 L1 距离获得的,即通过 |X-F|完成运算,那么最直观的梯度运算应该是采用符号函数 Sgn():

也就是说,但 X-F 距离为正,那么梯度为 1,反之梯度为 0 或-1。 这样看起来收敛就不会稳定,因为即使距离再大,它的梯度也恒为 1 或-1。 现在我们需要改造这样的传播公式,研究者提出了以下反向传播公式:

可以看出来,这样的梯度是由 L2 范数推导出来的,因为 L1 范数与 L2 范数都能度量两者的距离,所以采用 L2 范数的梯度更新 L1 范数的表达式,直观上应该是可行的。 研究者将这种方法被称为全精度梯度(full-precision gradient),但是在没有符号函数整流的情况下,梯度可能会随着层积累而导致梯度爆炸的情况。 因此,研究者加上了一个梯度裁剪操作,使对 X 的梯度限定在 [-1,1] 的范围内。 最终的公式如下所示,其中 HT 是裁剪梯度的一个运算。

除了反向传播之外,研究者还在学习率等方面进行了改进,加强了模型的训练能力。 没有乘法的模型真的能收敛? 为了证明 AdderNet 的有效性,研究者在 MNIST、CIFAR 和 ImageNet 上测试了模型效果,同时也做了一系列对照实验来确定 L1 距离等不同模块的重要性。 所有实验都是在英伟达 Tesla V100 GPU 和 PyTorch 上完成的。 首先对于 MNIST,研究者的方案是采用本文提出的 adder 滤波器替代 LeNet-5-BN 的卷积核,同时因为全连接层可视为特殊的卷积层,因此研究者采用减法代替了全连接层中的乘法。 对于常规的卷积网络来说,最终约有 435K 乘法运算、435K 加法运算,而 AdderNet 只有 870K 加法,基本没有乘法。 在 MNIST 上,卷积与 Adder 都能获得 99.4% 的准确率。 但从 CPU 的角度来说,加法的延迟要远远低于乘法,采用 Adder 运算的 LeNet-5 在 CPU 上能有∼1.7M 的延迟,而原版 LeNet-5 有∼2.6M 的延迟。 研究者并没有继续对比 GPU 上的延迟,毕竟卷积经过了 CUDA 与 CuDNN 的高度优化,而 Adder 运算并没有。 随后研究者进一步在 CIFAR 和 ImageNet 上对比了不同方法的效果。 这一次还是像 MNIST 那样用 Adder 运算替代卷积运算,只不过新加了二值神经网络(BNN),因为它可以通过 XNOR 运算代替乘法运算,整个实验保证其它条件都一致。

图 2: 二值网络、加法网络和卷积网络在 CIFAR-10 与 CIFAR-100 数据集上的效果。 我们可以看到共有 1.3G 的总运算,CNN 会将其分配给乘法与加法,BNN 会分配给加法与 XNOR 运算,而 AddNN 完全采用加法。 值得注意的是,在 CIFAR 数据集上,完全加法的神经网络在性能上也能媲美常规卷积神经网络。

图 3: ImageNet 上的分类结果。 与 CIFAR 数据集一一致,Adder 运算效果能媲美卷积运算,同时完全采用加法。 最后,研究者还做了一系列对照试验,主要探讨到底什么样的梯度信号才能保证收敛的速度与准确性。 如下图 3 所示,研究者提出的适应性学习率缩放与全精度梯度方法最终能达到最好的效果。

图 3: AdderNet 采用不同最优化策略所获得的学习曲线,其中 FP 表示全精度梯度,Sgn 表示符号函数梯度。 看了实验效果,先不管它的实际应用怎么样,就这样完全采用加法运算,还能收敛得如此优秀,足以说明用加法替代乘法是可行的、采用 L1 距离替代卷积运算也是可行的。 之前机器之心挺少看到类似的研究,这样的方向说不定非常值得更多研究者去探索。 机器之心 AAAI 2020 论文分享进行到了第三期,本期我们邀请到了加州大学伯克利分校 Zhewei Yao 博士,他的论文《Q-BERT: Hessian Based Ultra Low Precision Quantization of BERT》被 AAAI 2020 所接收。在这期分享中,他将介绍把二阶方法用于训练深度神经网络的最新结果。

excel乘法公式怎么输入_深度学习可以不要乘法,北大、华为诺亚新论文:加法替代,效果不变,延迟大降...相关推荐

  1. excel乘法公式怎么输入_智能考勤表,MM你再也不用加班了!【Excel教程】

    回复[目录]学习113篇Excel教程 全套Excel视频教程,微信扫码观看 如果考勤机没那么智能需要手工辅助统计,如果公司还没有使用考勤机,制作当月的考勤表是一个复杂而又冗长的过程.因此如何在有限的 ...

  2. excel乘法公式怎么输入_你加班3小时做的Excel表格,我只需1分钟!(建议收藏)

    今日干货领取 开始之前,老师要强烈推荐大家一个公众号给大家,这个号目前已聚集近60W财务小伙伴,在会计圈财税领域排名前列.每天只精选4.5条精华内容,封面统一.干货多多.情怀满满.他们还有专业答疑社群 ...

  3. excel乘法公式怎么输入_这4个变态的Excel函数公式,却好用的很!初级会计100%用的上!...

    免费赠书 2020年第3天,院长给大家准备了这套Excel财务书籍,包括财务单据和统计表.制作会计账务表单.会计记账.员工工资管理.月末账务处理.会计报表.财务分析......附赠8小时视频课程+90 ...

  4. excel乘法公式怎么输入_电气计算太慢?62套自动计算EXCEL表格,一键下载秒出结果...

    电气计算太慢?62套自动计算EXCEL表格,一键下载秒出结果 随着社会的整体发展节奏加快,人们的生活和工作节奏也随之加快!尤其是在职场上,高效工作是每个职场人员必须不断锻炼并掌握的专业技能.作为电气工 ...

  5. excel乘法公式怎么输入_最火8套工程测量公式计算表,操作简单,不仅效率高,误差还少...

    对于初入行的测量员来说,天天背着仪器下工地很累,但天天加班计算数据更辛苦,这就导致大量测量离职转行.针对这种情况中建推出了最火8套工程测量公式计算表. 这8套工程测量公式计算表包含了(完整版)测量坐标 ...

  6. tensorflow一维卷积输入_深度学习中的反卷积(Transposed Convolution)

    反卷积(Transposed Convolution)是一种图像上采样(UpSample)的方法,在DCGAN中用它来将随机采样的值转换为一张完整的图像. DCGAN生成手写数字.图片来源[5] Tr ...

  7. AUTOML学习神器VEGA(华为-诺亚方舟人工智能实验室出品)

    1.关于AUTOML https://zhuanlan.zhihu.com/p/93109455 2.华为诺亚(noha)AUTOML开源工具-VEGA https://github.com/huaw ...

  8. html输入公式得到混合运算结果,excel表格乘法公式怎么输入

    excel表格乘法的基本操作是很常用的函数技能,那么excel表格乘法公式怎么输入呢?小编为大家整理了excel表格乘法的基本操作,希望大家喜欢! excel表格乘法的基本操作:excel表格乘法公式 ...

  9. 深度学习 图像分类_深度学习时代您应该阅读的10篇文章了解图像分类

    深度学习 图像分类 前言 (Foreword) Computer vision is a subject to convert images and videos into machine-under ...

最新文章

  1. /var/lib/docker/overlay2/xxxxx no such file or directory docker文件删除引发的问题
  2. 洛谷8月赛Div.2
  3. windows核心编程 如何等待超过64(MAXIMUM_WAIT_OBJECTS) kernal object
  4. 转:Java NIO系列教程(九) Pipe
  5. 数字图像处理实验(7):PROJECT 04-03 , Lowpass Filtering
  6. 【杂谈】计算机视觉在人脸图像领域的十几个大的应用方向,你懂了几分?
  7. Innovation Factory Open Day
  8. 最佳调度问题pascal程序
  9. TenSorFlow随笔-除法
  10. 十八、梯度下降与反向传播
  11. 基于“证书”的Ipsec的传输模式
  12. leetcode题目:第 k 个数
  13. 安卓ondraw刷新视图_android播放动画时是否会调用被操作的视图的onDraw方法?
  14. 蓝桥杯 基础练习 时间转换
  15. 如何降低软件项目的风险 -- 包括客户的风险,软件提供商的风险
  16. 计算机维修报价,求一张电脑维护维修价格表
  17. arduino的串口缓冲区_C#无法从串口Arduino读取完整缓冲区
  18. 人工智能目前有哪些突破?
  19. 科学研究设计五:实验设计
  20. Python3 __dict__与dir()区别,对象中私有属性的访问

热门文章

  1. Spring源码之ResourceLoader(二):PathMatchingResourcePatternResolver实现getResources加载多文件
  2. 漫步数学分析二十——一致连续
  3. 小学二年级计算机考试,二年级下册数学:2000道口算题汇总,给孩子打印练习,堪比计算机...
  4. 【record】2、使用非官方遥控器适配prometheus的驱动修改
  5. 在Visual Basic 中使用C++ 类 (转)
  6. centos7中设置防火墙
  7. 一文学会Scrapy-redis分布式爬虫项目,初级工程师与中级工程师分水岭之一
  8. 三年多的电脑生涯的总结
  9. 用selenium爬取直播信息
  10. 支付退款流程设计_电商之下:电商订单系统,从0到1设计思路