DL——学习率和梯度方向的思考


为什么可以冻结参数或使用不同的学习率?

  • 改变学习率的两种方式,冻结参数(学习率为 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)差异巨大
  • 例如,底层(靠近输入)的梯度可能很小且平缓,而顶层(靠近输出)的梯度可能很大且陡峭
  • 如果使用统一的学习率(即保持原始梯度方向),可能会导致顶层梯度爆炸,而底层梯度消失
  • 给不同层分配不同的学习率,相当于在不同维度上拉伸/压缩了空间,使得优化过程在各个维度上更加均衡