先修:14 点积、欧氏长度与柯西—施瓦茨不等式;17 最小二乘;30 导数与局部线性;31 偏导与链式法则

导数告诉我们,截距往哪个方向挪一点,损失可能下降。上一章又把许多参数的局部影响算了出来。但拿到这些数,训练还没有发生:真正改动参数时,究竟该乘上多大的倍率?

本章仍用三条虚构读数(0,1)、(1,2)、(2,2),预测为ŷ=ax+b,损失为三项平方误差之和。先只调截距,把整个迭代过程解出来;再让两个参数一起动,用平方展开算出一个确实可靠的步长范围。

把一次调整写成一条规则

固定a=1/2,前两章已经得到

L(b)=3(b−7/6)²+1/6, L′(b)=6b−7。

当导数为正,向较小的b移动;当导数为负,向较大的b移动。一条简单规则是

bₖ₊₁=bₖ−ηL′(bₖ)=bₖ−η(6bₖ−7)。

下标k表示已更新的次数,b₀是初始值。η读作eta,通常取正数,叫步长系数,在机器学习里也叫学习率。每次都先在当前bₖ重新求导,再更新,不能一直沿用最初的导数。

这里的η不是参数实际移动的距离。一次位移是−ηL′(bₖ),大小是η|L′(bₖ)|;即使η固定,导数变小,实际步子也会缩短。本章一律在既定厘米单位下使用数值坐标,暂不更换目标或参数的尺度。

从b₀=1出发,导数是−1。取η=1/12,第一步来到13/12;那里导数变成−1/2,第二步只增加1/24,来到9/8。两个步子都是向右,长度却不同。至于能否一直靠近最优截距7/6,列出两步还不能作保证。

注意,执行更新只需要当前参数和导数,不需要先知道最优截距。我们此处预先知道7/6,是为了检查算法是否真的到达目标。算法怎样运行,与我们怎样证明它有效,是两件事。这个小例子当然可以直接配方求解;刻意改用迭代,是为了在能手算到底的地方检验一种更通用的思路。

不靠试跑,直接算每一步的误差

令eₖ=bₖ−7/6,表示当前截距与最佳截距之间的带符号差。因为6bₖ−7=6eₖ,更新规则立刻化成

eₖ₊₁=(1−6η)eₖ。

原来每次更新,只把误差乘上同一个数!记q=1−6η,连续代入便得到,对k≥1:

eₖ=qᵏe₀, L(bₖ)−1/6=3q²ᵏe₀²。

第一式描述参数误差,第二式描述超过最小值的那部分损失。两者不是同一个量:误差缩成一半,超额损失就缩成四分之一。

还要看清减去的1/6。三条读数并不能被这条直线同时满足,第17章已经证明最佳损失仍然大于0。算法应该消掉的是“比最优值多出的部分”,不是承诺消掉所有残差。若把损失不再接近0当作失败,就会把模型本身无法表达的差异,误怪到更新方法上。

对e₀≠0和固定的实数η,收敛到最优截距7/6,当且仅当|1−6η|<1,也就是0<η<1/3。 理由在于:当|q|<1时,|q|ᵏ趋于0;当|q|≥1时,|q|ᵏ|e₀|始终不小于|e₀|,不可能趋于0。

这里用到的几何衰减也能看清:若0<|q|<1,写1/|q|=1+c,其中c>0,则(1+c)ᵏ≥1+kc,因而|q|ᵏ≤1/(1+kc)→0。q=0时,第一步就把误差消掉。我们由此覆盖所有步数,不是把有限次实验当成收敛证明。

这个范围内外,还有几种不同的走法:

  • η=1/12时,q=1/2,误差在同一侧每次减半
  • η=1/4时,q=−1/2,误差左右交替,但绝对值仍每次减半
  • η=1/6时,q=0,一步到达最佳截距
  • η=1/3时,q=−1,在两侧等幅来回,损失不降
  • η=1/2时,q=−2,误差交替翻倍,超额损失每次变为四倍

