1 梯度下降
梯度下降法主要用于单个参数的取值。假如损失函数是一座山,我们从山上一个任意点开始往山下走,山坡的坡度越大,我们的垂直高度下降的越快。当我们到达某一个点是,我们往任意方向前进多都会升高使,我们就到达了最低点。准确来说是局部最低点。但是如果损失函数是个凸函数,那么这个局部最优解就是整体最优解。
梯度下降
说到这我们就要提到微分方程了。对损失函数求导,导数就是我们所谓的梯度:
此处的是数据集的数目。符号代表对所有训练数据集中的特征和标签进行处理并求和,这是已经推导出来的求梯度的具体步骤。如果不熟悉导数(也就是对损失函数的微分)的演算也没有什么影响。因为梯度的计算过程都已经封装在各种机器学习框架中,并不用我们自己写代码实现。我们的目的是不断更新参数以使得损失函数最小化。
那这里的α是什么?α是我们给参数的变化加上一个权重,也即是学习率。我们以此来控制参数的变化速度。为什么我们要使用学习率呢?
2 学习率
从上面的公式我们不难发现,我们加入学习率就是希望在参数更新缓慢的时候加快它的更新,在参数跟新跨度太大使减弱它的更新。那么如何选择合适的学习率呢?
小学习率和大学习率的影响
如图左所示,如果学习率太小,那么我们每次训练之后得到的效果都太小,这无疑增大了我们的无谓的时间成本。如果如图右所示,学习率太大,那我们有可能直接跳过最优解,进入无限的训练中。所以解决的方法就是,学习率也需要随着训练的进行而变化。
Tensorflow提供了一种灵活的学习率设置—指数衰减法。先从一个较大的学习率开始快速得到一个比较优的解,然后随着迭代的继续逐步减小学习率:
current_learning_rate = \ learning_rate * decay_rate ^ (global_step / decay_steps)
current_learning_rate: 当前使用的学习率
learning_rate: 初始学习率
decay_rate: 衰减系数
decay_steps: 衰减步幅
global_step: 训练总步数
3 反向传播
反向传播法是神经网络训练中非常重要的算法,可以帮助我们在所有参数上使用梯度下降法,通过反向传播更新参数,从而使损失函数更小。
前向传播与反向传播
x和y作为输入经过训练变成输出z传给下一层,我们计算得到误差函数L,并对x和y求导,得出x和y对于误差的影响,然后据此更新x和y。在实际应用中我们计算参数对于误差的影响,然后反向更新参数。