神经网络优化算法

反向传播算法(backpropagation)和梯度下降算法(gradient decent)调整神经网络中参数的取值。梯度下贱算法主要用于优化单个参数的取值,而反向传播算法给出了一个高效的方式在所有参数上使用梯度下降算法,从而使神经网络模型在训练数据上的损失函数尽可能的小。反向传播算法是训练神经网络的核心算法,它可以根据定义好的损失函数优化神经网络中的参数的取值,从而使神经网络模型在训练数据集上的损失函数达到一个较小值。神经网络模型中参数的优化过程直接决定了模型的质量,是神经网络非常重要的一步。

假设用θ表示神经网络中的参数,J(θ)表示在给定的参数取值下,训练数据集上损失函数的大小,那么整个优化过程可以抽象为寻找一个θ,使得J(θ)最小。因为目前没有一个通用的方法可以对任意损失函数直接求解的最佳参数取值,所以实践中梯度下降算法是最常用的神经网络优化方法。梯度下降算法会迭代更新参数θ,不断沿着梯度的反方向让参数朝着总损失更小的方向更新。
神经网络优化算法_第1张图片

x轴表示参数θ的取值,y轴表示损失函数J(θ)的值,在参数θ不同时,J(θ)不同。假设当前的参数和损失值对应图中位置小圆点位置,那么梯度下降算法会将参数向x轴左侧移动,从而使得小圆点朝着箭头的方向移动。参数的梯度可以通过求偏导的方式计算,对于参数θ,其梯度为∂J(θ)/∂θ。有了梯度,还要定义一个学习率η(learning rate)定义每次更新的幅度。从直观上理解,可以认为学习率定义的就是每次参数移动的幅度。通过参数的梯度和学习率,参数的新公式为:
这里写图片描述
假设要通过梯度下降算法来优化参数x,使得损失函数J(x)=x^2的值尽可能的小。梯度下降算法的第一步需要随机产生一个参数x的初始值,然后通过梯度和学习率来更新x的取值。在这个例子中,参数x的梯度为∂J(x)/∂x=2x,那么使用梯度下降算法每次对参数x的更新公式为。x(n+1)=x(n)-η(学习率)*梯度。
神经网络优化算法_第2张图片
经过五次迭代后,参数x的值变成了0.0512,这个和参数最优值0已经比较接近了。通过这个样例,可以类推神经网络的优化。
神经网络的优化过程可以分为两个阶段,第一个阶段先通过前向传播算法计算得到预测值,并将预测值和真实值对比得到两者之间的差距。然后在第二个阶段通过反向传播算法计算损失函数对每一个参数的梯度,再根据梯度和学习率使用梯度下降算法更新每一个参数。
注意的是梯度下降算法不能保证被优化的函数达到全局最优解。
神经网络优化算法_第3张图片
当x在小黑点处时,损失函数的偏导为0,于是参数不会再进一步更新。,由图可知初始值是影响最优解的重要因素,收到初始值影响可能只能得到局部最优解而不是全局最优解。
只有当损失函数为凸函数时,梯度下降算法才能保证达到全局最优解。
梯度下降算法另一个问题就是计算时间太长。因为要在全部训练数据上最小化损失,所以损失函数J(θ)是在所有训练数据上的损失和。这样在没一轮迭代中都需要计算在全部训练数据上的损失函数。在海量训练数据下,要计算所有训练数据的损失函数是非常耗时间的。为了加速训练过程,可以使用随机梯度下降的算法(stochastic gradient descent).这个算法优化的不是在全部训练数据上的损失函数而是在每一轮迭代中,随机优化某一条训练数据上的损失函数 。这样每一轮参数更新的速度就大大加快了。因为随机梯度下降算法每次优化的只是某一条数据上的损失函数,所以它的问题非常明显:在某一条上的损失函数更新并不代表全部数据上损失函数更小,于是使用随机梯度下降优化的神经网络甚至可能无法达到局部最优解。
为了综合梯度下降和随机梯度下降算法的优缺点,在实际应用中一般采用这两个算法的折中,每次计算小部分训练数据的损失函数,这一小部分数据被称之为一个batch.通过矩阵计算,每次在一个batch上优化神经网络的参数并不会比但个数据慢太多。另一方面,每次使用一个batch可以大大减小收敛所需要的迭代次数,同时可以使收敛结果更加接近梯度下降的结果。
神经网络优化算法_第4张图片
神经网络优化算法_第5张图片

你可能感兴趣的:(Tensorflow,神经网络)