分界点1/6两侧的区别也能从q读出。0<η<1/6时,0<q<1,误差不变号;1/6<η<1/3时,−1<q<0,误差每步变号。跨过最佳截距并不必然有害,只要跨过去之后距离更小,平方损失仍下降。

因此,步长加大并不意味着收敛更快。1/12和1/4相差三倍,却有完全相同的误差缩小倍率;再把η推近1/3,|q|反而接近1,缩小速度变慢。另一方面,η过分接近0时,q也接近1。一步到位的1/6来自这个特定二次式的系数,换一个目标,就不能照搬这个数字。

η=0则完全不动;此时序列虽有极限,却没有从非最优点走向最优点。若一开始e₀=0,任何固定η都使它停在原地,所以前面的“当且仅当”必须保留e₀≠0这个条件。

四种固定步长的相对误差轨迹:正半倍率和负半倍率均趋零,负一倍率等幅交替,负二倍率交替发散;发散图另标纵轴尺度

图1:纵轴是eₖ/e₀,要求e₀≠0。前两幅共用纵轴尺度;最右幅的纵轴刻度改为−64至64并明确标出。点间连线只帮助阅读离散更新,不代表中间也发生过迭代。

两个旋钮同时动时,导数排成梯度

现在放开a,完整损失是

L(a,b)=(1−b)²+(2−a−b)²+(2−2a−b)²。

按第31章的办法,固定b对a求导,固定a对b求导,再按θ=(a,b)的顺序排列,得到梯度

g=∇L(θ)=(∂L/∂a,∂L/∂b)

=(10a+6b−12,6a+6b−10)。

∇读作nabla。它不是一个新的求导捷径,只是把各坐标的偏导收进同一个向量。其中第一项可以逐条核算:第一条预测b不受a影响,贡献为0;第二条贡献是2(a+b−2),第三条贡献是4(2a+b−2),相加得到10a+6b−12。对b求偏导时,三条预测的局部倍率都是1,把三条贡献相加即可。

比如θ=(0,0)时,g=(−12,−10),所以两个参数都略微增加,各自的一阶影响都会使损失下降。

但“一起增加”有很多比例,为什么偏偏按(12,10)的比例走?要公平地比较方向,先把所有候选方向的长度都定为1,免得一支箭头仅仅因为更长,就显得下降更多。

负梯度为什么是局部最陡方向

多元可微的含义,是存在下面这种局部线性表达:

L(θ+δ)=L(θ)+g·δ+r(δ), |r(δ)|/‖δ‖→0。

这里δ是整组参数的小改变量,极限沿任意方向δ→0成立;仅仅各偏导存在,并不足以代替这个条件。本例是平方和,下一节会直接算出它的余项,因而不必靠图形猜测可微性。

取单位方向v,即‖v‖=1,让δ=tv。将损失变化除以非零t,再令t→0,余项除以t趋于0,得到方向导数g·v。它衡量沿指定方向每单位数值距离的一阶变化。[1]

第14章的柯西—施瓦茨不等式现在派上用场:

g·v≥−|g·v|≥−‖g‖‖v‖=−‖g‖。

如果不限制方向长度,这个比较就没有有限的最小值:把一个负点积方向不断放大,点积还会更负,那只是在比较不同大小的位移。要求单位长度,才能把“朝哪里”从“走多少”中单独取出来。

当g≠0时,取v=−g/‖g‖,点积恰为−‖g‖,达到所有单位方向中的最小值。因此负单位梯度是局部一阶下降最快的方向。这是比较点积得到的结论,不需要把高维损失想象成一座山。[2]

在θ=(0,0)处,分别沿(1,0)、(0,1)走,一阶变化率为−12、−10;负单位梯度为(6,5)/√61,变化率是−2√61,约−15.62,确实更低。但这只比较同样短的步子在一阶上的表现,没有说沿该方向走任意远都更好。

