论文笔记: 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^, s^ = argmin_{B_w, s} ||w_{std}-B_w << >> s|| $
    • $ s=round(log_2(||w_{std}||_1/n)) $

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

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

效果:EDE能提升1.4%在CIFAR,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之间的差异。

论文笔记 Experiences with ML-Driven Design: A NoC Case Study

这篇是AMD在HPCA 2020上《Experiences with ML-Driven Design: A NoC Case Study》发表论文的读书笔记,这篇文章以NoC Arbitrator的设计作为一个例子,提出了用机器学习的算法辅助系统的设计,尤其强调了专家知识参与到系统设计中的重要性。一作Jieming Yin是AMD的工程师,08年哈工大本科毕业,15年美国明尼苏达双城分校博士毕业。

这篇论文提出:使用机器学习可以帮助人类专家做出更好的系统设计,但不是直接使用机器学习那么简单,需要人去设计和优化专门的结构。这篇论文以NoC的Arbitrator作为一个例子,使用RL来解每一个router上面的arbitrator应该传输哪个数据的任务,通过分析RL的Agent网络,专家可以知道哪些输入特征是重要的,因此可以利用这些信息来设计一个更简单高效的Arbitrator,而不是直接使用RL的Agent。

方法

  • 使用一个好解释的三层NN来做RL的Agent
  • 通过分析输入feature连接中间隐层的weight平均大小来判断feature重要程度(positive negative)
  • 根据feature重要程度来设计硬件
  • 先通过一个模拟器的简单场景来做分析,得到一些结论,总结一些方法,再推到一个真实的复杂场景(APU模拟器)做分析

评价

这篇论文没有直接说用ML比其他方法是好的,而是以一种介绍一个opportunity的口吻来探索ML方法在system design中的应用,非常的机智。作者通过简单实验->复杂实验一步步分析结论,一步步总结方法的模式也是非常值得借鉴的。总的来说,我很喜欢这篇论文,但是遗憾的是没有和一些其他的方法充分比较、也没有很好地分析可解释性的问题,正好留下了一个机会。

论文笔记 Scalpel: Customizing DNN Pruning to the Underlying Hardware Parallelism

这篇是Michigan大学和ARM合作的发表在2017年 ISCA的论文《Scalpel: Customizing DNN Pruning to the Underlying Hardware Parallelism》,到今天的引用量为154。第一作者Jiecao Yu 俞杰草,本科毕业于浙江大学,14年留学密歇根大学(MS & Ph.D),导师Scott Mahlke,已经毕业在Facebook工作。

这篇论文发现了之前的剪枝方法虽然在weight的数量上减少了很多,但是由于稀疏运算的特性,它们在硬件上的效率不行。文章提出了两种新的剪枝方法,针对三种不同的硬件(Micro-controller,CPU,GPU),分别使用它们或者联合使用它们可以得到更高的加速比。

方法

  • SIMD aware的剪枝
    • 将硬件的SIMD并行度作为剪枝的参数,一块一块地进行剪枝
    • 适用于Micro-controller和fc
  • Node Pruning
    • 直接将一个neuron减掉
    • 适用于高并行度的GPU和conv

评价

这篇文章于2017年发表,当时有人已经意识到剪枝带来的硬件效率的问题,部分人选择在硬件架构的角度来做稀疏运算(如:2016 ISCA EIE, 2017 ISCA SCNN);这篇文章反其道而行之,从软件的角度来思考问题,通过硬件的特性来优化算法,最后取得一个不错的加速效果。在之后的文章里面,软件-硬件的联合优化就成了一个大趋势(如 2019 ISCA Eager Pruning等)。

魔法师英语语法笔记(1) 四种基本语气

开个新的系列,魔法师英语语法笔记,我会在未来一段时间里面把《英语魔法师之语法俱乐部》的语法梳理一遍。开这个系列主要是苦于语法基础不够扎实,写英文的学术论文很费劲,为了更好的写学术文章,重拾语法温故知新,所以这并不是什么新手教学啦。如果想更深入地去理解的话就去看看这本书吧。

今天讲的是英语语法中的四种基本语气的用法(陈述语气、条件语气、命令语气、虚拟语气)。

语气什么意思呢?就是通过语法形式说明动作或者过程的进行方式说话者对动作的态度(动作会发生、动作可能发生、动作不可能发生、希望动作发生等)。注意,语气不是句式,比如条件语气和条件句(一个陈述语气的条件+一个条件语气的可能)不同

