🚀 机器学习系列前期回顾
1、初识机器学习
2、线性模型到神经网络
3、local minima`的问题如何解决🚀在初识机器学习中,了解了机器学习是如何工作的并引入了线性模型,在线性模型到神经网络这节,将线性模型进一步改进为弹性较大的神经网络模型并在结尾简要说了一下使用一个
batch
更新一次参数,在local minima
的问题如何解决这节,解决了求解模型未知参数的时候遇见local minima
的解决办法。在这一小结,将继续探索为什么要使用batch
。
1) batch
在前面已经了解过了batch 如何工作,其就是在进行模型未知参数求解的时候,对于构建损失函数来说,之前是使用所有的已知的数据(训练数据)来构建损失函数,而引入batch
后,将已知的所有数据分成等大小的batch
,使用一个batch
的数据来构建损失函数,进行更新参数,然后依次使用下一个batch
构建新的损失函数,进行更新参数,直到使用完最后一个batch
,即看完所有的已知数据,即进行了一个epoch
。 在进行完一个epoch
后,会将数据进行一个shuffle
(洗牌的操作),再次分成batch
进行训练,更新参数。
2)batch
的大小如何设置
对于batch
的大小如何设置,这也是一个超参数,需要自己人工设置,那到底应该设置多大,先来看一个极端的例子
example
:
假设有20个训练数据,若极端的将batch
的大小就设置为20,即full batch
;另外一个极端将batch
的大小设置为1。
- 对于
full batch
来说,其是使用full batch
来构建损失函数,即用20个已知数据来构建损失函数,其更新一次参数要看过所有的20个资料,并且看完20个资料只更新一次。 - 对于
batch
的大小为1,即只使用一个数据来构建损失函数,其每次更新数据只看其中一个数据,当看完20个资料更新20次。
这样对比来看,使用full batch
的话,计算量较大,好像更新较慢,batch
的大小为1的话,计算量较小,且更新的速度较快,所以看起来好像batch
的大小越小越好
其实大的batch
不需要更长的时间
这是因为其实GPU有平行运算(parallel computing)的能力;在下图中,对于手写体识别的实验来说,若batch
的大小是1或者10或者100,甚至1000的话,他们运行所需要的时间都是相差不大的,所以batch
的大小只要不太大,其计算时间几乎没有区别。
所以得到小的batch
和大的batch
在一次计算时间上没有差异。但是对于一个epoch
的时间呢?
如下图所示,对于一个epoch
来说,如果batch
的大小是1的话,进行一个epoch
需要60000次的更新操作;如果batch
的大小是1000的话,进行一个epoch
需要60次的更新操作。在计算时间相同的情况下,60000次的计算更新操作显然要比60次的更新操作所需要的时间更多。
时间上来说:较大的batch
更节约资源。
batch
的大小对于训练结果的准确度又有什么影响呢?观察下图可知,要是batch
的过大,反而会导致准确度的下降。同样的模型使用不同的batch
训练,其最后的准确度不同,这显然不是model bias
的问题,也并不是overfitting
的问题,因为对于过拟合来说,其表现为训练上表现好,测试上表现不好,所以这是由于使用大的batch
导致的optimization failed
(没有找到最好的解)。
准确度上来说:较小的的batch
可以训练出来更高准确度的模型。
为什么较小的的batch
可以训练出来更高准确度的模型?
full batch
的其损失函数是固定不变的,在更新参数求解的时候更难走到全局最优解。small batch
的损失函数,在不同的batch
中,其损失函数是不一样的,就如上图所示,若在batch1
中得到的损失函数是 L 1 L^1 L1的话,它也许会卡在local minima
的位置,当时进入第二个batch
进行训练的时候,也许在batch2
中得到的损失函数 L 2 L^2 L2就正好跳过了local minima
,所以小一点的batch
更好到达全局最优点。
小的batch
在训练的时候可以得到更低的准确率,现在想办法将使用大的batch
训练(下图中LB(large batch)
那列)也达到和小的一样的准确度,然后让LB和SB进行测试,得到的结果也如下图所示,仍然是SB的表现更好。
所以可以得到,小的batch
不仅在训练的时候表现得更好,而且在测试上也会表现得更好,即使使用大的batch
,想办法让其在训练得时候达到小batch
的训练效果,即使得到了好的训练效果,但是其在测试数据上也不会表现得好。
上图该数据来自论文https://arxiv.org/abs/1609.04836
总结一下小的batch
和大batch
的对比:
3) momentum
这也是一个对抗local minima
和 saddle point
的技术。先来假设一下,在物理世界里,一个小球从高处滚落,要想使得其滚到局部最低点的时候,并不会停下来,而是会继续带有一定的momentum
(动量) 继续向前运动,也许就会有机会走出local minma
。
所以,现在如果可以将这种特性加到之前的梯度下降中的话,就可以进一步很好的克服local minma
的问题,可以更好的走到全局最优点。
在加入这种特性之前,先来回顾一下之前的梯度下降;如下所示,随机初始初始点开始,计算梯度,根据该点的梯度进行下降。
加入momentum
之后,每次进行移动的时候会考虑前一次的移动方向。 每一次更新都是计算当前点的梯度然后再加上前一步的梯度。
具体来看一下momentum
是如何工作的
- 第一个位置,先计算该点的导数,根据导数得出的方向为红色线提供的,蓝色线为初始设定的一个方向。
- 第二个位置,同样先计算该点的导数,很平缓,所以根据导数得到的红色线很小,同时得加上前一步的移动方向继续向前移动
- 来到第三个位置,计算导数为零,即不提供红色方向,但是还得加上前一个点的蓝色方向,所以还得再往前走
- 来到第四个点后,同样的计算其导数,导数提供的红色方向是向左的,前一个点的蓝色方向提供的蓝色方向是向右的,所以二者相加会抵消一部分,若前一个点提供的蓝色方向更多一点的话,那么整体也就会继续再向右移动,有可能就会越过
local minima
。