-
BGD
BGD (Batch Gradient Descent),批量梯度下降。
损失函数: L ( X ; θ ) = ∑ x i ∈ X l ( x i ; θ ) , X L(X;θ) = \sum_{x_i∈X} l(x_i;θ),X L(X;θ)=∑xi∈Xl(xi;θ),X 代表整个数据集。
BGD 的参数更新公式为:
θ t + 1 = θ t − μ ∇ θ L ( X ; θ ) θ_{t+1}=θ_t-μ\nabla_θL(X;θ) θt+1=θt−μ∇θL(X;θ)
BGD 每次都对整个数据集计算梯度,所以计算速度非常慢。无法进行在线学习,即便可以,一个样本加入到大数据集中,对梯度影响也不明显。
它对于凸函数可以收敛到全局极小值,对于非凸函数可以收敛到局部极小值。
-
SGD
SGD (Stochastic Gradient Descent),随机梯度下降。
损失函数: L ( x i ; θ ) = l ( x i ; θ ) , x i ∈ X , X L(x_i;θ) =l(x_i;θ),x_i∈X,X L(xi;θ)=l(xi;θ),xi∈X,X代表整个数据集。
BGD 的参数更新公式为:
θ t + 1 = θ t − μ ∇ θ L ( x i ; θ ) θ_{t+1}=θ_t-μ\nabla_θL(x_i;θ) θt+1=θt−μ∇θL(xi;θ)
每次只使用一个样本进行更新,计算速度快,而且可以进行在线学习,即获得一个样本就可以学习一次。而且在学习过程中,有可能还未使用全部样本便已经达到最优解。
但 SGD 易受噪声点影响,参数更新的方差大,迭代并不是每次都向着最优解方向进行,可能无法达到全局最优解,且学习曲线震荡。
(震荡的一个好处是可能从以一个局部最优解跳出到另一个更好的局部最优解。)
-
MBGD
MBGD (Mini-Batch Gradient Descent),小批量梯度下降。
介于 BGD 与 SGD 之间,每一次利用一小批样本,即 n 个样本进行计算。
损失函数: L ( X n ; θ ) = ∑ x i ∈ X n l ( x i ; θ ) , X n ∈ X , X n L(X_n;θ) = \sum_{x_i∈X_n} l(x_i;θ),X_n∈X,X_n L(Xn;θ)=∑xi∈Xnl(xi;θ),Xn∈X,Xn代表整体数据集中的一个子集。
BGD 的参数更新公式为:
θ t + 1 = θ t − μ ∇ θ L ( X n ; θ ) , X n ∈ X θ_{t+1}=θ_t-μ\nabla_θL(X_n;θ),X_n∈X θt+1=θt−μ∇θL(Xn;θ),Xn∈X
可以降低更新时的方差,收敛更加稳定。
以上三种梯度下降方法明显发现两个重要缺点:
-
学习率的设定,如果学习率设置得过大,那么会非常震荡,以至于无法收敛;如果设置的太小,学习速度会很慢,还可能陷入局部最优解。对于局部最小值或鞍点来讲,周围是一片平坦的开阔地,其 Error 基本相等,导致梯度基本为 0,被困在这里。
在局部最小值或鞍点,对 BGD来讲会停止优化,对 SGD 与 MBGD 来讲可能会在周围震荡,来回跳动。
-
它们对于不同的参数应用了相等的学习率,但是对于稀疏数据来讲,稀疏特征对应的参数在更新时的梯度会非常小几乎消失,所以在很多轮次后才可能得到稍微明显的更新,而稠密特征的参数则每次都会得到相对明显的更新。
我们希望对于不同稠密度的特征对应的参数更新采取不同的学习率。对于稀疏的,我们希望调大他的学习率,让“难得”的一次更新步子更大,效果更加明显;对于稠密的,更新太过频繁,我们希望降低它的学习率,让每次的步子稍微小一点,不至于跳出全局最优点。
那么为了解决这两个缺点,产生了很多方法,我们在之后的文章中再做解释。