论文笔记: AdderNet: Do we really need multiplications in deep learning?

这篇是华为和北大合作发表在CVPR2020的论文《AdderNet: Do we really need multiplications in deep learning?》,第一作者是北京大学的Hanting Chen,第二作者是华为诺亚方舟实验室的王云鹤,也是北大的师兄。看到这篇论文第一反应是有点遗憾,我三年前想到过这个idea,连名字都一样,但是因为自己能力不够就没有深入研究下去;又觉得非常高兴,因为提出的算法非常新颖,让我茅塞顿开,这个问题的解决方案非常漂亮。

文章基于深度学习的基本运算单元——乘累加运算(MAC)进行分析:乘法需要大量硬件运算,而加法运算的代价小很多,我们一定需要用乘法单元吗?以卷积为例子,可以简单地认为乘法是为了计算feature map和kernel之间的相似性,相似性高的区域会在output feature map上表现高的激活值。作者因此启发式地提出一种基于L1距离的相似性度量,将feature map与kernel做减法取相反数,相似性高的区域同样也会在output feature map上表现高的激活值。这样做的好处就是可以把乘法运算全部替换成加法运算,在实际硬件设备上减少能耗和计算时间。

方法

前向运算

  • $Y=-\sum_{kernel}\sum_{c_{in}}|X-F|$
    • 类似于模板匹配
  • batch normalization
    • 否则Y全是负值

反向传播优化

  • 计算gradient
    • 不用signSGD,而直接使用减法
    • 使用HardTanh来Clip到[-1,1]
  • 可适应的学习率Scale
    • 将学习率乘个系数$ \frac{\sqrt{d^2 c_{in} c_{out}}}{||grad||_2} $
    • 原因
      • 计算gradient的公式显示大的Var[Output]会造成input的gradient的数值特别小,而AdderNet正好可以导致一个很大的Var[Ouput] (这里注意是有条件的)
      • activation被bn均一化了,因为用的是L1的减法,所以weight也应该被均一化??(为什么是gradient而不是本身)

结果很好

  • ImageNet ResNet-18 89->87.6
  • ImageNet ResNet-50 92.9->91.7

评价

这篇论文我一开始看的时候,还以为是Binary Neural Network的翻版,但仔细看了之后发现这其实是一种全新的降低计算量的形式。在计算量上是Quantization计算和全精度计算的折中,在存储量上是不会少的,我想如果能结合其他方法(如量化、剪枝、SNN)等算法,会有更多新的东西出来,是一个值得研究的方向。

论文笔记: Forward and backward information retention for accurate binary neural networks

读了在CVPR2020上发表的文章《Forward and backward information retention for accurate binary neural networks》,收获颇丰。这篇论文分析了二值化神经网络的训练过程中前向和反向过程的存在的问题,分别提出了解决方案。论文的第一作者是来自于北航的Haotong Qin,通讯作者是北航的Xianglong Liu。

首先文章启发式地分析了二值神经网络前向中存在的问题是diversity的问题,因为二值化了,不管是weight的diversity和activation的diversity都变小了很多,因为网络的能力下降;反向传播中存在的问题是gradient不准,不准的原因来自于sign函数的导函数的近似。因为不同epoch的lr大小和不同,因此需要不断变化近似导函数来提升效果。

方法

前向传播(Libra-PB)

  • weight的information最大化模型
  • 当+1的weight和-1的weight数量相等时达到最大(中位数)
  • 在quantization之前将weight做重分布,也就是减中位数除标准差
    • 除以标准差是为了让weight分布范围更大(dispersed)
  • 做完权重重分布,再量化
  • 另一个优化策略是对weight做shift,避免quantization error和 extra float-point计算
    • $ B^\ast, s^\ast = \arg\min_{B_w, s} |w_{std}-B_w \ll \gg s|^2 s.t. s\in \mathbb{N}$
      • B就是二值化的weight,s是shift量
    • $ s=round(log_2(||w_{std}||_1/n)) $

反向传播(Error Decay Estimator(EDE))

  • 手工设计一个加上epoch为参数的导函数,导函数随着epoch变化
  • Stage1,在训练初期,Identity->Clip。目的是更好的训练(理解是更像全精度,更新效果好;更能重新分布weight)
  • Stage2,在训练末期,Clip->sign。目的是让网络更适应quantization

效果:在CIFAR-10,EDE能提升1.4%,Libra-PB能提升0.8%,一共提升2.7%。ImageNet上ResNet-18提升2%左右,到58.1%(bitwidth W/A 1/1)66.5%(bitwidth W/A 1/32);ResNet-34 62.9%(1/1) 70.4(W/A 1/32)

评价

我很喜欢这篇论文,首先是通过对二值量化的启发式分析(为什么精度会低)进行设计的思路,其次是提出的Libra-PB算法有部分理论支撑(信息论)。另外文章的算法有很大的提升空间,EDE算法是手工设计的,没有理论依据;前向的activation信息是关键的,是否可以针对activation信息做保留;信息论的分析是启发式的,方向对了但是方法不一定是最佳的,还有一个可能方法是最大化kernel之间的差异。

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×