目录
1.批量梯度下降法BGD(Batch Gradient Descent):
2.随机梯度下降SGD(stochastic gradient descent)
3.小批量梯度下降法MBGD(mini-batch Gradient Descent)
梯度下降算法
在训练和优化智能系统时,梯度下降是一种最重要的技术和基础。梯度下降的功能是:
通过寻找最小值,控制方差,更新模型参数,最终使模型收敛。
根据训练的数据个数不同,分为以下三种形式
1.批量梯度下降法BGD(Batch Gradient Descent):
Batch中文意思是一批,一组;
将计算整个数据集梯度,但只会进行一次更新
#全部样本大小Batch
for epoch in range(examples_size):
#举例 如共10000个样本
for epoch in range(10000):
优点:可以最大化的利用向量化计算的优势,来提升计算速度;是全局最优解
缺点:样本数多时,计算机速度慢,性能差
2.随机梯度下降SGD(stochastic gradient descent)
对每个训练样本进行参数更新,每次执行都进行一次更新,且执行速度更快。
优点:具有比较好的随机性,可以帮助我们跨越”鞍点“”问题
缺点:训练时间过长,收敛性不佳
鞍点
在二维数轴中,要求一条曲线的最值,通常求这条曲线导数为0的点;
但是在三维坐标,高维坐标中,存在一个点在一个方向上是最大值,在另一个方向是最小值,这样的点就是鞍点;形象地认为是马鞍中央的点
3.小批量梯度下降法MBGD(mini-batch Gradient Descent)
以上两种方法的折中,将全部的样本按照合适的大小(batch-size)分成多组(Iterations)
对每个批次中的n个训练样本只执行一次更新
#mini-Batch
for epoch in range(training_epochs):
for i in range(total_batch):
区分Epoch,Batch-Size,Iterations
Epoch:训练周期,所有训练样本的一次前馈和反馈的过程。在实际训练过程中,由于训练样本的个数太大,因此经常将一个Epoch分成多个Batch,每个Batch训练一小部分的数据。
Batch-Size:一次前馈和反馈的训练样本数量
Iterations:迭代次数,即完成一次Epoch所需要的Batch个数,也可理解成内存嵌套的循环次数。每次迭代完成1次网络结构参数的更新
看了很多的文章,都是给了概念,但是不是很清晰,不如给个例子
一共有10000个样本,则完成1次epoch需要将10000个样本数据都运行一遍,如果1个batch的大小是10,那就需要10000/10=1000个iterations,也就是1000个batch,用代码表示就是
#举例:一共10000个样本,batch-size=10,则Iterations=10000/10=1000
for epoch in range(5):#这个5表示将所有的样本训练5次,与batch_size,iterations无关
for i in range(1000):#一共有1000个batch
作者当初不懂的点就在于将epoch的循环次数当成batch_size,以为外层循环次数*内层循环次数需要等于样本个数,其实不是这样的,外层的epoch循环次数与batch_size,batch_numbers,iterations是无关的。
一般epoch的大小就是靠经验先蒙一个,运行看结果,当loss基本不变时,确定大概的epoch个数
梯度下降算法的问题
- 一个方向上变化迅速而在另一个方向上变化缓慢
- 局部最小处及鞍点处梯度为0,算法无法通过
如下图所示,小球的目标是走到底端笑脸处,但是小球在山壁间震荡,往谷底方向行进缓慢
改进的优化算法
动量法
目的:减少震荡,加速通往谷底
改进思想:利用累加历史梯度信息更新梯度
由于动量是矢量,既有方向又有长度,多次的叠加,在震荡方向上的速度就被抵消,几乎为0;而前进方向上的速度被叠加而逐渐加快。
动量法的优势:由于动量的存在,算法可以冲出局部最小点及鞍点,找到最优解
AdaGrad
自适应梯度法的一种
自适应梯度法是通过减小震荡方向步长,增大平坦方向步长来加速通往谷底方向
那如何区分震荡方向与平坦方向呢?
梯度幅度的平方较大的方向是震荡方向;梯度幅度的平方较小的方向是平坦方向。
AdaGrad将来代替学习率控制步长。梯度幅度大,也就是分母大,学习率小;反之梯度幅度小,学习率大。
AdaGrad方法的不足之处在于,随着训练时间的增长,累计梯度r的值变得很大,也就失去了调节的作用,步长会变得很小。
RMSProp
RMSProp也是自适应梯度方法
Adam
Adam初期效果很好,但是最后可能效率升不上去了;要想效果好,最终还是要靠动量法+sgd手动调超参数。(虽然慢,但是效果好)