TensorFlow实战系列5--梯度下降算法

 本文将介绍优化训练神经网络模型的一些常用方法,并给出使用TensorFlow 实现深度学习的最佳实践样例代码。为了更好的介绍优化神经网络训练过程,我们将首先介绍优化神经网络的算法——梯度下降算法。然后在后面的部分中,我们将围绕该算法中的一些元素来优化模型训练过程。

梯度下降算法
 梯度下降算法主要用于优化单个参数的取值,而反向传播算法给出了一个高效的方式在所有参数上使用梯度下降算法,从而使神经网络模型在训练数据上的损失函数尽可能小。反向传播算法是训练神经网络的核心算法,它可以根据定义好的损失函数优化神经网络中参数的取值,从而使神经网络模型在训练数据集上的损失函数达到一个较小值。神经网络模型中参数的优化过程直接决定了模型的质量,是使用神经网络时非常重要的一步。假设用Θ 表示神经网络中的参数,J(Θ) 表示在给定的参数取值下,训练数据上损失函数的大小,那么整个优化过程可以抽象为寻找一个参数Θ,使得J(Θ) 最小。因为目前没有一个通用的方法可以对任意损失函数直接求解最佳的参数取值,所以在实践中,梯度下降算法是最常用的神经网络优化方法。梯度下降算法会迭代式更新参数Θ,不断沿着梯度的反方向让参数朝着总损失更小的方向更新。图1 展示了梯度下降算法的原理。


     图1 梯度下降算法思想示意图

 图1 中x 轴表示参数Θ 的取值,y 轴表示损失函数J(Θ) 的值。图1 的曲线表示了在参数Θ 取不同值时,对应损失函数J(Θ) 的大小。假设当前的参数和损失值对应图1 中小圆点的位置,那么梯度下降算法会将参数向x轴左侧移动,从而使得小圆点朝着箭头的方向移动。参数的梯度可以通过求偏导的方式计算,对于参数Θ,其梯度为∂/∂Θ J(Θ)。有了梯度,还需要定义一个学习率η(learning rate)来定义每次参数更新的幅度。从直观上理解,可以认为学习率定义的就是每次参数移动的幅度。通过参数的梯度和学习率,参数更新的公式见下页。下面给出了一个具体的例子来说明梯度下降算法是如何工作的。


假设要通过梯度下降算法来优化参数x,使得损失函数J(x)=x2 的值尽量小。梯度下降算法的第一步需要随机产生一个参数x 的初始值,然后再通过梯度和学习率来更新参数x 的取值。在这个样例中,参数x 的梯度为=( ∂ J(x))/ ∂ x=2x,那么使用梯度下降算法每次对参数x 的更新公式为x_(n+1)=x_n-η_n。假设参数的初始值为5,学习率为0.3,那么这个优化过程可以总结为表1。


 从表1 中可以看出,经过5 次迭代之后,参数x 的值变成了0.0512,这个和参数最优值0 已经比较接近了。虽然这里给出的是一个非常简单的样例,但是神经网络的优化过程也是可以类推的。神经网络的优化过程可以分为两个阶段,第一个阶段先通过前向传播算法计算得到预测值,并将预测值和真实值做对比得出两者之间的差距。然后在第二个阶段通过反向传播算法计算损失函数对每一个参数的梯度,再根据梯度和学习率使用梯度下降算法更新每一个参数。本书将略去反向传播算法具体的实现方法和
数学证明,有兴趣的读者可以参考论文Learning representations by backpropagating errors。

 因为梯度下降算法要在全部训练数据上最小化损失,所以损失函数J(Θ) 是在所有训练数据上的损失和。这样在每一轮迭代中都需要计算在全部训练数据上的损失函数。在海量训练数据下,要计算所有训练数据的损失函数是非常消耗时间的。为了加速训练过程,可以使用随机梯度下降的算法(stochastic gradient descent)。这个算法优化的不是在全部训练数据上的损失函数,而是在每一轮迭代中,随机优化某一条训练数据上的损失函数。这样每一轮参数更新的速度就大大加快了。因为随机梯度下降算法每次优化的只是某一条数据上的损失函数,所以它的问题也非常明显:在某一条数据上损失函数更小并不代表在全部数据上损失函数更小,于是使用随机梯度下降优化得到的神经网络甚至可能无法达到局部最优。为了综合梯度下降算法和随机梯度下降算法的优缺点,在实际应用中一般采用这两个算法的折中——每次计算一小部分训练数据的损失函数。这一小部分数据被称之为一个batch。通过矩阵运算,每次在一个batch上优化神经网络的参数并不会比单个数据慢太多。另一方面,每次使用一个batch 可以大大减小收敛所需要的迭代次数,同时可以使收敛到的结果更加接近梯度下降的效果。









猜你喜欢

转载自blog.csdn.net/tian_qing_lei/article/details/79265441