优化问题
随着训练时间推移,损失函数的大小开始在某一值处震荡,但是并没有降低到理想程度,原因是梯度为零。
梯度为零的点
梯度为零有两种可能
如图所示,这两点是critical point
- 局部最小点:接下来无路可走
- 鞍点:可以逃离(数学依据,一般比较复杂,不采用数学方法上的检测)
局部最优
事实上, 通常我们选定的参数维度较高,在高维空间中,局部最优的情况是少见的。
如何解决陷入critical的难题?
BATCH
将数据集分批训练,假设有 n n n个数据,每一个batch的大小为batch_size,则共有n//batch_szie+1个batch,称为一个epoch。每进行一次epoch,都要shuffle操作(打乱数据集数据喂入模型的顺序,以获得较好的效果)。
- 全批量梯度下降法full_batch,batch_size = n
- 随梯梯度下降法,batch_size = 1
- 小批量梯度下降法mini_batch,batch_size = 1-n
一次梯度更新和一轮梯度更新时间对比群
大batch和小batch的性能对比
在训练集上,batch_size越小,性能越佳;batch_size越大,性能越差,为什么?
如图所示,如果采用full_batch,当梯度为零时,不太好逃离局部最小,因为是在整个训练集上做的损失函数;而如果采用mini_batch,因为每一次梯度下降由于batch的数据不同,损失函数也略不一样,即使某个batch上的损失函数陷入局部最小,但是在训练其他batch的时候可能逃离局部最小,所以可能达到更好的效果。
在测试集上,同样batch_size越小,性能越佳;batch_size越大,性能越差,为什么?
机器学习的假设是训练集和测试集数据来自同一分布,但是训练损失函数和测试损失函数还会略有不同,如图所示,我们把梯度为零的局部最小点分为两种
- flat minima
- sharp minima
在flat minima附近,训练集的损失函数和测试集的损失函数大体相当,但是在sharp minima附近,却可能截然相反,造成测试误差和训练误差有很大的不同,而采用full_batch训练,更有可能使模型陷入sharp minima。
small batch和large batch比较
如图所示,第二列中为什么训练short_batch和训练large_batch时间接近?
答:并行计算
动量momentum
动量梯度下降是根据现实世界物体运动的惯性而提出的,在梯度下降中,即使下降到局部最小值点出,也可以由于惯性而跳出局部最小值点,从而避开了critical point。
对比一下梯度下降法和动量梯度下降法
- 梯度下降法
初始化参数 θ 0 \theta^0 θ0
计算梯度 g 0 g^0