梯度下降法(Gradient Descent)优化函数的详解(2)随机梯度下降法(SGD Stochastic Gradient Descent)

随机梯度下降法(Stochasitc Gradient Descent)

针对BGD算法训练速度过慢的缺点,提出了SGD算法 ,普通的BGD算法是每次迭代把所有样本都过一遍,每训练一组样本就把梯度更新一次。而SGD算法是从样本中随机抽出一组,训练后按梯度更新一次,然后再抽取一组,再更新一次,在样本量及其大的情况下,可能不用训练完所有的样本就可以获得一个损失值在可接受范围之内的模型了。这种逐个样本进行loss计算进行迭代的方法,称之为 Stochasitc Gradient Descent 简称SGD。

算法详解

每一次迭代按照一定的学习率α沿梯度的反方向更新参数,直至收敛,公式
θ t + 1 = θ t − α d f d θ \theta _{t+1} = \theta _{t}-\alpha \frac{df}{d\theta } θt+1=θtαdθdf
接下来我们回到房价预测问题上。

这是SGD梯度下降方法:
step1:
y p , i = a x i + b l o s s = 1 2 ( y p , i − y i ) 2 y_{p,i} = ax_i + b \qquad \qquad loss = \frac{1}{2}(y_{p,i}-y_i)^2 yp,i=axi+bloss=21(yp,iyi)2

step2:要优化的参数有两个,分别是a和b,我们分别对他们求微分,也就是偏微分
∂ l o s s ∂ a = ( a x i + b − y i ) x i ∂ l o s s ∂ b = a x i + b − y i \frac{\partial loss}{\partial a} = (ax_i+b-y_i)x_i \qquad \qquad \frac{\partial loss}{\partial b} = ax_i+b-y_i aloss=(axi+byi)xibloss=axi+byi

step3: ∂ l o s s ∂ a \frac{\partial loss}{\partial a} aloss记为 ▽ a \bigtriangledown a a ∂ l o s s ∂ b \frac{\partial loss}{\partial b} bloss记为 ▽ b \bigtriangledown b b,分别表示loss在a、b方向的梯度,更新参数的方式如下
a n e w = a − α ▽ a b n e w = b − α ▽ b a_{new} = a - \alpha ▽a \qquad \qquad b_{new} = b - \alpha ▽ b anew=aαabnew=bαb

算法实现

直接看图
在这里插入图片描述
随机梯度下降的做法实际上就是扫描所有的训练样本,首先是第一组训练样本(x(1), y(1))。
然后只对这第一个训练样本,我们的梯度下降只对这第一个训练样本的代价函数进行。换就话说我们要关注第一个样本,然后把参数稍微修改一点使其对第一个训练样本的拟合变得好一点完成这个内层循环(for i=1,….,m)以后,然后再转向第二个训练样本,把参数稍微修改一点使其对第二个训练样本的拟合变得好一点,然后再转向第三个训练样本以此类推直到完成所有的训练集。

外环(Repeat)的循环次数取决于训练样本的大小,通常1次,最多10次

随机梯度下降算法在每一次计算之后便更新参数 θ, 而不需要首先将所有的训练集求和,在梯度下降算法还没有完成一次迭代时, 随机梯度下降算法便已经走出了很远。 但是这样的算法存在的问题是, 不是每一步都是朝着”正确”的方向迈出的。 因此算法虽然会逐渐走向全局最小值的位置,但是可能无法站到那个最小值的那一点,而是在最小值点附近徘徊。

等高线图和loss图都很明显的表现了SGD的特点。总体上收敛,局部有一些震荡。

随机梯度下降伪代码

输入参数:rate, x → \overrightarrow{x} x y → \overrightarrow{y} y ,scope
============> rate为设定的学习率
============> x → \overrightarrow{x} x 为给定的模拟数据
============> x取值范围
============> scope 训练次数
输出参数:a,b,loss
1):初始化a,b
2):for i in len(x)
A:更新x的值: x[i] = (x[i] - x_min)/(x_max - x_min)
B:更新y的值: y[i] = (y[i] - y_min)/(y_max - y_min)
3):for step in scope
\qquad A:随机打乱x,y的数据,并且保持x和y一一对应:shuffle_data(x,y)
\qquad B:for i in len(x)
\qquad \qquad A:更新all_da的值:all_da = da(y[i],y_p,x[i])
\qquad \qquad B:更新all_db的值:all_db = db(y[i],y_p,x[i])
\qquad \qquad C:更新a旳值:a = a - rate × all_da
\qquad \qquad D:更新b旳值:b = b - rate × all_db
\qquad \qquad E:更新step的值:step+=1
4)end
由于加入了随机的成分,有的时候可能算法有一点点走偏,但好处就是对于一些局部极小点可以从坑中跳出,奔向理想中的全局最优。

算法优势:与批量梯度下降不同,随机梯度下降不需要对所有m个训练样本求和来得到梯度项,只需要对单个训练样本求出这个梯度项,我们已经在这个过程中开始优化参数了。

具体代码:https://github.com/admin110/s0/blob/master/SGD.py

上一篇:梯度下降法(Gradient Descent)优化函数的详解(1)批量梯度下降法(Batch Gradient Descent)
下一篇:梯度下降法(Gradient Descent)优化函数的详解(3)小批量随机梯度下降法(mini-batch SGD )

  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值