PP电子「中国」平台网站

您好,欢迎进入PP电子有限公司网站!

咨询热线:

13706139936

PP电子的官方网站解读模型压缩1:轻量化模型设计新思路:加法神经网络解读 (一)

发布时间:2023-09-12 12:05人气:

  PP电子 游戏PP电子 app截止到2020年10月6号,关于加法神经网络(AdderNet)的工作共有3篇,它们分别是:

  在将多种包含深度学习的计算机视觉任务(分类,检测,分割等)部署在移动端(智能手机,照相机,手表,无人车等等)上时,神经网络较高的算力要求和能源需求成为了瓶颈,于是,如何压缩神经网络使得他们可以被应用在资源受限的设备上已成为研究的热点。

  乘法的运算速度比加法慢,且乘法的运算代价大大高于加法。但是深度神经网络的大多数计算都是浮点数之间的乘法,带来了极大的运算代价。前人有许多关于如何用乘法来换取加法,以加速深度学习的工作,比如二值神经网络及二值神经网络NAS:

  尽管二值神经网络能够显著降低计算成本,但原始的精度往往无法保持。此外,二元网络的训练过程不稳定,通常收敛速度较慢,学习率较小。

  互相关函数和卷积运算几乎一样,但没有对核进行翻转。所以很多资料把互相关函数称为卷积,如下面这段话所示,图源花书(Deep Learning)。

  所以,CNN中的卷积运算是计算特征和卷积核之间的互相关性,而互相关性本质上是一种距离的度量,或者说,一种相似性的度量。

  卷积被视为是从视觉数据中提取特征的默认操作,前人的工作引入各种方法来加速卷积,尽管会牺牲性能。即便如此,前人也未能提出一种相似性的度量方法(similarity measure method),使这种方法能够取代卷积操作,而且只包含计算复杂度极低的加法操作。

  根据前面的的分析,CNN中的卷积运算是计算特征和卷积核之间的互相关性。而这个互相关性可以理解为一种距离的度量。因此,卷积运算也可以看成是距离度量的一种方式。所以,在我们计算卷积的时候,可以理解为我们在度量特征X与卷积核F之间的距离。但是,距离度量的方式有很多种。大部分的度量函数都包含乘法,因此带来了大量的计算代价。

  当使用互相关作为距离度量时,我们有S(x, y) = x \times y,此时上面的公式就成为了卷积运算,当d=1时,公式可以被看做全连接层的计算。

  所以,我们理所应当想到:有没有那么一种距离度量的方式,可以避开乘法运算?

  谈到距离的度量,你一开始想到的应该是几个范数:l_1-范数,l_2-范数,l_\infty-范数,F-范数等等。而恰好l_1-范数(以向量的l_1-范数为例):

  只是把距离度量函数变为了不含乘法运算的l_1-范数。借助它,我们可以有效地计算卷积核和特征之间的相似性。因此,我们可以只使用加法来提取神经网络中的特征,并构建加法神经网络。

  但是传统的卷积神经网络的输出有正有负,可是按照上2式计算,输出全是负值。怎么办?

  借助batch normalization,把输出归一化到一定的范围,并正常在后面使用激活函数。尽管batch normalization涉及乘法运算,但是乘法运算量相比于常规卷积微乎其微。为什么微乎其微?这里作者给出了量化的对比:

  看上去相比于常规卷积操作只是改变了度量函数,那反向传播的方法能不能和常规卷积操作进行类比?

  这里我们要求的导数包含绝对值,是无法直接求导的。在深度学习中,要解决目标函数无法求导的问题,我们一般有2种方法:

  这一眼就能看出有问题,符号函数的输出结果只有\left\{ -1,0,+1 \right\}这三种情况,也就是说你的梯度也只可能算出来这三个值。这样的梯度更新方式没法在梯度下降的最陡方向更新,且当参数的维度很高时,效果会更差,非常不利于卷积核的优化。

  同样的问题,符号函数的输出结果只有\left\{ -1,0,+1 \right\}这三种情况,仿照上面的做法,我们考虑使用以l_2-范数为距离度量的梯度计算公式:

  但是,此时输出特征Y对于输入特征X的偏导数计算出的结果的量级可能大于1,当网络很深时,反向传播会导致梯度爆炸。

  其中HT为HardTanh函数,即将输出截断到-1到+1。如果不对X进行截断,多层的反向传播会使得改进梯度的量级和真实梯度的量级有着很大的累计误差,导致梯度爆炸。

  在传统CNN中,我们常常希望每一层之间的输出分布相似,使得网络的计算更加稳定考虑输出特征的方差,我们假设X和F中的所有值都为独立同分布:均值0的正态分布,在CNN中的方差可以被计算为:

  再回看(12)式,可以看到,Var[F]是一个量级在10^{-3}\sim10^{-4}的值,可以忽略。所以等号左边是输出的方差,等号右边是输入的方差,而系数是远远大于1的,所以我们无法给定一个F的方差Var[F]使得输出特征的方差维持不变,于是输出特征的量级会大大的高于输入的特征,如果不对其进行归一化,将会导致输出的数量级随着网络的加深而爆炸。

  幸运的是,现有的神经网络都使用批归一化来控制每层的特征量级相似,批归一化使得每一层的方差和均值都相对稳定。

  其中\gamma和\beta是可学习的参数,\mu和\sigma是输出特征的均值和方差。BN层的梯度被计算为:

  我们稍作变形就可以发现(14)式和(15)式有细微的差别,但并不影响宏观的结论:

  由于AdderNet的方差\sigma很大,计算出的偏导数的量级会很小,于是,AdderNet 对滤波器的梯度将会变的很小。

  这个问题的本质梯度削减的问题,拍脑袋的想法是把学习率调大,但是又注意到不同层中的梯度值的大小差异很大,所以不同的层学习率应该不同,就有了本文的基于归一化的自适应学习率。

  这个设计非常的intuitive,因为作者想保持每一层的参数的更新量差不多,所以如果某一层梯度比较大,那么学习率就小一点。如果某一层梯度比较小,那么学习率就大一点。

  由于AdderNet计算的是特征和滤波器之间的减法,它们的量级大小应该相似从而有利于特征的提取,由于每层的特征都进行了归一化,其量级都近似一样,所以每层的滤波器的量级也应该相似。

  其中k代表F_l中元素的个数,\eta为控制所有adder层的超参数。通过使用这个方法,每层的滤波器可以以相同且更快的更新速度进行优化。算法1总结了AdderNet的优化过程。

  对于卷积层:卷积核F不变,只是卷积核F与输入特征X的相乘过程变为求l_1范数的过程,结果作为输出特征Y即可。

  对于FC层:weight与x的相乘过程变为求l_1范数的过程,结果令其等于y即可。

  作者首先在CIFAR数据集上测试AdderNet的表现,除了CNN以外,由于BNN将神经网络的参数和特征都量化为1比特,其乘法被替换为xnor运算,我们也将BNN作为比较对象。

  下表2展示了AdderNet的分类结果,我们在VGG和ResNet上都进行了测试,结果表明,作者的方法可以取得和正常卷积网络几乎一样的准确率,然而几乎没有乘法(bn层中的乘法数量级远小于卷积层,我们将其忽略),BNN虽然使用更快的XNOR计算,但是其准确率远低于CNN和AdderNet。

  由于AdderNet使用L1距离来代替了CNN中的互相关性,我们有必要探究其是否能准确地区分不同的类别,下图展示了AdderNet和CNN的特征可视化,可以看到,CNN使用了互相关性作为特征提取的度量,不同的类别被按照角度分开,因为CNN是使用cosine来度量相似性。而AdderNet使用的L1距离把不同的类别分成不同的聚类中心。因为ANN使用l_1范数来度量独立,所以不同的类别按照距离分开成不同的聚类中心。两种方式都可以成功地分开不同类别的图像,证实了AdderNet可以具有和CNN一样的特征提取能力。

  图2将AdderNet和CNN的滤波器进行了可视化,可以看到,两种网络虽然采用了不同的度量方式,它们的滤波器都具有较强的纹理特征,都具有提取图片中特征的能力。

  由于我们对AdderNet提出了特殊的优化方式,我们有必要探究这些优化方法对于AdderNet准确率的影响,我们提出了自适应学习率和更精确的梯度计算方式,从图4可以看到,当采用我们提出的两种方法时(灰色线条),ANN取得了最高的学习率和最小的损失。证明了我们提出的优化方法的有效性。

  参数分布可视化作者还对 ANN 和 CNN 中参数的权重分布进行了可视化,可以看到,ANN 的参数更接近于拉普拉斯分布,而 CNN 的权重更接近于正态分布。这也和 ANN 使用了l_1距离作为度量有关。由于l_1距离度量的先验分布为拉普拉斯分布,所以 ANN 的参数更倾向于产生拉普拉斯分布。

  这里需要理解:L_1正则先验分布是 Laplace 分布,L_2正则先验分布是 Gaussian 分布。

  拉普拉斯分布的密度函数,可以看作是两个指数分布函数的概率密度“背靠背”拼接在一起。(事实上拉普拉斯分布与指数分布确实有很密切的关系)

  拉普拉斯分布的概率密度与正态分布看起来很像,画出标准拉普拉斯分布(b=1)和标准正态分布的概率密度图:

  此外,标准拉普拉斯分布的0.99分位点是3.91,而标准正态分布是2.32,这说明,服从拉普拉斯分布的随机变量,出现极端大的值的概率,要远远大于正态分布。

  假设我们有个机器学习的模型,对于模型权重系数w的求解释通过最小化目标函数实现的,也就是求解:

  最大似然估计 (MLE)的含义是根据已知样本,希望通过调整模型参数来使得模型能够最大化样本情况出现的概率。在最大似然估计中,是假设权重w是未知的参数,从而求得对数似然函数 (取了log):

  举个例子,若我们假设:y_i\sim N(w^Tx_i,\sigma^2),则我们就可以带入高斯分布的概率密度函数:

  最大后验概率估计 (MAP)是贝叶斯学派的法宝。与统计学派不同,贝叶斯学派认为在做估计之前,人们对要估计的实物先有一个经验性的判断,然后根据数据调整对这个实物的判断。而这个经验性的判断就是先验概率,而经过调整之后的概率称作后验概率。最大后验估计的基础是贝叶斯公式:

  可以看出来后验概率函数为在似然函数的基础上增加了log P(w),P(w)是先验概率, 是指在没有任何实验数据的时候对参数\theta的经验判断,对于一个硬币,大概率认为他是正常的,正面的概率为0.5的可能性最大,所以可以用\theta(1-\theta)作为先验概率。在这里P(w)的意义是对权重系数w的概率分布的先验假设,在收集到训练样本\left\{ X,y \right\}后,则可根据w在\left\{ X,y \right\}下的后验概率对w进行修正,从而做出对w的更好地估计。

  而我们的L_1正则化与L_2正则化与先验分布的关系正是通过log P(w)体现的。

  所以对MAP取相反数作为损失函数就意味着在损失函数中加上了一项\frac{1}{a}\sum_{j}^{}{w_j},这就是L_1正则化。

  AdderNet所做的改变是在计算输入特征和卷积核时,不使用卷积,而使用l_1范数,以避免用乘法。

  但是Batch Normalization一用,发现梯度消失了(有证明),为了解决这个难题,作者开发了自适应学习率。

  讲到这里应该算是把AdderNet的所有数学原理说清楚了,AdderNet实现了更高的速度和更低的能耗。这篇文章只是AdderNet的简单介绍,接下来我们进一步探索AdderNet更深层的操作。

  在ResNet-50上面,用AdderNet替换CNN之后精度还是有损失的,所以作者想通过知识蒸馏操作,实现把知识从CNN转移到ANN上。

  也可以利用\text{soft label}将教师网络的输出和真实预测混合在一起:

  接下来作者提出了一种渐进式的基于核的知识蒸馏操作,实现把知识从CNN转移到ANN上。

  但是对于AdderNet你这样做就有问题,因为在原来的CNN蒸馏CNN的时候,不论是Teacher还是Student都是CNN网络,他们特征的分布应该是一致的。所以可以使用\text{MSE Loss}。

  但是上面我们刚刚证明,训练好的AdderNet特征的分布服从Laplace分布,而训练好的CNN的特征的分布服从高斯分布,特征的分布都不一样。

  我们比较一下式(20)和式(21),发现AdderNet的输出分布和CNN的输出分布几乎不可能一致。

  问:既然CNN和AdderNet的输出特征的分布是不同的,那有没有那么一种办法可以把分布用一种共同的方式去度量?

  核方法(kernel method)是使用核函数表示和学习非线性模型的一种机器学习方法,可以用于监督学习和无监督学习。有一些线性模型的学习方法基于相似度计算,更具体地,向量内积计算。核方法可以把它们扩展到非线性模型的学习,使其应用范围更广泛。

  如图5所示,比如说我在A空间里有一些点\bullet\times,它们是线性不可分的(左图),没法直接用线性分类器分开。

  这时候我们想个办法把这些点\bullet\times给映射到B空间,使之映射完以后线性可分(右图),这样子就可以用线性分类器分开了。

  那么,这个A空间就叫做输入空间,B空间就叫做特征空间。输入空间的线性不可分问题转化为特征空间的线性可分问题。

  核方法的技巧在于不显式地定义这个映射,而是直接定义核函数,即映射之后在特征空间的内积。这样可以简化计算, 达到同样的效果。

  这一定义在构造核函数时很有用。但对于一个具体函数K(x,z)来说,检验它是否为正定核函数并不容易,因为要求对任意有限输入集\left\{ x_1,x_2,..,x_m \right\}验证K对应的 Gram 矩阵是否为半正定的。在实际问题中往往应用已有的核函数。

  回到AdderNet上来,既然CNN和AdderNet的输出特征的分布是不同的,作者希望用核函数把输出特征映射到另一个高维的特征空间上,使它们的特征的分布尽量接近。

  按照(20)和(21)式,原来我们是这么计算输出特征的,如下(25)和(26)式所示:

  (23)和(24)式和(25)和(26)式相比,使用了核函数,相当于先把输入特征x^m和卷积核f^m映射到高维空间,使CNN和AdderNet输出特征的分布尽量接近,再按照CNN和AdderNet的办法计算输出特征。

  所以(23)和(24)式相当于是2个核函数,一个是伪高斯核,另一个是拉普拉斯核。

  为什么伪高斯核具有核函数的性质?,即把低维特征映射到高维空间中,作者提供了证明。

  因为这个问题转化成排列组合的问题:相当于是k个值的和为n,问这k个值一共有多少种可能的情况?问题等价于求x_1+x_2+…+x_k=n的可行解数,其中x_1,x_2,…,x_k为非负整数。

  使用添元素隔板法挡板法,相当于是n+k个球分成k堆,不许有空堆。得到一共有C_{n+k-1}^{k-1}种分法。

  至此我们证明了exp(-\frac{\text x*\text f}{2\sigma^2})可以表示为一个无穷维的核函数的线性组合。所以伪高斯核具有核函数的性质,且伪高斯核会把输入特征映射到L维空间中,前面我们提到L=\frac{(n+k-1)!}{n!(k-1)!},则当你取的n很大时,会映射到无穷为空间中。

  但即便是把输入特征x^m和卷积核f^m映射到高维空间之后再做卷积或者l_1范数,其结果的分布仍然是不同的,与KD的目的相矛盾。

  最后,为了让教师网络的知识更好地转移到学生网络上,作者在蒸馏时实验渐进式操作,把CNN和ANN一起迭代更新,算法如下图7所示:

  由于AdderNet使用L1距离来代替了CNN中的互相关性,我们有必要探究其是否能准确地区分不同的类别,下图展示了AdderNet,CNN和PKKD的特征可视化,可以看到,CNN使用了互相关性作为特征提取的度量,不同的类别被按照角度分开。而AdderNet使用的L1距离把不同的类别分成不同的聚类中心,两种方式都可以成功地分开不同类别的图像,证实了AdderNet可以具有和CNN一样的特征提取能力。而PKKD兼具二者的属性,既能不同的类别被按照角度分开,又能把不同的类别分成不同的聚类中心。

  这里作者设置了4组不同的实验: 第1种设置是直接计算ResNet-20和ANN-20的中间层输出上的KD损失。第2种设置是在对特征的输出应用1\times1卷积后计算KD损失,这在许多以前的研究中是常用的。第3是使用核方法,而不用线卷积,以及渐进式的学习CNN。

  W,通过任意的图片,输出都不变。那很遗憾,你train不出这样的权重W。

  定理2:设E\in R^{d\times d}是加法网络的输入图片,每个元素都是1,W表示加法网络滤波器的权重,则不存在W\in R^{d\times d}以及常数a满足下式:

  s*E,在AdderNet 作用之后都会去掉,则W起了高通滤波器的作用。

  证明:反证法:假设这样的权重W是存在的,则对于任意的s都有:(s*E)\oplus W=a

  1,2对比:没有残差结构的Adder Layer的特征图不能保持其输入特征的细节信息。

  把AdderNet迁移到不同任务的动机很容易想到,但如何解决迁移过程的具体问题才是真正困难之所在。加法滤波器有望代替原始卷积滤波器用于计算机视觉任务中。在未来的工作中,作者们将研究AdderNet的量化,以实现更高的速度和更低的能耗,以及AdderNet在其他计算机视觉任务如检测和分割中的应用。

  A1:ANN必须要修改底层的CUDA代码才能实现加速。因为现有的GPU芯片有成熟的乘法器模块,所以在当前的GPU硬件上乘法和加法的速度没有明显的差异。但是理论上乘法肯定慢于加法,因为乘法可以看成多次加法。也就是说在现有的GPU芯片上体现不明显,但会对未来芯片设计产生影响,引领下一代芯片设计,所以取名为下一代芯片级推理器。


13706139936