Deep Learning|神经网络原理学习笔记(5) :随机梯度下降算法SGD(附手绘图)、离线学习与在线学习

快开学了,今天一天都静不下心。不如趁着美好的黄昏来更一篇叭。(写了整整一晚上也是没谁了)

惯例推音乐:今天是一首温柔的迷幻摇滚,我正在摇头晃脑的写
希望听到这首歌的盆友们也能摇头晃脑的看完这篇博客(´^`)
歌手:椅子乐团 The Chairs
歌名:Rollin’ On

Deep Learning|神经网络原理学习笔记(5) :随机梯度下降算法SGD(附手绘图)、离线学习与在线学习
❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤❤分割线

1.真实模型的梯度更新规则

在上一篇里我们说到如何用vv来代替所有自变量,那么用vv表示的模型看懂了,我们就可以把男女主角权重ww和偏置bb换上场了。还记得上次的式子吗?
Deep Learning|神经网络原理学习笔记(5) :随机梯度下降算法SGD(附手绘图)、离线学习与在线学习
我们将这个式子描述为位置变量vv的变化,现在将位置变量vjv_{j}分解为两个分量,即wkw_{k}blb_{l}
因此梯度向量C\bigtriangledown C也就有了相应的分量,即C/wk\partial C/\partial w_{k}C/bl\partial C/\partial b_{l}
我们用这些分量,模仿vv来写wkw_{k}blb_{l}的更新规则。
Deep Learning|神经网络原理学习笔记(5) :随机梯度下降算法SGD(附手绘图)、离线学习与在线学习
梯度下降算法在神经网络中使用的原理,就是利用算法去寻找能使代价函数CC取得最小值的权重ww和偏置bb。利用上面的两条更新规则,我们就可以找到让小球沿曲面滚到最低点的路线。也就会找到CC的最小值。
Deep Learning|神经网络原理学习笔记(5) :随机梯度下降算法SGD(附手绘图)、离线学习与在线学习

2.训练中的问题

在上次,我们说到代价函数的一种类型——二次代价函数。
Deep Learning|神经网络原理学习笔记(5) :随机梯度下降算法SGD(附手绘图)、离线学习与在线学习
拆解一下,对于每个样本,我们需要计算代价:
Deep Learning|神经网络原理学习笔记(5) :随机梯度下降算法SGD(附手绘图)、离线学习与在线学习
然后再对所有样本的代价求平均:
Deep Learning|神经网络原理学习笔记(5) :随机梯度下降算法SGD(附手绘图)、离线学习与在线学习
对求总梯度也有一样的变化:我们需要对每个样本x单独计算梯度值Cx\bigtriangledown C_{x},再计算总的梯度,也就是求所有样本梯度的平均值。
Deep Learning|神经网络原理学习笔记(5) :随机梯度下降算法SGD(附手绘图)、离线学习与在线学习
这个过程大概是这样的:
有好多好多样本xx——对每个样本都要计算一个代价函数最小值CxC_{x}——继而需要对每个样本计算Cx\bigtriangledown C_{x}以更新CxC_{x}——而计算每个 Cx\bigtriangledown C_{x}会对应计算对所有wkw_{k}blb_{l}的偏导——再用所有样本的CxC_{x}wkw_{k}的偏导求平均带入式来更新wkw_{k},对blb_{l}做同理运算。不断更新最终得到最优的wkw_{k}blb_{l}。这个过程在样本数少的时候还好说,当样本数很多时,计算量将会非常大也会消耗很多时间,学习过程就会十分缓慢。

因此在学习中,最常用的是加入了batch和epoch概念的随机梯度下降算法。可以理解为梯度下降算法的升级版。

3.随机梯度下降算法

随机梯度下降算法可以加速学习。其算法思想是从整个训练集中,随机选一小组共mm个输入样本来计算Cx\bigtriangledown C_{x}。随机抽取的mm个输入我们按顺序标号,将他们成为一个mini-batch
由于这些输入都是随机抽取的,我们认为其可以近似估计整个数据集的C\bigtriangledown C。也就有这样一个近似:
Deep Learning|神经网络原理学习笔记(5) :随机梯度下降算法SGD(附手绘图)、离线学习与在线学习
左边是我们对一个mini-batch计算得到的近似C\bigtriangledown C,中间和右边是真实的C\bigtriangledown C。其实本质上还是一样的,不管用多少个样本求了多少个Cx\bigtriangledown C_{x},算C\bigtriangledown C时总是用所有Cx\bigtriangledown C_{x}的和除以样本个数来求平均。就像我们高中生物要求一个池塘有多少红蛤蟆和绿蛤蟆,不能把几万只全捉来,就随机捉个100只看看红绿的比例。这里也是一样的,我们将C\bigtriangledown C这个平均值求出来看看是不是已经很小了。
去掉中间可以写成:
Deep Learning|神经网络原理学习笔记(5) :随机梯度下降算法SGD(附手绘图)、离线学习与在线学习
由此我们就可以用小样本来完成对整体梯度的估计。
权重的偏置的更新就可以表达为:
Deep Learning|神经网络原理学习笔记(5) :随机梯度下降算法SGD(附手绘图)、离线学习与在线学习
注意这里每更新一次某个wwbb,就需要求出这个mini-batch中所有CXjC_{X_{j}}对它的偏导再求和。也就是上面的求和符号,是在当前mini-batch中所有的训练样本上进行的。

我用很傻的方式 列了一下,大概就酱紫:
Deep Learning|神经网络原理学习笔记(5) :随机梯度下降算法SGD(附手绘图)、离线学习与在线学习
所以说有了mini-batch,计算量是明显减少了啊。
我们计算的目的是决定在某个方向上移动来减少CC,因此我们不需要每次计算得那么精确,梯度的只要能告诉我们方向就足够了。

3.epoch迭代期

我们当然不是选了一个mini-batch计算完就完事了。当计算完一个mini-batch,我们会选取另一个随机选定的mini-batch继续训练。直到用完了所有输入,这就叫做完成了一个训练迭代期epoch。一般训练中会设置很多个epoch

4.离线学习与在线学习

这里顺便说一下离线训练和在线训练。

离线训练,就是每次用一堆输入样本xx来训练,比如用所有样本来训练,更新每个ww,又或者用一小部分,也就是mini-batch来训练。
在线训练,就是每次只用一个样本来训练,可以理解为这个mini-batch的大小为1。

离线训练一般用在我们对大批数据进行学习的过程中。而在线训练就比如说,小绿同学登上某个购物网站,这个网站根据小绿这个人的购物行为对进行用户分析和定向推送,小绿就是本次训练的一个样本。用训练好的模型对他进行分析就是一个在线训练。

Deep Learning|神经网络原理学习笔记(5) :随机梯度下降算法SGD(附手绘图)、离线学习与在线学习