等比例方向坐标中的单位圆及四个单位方向,负单位梯度方向的点积为负二倍根号六十一,小于仅调整任一坐标的负12和负10

图2:所有箭头长度都为1,横纵轴采用相同尺度。垂直于梯度的方向(5,−6)/√61点积为0,表示一阶变化为0,不表示实际损失完全不变。

若g=0,上面的归一化不能计算,而且所有方向的一阶变化率都为0。此时不能仅凭梯度决定哪里更好;第33章会继续区分驻点、局部最优与全局最优。

让二次余项给步长划一道保证线

梯度下降把刚才的方向写成更新式θ新=θ−ηg,实际位移长度为η‖g‖。两个偏导必须都在同一组旧参数上计算,再一起更新。如果先改a,再拿新a计算b的偏导,执行的已是另一条算法,不能直接使用这里的推导。

要从“一阶下降”走到“一整步之后仍下降”,还得控制被近似省掉的部分。

沿用第17章,X的三行是(0,1)、(1,1)、(2,1),y=(1,2,2),L(θ)=‖Xθ−y‖²。把θ改成θ+δ,展开平方:

L(θ+δ)=L(θ)+2(Xθ−y)·Xδ+‖Xδ‖²

=L(θ)+g·δ+‖Xδ‖²。

中间项收集δa、δb的系数,恰好就是刚才两个偏导。这是对任意δ成立的精确恒等式。余项为‖Xδ‖²,不是一个来历不明的“小误差”。

这里同时出现两种长度:‖δ‖量参数数值改动,‖Xδ‖量三个预测共同改变了多少。前者只有两个坐标,后者有三个,不能相互替换。矩阵X把参数空间里的动作送到预测空间;同样长的参数动作,送过去以后未必一样长。

把X的每一行记作xᵢ,逐行使用柯西—施瓦茨不等式:

‖Xδ‖²=Σᵢ(xᵢ·δ)²≤Σᵢ‖xᵢ‖²‖δ‖²

=(1+2+5)‖δ‖²=8‖δ‖²。

这也补上了可微性的检查:余项除以‖δ‖不超过8‖δ‖,随δ→0而趋于0。现在令δ=−ηg、η>0,便得到

ΔL=−η‖g‖²+η²‖Xg‖²

≤−η(1−8η)‖g‖²。

所以只要g≠0且0<η<1/8,损失就严格下降。这是对本例所有当前参数都适用的充分条件,并非“超过它一定失败”的必要条件;逐行估计可能把余项放大了。

这条保证的作用在于,选择η时不必先猜当前点在哪条特殊方向上,也不必等试错后才知道是否下降。数值8来自本例三行的长度平方和;换数据、换权重或换模型,都要重新检查这个控制余项的常数。一个正确的证明总应告诉我们,哪些条件是可以搬走的结构,哪些数字只属于当前问题。

同一坐标中比较负梯度更新的一阶预测、精确二次变化和二次上界;上界在0与八分之一之间为负,精确变化在八分之一处仍为负

图3:纵轴将损失变化除以当前‖g‖²;橙色是上界−η+8η²,绿色是从(0,0)出发的精确变化。阴影只标充分保证区间,不把其外侧都判成失败。

手算一步核对:取θ₀=(0,0),L=9,g=(−12,−10)。η=1/16给出θ₁=(3/4,5/8),三个预测是5/8、11/8、17/8,残差为3/8、5/8、−1/8,故

L(θ₁)=(9+25+1)/64=35/64。

原损失减小了541/64。这个数验证本次运算;保证下降的理由仍是前面的不等式。下降、长期收敛、找到全局最优,也仍是三个不同命题:一维迭代已由通项式证明,两参数部分此处只给出了逐步下降保证。

