Learning Rate
关于lr的问题
-
lr太小
模型收敛的很慢,时间开销大
-
lr太大
每次更新参数步子迈的很大,容易越过最优解
![image-20230423100204282](https://gitee.com/dctwan/blog-image/raw/master/image-20230423100204282.png)
我们追求的是红色的情况
动态调整lr
基本原则:先大再小
在训练开始时,此时我们距离最优解还较远,lr可以设置稍大些,以较快的速度接近最优解。在训练的后期,此时我们已经很接近最优解了,lr要设置的小一些,慢慢地逼近最优解,否则会越过最优解。
具体实现如下,第t次更新时,lr设置如下
\[\eta^t = \eta / \sqrt{t+1} \]这样随着训练的进行,lr逐渐减小
不同参数给不同的lr
每一个参数都设置不同的learning rate,Adagrad优化器
![image-20230423100940399](https://gitee.com/dctwan/blog-image/raw/master/image-20230423100940399.png)
与传统的lr相比,Adagrad的lr除以root mean square,这样可以使得所有参数的lr都是不同的
具体实现如下
![image-20230423101221074](https://gitee.com/dctwan/blog-image/raw/master/image-20230423101221074.png)
实际上Adagrad综合考虑了动态调整lr和给不同参数不同lr,数学表达如下
![image-20230423102135003](https://gitee.com/dctwan/blog-image/raw/master/image-20230423102135003.png)
Stochastic Gradient Descent
stochastic gradient descent 随机梯度下降
-
Gradient Descent
计算Loss需要计算所有的样本,然后才更新一次参数
-
SGD
计算Loss只需计算1个样本,然后更新一次参数,收敛速度较快
![image-20230423104047368](https://gitee.com/dctwan/blog-image/raw/master/image-20230423104047368.png)
Feature Scaling
使得特征向量中不同的分量(也就是样本不同的特征)具有相同(近似)的分布,换句话说使得不同的特征的取值范围近似(考虑Batch-Normalization)
举个栗子,注意2个特征x1,x2的取值范围
![image-20230423104855191](https://gitee.com/dctwan/blog-image/raw/master/image-20230423104855191.png)
直观理解就是,不做feature scaling(左/蓝),梯度下降时,绕了一圈,没有直接向最优解方向前进;做feature scaling(右/绿),梯度下降时,方向直指最优解
具体做法,对相同维度的所有样本的特征分量做标准化(归一化)
![image-20230423105355211](https://gitee.com/dctwan/blog-image/raw/master/image-20230423105355211.png)
Backpropagation
反向传播算法,是在梯度下降算法中高效计算梯度的方法
要计算损失函数对某个参数的梯度,分为forward pass和backward pass两个步骤
![image-20230423145730570](https://gitee.com/dctwan/blog-image/raw/master/image-20230423145730570.png)
foward pass
对于神经网络中的每一个神经元,按照如下方式计算出\(\partial z / \partial w\),此即forward pass
![image-20230423145853764](https://gitee.com/dctwan/blog-image/raw/master/image-20230423145853764.png)
举例如下
![image-20230423150232143](https://gitee.com/dctwan/blog-image/raw/master/image-20230423150232143.png)
backward pass
forward pass已经计算出了神经网络中所有神经元的\(\partial z / \partial w\),而我们的目标是\(\partial C / \partial w\),所以接下来backward pass的目标就是计算\(\partial C / \partial z\),二者相乘即得所求梯度(求偏导链式法则)
![image-20230423151121434](https://gitee.com/dctwan/blog-image/raw/master/image-20230423151121434.png)
\(\partial C / \partial z\)可以写成如下形式
![image-20230423151224157](https://gitee.com/dctwan/blog-image/raw/master/image-20230423151224157.png)
\(\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。反向传播,其实相当于倒着看的正向传播
总结
![image-20230423154633684](https://gitee.com/dctwan/blog-image/raw/master/image-20230423154633684.png)
参考:李宏毅老师课程 https://youtu.be/yiY4nPOzJEg
标签:prime,partial,Descent,Gradient,lr,计算,pass,最优 From: https://www.cnblogs.com/dctwan/p/17346764.html