经典梯度下降、随机梯度下降、批量梯度下降是个啥?

假设某任务损失函数为 L L L,模型参数为 θ \theta θ,我们希望找到使损失函数最小的模型参数

θ ∗ = a r g min ⁡ L ( θ ) \theta^* = arg \min L(\theta) θ=argminL(θ)

经典的梯度下降方法采用平均所有数据的平均损失来近似目标优化函数

L ( θ ) = 1 M ∑ i = 1 M L ( f ( x i , θ ) , y i ) L(\theta) = \frac{1}{M}\sum_{i=1}^{M}L(f(x_i, \theta), y_i) L(θ)=M1i=1ML(f(xi,θ),yi)

M M M表示样本个数,求梯度得

▽ L ( θ ) = 1 M ∑ i = 1 M ▽ L ( f ( x i , θ ) , y i ) \triangledown L(\theta) = \frac{1}{M}\sum_{i=1}^{M} \triangledown L(f(x_i, \theta), y_i) L(θ)=M1i=1ML(f(xi,θ),yi)

参数更新公式为

θ t + 1 = θ t − α ▽ L ( θ t ) \theta_{t+1} = \theta_t - \alpha \triangledown L(\theta_t) θt+1=θtαL(θt)

α \alpha α为学习率,经典的梯度下降算法在更新参数时需要遍历所有的数据,当样本数量很大时,计算量很大,更新耗时严重,实际应用场景下,基本不可行。

因此,有人提出了随机梯度下降算法SGD,用1个样本来进行参数更新

L ( θ ) = L ( f ( x i , θ ) , y i ) L(\theta) = L(f(x_i, \theta), y_i) L(θ)=L(f(xi,θ),yi)

▽ L ( θ ) = ▽ L ( f ( x i , θ ) , y i ) \triangledown L(\theta) = \triangledown L(f(x_i, \theta), y_i) L(θ)=L(f(xi,θ),yi)

单个样本更新参数大大加快了收敛速度,适用于源源不断的在线更新,但是容易陷入到局部最优解中。因此为了折衷这两种方法,使迭代更加稳定,同时充分利用高度优化的矩阵计算,实际应用中会采用小批量梯度下降,每次处理 m ( m < < M ) m(m << M) m(m<<M)个样本,目标函数及其梯度为

L ( θ ) = 1 m ∑ i = 1 m L ( f ( x i , θ ) , y i ) L(\theta) = \frac{1}{m}\sum_{i=1}^{m}L(f(x_i, \theta), y_i) L(θ)=m1i=1mL(f(xi,θ),yi)

▽ L ( θ ) = 1 m ∑ i = 1 m ▽ L ( f ( x i , θ ) , y i ) \triangledown L(\theta) = \frac{1}{m}\sum_{i=1}^{m} \triangledown L(f(x_i, \theta), y_i) L(θ)=m1i=1mL(f(xi,θ),yi)

  1. 参数m如何选取
    在不同应用中,最优的 m 通常会不一样,需要通过调参选取。一般 m 取为2的幂次时能充分利用矩阵运算操作,如选取32、64、128等。
  2. 如何挑选m哥数据
    一般会在每次遍历训练数据之前,先对所有的数据进行随机排序,来避免数据的特定顺序给算法收敛带来影响。然后在每次迭代时按顺序挑选 m 个训练数据直至遍历完所有的数据。
  3. 学习率 α \alpha α如何确定
    衰减方案。开始用大的学习率,当误差曲线趋于平缓时减小学习率进行精调。

欢迎关注微信公众号(算法工程师面试那些事儿),本公众号聚焦于算法工程师面试,期待和大家一起刷leecode,刷机器学习、深度学习面试题等,共勉~

算法工程师面试那些事儿

猜你喜欢

转载自blog.csdn.net/qq_40006058/article/details/121893029