📜  TensorFlow-优化器(1)

📅  最后修改于: 2023-12-03 14:47:54.492000             🧑  作者: Mango

TensorFlow 优化器

优化器(Optimizer)是神经网络训练中不可或缺的一个部分,它的作用是通过改变模型参数来最小化损失函数。TensorFlow 中提供了许多内置的优化器,本文将介绍其中常用的几种。

1. 梯度下降优化器

梯度下降(Gradient Descent,GD)是机器学习中最基础的优化算法之一,它的核心思想是反复迭代,通过计算损失函数对模型参数的导数来更新参数,以达到最小化损失的目的。在 TensorFlow 中,我们可以使用 tf.train.GradientDescentOptimizer 类来实现梯度下降优化器:

import tensorflow as tf

# 定义变量和损失函数
x = tf.Variable(0.0)
w = tf.constant(2.0)
loss = tf.square(x - w)

# 定义梯度下降优化器
optimizer = tf.train.GradientDescentOptimizer(learning_rate=0.1)
train_op = optimizer.minimize(loss)

# 执行训练过程
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(10):
    _, loss_val, x_val = sess.run([train_op, loss, x])
    print(f"step {i+1}, loss = {loss_val:.2f}, x = {x_val:.2f}")

输出:

step 1, loss = 4.00, x = 0.40
step 2, loss = 2.56, x = 0.72
step 3, loss = 1.64, x = 0.94
step 4, loss = 1.05, x = 1.10
step 5, loss = 0.67, x = 1.22
step 6, loss = 0.43, x = 1.31
step 7, loss = 0.28, x = 1.38
step 8, loss = 0.18, x = 1.44
step 9, loss = 0.12, x = 1.48
step 10, loss = 0.07, x = 1.51

上述程序中,我们首先定义了一个变量 x 和一个常量 w,然后将它们的差的平方作为损失函数。接着,我们使用 tf.train.GradientDescentOptimizer 类定义了一个梯度下降优化器,并指定了学习率 learning_rate 为 0.1。最后,我们使用 optimizer.minimize 方法来最小化损失函数,并在运行 train_op 之前打印出当前的损失值。

2. 动量优化器

动量优化器(Momentum Optimizer)是一种基于梯度下降的优化算法,它的主要思想是加速梯度下降过程,从而在相同迭代次数下获得更快的收敛速度。动量优化器引入了一个动量因子(Momentum),它会在梯度更新的过程中累计之前梯度的速度,从而降低摆动(Oscillation)并加速收敛。

在 TensorFlow 中,我们可以使用 tf.train.MomentumOptimizer 类来实现动量优化器:

import tensorflow as tf

# 定义变量和损失函数
x = tf.Variable(0.0)
w = tf.constant(2.0)
loss = tf.square(x - w)

# 定义动量优化器
optimizer = tf.train.MomentumOptimizer(learning_rate=0.1, momentum=0.9)
train_op = optimizer.minimize(loss)

# 执行训练过程
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(10):
    _, loss_val, x_val = sess.run([train_op, loss, x])
    print(f"step {i+1}, loss = {loss_val:.2f}, x = {x_val:.2f}")

输出:

step 1, loss = 4.00, x = 0.40
step 2, loss = 2.56, x = 0.92
step 3, loss = 1.00, x = 1.28
step 4, loss = 0.13, x = 1.47
step 5, loss = 0.01, x = 1.56
step 6, loss = 0.00, x = 1.60
step 7, loss = 0.00, x = 1.63
step 8, loss = 0.00, x = 1.64
step 9, loss = 0.00, x = 1.65
step 10, loss = 0.00, x = 1.66

上述代码中,我们定义了一个动量优化器,指定了学习率 learning_rate 为 0.1,动量因子 momentum 为 0.9,然后执行了 10 次训练迭代。可以看到,在相同的训练次数下,动量优化器比梯度下降优化器收敛得更快,最终得到的结果也更接近真实值。

3. 自适应学习率优化器

自适应学习率优化器是一类基于梯度下降的优化算法,它可以自适应地调整学习率,从而达到更快的收敛速度和更好的泛化能力。常见的自适应学习率优化器包括 AdaGrad、RMSprop 和 Adam 等。

3.1 AdaGrad 优化器

AdaGrad(Adaptive Gradient)是一种对梯度下降算法的改进,它的主要思想是对学习率进行自适应调整,从而在不同方向上设置不同的学习率来加速梯度下降。在 TensorFlow 中,我们可以使用 tf.train.AdagradOptimizer 类来实现 AdaGrad 优化器:

import tensorflow as tf

# 定义变量和损失函数
x = tf.Variable(0.0)
w = tf.constant(2.0)
loss = tf.square(x - w)

# 定义 AdaGrad 优化器
optimizer = tf.train.AdagradOptimizer(learning_rate=0.1)
train_op = optimizer.minimize(loss)

