深度学习记录(4) - 深度学习网络的优化方法

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值

猜你喜欢

转载自blog.csdn.net/u014117943/article/details/114436186
今日推荐