最近看到了个一个学习率跟batch size 关系的帖子,里面说 OpenAI的《An Empirical *** Training》
通过损失函数的二阶近似分析SGD的最优学习率,得出“学习率随着Batch Size的增加而单调递增但有上界”的结论。推导过程中将学习率作为待优化参数纳入损失函数,并通过二阶泰勒展开得到最优学习率表达式:
η ∼ η max 1 + B n o i s e B \eta \sim \frac{\eta_\text{max}}{1 + \frac{B_{noise}}{B}} η∼1+BBnoiseηmax
这表明,随着批量大小 ( B ) 的增大,学习率可以增大,但最终会趋于饱和。
训练过程:在训练过程中,首先通过海塞矩阵和梯度计算 B n o i s e B_{noise} Bnoise,然后利用小批量数据得到 η \eta η,结合B得到 η max \eta_\text{max} ηmax。
数据效率:研究表明,数据量越小,应缩小Batch Size并增加训练步数,以提高达到更优解的机会。
海塞矩阵和梯度计算在训练过程中的应用
在机器学习模型训练过程中,海塞矩阵和梯度的计算是非常重要的步骤,特别是在优化算法中。下面详细介绍如何通过海塞矩阵和梯度计算来分析和优化训练过程。
梯度和海塞矩阵的定义
梯度(Gradient)
对于一个损失函数 ( L(\theta) ),梯度是一个向量,包含了损失函数对每个参数的偏导数。
∇ L ( θ ) = [ ∂ L ∂ θ 1 , ∂ L ∂ θ 2 , … , ∂ L ∂ θ n ] \nabla L(\theta) = \left[ \frac{\partial L}{\partial \theta_1}, \frac{\partial L}{\partial \theta_2}, \ldots, \frac{\partial L}{\partial \theta_n} \right] ∇L(θ)=[∂θ1∂L,∂θ2∂L,…,∂θn∂L]
海塞矩阵(Hessian Matrix)
海塞矩阵是损失函数的二阶偏导数矩阵,用于描述损失函数的局部曲率。
H ( L ) = [ ∂ 2 L ∂ θ 1 2 ∂ 2 L ∂ θ 1 ∂ θ 2 ⋯ ∂ 2 L ∂ θ 1 ∂ θ n ∂ 2 L ∂ θ 2 ∂ θ 1 ∂ 2 L ∂ θ 2 2 ⋯ ∂ 2 L ∂ θ 2 ∂ θ n ⋮ ⋮ ⋱ ⋮ ∂ 2 L ∂ θ n ∂ θ 1 ∂ 2 L ∂ θ n ∂ θ 2 ⋯ ∂ 2 L ∂ θ n 2 ] H(L) = \begin{bmatrix} \frac{\partial^2 L}{\partial \theta_1^2} & \frac{\partial^2 L}{\partial \theta_1 \partial \theta_2} & \cdots & \frac{\partial^2 L}{\partial \theta_1 \partial \theta_n} \\ \frac{\partial^2 L}{\partial \theta_2 \partial \theta_1} & \frac{\partial^2 L}{\partial \theta_2^2} & \cdots & \frac{\partial^2 L}{\partial \theta_2 \partial \theta_n} \\ \vdots & \vdots & \ddots & \vdots \\ \frac{\partial^2 L}{\partial \theta_n \partial \theta_1} & \frac{\partial^2 L}{\partial \theta_n \partial \theta_2} & \cdots & \frac{\partial^2 L}{\partial \theta_n^2} \end{bmatrix} H(L)= ∂θ12∂2L∂θ2∂θ1∂2L⋮∂θn∂θ1∂2L∂θ1∂θ2∂2L∂θ22∂2L⋮∂θn∂θ2∂2L⋯⋯⋱⋯∂θ1∂θn∂2L∂θ2∂θn∂2L⋮∂θn2∂2L
在训练过程中计算梯度和海塞矩阵
1. 梯度计算
在每次迭代中,首先计算损失函数 ( L(\theta) ) 对模型参数 ( \theta ) 的梯度:
∇ L ( θ ) = [ ∂ L ∂ θ 1 , ∂ L ∂ θ 2 , … , ∂ L ∂ θ n ] \nabla L(\theta) = \left[ \frac{\partial L}{\partial \theta_1}, \frac{\partial L}{\partial \theta_2}, \ldots, \frac{\partial L}{\partial \theta_n} \right] ∇L(θ)=[∂θ1∂L,∂θ2∂L,…,∂θn∂L]
这通常通过**反向传播算法(Backpropagation)**来实现,特别是在深度学习中。
2. 海塞矩阵计算
计算海塞矩阵涉及到更多的计算资源,因为需要计算二阶偏导数。海塞矩阵的元素是损失函数对每对参数的二阶偏导数:
H i j = ∂ 2 L ∂ θ i ∂ θ j H_{ij} = \frac{\partial^2 L}{\partial \theta_i \partial \theta_j} Hij=∂θi∂θj∂2L
在实践中,直接计算完整的海塞矩阵可能计算量很大,因此一些近似方法如有限差分法、**BFGS算法(拟牛顿法)**等被广泛使用。
使用海塞矩阵和梯度优化训练过程
1. 学习率的调整
OpenAI的研究表明,学习率可以作为待优化参数纳入损失函数,并通过二阶泰勒展开得到最优学习率表达式。这个过程可以简化为:
泰勒展开
将损失函数 ( L(\theta) ) 在当前参数 ( \theta ) 处进行二阶泰勒展开:
L ( θ + Δ θ ) ≈ L ( θ ) + ∇ L ( θ ) T Δ θ + 1 2 Δ θ T H ( θ ) Δ θ L(\theta + \Delta\theta) \approx L(\theta) + \nabla L(\theta)^T \Delta\theta + \frac{1}{2} \Delta\theta^T H(\theta) \Delta\theta L(θ+Δθ)≈L(θ)+∇L(θ)TΔθ+21ΔθTH(θ)Δθ
最优学习率
通过最小化泰勒展开式,得到最优学习率的表达式。假设学习率为 ( \eta ),则更新步长为 ( \Delta\theta = -\eta \nabla L(\theta) )。将其代入泰勒展开式并最小化,可以得到最优学习率:
η = ∇ L ( θ ) T ∇ L ( θ ) ∇ L ( θ ) T H ( θ ) ∇ L ( θ ) \eta = \frac{\nabla L(\theta)^T \nabla L(\theta)}{\nabla L(\theta)^T H(\theta) \nabla L(\theta)} η=∇L(θ)TH(θ)∇L(θ)∇L(θ)T∇L(θ)
这表明,随着批量大小的增大,学习率可以增大,但最终会趋于饱和。
2. 训练过程中的优化
在训练过程中,可以使用梯度和海塞矩阵来优化模型参数:
梯度下降法
使用梯度信息更新参数:
θ t + 1 = θ t − η ∇ L ( θ t ) \theta_{t+1} = \theta_t - \eta \nabla L(\theta_t) θt+1=θt−η∇L(θt)
牛顿法
使用梯度和海塞矩阵更新参数:
θ t + 1 = θ t − H ( θ t ) − 1 ∇ L ( θ t ) \theta_{t+1} = \theta_t - H(\theta_t)^{-1} \nabla L(\theta_t) θt+1=θt−H(θt)−1∇L(θt)
牛顿法利用了损失函数的二阶信息,可以更快地收敛,但计算复杂度较高。
拟牛顿法
如BFGS算法,通过近似海塞矩阵来更新参数,兼顾了计算效率和收敛速度。
总结
通过海塞矩阵和梯度计算,可以更精确地分析和优化训练过程。特别是在调整学习率和使用二阶优化方法时,海塞矩阵提供了关键的曲率信息,使得优化过程更高效和稳定。