文章目录
学习一个模型:
前向计算部分
损失函数:
mean square error:MSE
cross enporty
反向传播部分
模型参数初始化
BGD/SGD/mini-batch GD
Batch gradient descent:BGD批梯度下降法
链接: 批梯度下降法(Batch Gradient Descent ),小批梯度下降 (Mini-Batch GD),随机梯度下降 (Stochastic GD)
优点:全局最优解;易于并行实现;
缺点:当样本数目很多时,训练过程会很慢。
从迭代的次数上来看,BGD迭代的次数相对较少。其迭代的收敛曲线示意图可以表示如下:
随机梯度下降法
SGD
权重参数记为W,把损失函数关于W的梯度记为∂L/∂W 。η 表示学习率,实际上会取 0.01 或 0.001 这些事先决定好的值。式子中的←表示用右边的值更新左边的值。
在都是凸函数的情况下:
相对于Batch方式,SGD的更新方式,波动大
可能使得梯度下降到更好的两一个局部最优解
但另一方面来讲,SGD的更新可能导致梯度一直在局部最优解附近波动
训练时不断的缓慢减小学习率,SGD能和Batch方法一样,在凸损失函数曲面取得全局最优解,对于非凸曲面能取得局部最优解
Mini-batch GD
1.相对于SGD来说可以减小参数更新的波动
2.能够利用矩阵操作,来提高参数的更新效率
一般minibatch的值在50~256之间选择,不同的应用选择不同,这个也是一个超参数
速度比BGD快,比SGD慢;精度比BGD低,比SGD高。
执行min-batch gradient descent之前,需要对数据集进行两步操作
1)Shuffle,即打乱数据集的顺序,以此保证数据集随机地分配到mini-batches中。
2)Partition,即把数据集分成多个大小相等batches,由于数据集大小可能不被batch size整除,所以最后一个batch的大小可能小于batch size。
总结:
1.Larning rate,大小比较难确定,需要反复试
2.minibatch算法中,并没有完全解决SGD中的问题,更新方向仍然前后有抵消,有浪费算力的情况
3.每个参数对应的学习率是一样的
4.对梯度爆炸和梯度弥散毫无抵抗力
5.Learning rate 衰减规则不好确定,只能通过感觉来试
BGD:相对噪声低些,幅度也大一些,你可以继续找最小值。
SGD:大部分时候你向着全局最小值靠近,有时候你会远离最小值,因为那个样本恰好给你指的方向不对,因此SGD是有很多噪声的,平均来看,它最终会靠近最小值,不过有时候也会方向错误,因为SGD永远不会收敛,而是会一直在最小值附近波动。一次性只处理了一个训练样本,这样效率过于低下。
mini-batch:实践中最好选择不大不小的 mini-batch,得到了大量向量化,效率高,收敛快。
调节 Batch_Size 对训练效果影响到底如何?
Batch_Size 太小,模型表现效果极其糟糕(error飙升)。
随着 Batch_Size 增大,处理相同数据量的速度越快。
随着 Batch_Size 增大,达到相同精度所需要的 epoch 数量越来越多。
由于上述两种因素的矛盾, Batch_Size 增大到某个时候,达到时间上的最优。
由于最终收敛精度会陷入不同的局部极值,因此 Batch_Size 增大到某些时候,达到最终收敛精度上的最优。
如果训练集较小(小于 2000 个样本),直接使用BGD法,一般的 mini-batch 大小为 64 到 512,考虑到电脑内存设置和使用的方式,如果 mini-batch 大小是 [公式] ,代码会运行地快一些。
链接: 吴恩达深度学习笔记(五) —— 优化算法:Mini-Batch GD、Momentum、RMSprop、Adam、学习率衰减
momentum/NAG
解决SGD/minBGD中参数更新的震荡问题:
由于min-batch GD在一次迭代求梯度时,只是用了部分数据集,这就不可避免地导致了梯度出现了偏差(因为掌握的信息不足以作出最明智的选择),由此使得在梯度下降的过程中出现了轻微震荡,如下图在纵向出现了震荡,而momentum可以很好地解决这个问题。
momentum的核心思想就是指数加权平均,最通俗的解释就是:在求当前的梯度时,把前面一部分的梯度也考虑进来,然后通过权值计算求和,最终确定当前的梯度。与普通gradient descent的每次求梯度都是相互独立的不同,momentum对于当前的梯度加入了“经验”的元素,且如果某一轴出现了震荡,那么“正反经验”相互抵消,慢慢地梯度方向也趋于平滑,最终达到消除震荡的效果。
这里引入了v变量,即velocity速度的缩写。那么这个变量与速度又有什么关联?这里或许可以用物理的思想去考虑:dW就是加速度、vdW就是速度。由第一条式子可知,vdW的当前值受到原始速度vdW和加速度dW的加权影响,这样vdW就综合了两者的因素。然后在看第二个式子:W减去学习率乘以vdW,而vdW就是“过往经验”和“当前情况”的综合考虑。
NAG
即使当前的梯度为0,由于动量的存在,更新梯度依然会存在并继续更新w
与Momentum唯一区别就是,计算梯度的不同,
Nesterov先用当前的速度v更新一遍参数,再用更新的临时参数计算loss,然后计算梯度。
相当于添加了矫正因子的Momentum
更新参数2次,一次为了反向传播,一次为了前向计算
Ada-grad/RMS-Prop/Ada-delta
AdaGrad(Adaptive Gradient)
神经网络中的超参数主要有以下几种:
1.学习率(Learning Rate)
2.初始权重(Weight Initialization)
3.网络层数(Layers)
4.神经元数量(Units)
5.正则化参数(Regularizer|Normalization)
SGD-M, NAG等算法,并没有针对上述超参数进行优化。而2010年Duchi et.al 则推出AdaGrad,自适应来调整学习率。
原文链接: 深度学习优化算法大全系列4:AdaGrad(Adaptive Gradient)
对不同参数使用不同学习率-Adaptice grad Adagrad
自适应的调整每个参数的梯度
缺点:随着训练次数的增加,h越来越大,训练的步长越来越小,可能最后模型还没收敛,参数确就不怎么更新了
RMSProp
adagrad升级;RMSProp:root mean square propagation
解决学习步长无限变小问题
依据误差符号改变学习量的大小:
当最后两次梯度符号一样,增大学习量
当最后两次梯度符号不同,减少学习量
Adagrad/RMSProp:adadelta 参数的变化量也自适应了:不用设置学习率了
这里仍然有个学习率需要设置:
学习步长/梯度=学习率
自适应的方法来估计学习率
Adam
Adam则是moment和RMSprop的综合(且加入了修正),即能避免震荡,又能自动调速。其数学表达是:
Adaptive Moment Estimation:AdaM
m用来稳定梯度:来自momentum
v使梯度自适应化:来自RMSProp