1.Mini-Batch Gradient descent
Mini-batch每次处理训练数据的一部分,即用其子集进行梯度下降,算法速度会执行的更快。
方法分为两个步骤:
- Shuffle:
洗牌一般同步打乱原来数据集X和对应标签Y中的数据信息,使得数据随机分散到不同的minibatch中
代码中用到了np.random.permutation()方法作为洗牌方法,对于打乱顺序有两种方法。permutation是返回一个新的数组,不对原来数组进行改动,而shuffle不返回值,对原来数组基础上进行打乱顺序操作。
- Partition:
将对应X,Y划分到各个minibatch中,每个minibatch里数据数量相等,除了最后一个可能略少于其他minibatch。
Mini-batch 大小的选择
- 在划分时通常采取2的次方项作为minibatch的大小。
- 如果训练样本的大小比较小时,如 时 ------ 选择batch梯度下降法;
- 如果训练样本的大小比较大时,典型的大小为: ;
- Mini-batch的大小要符合CPU/GPU内存。
当minibatch的size选择为1的时候,称为Stochastic Gradient Descent
几个方法效果比较如下:
图中“+”表示损失函数的最小值点
2.指数加权平均
指数加权平均的关键函数:
实际温度为蓝色点
当=0.5,指数加权平均如黄线所示
当=0.9,指数加权平均如红线所示
当=0.98,指数加权平均如绿线所示
由图可见,值越大(<1),所的曲线更加平滑。解释如下:
例子,当 时:
展开,有:
上式中所有 前面的系数相加起来为1或者接近于1,称之为偏差修正。
总体来说存在, ,在我们的例子中, ,即 。相当于大约10天后,系数的峰值(这里是0.1)下降到原来的 ,只关注了过去10天的天气。
可以认为关注了前的天数,因此越大,曲线越平滑。
如果将前存储起来将占用比较大的存储空间,但是使用指数加权平均就不需要担心这个问题,减少了计算机的资源占用,提升效率。
然而实际运行时曲线的前一小段会偏低,因为初始并没有那么多先前的数据作为储存,导致理想中的绿线运行结果是紫线。
- 原因:
如果第一天的值为如 ,则 (话说这里吴恩达大佬竟然说成了8。。。) ,得到的值要远小于实际值,后面几天的情况也会由于初值引起的影响,均低于实际均值。
解决方法:
在等式右边除以,因为,所以等于等式右边加权平均之和,而随着t的增大逐渐趋于1。这样就解决了前段曲线过低的问题。
3.Momentum
动量梯度下降,思路是:将上一次的梯度考虑进来,以实现更加平滑的梯度更新,至于上一个梯度参与进来的方法就是上文所提到的指数加权平均。
公式如下:
值得注意的是,v初始化为0,所以算法需要一些迭代来建立起速度然后开始更大的步长更新。越大更新将越平滑然而也不能太大,一般选取在0.8~0.999,如果没有什么特殊需求,0.9是默认的选择。可尝试用多个来确定最佳选择。
4. RMSprop
这里定义了,
其中为学习率,为一个很小的值比如来确保分母不为0。图中W作为横轴,b为纵轴,可以看出dW较小而db较大,所以该方法可以加速横轴的更新减少纵轴上的抖动。当然实际应用情况会更高维。
5.adam
adam优化算法是将 Momentum 和 RMSprop 的结合。
方法如下:
6.学习率衰减
在利用 mini-batch 梯度下降法来寻找Cost function的最小值的时候,如果我们设置一个固定的学习速率 ,则算法在到达最小值点附近后,由于不同batch中存在一定的噪声,使得不会精确收敛,而一直会在一个最小值点较大的范围内波动,如下图中蓝色线所示。
如果采取一个随着迭代次数衰减的学习率,就可以在保证运行速度的情况下在最后在最小值附近的小区域里波动。如图中绿线所示。
7.局部最优问题
在高维度的神经网络中,梯度为0的点并不一定是左图的局部最优点,而是右图的鞍点(灵魂画师。。。)
在高维度的神经网络中,损失函数如果定义在高维度上,不太可能陷入较差的局部最优点。对于下图中的平滑区,可用adam等算法进行加速。
最后根据作业中给出的样例,可以看出adam效果最好。
adam需要相对少的系统资源(尽管比梯度下降和带动量的梯度下降多),而且在超参数设置略有人为调整的情况下(除了学习率)仍取得不错结果