梯度下降算法gradient decent主要用于优化单个参数的取值,而反向传播算法给出了一个高效的方式在所有参数上使用梯度下降算法,从而使神经网络模型在训练数据上的损失函数尽可能小。
梯度下降算法会迭代式更新参数θ,不断沿着梯度的反方向让参数朝着总损失更小的方向更新,参数的梯度可以通过求偏导的方式计算。
学习率learning rate 定义每次参数更新的幅度。
神经网络的优化过程可以分为两个阶段
- 先通过前向传播算法计算得到预测值,并将预测值和真实值做对比得出两者之间的差距。
- 通过反向传播算法计算损失函数对每一个参数的梯度,再根据梯度和学习率使用梯度下降算法更新每一个参数。
梯度下降算法的两个问题
-
不能保证被优化的函数达到全局最优解
只有当损失函数是凸函数时,梯度下降算法才能保证达到全局最优解。
-
计算时间太长
要在全部训练数据上最小化损失,损失函数是在所有训练数据上的损失和。
为了加速训练过程,可以使用随机梯度下降算法,即在每一轮迭代中,随机优化某一条训练数据上的损失函数。但由于在某一条数据上损失函数更小并不代表在全部数据上损失函数更小会导致甚至无法达到局部最优。
为了综合梯度下降算法和随机梯度下降算法的优缺点,一般采用这两种算法的折中——每次计算一小部分训练数据的损失函数。
batch_size = n
# 每次读取一小部分数作为当前的训练数据来执行反向传播算法。
x = tf.placeholder(tf.float32, shape=(batch_size, 2), name='x-input')
y_ = tf.placeholder(tf.float32, shape=(batch_size, 1), name='y-input')
# 定义神经网络结构和优化算法。
loss = ...
train_step = tf.train.AdamOptimizer(0.001).minimize(loss)
# 训练神经网络。
with tf.Session as sess:
# 参数初始化。
...
# 迭代的更新参数。
for i in range(STEPS):
# 准备batch_size个训练数据。一般将所有训练数据随机打乱之后再选取可以得到更好的优化效果。
current_X, current_Y = ...
sess.run(train_step, feed_dict={x: current_X, y_: current_Y})
(最近更新:2019年04月13日)