ICLR2019论文解读:量化神经网络
今年五月举办 ICLR 2019 会议共接收论文 502 篇,本文将解读其中两篇有关量化神经网络的研究。
UNDERSTANDING STRAIGHT-THROUGH ESTIMATOR IN TRAINING ACTIVATION QUANTIZED NEURAL NETS https://openreview.net/pdf?id=Skh4jRcKQ ANALYSIS OF QUANTIZED MODELS https://openreview.net/pdf?id=ryM_IoAqYX深度神经网络(DNN)已经极大推升了机器学习(ML)/人工智能(AI)在许多不同任务中的性能,并由此带来了许多我们日常生活中所见的成熟应用。经典案例包括图像目标识别(Krizhevsky et al., 2012; Szegedy et al., 2014)、语音识别(Hinton et al., 2012; Sainath et al., 2013)、统计机器翻译(Devlin et al., 2014; Sutskever et al., 2014; Bahdanau et al., 2015)和掌握围棋(Silver et al., 2016)。
神经网络包含两部分:训练和推理。由于计算神经元输入的加权和以及执行神经网络所需的运算需要大量乘法-累加运算(MAC),所以在传统的(通用型)数字硬件上训练神经网络以及使用神经网络执行推理的效率很低。
DNN 基本上都是在一个或多个图形处理单元(GPU)上训练的。本质上而言,GPU 速度很快且支持高度并行,但功耗却很高。此外,一旦模型训练完成,仍然很难在手持设备等低功耗设备上运行训练后的网络。因此,人们投入了大量研究精力,想要在通用和专用计算硬件上加速 DNN 的运行。
理解训练激活量化网络中的直通估计器(Understanding Straight-Through Estimator in Training Activation Quantized Neural Nets)
引言
使用直通估计器(STE)的理由可以通过一个简单实例进行说明。设有一个简单的阈值函数——ReLU 函数,即 f(x) = max(0,x)。此外,设网络一开始就有某套初始权重。这些 ReLU 的输入(乘上了权重的信号)可以是负数,这会导致 f(x) 的输出为 0。
对于这些权重,f(x) 的导数将会在反向传播过程中为 0,这意味着该网络无法从这些导数学习到任何东西,权重也无法得到更新。STE 的概念也由此而来。STE 会将输入的梯度设置为一个等于其输出梯度的阈值函数,而不管该阈值函数本身的实际导数如何。有关 STE 的最早研究(Bengio et al. 2013)请见:
https://arxiv.org/pdf/1308.3432.pdf这篇论文使用了「粗粒梯度(coarse gradient)」这个术语来指代通过「经 STE 修改的
链式法则
」而得到的损失函数在权重变量方面的梯度。通过选择这种非一般的梯度,问题就变成了:STE 梯度并非该损失函数的实际梯度(实际上,STE 梯度不是任何函数的梯度),为什么在其负方向搜索有助于最小化训练损失?此外,该如何选择一个「好的」STE?
这篇论文讨论了通过二元激活和高斯数据学习二层线性层网络的三种代表性 STE。作者还证明选择适当的 STE 能得到表现优良的训练算法。
我选择解读这篇论文的原因是想要详细解读使用 STE 的权重更新的梯度。直接复制这些公式进行使用当然完全可以,但是我希望能围绕数学进行解读,并能提供一些这种数学过程为何有效的见解。
在继续解读之前,我们先看看这篇论文所使用的符号表示方式:
|| ⋅ || 表示一个向量的欧几里德范数或一个矩阵的谱范数 0_n ∈ R^n 表示全为零的向量 1_n ∈ R^n 表示全为一的向量 I_n 是 n 阶单位矩阵 = (w^T)z 表示 w, z ∈ R^n 的内积 w⊙z 表示哈达玛积(Hadamard product,也被称为 entry-wise product)使用二元激活学习二层线性层 CNN
模型设置和问题构建
考虑以下模型:
其中 Z ∈ R^(mxn) 是输入,w ∈ R^n 和 v ∈ R^n 分别是第一和二层线性层的权重。(Z_i)^T 表示 Z 的第 i 行,σ( ⋅ ) 是在向量 Zw 上逐分量工作的激活函数。第一层用作卷积层,第二线性层用作分类器。标签根据 y*(Z) = (v*)^T σ(Zw*) 生成,其中 v* 和 w* 是一些最优参数。式 (1) 描述了损失函数,其就是一个简单的平方损失:
σ( ⋅ ) 被取为一个二元函数,即 σ( x ) = 1_{x>0}。Z ∈ R^(mxn) 的项是独立同分布地(i.i.d.)采样自一个高斯分布 N(0,1)。不失泛化性能,我们将假设 || w || = 1 并将优化问题构建成 (2) 式形式:
反向传播和粗粒度梯度下降
(2) 式是对问题的数学描述,即最小化 (1) 式中定义的损失函数与 Z 相关的期望。注意,由于对 Z 的高斯假设,所以取期望是可能的。获取的梯度信息由下式给出:
其中期望中的表达式由 (3) 和 (4) 式描述。
注意 (4) 式中的 σ' 为零,会导致反向传播过程中不会传播信息。也就是说,如果使用标准的梯度下降更新规则,网络将什么也学习不到。STE 的思想很简单,就是用一个相关的非平凡函数 µ' 替代 (4) 式中的零分量 σ',其中 µ' 是某个次(可微分)函数 µ 的导数。也就是说,使用 STE µ' 的反向传播会为 (∂l / ∂w)(v, w; Z) 提供一个非平凡的表达。这就是作者称之为粗粒梯度(coarse gradient)的东西,如 (5) 式所示。
然后,将这个粗粒梯度插入到标准梯度下降更新规则中,就得到了算法 1 所示的梯度下降算法。
注意这只是用 g_µ(v^t, w^t; Z) 替换了时间 t 的真实梯度 (∂l / ∂w)(v, w; Z),其中的 t 是指时间步骤(或迭代)。
分析——计算梯度
让我们更进一步深入群损失函数 f(v, w) 及其梯度 ∇ f(v, w)。首先,将两个向量 w 和 w* 之间的角度定义为:对于任意 w ≠ 0_n,有
这在后面会用到,因为这被用于描述两个带有高斯项的向量的一个积的期望。arccos(⋅) 中的参数是 w 和 w* 的内积除以 ||w|| ||w*||,这是 w 和 w* 之间的余弦角。这两个向量越近,这个角就越小。
现在来看式 (1) 和 (2) 中描述的 f(v, w),我们可以取式 (1) 的转置,因为一个标量的转置还是一样,将所得到的表达式放入 (2) 中,然后扩展得到(不正确的)表达式如下(下一段会说明这个错误):
现在的目标是使用分析表达式替换表达式 E_Z[ σ(Zw) σ(Zw)^T ]、E_Z[ σ(Zw) σ(Zw*)^T ] 和 E_Z[ σ(Zw*) σ(Zw*)^T ]。读者应该把这个牢记在心,不然下一节会很吃力。
因此,(v*)^TZw* 就等于 y*(Z),即为标签。如果我们查看这个 (m x m) 矩阵 E_Z[ σ(Zw) σ(Zw)^T ]。当 i≠j 时,EZ[ σ(Zw) σ(Zw)^T ] 的元素为 E[ σ(**Zi^Tw) σ(Zj^Tw) ],并且可以写成 E[ σ(Zi^Tw) ] E[ σ(Zj^Tw) ]。而当 i=j 时,元素为 E[ σ(Zi^Tw) ] E[ σ(Zi^Tw) ] = ( E[ σ(Zi^Tw) ] )^2。其中 Z_i**^T 是指 Z 的第 i 行。
现在我们可以按下式求得对角元素:
为什么会得到第二个等式?我会尝试给出一些见解。首先,注意 σ(Z_i^Tw) 就是 1_{Z_i^Tw},这是一个指示函数。有一个参数 x 的指示函数 1_{x} 在与自身相乘时会保持不变,因此会得到第二个等式。
最后一个等式源自一个
高斯分布
的统计情况。将 w 固定为 R^n 中的任意向量,则其元素是分布为 N(0,1) 的高斯随机变量的向量 Z_i 将与 w 形成一个锐角的概率是 0.5。
因此,每个元素都有 0.5 的概率为 1,得到总的期望为 (0.5)x1 + (0.5)x0 = 1/2。我们可以考虑这个例子的极限情况,即仅有 1 个维度的情况。令 w 为任意正数,z 为一个高斯随机变量 ~N(0,1),则 P [ 1_{w x z > 0} ] = P[ 1_{w x z < 0} ] = 0.5。
对于 i≠j 的情况,E[ σ(Z_i^Tw) σ(Z_j^Tw) ] = E[ σ(Z_i^Tw) ] E[ σ(Z_j^Tw) ],而且因为 Z_i 和 Z_j 是
独立同分布
,所以这两个期望是独立的且每一个都估计为 1/2。使用这一观察,我们可得以下结果:
因此,我们可以综合以上结果得到表达式:
也就是说,E_Z[ σ(Zw) σ(Zw)^T ] 沿对角的元素等于 1/2,其它地方为 1/4。E_Z[ σ(Zw*) σ(Zw*)^T ] 也有一样的参数。
最后,对于元素为 E_Z[ σ(Zw) σ(Zw*)^T ]_{i, j} 的矩阵,如果 i≠j,则由于独立同分布的假设,该期望可以被分解和独立地评估。这会得到 E_Z[ σ(Zw) σ(Zw*)^T ]_{i, j} = E[ σ(Z_i^Tw) ] E[ σ(Z_j^Tw*) ] = 1/4.
对于 i=j 的情况,我们有如下结果:
其中 θ(w, w*) 是 w 和 w* 之间的夹角。
主要结果与分析
这篇论文主要关注的是算法 1 中总结的粗粒梯度下降的行为。其研究了 STE 被设置为基本 ReLU、截断式 ReLU(clipped ReLU)和恒等函数的导数的情况。这篇论文证明通过使用普通或截断式 ReLU 的导数,算法 1 会收敛到一个临界点;而使用恒等函数则不会。
作者在论文中给出一个说明,其表示粗粒梯度下降的收敛保证基于训练样本无限的假设。在仅有少量数据时,在粗粒尺度上,实验损失大致会沿负粗粒梯度方向下降。随着样本规模增大,实验损失会变得单调和平滑。图 1 给出这一思路的图示。
注意随着样本规模的增大,单个步骤的损失是如何获得变得单调和越来越平滑的。这能解释为什么(合适的)STE 在具有大量数据时(就像深度学习一样)的表现会那么好。
将普通 ReLU 的导数视为 STE
(5) 中使用了 ReLU 函数 µ(x) = max(x, 0) 的导数作为 STE。不难看出 µ'(x) = σ(x),全梯度 ∇ f(v, w) 的表达式如下所示。
与 w 相关的粗粒梯度遵循下式:
要让粗粒梯度成为真实梯度的一个可接受的估计量,我们需要两者之间的内积为非负。这也可被解释为两个梯度之间的非负相关性。
相关性、内积、夹角
我想稍微扩展,介绍一下夹角、内积和相关性之间的关系,因为这些术语在论文中出现的次数很多。相关性和内积之间的联系可通过以下示例理解。
首先有一个带有实值随机变量的向量空间。设 X 和 Y 为随机变量,它们可能相互独立,也可能不独立。X 和 Y 之间的协方差可这样计算:Cov(X,Y) = E[ (X- µ_X) (Y-µ_Y)],其中 u_X 和 µ_Y 分别为 X 和 Y 的均值。因为这个协方差是双线性的,所以我们可以在随机变量的向量空间上定义内积,使其成为一个内积空间。为了完整说明,下面给出了协方差的公式。
有了内积之后,我们可以定义向量的范数,即 || X || = √X⋅X,这等于 Cov(X,X) 的平方根、E[ (X-mX)(X-µX) ] 的平方根、Var(X) 的平方根以及最后的 X 的标准导数,即 _X。更进一步,两个随机变量的相关性定义为:
这本质上就是在处理点积(内积)时,两个向量之间的夹角的余弦的定义,即:
总结来说,协方差是内积,标准差是范数,相关性是夹角的余弦。了解了这一点,我们再回到论文。
内积可以用一种闭式(closed form)表示:
不难看出这个内积是非负的,因为 θ(w, w*) 的范围是 [0, π],所以 sin( θ(w, w*) ) 总是非负的。范数 || w || 也是非负的,(v^Tv*)^2 也是。前面提到,非负内积能保证粗粒梯度大致与真实梯度在同一方向上。因此,ReLU 函数的导数可以用作 STE,以及 f(v, w) 的梯度下降方向。
要让该算法收敛,EZ[(∂l / ∂w)(v, w; Z) ] 和 EZ[ g_{relu}(v, w; Z) ](粗粒梯度)必须同时消失。这只会发生在 (2) 式(即构建的问题)的鞍点和最小量处。(2) 式的最小量应该有 v = v* 且 θ(w, w*)=0。
将截断式 ReLU 的导数视为 S
- 免责声明
- 本文所包含的观点仅代表作者个人看法,不代表新火种的观点。在新火种上获取的所有信息均不应被视为投资建议。新火种对本文可能提及或链接的任何项目不表示认可。 交易和投资涉及高风险,读者在采取与本文内容相关的任何行动之前,请务必进行充分的尽职调查。最终的决策应该基于您自己的独立判断。新火种不对因依赖本文观点而产生的任何金钱损失负任何责任。