陈述语气

陈述语气是最基本的语气,表示肯定发生、已经发生、将来会发生、必然发生的一般性意见和陈述。

现在时:

  • The chicken is delicious.
    • 鸡肉好吃的一般性意见。

过去时:

  • The chicken was fresh yesterday.
    • 鸡肉昨天还是新鲜的的陈述,is变成was。

将来时:

  • The chicken will rot tomorrow.
    • 鸡肉明天要坏了,用will表示未来。
  • If you don’t put the chicken into fridge, it will rot.
    • 当有两个未来的句子的时候(一个主句,一个从句),将其中的从句的变为现在时。其中的逻辑是:需要假定条件发生的情况下,未来会发生什么。所以把条件(You will not put the chicken into fridge.)变为一般现在时假定已经发生。

条件语气

条件语气是表现一种在某种条件下会发生的语气,句子描述的状况有可能不会发生。一般通过加助动词(must/should/will/would/can/could/may/might等)表达这种不确定性。

  • It must rain tomorrow.
    • 认定了明天一定下雨(但是因为是未来的事件,实际可能不下雨)
  • It will rain tomorrow.
    • 明天很有可能下雨
  • It might rain tomorrow.
    • 明天有点下雨的可能
  • If it rains the picnic will be cancelled. (这是条件句)
    • If it rains是陈述语气(如果两句都是可能的,需要假设条件是发生的)
    • the picnic will be cancelled 是条件语气

因为条件语气中的助动词表达时间的功能不完整,如will的过去式would、can的过去式could不表示时间的区别,而是表示语气的强弱,would和could的语气较弱。

  • My sister thinks the cloth can be in bad quality.
  • My mother thinks the cloth could be in bad quality.
    • 妹妹觉得这块布很有可能质量不好,母亲觉得有可能质量不好。

因此,只能使用完成时表达对于过去的猜测

  • The air is wet. It may have rained last night.
    • 猜测昨天晚上可能下雨了,过去的rain使用完成时have rained来表示。

命令语气

命令语气也叫祈使句,说话人希望或者命令让句子描述的内容发生,
但说话的时候还未发生。句式上可以看做条件语气省略助动词。

  • Wash your clothes!
    • 可以看成是条件语句(You must) wash your clothes省略主语you和助动词must.
  • There is a strong expectation among the public that the government close the traffic of Wuhan.
    • 从句可以看做the government (should) close the traffic的简写。

虚拟语气(假设语气)

虚拟语气表示希望说话的内容成真,但是实际不是真的。一般是过去的坏事情,或者现在/未来基本不会发生的事情。

句式

  • 在主句用过去式的助动词
  • 从句不加助动词
  • 把时态往前提(现在时 变成 过去时;过去时 变成 过去完成时)
  • 一般主句和从句都是虚拟语气

现在时虚拟语气

  • If I were you, I wouldn’t do it.
    • 主句中用过去时态的would表示虚拟的语气
    • 从句中用过去时态的were

过去时的虚拟语气

  • If I had known earlier, I might have fixed the car yesterday.
    • 僵尸来的时候,如果我早点知道他们会来,我昨天就把车修好,现在就可以坐车逃跑了。
    • 两个过去的句子都是过去完成时。

未来时态的虚拟语气

  • 对于未来的预测一般用条件句,但那种基本不太可能在未来发生的句子,可以选择在从句中加一个助动词(would should)或者在从句中使用过去式进行虚拟语气表达。
  • If a flood should broke the bridge tomorrow, we could stay here.
    • 如果明天洪水冲断了桥梁(可能性非常小),我们才有可能被留在这儿。
  • If I were to take the ash-removal job, I could never go into the dangerous place.
    • 除非我接下来这个火山灰清理的工作(我没可能会接),否则我不可去那个危险的地方
    • 直接使用过去式不可能的意味更强烈

总结

  • 条件语气:助动词+过去时态
  • 虚拟/假设语气:助动词+时态提前
  • 祈使语气:条件语气省助动词

Hello World

你好,世界!刚才我用Hexo框架搭了这个博客!

怀着激动的心情,发布这第一篇博客。

首先,得测试一下Tex行不行!开始吧:

$$ E=mc^2 $$

完美,公式编辑功能妙不可言!

Your browser is out-of-date!

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

×