基于梯度的超参数优化(Gradient-based Hyperparameter Optimization)详解
描述
在机器学习中,超参数(如学习率、正则化系数、网络层数等)通常由人工设定或通过网格搜索/随机搜索等启发式方法优化。然而,这些方法计算成本高,且无法利用超参数与模型性能之间的梯度信息。基于梯度的超参数优化通过将超参数视为可微优化变量,利用梯度下降直接优化超参数,从而更高效地找到最优配置。本讲解聚焦于通过可微方式优化验证集损失相对于超参数的梯度。
解题过程循序渐进讲解
步骤1:问题形式化
设模型参数为 \(\theta\),超参数为 \(\lambda\)(例如学习率、权重衰减系数)。模型训练旨在最小化训练损失 \(\mathcal{L}_{\text{train}}(\theta, \lambda)\)。但超参数优化目标是基于验证集损失 \(\mathcal{L}_{\text{val}}(\theta^*(\lambda), \lambda)\),其中 \(\theta^*(\lambda)\) 是通过在训练集上优化 \(\mathcal{L}_{\text{train}}\) 得到的最优模型参数,依赖于 \(\lambda\)。目标是最小化验证集损失:
\[\lambda^* = \arg\min_{\lambda} \mathcal{L}_{\text{val}}(\theta^*(\lambda), \lambda). \]
关键挑战:验证损失 \(\mathcal{L}_{\text{val}}\) 依赖于 \(\theta^*(\lambda)\),而 \(\theta^*(\lambda)\) 本身是优化过程的结果,通常无闭式解。
步骤2:梯度计算的核心思想
为了用梯度下降优化 \(\lambda\),需要计算梯度 \(\nabla_{\lambda} \mathcal{L}_{\text{val}}\)。通过链式法则:
\[\nabla_{\lambda} \mathcal{L}_{\text{val}} = \frac{\partial \mathcal{L}_{\text{val}}}{\partial \lambda} + \frac{\partial \mathcal{L}_{\text{val}}}{\partial \theta^*} \frac{\partial \theta^*}{\partial \lambda}. \]
第一项是超参数的直接影响(如正则化项中的 \(\lambda\)),第二项是间接影响:超参数 \(\lambda\) 改变模型参数 \(\theta^*\),进而影响验证损失。难点在于计算 \(\frac{\partial \theta^*}{\partial \lambda}\),因为 \(\theta^*\) 是内层优化(模型训练)的结果。
步骤3:近似梯度计算——隐函数定理法
假设内层优化(模型训练)通过梯度下降进行。设训练使用T步梯度下降,初始参数 \(\theta_0\),学习率 \(\alpha\)。第t步更新:
\[\theta_t = \theta_{t-1} - \alpha \nabla_\theta \mathcal{L}_{\text{train}}(\theta_{t-1}, \lambda). \]
训练结束时 \(\theta_T \approx \theta^*(\lambda)\)。计算 \(\frac{\partial \theta_T}{\partial \lambda}\) 可通过时间展开:
- 初始化:\(\frac{\partial \theta_0}{\partial \lambda} = 0\)(初始参数独立于 \(\lambda\))。
- 递归计算:对 \(t=1\) 到 \(T\),
\[\frac{\partial \theta_t}{\partial \lambda} = \frac{\partial \theta_{t-1}}{\partial \lambda} - \alpha \left( \frac{\partial}{\partial \lambda} \nabla_\theta \mathcal{L}_{\text{train}}(\theta_{t-1}, \lambda) + \nabla_\theta^2 \mathcal{L}_{\text{train}}(\theta_{t-1}, \lambda) \frac{\partial \theta_{t-1}}{\partial \lambda} \right). \]
其中 \(\nabla_\theta^2\) 是Hessian矩阵。然后代入链式法则计算 \(\nabla_{\lambda} \mathcal{L}_{\text{val}}\)。
步骤4:实际优化中的简化——近似梯度与反向传播
上述精确梯度计算需存储所有中间状态,计算Hessian矩阵,成本过高。常用简化方法:
- 有限差分近似:用 \(\frac{\mathcal{L}_{\text{val}}(\theta^*(\lambda+\epsilon), \lambda+\epsilon) - \mathcal{L}_{\text{val}}(\theta^*(\lambda), \lambda)}{\epsilon}\) 近似梯度,但需重复训练模型,效率低。
- 基于迭代展开的梯度:将T步训练展开为一个计算图,通过反向传播计算超参数梯度。在深度学习框架(如PyTorch、TensorFlow)中,可将内层优化(如几个训练周期)视为可微操作,直接对验证损失进行自动微分。例如:
- 训练模型几个周期(如5-10个周期),得到 \(\theta_T\)。
- 在验证集上计算损失 \(\mathcal{L}_{\text{val}}(\theta_T, \lambda)\)。
- 对 \(\lambda\) 进行反向传播,梯度会通过训练步骤传播回 \(\lambda\)。这需框架支持二阶梯度(高阶导)计算。
步骤5:具体算法——梯度优化超参数流程
以优化学习率 \(\lambda\) 为例:
- 初始化超参数 \(\lambda\) 和模型参数 \(\theta\)。
- 重复直到收敛:
a. 内层优化:用当前 \(\lambda\) 训练模型T步(如T=5),更新 \(\theta\) 到 \(\theta_T\)。
b. 计算验证损失:在验证集评估 \(\mathcal{L}_{\text{val}}(\theta_T, \lambda)\)。
c. 计算超参数梯度:通过自动微分计算 \(\nabla_{\lambda} \mathcal{L}_{\text{val}}\)(框架会自动处理训练步骤的反向传播)。
d. 更新超参数:\(\lambda \leftarrow \lambda - \beta \nabla_{\lambda} \mathcal{L}_{\text{val}}\),其中 \(\beta\) 是超参数学习率。 - 返回最优 \(\lambda\)。
步骤6:挑战与改进
- 计算开销:每次迭代需训练模型多步,但比网格搜索更高效,因梯度信息引导搜索方向。
- 梯度估计方差大:训练过程的随机性(如随机初始化、小批量)导致梯度噪声。解决方法:用多个随机种子平均梯度,或采用基于梯度的元学习算法(如MAML)。
- 非可微超参数:如网络层数、离散选择。可引入松弛(如连续松弛)或用梯度估计(如REINFORCE策略梯度)。
- 过拟合风险:可能过拟合到验证集。可交叉验证或早停。
总结
基于梯度的超参数优化将超参数优化转化为双层优化问题,通过可微方式计算验证损失对超参数的梯度,实现高效自动化调参。核心在于利用自动微分框架,将内层训练过程展开为计算图,使梯度可传播。虽实现较复杂,但在小规模问题或元学习中有显著优势。