从线性回归看Normalization
考虑如下线性回归模型:
$$
\hat{y}_{i}=wx_{i}+b
$$
其损失函数为:
$$
L=
\frac{1}{2N}
\sum_{i=1}^{N}
(\hat{y}_{i}-y_{i})^2
$$
可以分别求出 $L$ 关于 $w$ 和 $b$ 的偏导。
$$
\begin{aligned}
\operatorname{grad}_{w}
&=
\frac{\partial L}{\partial w}
\\
&=
\frac{1}{N}
\sum_{i=1}^{N}
\frac{\partial \ell_{i}}{\partial \hat{y}_{i}}
\frac{\partial \hat{y}_{i}}{\partial w}
\\
&=
\frac{1}{N}
\sum_{i=1}^{N}
(\hat{y}_{i}-y_{i})x_{i}
\end{aligned}
$$
$$
\begin{aligned}
\operatorname{grad}_{b}
&=
\frac{\partial L}{\partial b}
\\
&=
\frac{1}{N}
\sum_{i=1}^{N}
\frac{\partial \ell_{i}}{\partial \hat{y}_{i}}
\frac{\partial \hat{y}_{i}}{\partial b}
\\
&=
\frac{1}{N}
\sum_{i=1}^{N}
(\hat{y}_{i}-y_{i})
\end{aligned}
$$
单纯从梯度公式可以看出,相比于 $b$,$w$ 的梯度还会额外受到输入 $x_{i}$ 的影响。
如果一批数据中的 $x_{i}$ 普遍较大,那么 $w$ 的梯度也可能很大。此时学习率稍大,$w$ 的更新幅度就可能过大,导致训练过程震荡甚至发散。
如果为了稳定 $w$ 的更新而调小学习率,$b$ 的更新又会变得很慢,只能通过增加训练轮数来弥补。
反过来,如果 $x_{i}$ 普遍很小,$w$ 的梯度也会很小,导致 $w$ 收敛缓慢。
也就是说,当输入数据的尺度不合适时,$w$ 和 $b$ 可能需要不同量级的更新步长,而普通梯度下降通常只使用一个统一的学习率,因此难以同时兼顾二者。
对输入进行标准化
一种常见的解决方案是对输入数据进行标准化:
$$
x_{i}^{\text{norm}} =
\frac{x_{i}-\mu_{x}}{\sigma_{x}}
$$
其中:
$$
\mu_{x} =
\frac{1}{N}
\sum_{i=1}^{N}x_{i}
$$
$$
\sigma_{x} =
\sqrt{
\frac{1}{N}
\sum_{i=1}^{N}
(x_{i}-\mu_{x})^2
}
$$
经过标准化后,输入数据的均值为 $0$,标准差为 $1$:
$$
\operatorname{mean}(x^{\text{norm}})=0
$$
$$
\operatorname{std}(x^{\text{norm}})=1
$$
这里需要注意,标准化并不保证数据一定落在某个固定的小区间内,而是将数据调整到相对稳定的尺度。
此时模型变为:
$$
\hat{y}_{i} = w^{\prime}x_{i}^{\text{norm}}+b^{\prime}
$$
由于 $x_{i}^{\text{norm}}$ 的尺度更加适中,$w^{\prime}$ 的梯度不容易因为输入尺度过大或过小而失衡,因此训练通常会更加稳定,也更容易选择合适的学习率。
同时,因为标准化后的输入均值为 $0$,模型中的 $w^{\prime}$ 和 $b^{\prime}$ 也会更加容易独立地进行优化。
转换回原始输入空间
标准化后的参数 $w^{\prime}$ 和 $b^{\prime}$ 是针对 $x^{\text{norm}}$ 的。如果需要,可以将它们转换为针对原始输入 $x$ 的参数。
由
$$
\hat{y} = w^{\prime}\frac{x-\mu_{x}}{\sigma_{x}}+b^{\prime}
$$
展开可得:
$$
\hat{y} =
\frac{w^{\prime}}{\sigma_{x}}x
+
\left(
b^{\prime}-\frac{w^{\prime}\mu_{x}}{\sigma_{x}}
\right)
$$
因此,原始输入空间中的参数为:
$$
w=\frac{w^{\prime}}{\sigma_{x}}
$$
$$
b=b^{\prime}-\frac{w^{\prime}\mu_{x}}{\sigma_{x}}
$$
可见,标准化只是改变了参数的表示方式,并没有改变线性模型能够表示的函数。
推广到多维输入
对于多元线性回归:
$$
\hat{y} = \sum_{j=1}^{d}w_{j}x_{j}+b
$$
每个权重 $w_{j}$ 的梯度都会受到对应特征 $x_{j}$ 的影响:
$$
\frac{\partial L}{\partial w_{j}} =
\frac{1}{N}
\sum_{i=1}^{N}
(\hat{y}_{i}-y_{i})x_{ij}
$$
如果不同特征的尺度差异很大,例如一个特征的取值范围是 $0\sim 1$,另一个特征的取值范围是几万,那么不同权重的梯度尺度也会相差很大。
因此,通常需要分别对每个特征进行标准化:
$$
x_{ij}^{\text{norm}} =
\frac{x_{ij}-\mu_{j}}{\sigma_{j}}
$$
使各个特征处于相近的尺度,从而让不同权重能够以更加协调的速度更新。
推广到神经网络
类似的问题也存在于神经网络中。
神经网络每一层都可以看作对上一层输出进行新的变换。如果某一层输出的尺度过大或过小,就可能影响下一层的激活值和梯度,使训练变得不稳定。
因此,神经网络中除了会对输入数据进行标准化,还经常使用归一化层来控制中间特征的尺度,例如:
- Batch Normalization;
- Layer Normalization;
- Group Normalization;
- RMSNorm。
这些方法的具体归一化维度不同,但基本目的相似:让网络中间特征保持相对稳定的尺度,使不同层的参数更容易使用统一的学习率进行优化。
不过神经网络中的归一化层并不只是简单的输入标准化。它们通常还会加入可学习的缩放和平移参数,使网络在获得稳定数值尺度的同时,仍然能够学习适合当前任务的特征分布。