优化算法
随机梯度下降法
在机器学习中,优化问题的目标函数通常可以表示成
其中 θ\thetaθ 是待优化的模型参数, xxx 是模型输入, f(x,θ)f(x,\theta)f(x,θ) 是模型的实际输出, yyy 是模型的目标输出,函数 LLL 刻画了模型在数据 (x,y)(x,y)(x,y) 上的损失, PdataP_{data}Pdata 表示数据的分布, EEE 表示期望。因此, L(θ)L(\theta)L(θ) 刻画了当参数为 θ\thetaθ时,模型在所有数据上的平均损失。
我们希望能够找到平均损失最小的模型参数,也就是求解优化问题
θ∗=argminL(θ)\theta^*=arg min L(\theta)θ∗=argminL(θ)
经典的梯度下降法采用所有训练数据的平均损失来近似目标函数,即
其中 MMM 为训练样本的个数。模型参数的更新公式为
θt+1=θt−α▽L(θt)\theta_{t+1}=\theta_t-\alpha ▽L(\theta_t)θt+1=θt−α▽L(θt)
因此,经典的梯度下降法在每次对模型参数进行更新时,需要遍历所有的训练数据。当 MMM 很大时,这需要很大的计算量,耗费很长的计算时间,在实际应用中基本不可行。
为了解决这个问题,随机梯度下降法(Stochastic Gradient Descent,SGD)用单个训练样本的损失来近似平均损失,即
因此,随机梯度下降法用单个训练数据即可对模型参数进行一次更新,大大加快了收敛速率。该方法也非常适用于源源不断到来的在线更新场景。
为了降低随机梯度的方差,从而使得迭代算法更加稳定,也为了充分利用高度优化的矩阵运算操作,在实际应用中我们会同时处理若干训练数据,该方法被称为小批量梯度下降法(Mini-Batch Gradinet Descent)。假设需要同时处理 mmm 个训练数据{(xi1,yi1),...,(xim,yim)(x_{i_{1}},y_{i_{1}}),...,(x_{i_{m}},y_{i_{m}})(xi1,yi1),...,(xim,yim)},则目标函数及其梯度为
对于小批量梯度下降法的使用,有以下三点需要注意:
(1)如何选取参数 mmm。在不同应用中,最优的 mmm 通常会不一样,需要通过调参选取。一般 mmm 取为2的幂次时能充分利用矩阵运算操作,如选取32、64、128等。
(2)如何挑选 mmm 个训练数据。为了避免数据的特定顺序给算法收敛带来影响,一般会在每次遍历训练数据之前,先对所有的数据进行随机排序,然后在每次迭代时按顺序挑选 mmm 个训练数据直至遍历完所有的数据。
(3)如何选取学习率 α\alphaα。为了加快收敛速率,同时提高求解精度,通常会采用衰减学习率的方案:一开始算法采用较大的学习率,当误差曲线进入平台期后,减小学习速率做更精细的调整。最优的学习速率方案也通常需要调参才能得到。
综上,通常采用小批量梯度下降法解决训练数据量过大的问题。每次更新模型参数时,只需要处理 mmm 个训练数据即可,其中 mmm 是一个远小于总数据量 MMM 的常数,这样能够大大加快训练过程。