在计算机上,我们也不会真做无穷多次。停止时可以检查梯度大小或最近的损失变化,但“数字变化很小”还需解释:可能是已经接近驻点,也可能只是学习率过小。只有在额外条件下,停止信号才能转化成距离最优解多近的保证。这里保留这层区别,是为了避免把一个方便的程序判断,误当成完成优化的证明。

同一个最优点,不代表同一个学习率

若把平方误差和SSE改成三条记录的平均MSE,即M=L/3,最优参数不变,因为除以正数不改变大小关系。但梯度变成g/3;想复制SSE下步长η产生的同一次更新,MSE的步长必须改为3η。固定a的一维收敛范围相应变为0<ηM<1。只报一个“好用的学习率”,却不报损失怎样定义,信息是不够的。

实际使用中,步长也可以不固定。例如先提出一个候选步长,计算更新后的目标;若没有满足预设的下降要求,就缩小步长后重试。这是回溯搜索的基本想法。[2] 不过,它增加了目标评估,并且仍需要说明下降要求和可微等条件。本章坚持固定步长,是为了把成功、振荡与发散的分界完整算清,不能把本章的通项式直接套到每步改变η的过程。

参数尺度同样重要。若另用c=10b表示截距数值,目标写成F(a,c)=L(a,c/10),由链式法则,∂F/∂c=(∂L/∂b)/10。对c做一次同系数更新,再换回b,b的改变量就成为原来直接更新时的1/100。

这不是物理问题突然换了答案,而是“等长步子”的约定换了:在(a,c)坐标里走1格,与在(a,b)坐标里走1格并非同一调整。本章的“最陡”始终依赖所选欧氏数值坐标,不能宣称它不受单位或度量影响。[2]

最后,这里每一步都使用同一目标的完整、确定性梯度。用随机小批量估计梯度,会引入另一层波动,不能直接套用本章每步必降的证明;一般神经网络的损失也没有本例现成的二次恒等式。

梯度给出了局部方向,余项约束了一步能走多远。把两者接起来,算法才从一个建议,变成带着条件的数学保证。

顺手试一下

题目1: 固定a=1/2,从b₀=1出发,取η=1/4。求前三次更新后的b、L,以及第k次的超额损失。它是否单侧靠近最优点?

提示: e₀=−1/6,q=−1/2;先算eₖ,再加回7/6。

参考答案: b₁=5/4,b₂=9/8,b₃=19/16。相应误差为1/12、−1/24、1/48;L依次为3/16、11/64、43/256。一般地,L(bₖ)−1/6=1/(12·4ᵏ)。截距在最优点两侧交替,损失却每一步下降,参数来回不等于算法失败。

题目2: 两参数从θ₀=(0,0)出发,取η=1/8。算新参数与损失。为什么这不推翻0<η<1/8的下降保证?若改用MSE并想得到相同新参数,步长该是多少?

提示: g=(−12,−10);充分条件未覆盖的地方,要用精确值检查。

参考答案: 新参数为(3/2,5/4),预测为5/4、11/4、17/4,残差为−1/4、−3/4、−9/4,L=(1+9+81)/16=91/16<9。损失仍下降53/16,说明所给条件不是必要条件;在η=1/8处,上界只保证ΔL≤0,精确值可以更小。MSE的梯度为g/3,因此步长应为3/8。

参考与延伸

[1] MIT OpenCourseWare,18.02SC,Directional Derivatives讲义,第1—3页。核对单位方向、方向导数与梯度点积;本章以余项条件明确多元可微的含义。

[2] Stephen Boyd、Lieven Vandenberghe、Parth Nobel,Convex Optimization课程讲义,第9章,课件页9.8—9.11、9.16—9.18。核对方向与步长的区分、梯度下降和所选范数的关系;本章的一维精确阈值与两参数常数8的界均由教学数据独立推导。

本文沿用本系列的虚构读数。迭代推导、练习及三幅图为本章原创编排,不是实际模型训练报告。


作者:Jiancheng Wang · 数学之美(独立原创)