随机梯度下降法(SGD)

有一组数据,需要进行拟合,(拟合后可以做很多事,做很多事都需要数据拟合,比如机器学习,从样本中学习也就是拟合的过程)

假设这个拟合函数为(1式)

拟合有误差,比如本来这个x对应的是100,你确根据拟合函数得到为200,这就是误差

而一堆x,就会产生一堆误差,这就确定了损失函数

其中,J(θ)是损失函数,m代表每次取多少样本进行训练,如果采用SGD进行训练,那每次随机取一组样本,m=1;如果是批处理,则m等于每次抽取作为训练样本的数量。θ是参数,对应(1式)的θ1和θ2。求出了θ1和θ2,h(x)的表达式就出来了:

(记住这个思想:目前是知道了一堆x,y,xy带入1式,变量就是theta了,所以,我们要把theta当作自变量,要求出这个theta使这个函数最小)

要想拟合得好,第一步,损失函数损失最小

也就是要找到上图中的一个最低点

这不就成了一个函数求最值问题吗?

那就求导吧

导数的作用一般在于求最值

根本在于为函数变化趋势指明了方向,沿着这个方向函数将会有一种偏离的趋势

我们形象地称之为梯度

梯度下降,那就减去

又抛出一个问题,方向确定了,但每次移动的距离却不知道。这个可以由步长(也称学习率)来确定,记为α。这样权值

调整可表示为:(也就是在delta前面乘以步长a)

下面我们再来想想这个步长

可以这样理解

 

对于给定的x,y样本集,要拟合的好

我们上面已经知道要将损失函数最小化,也就是求导得到偏导函数

最终要求的是theta,我们肯定要将不同的theta带进去测试得到一个最好的结果

而这里是梯度下降,我们就将theta减去偏导函数,就是一个新的theta测试用例

而这里减去偏导函数时我们加入了步长

 

步长多少合适呢?

少了测试的太慢,多了测试可能不精准出现震荡,也就是一会出现了个好的theta,一会坏,一会好

一般来说,通过经验选取a,使得损失值与迭代次数之间的函数曲线下降最快


B(BATCH)GD批量梯度下降:每更新一次theta就把一批样本带进去测验损失值

这肯定慢啊,所以有人想了个小批次地方法MBGD

但又出现个问题,测试样本数少了,万一找到的theta是局部最优解呢


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

 

附:

https://blog.csdn.net/SecondLieutenant/article/details/79082411(算法比较)

https://blog.csdn.net/zjxiaolu/article/details/44560563(步长选择)

发布了112 篇原创文章 · 获赞 19 · 访问量 2万+
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 大白 设计师: CSDN官方博客

分享到微信朋友圈

×

扫一扫,手机浏览