BGD、SGD以及MBGD

三种梯度下降的方法用于更新参数,也就是当前参数等于上一时刻参数减去学习率乘以梯度。
θ j : = θ j − α ∂ ∂ θ j J ( θ ) \theta_{j} :=\theta_{j}-\alpha \frac{\partial}{\partial \theta_{j}} J(\theta) θj:=θjαθjJ(θ)
三种方法的不同体现在计算 ∂ ∂ θ j J ( θ ) \frac{\partial}{\partial \theta_{j}} J(\theta) θjJ(θ)的不同上

假设损失函数为二次函数,那么参数 θ j \theta_{j} θj的更新公式为
∂ ∂ θ j J ( θ ) = ∂ ∂ θ j 1 2 ( h θ ( x ) − y ) 2 = 2 ⋅ 1 2 ( h θ ( x ) − y ) ⋅ ∂ ∂ θ j ( h θ ( x ) − y ) = ( h θ ( x ) − y ) ⋅ ∂ ∂ θ j ( ∑ i = 0 n θ i x i − y ) = ( h θ ( x ) − y ) x j \begin{aligned} \frac{\partial}{\partial \theta_{j}} J(\theta) &=\frac{\partial}{\partial \theta_{j}} \frac{1}{2}\left(h_{\theta}(x)-y\right)^{2} \\ &=2 \cdot \frac{1}{2}\left(h_{\theta}(x)-y\right) \cdot \frac{\partial}{\partial \theta_{j}}\left(h_{\theta}(x)-y\right) \\ &=\left(h_{\theta}(x)-y\right) \cdot \frac{\partial}{\partial \theta_{j}}\left(\sum_{i=0}^{n} \theta_{i} x_{i}-y\right) \\ &=\left(h_{\theta}(x)-y\right) x_{j} \end{aligned} θjJ(θ)=θj21(hθ(x)y)2=221(hθ(x)y)θj(hθ(x)y)=(hθ(x)y)θj(i=0nθixiy)=(hθ(x)y)xj

BGD (批梯度下降算法 Batch Gradient Descent)

计算梯度时候用所有的数据来计算,但是要取平均(不平均就没有意义了)
∂ J ( θ ) ∂ θ j = − 1 m ∑ i = 1 m ( y i − h θ ( x i ) ) x j i \frac{\partial J(\theta)}{\partial \theta_{j}}=-\frac{1}{m} \sum_{i=1}^{m}\left(y^{i}-h_{\theta}\left(x^{i}\right)\right) x_{j}^{i} θjJ(θ)=m1i=1m(yihθ(xi))xji
好处在于收敛次数少,坏处就是每次迭代需要用到所有数据,占用内存大耗时大。
收敛图如下,可以看到收敛的比较快
BGD、SGD以及MBGD_第1张图片

SGD(随机梯度下降法Stochastic Gradient Descent)

每次只用一个样本求梯度,
BGD、SGD以及MBGD_第2张图片

优点是速度快,缺点是可能陷入局部最优,搜索起来比较盲目,并不是每次都朝着最优的方向(因为单个样本可能噪音比较多)

MBGD(小批量梯度下降法Mini-batch Gradient Descent)

SGD和BGD是两个极端, 而MBGD是两种方法的折衷,每次选择一批数据来求梯度。
该方法也容易陷入局部最优
现在说SGD一般都指MBGD

参考资料

https://zhuanlan.zhihu.com/p/22252270
https://zhuanlan.zhihu.com/p/25765735

你可能感兴趣的:(机器学习)