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