文章目录
0. epoch,batch,和iteration
- Epoch:使用训练集的全部数据进行一次完整的训练,被称为“一代训练”
- Batch:使用训练集中的一小部分对样本权重进行一次反向传播的参数更新,这一小部分样本被称为“一批数据”
- Iteration:使用一个Batch数据对模型进行一次参数更新的过程,称之为“一次训练”
注:上表中,Mini-Batch的Batch个数为 N/B+1,是针对未整除的情况,整除就没有+1。
Number Of Batches就是每个Epoch具有的Iteration的个数。
1. 前向传播、反向传播与链式法则
- 前向传播过程:数据通过输入层,逐层向前传播,一直到输出层为止。
- 反向传播过程:从输出层往回计算,结合损失函数,依次求各个参数的偏导,更新网络参数。
- 链式法则:就是复合函数的求导法则,层层剥开。
2. BP算法(反向传播算法)
通过反向传播算法,可以完成对网络的优化。
要了解反向传播更新参数的整个流程。
3. 优化算法:梯度下降(BGD,SGD,MBGD)
- 目的:寻找使损失函数最小化的方法。
- 数学上来看,梯度方向是函数增长速度最快的方向,那么梯度的反方向就是函数减少最快的方向。
- 学习率如果太小,更新过程会比较长,如果学习率太大,那么可能会跨过最优解。
根据在进行迭代时使用的样本量,将梯度下降算法分为以下三类:
第三种使用较多
# 实例化SGD
opt = keras.optimizers.SGD(learning_rate=0.1)
# 定义要更新的参数
var = tf.Variable(1.0)
# 定义损失函数
loss = lambda:(var**2)/2.0
# 计算损失梯度 并 进行参数更新
opt.minimize(loss, [var]).numpy()
# 参数更新结果
var.numpy()
更新结果为:
# 1 - 0.1 * 1 = 0.9
0.9
4. 优化算法:带动量的梯度下降(Momentum)
梯度下降算法进行训练时,会遇到鞍点、局部最小值等问题,那怎么改进SGD呢?
4.1 带动量的梯度下降
- 是梯度下降算法的优化
- 针对鞍点问题。
指数加权平均
带动量的梯度下降算法
- 计算梯度时,会计算梯度的指数加权平均数,并利用该值来更新参数值。通常β设置为0.9
在tf.keras中使用动量梯度下降算法,只需要设置一下SGD方法中的momentum参数。
代码如下:
# 实例化SGD
opt = keras.optimizers.SGD(learning_rate=0.1, momentum=0.9) # 配置momentum参数
# 定义要更新的参数
var = tf.Variable(1.0)
val0 = var.value()
# 定义损失函数
loss = lambda:(var**2)/2.0
# 第一次更新
opt.minimize(loss, [var]).numpy()
# 第一次更新结果
val1 = var.value()
# 第二次更新
opt.minimize(loss, [var]).numpy()
val2 = var.value()
结果:
val0 - val1, val1 - val2
# 输出
0.1 # 第一次更新步长
0.18 # 第二次更新步长
此外,还有一种动量算法(NAG),在SGD算法中设置nesterov参数为true即可,该方法,在Momentum的基础上进一步加快收敛,提高响应性。
5. 优化算法:Adagrad
- 是梯度下降算法的优化
待完善
6. 优化算法:RMSprop
- 是梯度下降算法的优化
待完善
7. 优化算法:Adam
- 是梯度下降算法的优化
待完善
8. 学习率退火
在训练神经网络时,一般请款修改学习率都会随着训练而变化,主要原因是:在训练的后期,如果学习率过高,会造成loss的震荡(跳过最优解);如果学习率减小的过快,又会造成训练时间长,收敛慢。
8.1 分段常数衰减
分段常数衰减是在事先定义好的训练次数区间上,设置不同的学习率常数,刚开始学习率大一些,之后越来越小,区间的设置需要根据样本量调整,一般样本量越大区间间隔应该越小。
代码:
tf.keras.optimizers.schedules.PiecewiseConstantDecay(boundaries, values)
- boundaries:设置分段更新的步长
- values:针对不用分段的学习率
8.2 指数衰减
tf.keras.optimizers.schedules.ExponentialDecay(initial_learning_rate, decay_steps, decay_rate)
- initial_learning_rate:初始学习率,a0
- decay_steps:k值
- decay_rate:指数的底
8.3 1/t衰减
具体实现代码:
def decayed_learning_rate(step):
return tf.keras.optimizers.schedules.InverseTimeDecay(initial_learning_rate, decay_steps, decay_rate)
- initial_learning_rate:初始学习率,a0
- decay_steps / decay_rate:k值