梯度下降
梯度下降法主要用于单个参数的取值。假如损失函数是一座山,我们从山上一个任意点开始往山下走,山坡的坡度越大,我们的垂直高度下降的越快。当我们到达某一个点是,我们往任意方向前进多都会升高使,我们就到达了最低点。准确来说是局部最低点。但是如果损失函数是个凸函数,那么这个局部最优解就是整体最优解。
说到这我们就要提到微分方程了。对损失函数求导,导数就是我们所谓的梯度:
我们的目的是不断更新参数以使得损失函数最小化。
那这里的α是什么?α是我们给参数的变化加上一个权重,也即是学习率。我们以此来控制参数的变化速度。为什么我们要使用学习率呢?
学习率
从上面的公式我们不难发现,我们加入学习率就是希望在参数更新缓慢的时候加快它的更新,在参数跟新跨度太大使减弱它的更新。那么如何选择合适的学习率呢?
如图左所示,如果学习率太小,那么我们每次训练之后得到的效果都太小,这无疑增大了我们的无谓的时间成本。如果如图右所示,学习率太大,那我们有可能直接跳过最优解,进入无限的训练中。所以解决的方法就是,学习率也需要随着训练的进行而变化。
Tensorflow提供了一种灵活的学习率设置—指数衰减法。先从一个较大的学习率开始快速得到一个比较优的解,然后随着迭代的继续逐步减小学习率:
current_learning_rate = \
learning_rate * decay_rate ^ (global_step / decay_steps)
current_learning_rate: 当前使用的学习率
learning_rate: 初始学习率
decay_rate: 衰减系数
decay_steps: 衰减步幅
global_step: 训练总步数
反向传播
反向传播法是神经网络训练中非常重要的算法,可以帮助我们在所有参数上使用梯度下降法,通过反向传播更新参数,从而使损失函数更小。
x和y作为输入经过训练变成输出z传给下一层,我们计算得到误差函数L,并对x和y求导,得出x和y对于误差的影响,然后据此更新x和y。在实际应用中我们计算参数对于误差的影响,然后反向更新参数。
滑动模型
我们有时候也会使用滑动模型来使模型更稳健,原因是有时数据会有些奇异点,在连续的数据中特别突兀。有可能是误差也有可能是真是数据,这时我们会使用以当前点为中心的一段数据的平均值来代替该点的值。有时使用简单的平均滑动模型,有时会加上权重,这都跟我们要研究的具体问题相关。
tf.train.ExponentialMovingAverage(decay_rate,step)
# Tensorflow提供的平均滑动模型,decay_rate为衰减率, step为窗口大小