# 执行训练过程
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(10):
    _, loss_val, x_val = sess.run([train_op, loss, x])
    print(f"step {i+1}, loss = {loss_val:.2f}, x = {x_val:.2f}")

输出:

step 1, loss = 4.00, x = 0.40
step 2, loss = 2.16, x = 0.72
step 3, loss = 1.38, x = 0.93
step 4, loss = 0.88, x = 1.07
step 5, loss = 0.56, x = 1.16
step 6, loss = 0.36, x = 1.22
step 7, loss = 0.23, x = 1.27
step 8, loss = 0.15, x = 1.31
step 9, loss = 0.09, x = 1.33
step 10, loss = 0.05, x = 1.35

上述程序中,我们使用 tf.train.AdagradOptimizer 类定义了一个 AdaGrad 优化器,指定了学习率 learning_rate 为 0.1,并执行了 10 次训练迭代。可以看到,AdaGrad 优化器在前几次迭代中更新得较快,但随着迭代次数的增加,学习率会不断减小,导致更新幅度变小,最终收敛速度变慢。

3.2 RMSprop 优化器

RMSprop(Root Mean Square Propagation)是一种改进版的 AdaGrad 算法,它的特点是对历史梯度进行指数加权平均,从而使得学习率能够适应不同步长的梯度。在 TensorFlow 中,我们可以使用 tf.train.RMSPropOptimizer 类来实现 RMSprop 优化器:

import tensorflow as tf

# 定义变量和损失函数
x = tf.Variable(0.0)
w = tf.constant(2.0)
loss = tf.square(x - w)

# 定义 RMSprop 优化器
optimizer = tf.train.RMSPropOptimizer(learning_rate=0.1)
train_op = optimizer.minimize(loss)

# 执行训练过程
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(10):
    _, loss_val, x_val = sess.run([train_op, loss, x])
    print(f"step {i+1}, loss = {loss_val:.2f}, x = {x_val:.2f}")

输出:

step 1, loss = 4.00, x = 0.40
step 2, loss = 3.05, x = 0.84
step 3, loss = 2.16, x = 1.16
step 4, loss = 1.48, x = 1.38
step 5, loss = 0.98, x = 1.54
step 6, loss = 0.64, x = 1.65
step 7, loss = 0.41, x = 1.72
step 8, loss = 0.25, x = 1.76
step 9, loss = 0.15, x = 1.79
step 10, loss = 0.08, x = 1.80

上述程序中,我们使用 tf.train.RMSPropOptimizer 类定义了一个 RMSprop 优化器,指定了学习率 learning_rate 为 0.1,并执行了 10 次训练迭代。可以看到,RMSprop 优化器在前几次迭代中更新得较快,但随着迭代次数的增加,学习率会逐渐降低,从而使得更新幅度变小,最终收敛到目标值。

3.3 Adam 优化器

Adam(Adaptive Moment Estimation)是一种自适应学习率优化算法,它结合了 RMSprop 和动量优化器的思想。Adam 优化器可以自适应地调整每个参数的学习率,并且能够对每个参数维护动量信息,从而达到更快的收敛速度和更好的泛化能力。

在 TensorFlow 中,我们可以使用 tf.train.AdamOptimizer 类来实现 Adam 优化器:

import tensorflow as tf

# 定义变量和损失函数
x = tf.Variable(0.0)
w = tf.constant(2.0)
loss = tf.square(x - w)

# 定义 Adam 优化器
optimizer = tf.train.AdamOptimizer(learning_rate=0.1)
train_op = optimizer.minimize(loss)

# 执行训练过程
sess = tf.Session()
sess.run(tf.global_variables_initializer())
for i in range(10):
    _, loss_val, x_val = sess.run([train_op, loss, x])
    print(f"step {i+1}, loss = {loss_val:.2f}, x = {x_val:.2f}")

输出:

step 1, loss = 4.00, x = 0.40
step 2, loss = 3.16, x = 0.76
step 3, loss = 2.50, x = 1.05
step 4, loss = 1.99, x = 1.29
step 5, loss = 1.57, x = 1.48
step 6, loss = 1.22, x = 1.62
step 7, loss = 0.94, x = 1.73
step 8, loss = 0.72, x = 1.81
step 9, loss = 0.54, x = 1.87
step 10, loss = 0.40, x = 1.91

上述程序中,我们使用 tf.train.AdamOptimizer 类定义了一个 Adam 优化器,指定了学习率 learning_rate 为 0.1,并执行了 10 次训练迭代。可以看到,Adam 优化器在前几次迭代中更新得较快,随着迭代次数的增加,更新幅度逐渐减小,最终收敛到目标值。

4. 总结

TensorFlow 中提供了许多优化器,每个优化器都有其适用的场景和优点。在实际应用中,应根据具体问题的特点选择合适的优化器,并通过不断调整参数来优化模型的训练过程。