这里我们用去做代替
0. 标准的梯度下降(GD)
就是每一次的权值更新都需要将全部的训练集输入到网络,然后求全部的误差,然后再取平均得到最终的loss(样本的总数是M)然后就执行BP了,收敛方向肯定标准啦,但是速度非常慢
cost fuction若为凸函数,能够保证收敛到全局最优值;若为非凸函数,能够收敛到局部最优值
1. 随机梯度下降(SGD)
本质还是梯度下降,更新权值的时候我们只有单个样本的误差去作为做更新,所以只要这个样本是一个噪声/离群值,就会对当前这次权重和偏置的更新造成比较严重的影响。但是因为只选择了一个样本去做更新,虽然收敛方向有点不统一,但是收敛速度还是很快的。
2. 批处理梯度下降(BGD)
不知道是不是中文名哈
综合了0和1的情况。我们将数据划分为多个batch,就是多个组吧,然后一组一组地送进去,假如一组有m个,更新权值的时候就:
上面说的三种梯度下降,都有一个问题就是学习率不好做选择的问题,太小的学习率会导致收敛缓慢,而学习速度太块会造成较大波动,妨碍收敛。
所以有人就用卡阈值的方法去实现“动态”调整学习率,预先定义一个迭代次数m,每执行完m次训练便减小学习率,或者当cost function的值低于一个阈值时减小学习率。但是我觉得这个方法不太可行,假如换一批数据,当前设定好的阈值就失效了。
3. Momentum
每次迭代计算的梯度含有比较大的噪音. 而Momentum方法可以比较好的缓解这个问题,尤其是在面对小而连续的梯度但是含有很多噪声的时候,可以很好的加速学习.
它模拟的是物体运动时的惯性,即更新的时候在一定程度上保留之前更新的方向,同时利用当前batch的梯度微调最终的更新方向。观察历史梯度(前一次的梯度t−1) ,若当前梯度的方向与历史梯度一致(表明当前样本不太可能为异常点),则会增强这个方向的梯度,若当前梯度与历史梯方向不一致,则梯度会衰减。
第一个公式就是,我保留了上一代的动量值,然后计算当前代的动量值,与当前代的梯度值进行加法操作。其中是动量衰减的因子,
是学习率
4. Nesterov Momentum(Nesterov Accelerated Gradient)
就是在momentum的基础上改进了计算动量的方法
之前的momentum是计算当前点的动量,然后计算当前点的梯度,两个方向做一个累加形成下一个点的梯度方向
具体步骤是这样子的,首先拿上一次的动量值来让他走一步,也就是 下图的蓝色方向,然后和当前的梯度做一下差,下右图的黑色箭头,这么一个操作构成这个位置看做是当前优化的一个”展望”位置,然后再计算当前这个状态应有的动量,再去更新梯度值
5. AdaGrad
Adagrad算法能够在训练中自动的对learning rate进行调整,独立地适应模型的每个参数。
一直较大偏导的参数相应有一个较小的学习率,初始学习率会下降的较快;而一直小偏导的参数则对应一个较大的学习率,初始学习率会下降的较慢:
就是当前第t轮的第i个参数的梯度,然后R就是累积平方梯度:R = R +
,不断重复计算,从而实现一开始,这个学习率的分母比较小,所以学习率比较大
但是!到了后面,分母越来越大,学习率就越小。从理论上很符合理想模型的,但是实战当中,确实分母会变得无敌大,从而导致学习率非常低,使得模型原地不动了
AdaGrad 旨在应用于凸问题时快速收敛。当应用于非凸函数训练神经网络时,学习轨迹可能穿过了很多不同的结构,最终到达一个局部是凸碗的区域。AdaGrad 根据平方梯度的整个历史收缩学习率,可能使得学习率在达到这样的凸结构前就变得太小了。
6. RMSProp
其实就是对AdaGrad的改良,为了解决Adagrad 学习率过早且过度衰减问题的:
其中,不像Ada那样,全部都一块累加到一起,这样会导致分母越来越大,这次改用了改变梯度积累为指数加权的移动平均:
RMSProp建议的初始值: 全局学习率 ϵ = 1 e − 3 ,对应上面的learning_rate参数。 衰减速率 ρ = 0.9
7. Adaptive Moment Estimatio(Adam)
先预先设定好几个默认值:,
,
,
还有一个变量t,从0开始
这个是算法是集合了上面动量(历史梯度的指数衰减方向)以及RMSProp的优点,随意表现效果会非常好,很多训练听说都用到了它。
这个算法的步骤如下:
第一次嘛,先计算当前的梯度
然后就是t+1
再然后就更新梯度的一阶矩,即过往梯度与当前梯度的平均。
然后再计算梯度的二阶矩, 即过往梯度平方与当前梯度平方的平均
然后计算值,接着就是更新
了