为什么可以冻结参数或使用不同的学习率?
- 改变学习率的两种方式,冻结参数(学习率为 0)或对不同参数使用不同的学习率
- 前置结论:
- 承认问题:冻结参数或使用不同的学习率,确实改变了参数更新的整体方向
- 一般不称为梯度有偏:但在深度学习和最优化理论中,这通常不被称为“梯度有偏(Biased Gradient)”(因为“有偏”通常指代在随机梯度下降 SGD 中,小批量梯度的期望不等于全量梯度,即 \(\mathbb{E}[\hat{g}] \neq \nabla L\))
- 数学理解:这种操作在数学上被理解为投影梯度下降(Projected Gradient Descent) 、块坐标下降(Block Coordinate Descent) 或预条件(Preconditioning)
- 三个核心问题:
- 导致梯度有偏吗?
- 从数学上看,方向确实变了(几何上确实改变了方向),但我们一般不称这种特意修改学习率为梯度有偏,相当于把梯度投影到了一个子空间,或者对空间进行了仿射变换
- 为什么可以这么更新?
- 因为只要未冻结的参数有梯度,或者学习率大于0,新的更新方向与原负梯度方向的内积依然大于0,数学上依然保证损失函数会下降
- 为什么要这么做?
- 首先:原始的全量梯度方向虽然是当前点下降最快的方向,但它可能会破坏预训练权重、导致震荡或引发过拟合
- 通过冻结或调整学习率来人为引导优化路径,使其符合对任务的先验知识(如迁移学习),从而可能让神经网络学的又快又稳
- 导致梯度有偏吗?
数学视角理解梯度方向
- 假设模型参数可以分为两部分
$$\theta = [\theta_1, \theta_2]^T$$ - 损失函数为
$$ L(\theta_1, \theta_2)$$ - 全量梯度(最陡下降方向)为:
$$
g = \nabla_{\theta} L = \begin{bmatrix} \nabla_{\theta_1} L \\ \nabla_{\theta_2} L \end{bmatrix}
$$
冻结部分参数 = 子空间投影(块坐标下降)
- 如果冻结了 \(\theta_1\),只更新 \(\theta_2\),实际更新方向变成了:
$$
\Delta \theta = - \eta \begin{bmatrix} 0 \\ \nabla_{\theta_2} L \end{bmatrix}
$$ - 这相当于在原始梯度上乘了一个投影矩阵 \(P\):
$$
\Delta \theta = - \eta P g, \quad \text{其中} \quad P = \begin{bmatrix} 0 & 0 \\ 0 & I \end{bmatrix}
$$ - 在最优化理论中,只要更新方向 \(d\) 与负梯度方向 \(-g\) 的夹角小于 90 度(即内积大于 0),这个方向就是一个下降方向(Descent Direction) ,就能保证损失函数下降
- 我们计算一下投影梯度与原梯度的内积:
$$
\langle P g, g \rangle = g^T P g = |\nabla_{\theta_2} L|^2 \ge 0
$$- 只要 \(\theta_2\) 的梯度不为 0,这个内积就严格大于 0
- 注意:因为 投影矩阵 \(P\) 中,关于 \(\theta_1\) 的位置(上半部分)都是0,下半部分都是 1(单位矩阵),所以有下面的式子成立:
$$ g^T P g = |\nabla_{\theta_2} L|^2 $$
- 因此,虽然方向改变了,但它依然保证了损失函数在 \(\theta_2\) 的子空间内是下降的
- 这在数学上被称为“块坐标下降法(Block Coordinate Descent)”
不同参数不同学习率 = 预条件(Preconditioning)
- 如果给 \(\theta_1\) 设定学习率 \(\eta_1\),给 \(\theta_2\) 设定学习率 \(\eta_2\),更新公式为:
$$
\Delta \theta = - \begin{bmatrix} \eta_1 I & 0 \\ 0 & \eta_2 I \end{bmatrix} \begin{bmatrix} \nabla_{\theta_1} L \\ \nabla_{\theta_2} L \end{bmatrix} = - H g
$$- 这里的 \(H\) 是一个对角矩阵
- 只要 \(H\) 是一个正定矩阵(即所有的学习率 \(\eta_i > 0\)),那么:
$$
\langle H g, g \rangle = g^T H g = \eta_1 |\nabla_{\theta_1} L|^2 + \eta_2 |\nabla_{\theta_2} L|^2 > 0
$$- 这同样保证了更新方向是一个有效的下降方向
- 事实上,改变梯度的方向往往是作者梦寐以求的
- 标准的梯度方向(最陡下降)在损失函数等高线呈椭圆(病态条件,Ill-conditioned)时,会导致严重的“Z字形”震荡
- 牛顿法(乘以海森矩阵的逆 \(\nabla^2 L^{-1}\))或 Adam 优化器(除以历史梯度的均方根),本质上都是在改变梯度的方向 ,使其指向真正的极小值点
- 不同层使用不同学习率,就是一种手动且粗糙的预条件操作
从功能上理解改变学习率的含义
- 除了数学上的合理性,在深度学习的实际应用中,故意 改变梯度方向(冻结或分层学习率),也有物理上的原因
避免灾难性遗忘(Catastrophic Forgetting)与保护特征提取器
- 核心理由:防止已经训练的不错的参数被其他随机参数影响(一般来说刚开始训练时,传回来的误差梯度会非常大且混乱)
- 在迁移学习或 Fine-tuning 中,\(\theta_1\) 通常是预训练模型的骨干(Backbone),\(\theta_2\) 是新加的分类头(Head)
- \(\theta_1\) 已经在一个巨大的数据集上学到了非常好的通用特征表示
- \(\theta_2\) 是随机初始化的
- 如果一开始就全参数更新,\(\theta_2\) 传回来的误差梯度会非常大且混乱,这个“全量梯度”会直接破坏 \(\theta_1\) 已经学好的脆弱的特征空间
- 需要 把 \(\theta_1\) 的梯度强行变为 0(冻结),或者给一个极小的学习率
- 于是,此时我们并不想要全局的最陡下降,只想要局部(分类头)的下降
深度神经网络的“过参数化”特性
- 核心理由:参数太多时,适当缩小搜索空间反而是一种正则化,能防止过拟合
- 深度学习模型通常是严重过参数化的(参数量远大于数据量)
- 损失函数的极小值不是一个点,而是一个巨大的、平坦的低维流形(Manifold)
- 意味着,不需要在全维度的参数空间中寻找最优解
- 只需要在某一个子空间(未冻结的参数空间)中移动,就能找到一个使得训练误差降为 0 的解
- 冻结部分参数相当于给模型施加了一种强正则化(Regularization) ,缩小了搜索空间,反而能防止模型在小数据集上过拟合
梯度的尺度差异(Lipschitz 平滑度不同)
- 核心理由:不同层、不同参数可能量级不同(梯度范数可能差异巨大),相同的学习率可能导致一些层已经梯度爆炸,但一些层还在梯度消失
- 在深层网络中,不同层的梯度方差和曲率(Curvature)差异巨大
- 例如,底层(靠近输入)的梯度可能很小且平缓,而顶层(靠近输出)的梯度可能很大且陡峭
- 如果使用统一的学习率(即保持原始梯度方向),可能会导致顶层梯度爆炸,而底层梯度消失
- 给不同层分配不同的学习率,相当于在不同维度上拉伸/压缩了空间,使得优化过程在各个维度上更加均衡