Gradient Descent

发布时间 2023-04-23 15:54:05作者: dctwan

Learning Rate

关于lr的问题

  • lr太小

    模型收敛的很慢,时间开销大

  • lr太大

    每次更新参数步子迈的很大,容易越过最优解

image-20230423100204282

我们追求的是红色的情况

动态调整lr

基本原则:先大再小

在训练开始时,此时我们距离最优解还较远,lr可以设置稍大些,以较快的速度接近最优解。在训练的后期,此时我们已经很接近最优解了,lr要设置的小一些,慢慢地逼近最优解,否则会越过最优解。

具体实现如下,第t次更新时,lr设置如下

\[\eta^t = \eta / \sqrt{t+1} \]

这样随着训练的进行,lr逐渐减小

不同参数给不同的lr

每一个参数都设置不同的learning rate,Adagrad优化器

image-20230423100940399

与传统的lr相比,Adagrad的lr除以root mean square,这样可以使得所有参数的lr都是不同的

具体实现如下

image-20230423101221074

实际上Adagrad综合考虑了动态调整lr给不同参数不同lr,数学表达如下

image-20230423102135003

Stochastic Gradient Descent

stochastic gradient descent 随机梯度下降

  • Gradient Descent

    计算Loss需要计算所有的样本,然后才更新一次参数

  • SGD

    计算Loss只需计算1个样本,然后更新一次参数,收敛速度较快

image-20230423104047368

Feature Scaling

使得特征向量中不同的分量(也就是样本不同的特征)具有相同(近似)的分布,换句话说使得不同的特征的取值范围近似(考虑Batch-Normalization)

举个栗子,注意2个特征x1,x2的取值范围

image-20230423104855191

直观理解就是,不做feature scaling(左/蓝),梯度下降时,绕了一圈,没有直接向最优解方向前进;做feature scaling(右/绿),梯度下降时,方向直指最优解

具体做法,对相同维度的所有样本的特征分量做标准化(归一化)

image-20230423105355211

Backpropagation

反向传播算法,是在梯度下降算法中高效计算梯度的方法

要计算损失函数对某个参数的梯度,分为forward passbackward pass两个步骤

image-20230423145730570

foward pass

对于神经网络中的每一个神经元,按照如下方式计算出\(\partial z / \partial w\),此即forward pass

image-20230423145853764

举例如下

image-20230423150232143

backward pass

forward pass已经计算出了神经网络中所有神经元的\(\partial z / \partial w\),而我们的目标是\(\partial C / \partial w\),所以接下来backward pass的目标就是计算\(\partial C / \partial z\),二者相乘即得所求梯度(求偏导链式法则)

image-20230423151121434

\(\partial C / \partial z\)可以写成如下形式

image-20230423151224157

\(\partial C / \partial z^\prime\)\(\partial C / \partial z^{\prime\prime}\)两项如何计算,考虑两种情况

  • case 1:output layer

    image-20230423152032101

    \(\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

    image-20230423152521012

    与最开始分析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-20230423154056657

总结

image-20230423154633684

参考:李宏毅老师课程 https://youtu.be/yiY4nPOzJEg