梯度范数

梯度范数

前言:最近斯坦福的团队公开了一个 535B 大模型的训练过程,本着闲着也是蛋疼的精神也是上班时间摸鱼看了看,就发现如文章封面的网页,他们把整个训练的指标都实时公开了。由于我上一次训练模型也许是半年之前了,看到这个 grad norm 指标愣了下。我记得这个是梯度范数但是这个干嘛的我也忘了(ML/DL/LLM 基础实在是太差了),所以记录一下。

概念#

范数这个概念指的是,给向量空间里的每个向量赋予一个"长度"或"大小"的函数,记作 $||x||$。它把一个向量映射成一个非负实数,这个数代表这个向量有多大。所以简单来说,向量的范数就是代表这个向量有多大的一个标量。

然后我们刚刚提到的给向量一个函数计算它的标量大小,因此存在很多种范数。对一个向量 $x = (x_1, x_2, \dots, x_n)$,最常用的一族范数定义 $Lp$ 范式为:

$$ \|x\|_p = \left( \sum_{i=1}^n |x_i|^p \right)^{1/p} $$

对 $p$ 取不同值就可以得到不同的范数:

  1. $L1$ 范数,曼哈顿距离 $\|x\|_1 = \sum_i |x_i|$ 就是所有分量绝对值加起来。
  2. $L2$​ 范数,欧几里得范数 $\|x\|_2 = \sqrt{\sum_i x_i^2}$ 这个是平常默认的范数。

还有一个 $L0$ 范数,代表非零向量的个数,所以用 $L0$ 范数当正则项相当于让模型趋向零矩阵,或者是稀疏矩阵。

这里面 $L1$ 范数和 $L0$ 范数可以实现稀疏化,但由于 $L0$ 范数存在 NP hard 问题很难优化求解,而 $L1$ 范数是 $L0$ 范数的最优凸近似,而且它比 $L0$ 范数要容易优化求解,所以大家才把目光和万千宠爱转于 $L1$ 范数。

$L2$ 范数是指向量各元素的平方和,然后求平方根我们让 $L2$ 范数的规则项 $||w||^2$ 最小,可以使得向量的每个元素都很小,都接近于零。但与 $L1$ 范数不同,它不会让它等于零,而是接近于零,这里是有很大的区别的。而越小的参数说明模型越简单,越简单的模型则越不容易产生过拟合现象。我这里是简单理解为,假设有一个线性函数 $y=wx+b$,如果 $w=1$ 模型就是一个很平缓的直线。如果 $w=100$ 那么这条直线对输入 $x$ 的变化会非常敏感,稍微改变一点 $x$,输出就会发生很大的变化。通过 $L2$ 范数,我们可以实现了对模型空间的限制,从而在一定程度上避免了过拟合。限制解空间范围,缩小解空间,来控制模型复杂度,降低结构化风险。


现在就可以回归正题到 grad norm 梯度范数身上了,在训练里梯度 $\nabla L$ 本身是一个高维向量,这个向量本身没法直接看,但取它的 $L2$ 范数:

$$ \|\nabla L\|_2 = \sqrt{\sum_i \left(\frac{\partial L}{\partial \theta_i}\right)^2} $$

就把这个高维向量压缩成一个标量,表示这一步损失函数对所有参数的敏感程度总体有多大。

斯坦福训练的这个 grad norm 曲线就是一个分成标准的梯度范数下降曲线:

  1. 在训练初期模型的参数都是随机初始化的,模型预测通常比较差,因此 loss landscape 中的梯度往往比较大。
  2. 随着模型训练,能力逐渐稳定,输出的 token 越来越接近训练的数据集,所以提供的梯度会逐渐减小,呈现一个 grad norm 逐渐下降的趋势。
  3. 由于模型的训练不同 batch 数据不同,所以提供的梯度有冲突很正常,会出现 grad norm 波动也就是尖峰。
  4. 后期 grad norm 可能稳定在一个区,因为每个 batch 仍然会产生 stochastic gradient,不可能完全收敛到零。

L1 和 L2 范数#

前面提到 $L1$ 范数会产生稀疏解,也就是参数会变成零,而 $L2$ 范式会让参数趋近于零但是不等于零,这是为什么呢?我们在二维平面 $(w_1, w_2)$ 上看看两个范数的图像。

可以看到 $L1$ 范数的二维约束空间是一个菱形,$L2$ 范数约束空间是一个圆形。所以二位目标函数 $J(w_1,w_2)$ 的目标函数等高线与约束空间相切时,$L1$ 范数就很有可能与菱形的角相切,相切位置就在坐标轴上,也就是 $(0,C)$ 或者 $(C,0)$,有一个参数变成 0 了,拓展到高维空间上就会产生更多的零。而 $L2$ 范数的约束空间是圆形,和目标函数等高线相切时候基本不会落在坐标轴上。