Gradient Descent
Learning Rate
关于lr的问题
-
lr太小
模型收敛的很慢,时间开销大
-
lr太大
每次更新参数步子迈的很大,容易越过最优解
我们追求的是红色的情况
动态调整lr
基本原则:先大再小
在训练开始时,此时我们距离最优解还较远,lr可以设置稍大些,以较快的速度接近最优解。在训练的后期,此时我们已经很接近最优解了,lr要设置的小一些,慢慢地逼近最优解,否则会越过最优解。
具体实现如下,第t次更新时,lr设置如下
这样随着训练的进行,lr逐渐减小
不同参数给不同的lr
每一个参数都设置不同的learning rate,Adagrad优化器
与传统的lr相比,Adagrad的lr除以root mean square,这样可以使得所有参数的lr都是不同的
具体实现如下
实际上Adagrad综合考虑了动态调整lr和给不同参数不同lr,数学表达如下
Stochastic Gradient Descent
stochastic gradient descent 随机梯度下降
-
Gradient Descent
计算Loss需要计算所有的样本,然后才更新一次参数
-
SGD
计算Loss只需计算1个样本,然后更新一次参数,收敛速度较快
Feature Scaling
使得特征向量中不同的分量(也就是样本不同的特征)具有相同(近似)的分布,换句话说使得不同的特征的取值范围近似(考虑Batch-Normalization)
举个栗子,注意2个特征x1,x2的取值范围
直观理解就是,不做feature scaling(左/蓝),梯度下降时,绕了一圈,没有直接向最优解方向前进;做feature scaling(右/绿),梯度下降时,方向直指最优解
具体做法,对相同维度的所有样本的特征分量做标准化(归一化)
Backpropagation
反向传播算法,是在梯度下降算法中高效计算梯度的方法
要计算损失函数对某个参数的梯度,分为forward pass和backward pass两个步骤
foward pass
对于神经网络中的每一个神经元,按照如下方式计算出\(\partial z / \partial w\),此即forward pass
举例如下
backward pass
forward pass已经计算出了神经网络中所有神经元的\(\partial z / \partial w\),而我们的目标是\(\partial C / \partial w\),所以接下来backward pass的目标就是计算\(\partial C / \partial z\),二者相乘即得所求梯度(求偏导链式法则)
\(\partial C / \partial z\)可以写成如下形式
\(\partial C / \partial z^\prime\)和\(\partial C / \partial z^{\prime\prime}\)两项如何计算,考虑两种情况
-
case 1:output layer
\(\partial C / \partial y_1\)和\(\partial C / \partial y_2\)取决于损失函数如何定义,\(\partial y_1 / \partial z^\prime\)和\(\partial y_2 / \partial z^{\prime\prime}\)取决于输出层的激活函数
至此为止,完成了\(\partial C / \partial w\)的计算
-
case 2:Not output layer
与最开始分析backward pass时的问题类似,我们要求\(\partial C / \partial z^\prime\)就要先求\(\partial C / \partial z_a\)和\(\partial C / \partial z_b\),\(\partial C / \partial z^{\prime\prime}\)同理
那么问题来了,如何计算\(\partial C / \partial z_a\)和\(\partial C / \partial z_b\),开始套娃了,又可以分case1和case2,直到output layer,计算完毕
如果我们把解决求\(\partial C / \partial z\)这个问题的方向倒过来就可以高效地(一直从后往前计算)计算出结果。如果不倒过来看的话,每计算一个\(\partial C / \partial z\)都要向后看直到output layer。反向传播,其实相当于倒着看的正向传播
总结
参考:李宏毅老师课程 https://youtu.be/yiY4nPOzJEg