学习参考来源:https://www.bilibili.com/video/BV1oY411N7Xz/?spm_id_from=333.788&vd_source=e3119ad0490e9417e487c2ba62c84750
本blog为学习笔记,若看不明白建议直接看视频。
1.梯度下降算法
-
梯度下降算法(Gradient Descent,GD),深度学习核心之一
(1)损失函数
以一元二次方程为例,如下图。通过让损失函数最小,使得函数更加拟合样本点。
展开,以优化参数b为例,可以看成一个关于b的一元二次方程。
接下来是一步步优化参数,先给b任意取一个值,然后计算该点的梯度dL/db,再乘以学习率,最后更新b参数。一直重复这个过程直到达到最低点,如下图所示:
在一般情况下,函数会是非线性且有很多样本点,如下图所示,参数为θ。
对损失函数中的θ求偏导,如下图,并按上述方法一步步优化参数θ。
-
随机梯度下降算法(Stochastic Gradient Descent, SGD)
由于大多数情况样本点会很多,使用GD的话会导致内存开销问题且收敛速度很慢,因此可是使用少部分的样本点来更新参数,每次通过随机取不同的样本点的方法称为随机梯度下降算法。
-
动量(Momcnt)
为了防止参数优化在山谷之间来回跳动,如下图:
因此引入动量的概念,在计算梯度的时候还要保留一部分历史梯度,使得优化参数更加平缓,如下图:
参数更新的数学公式如下:
-
自适应学习AdaGrad和RMSProp 算法
为了快速找到收敛方向,细致优化防止震荡,需要在开始的时候学习率大,后面学习率小。但是手写调整很难。因此有了自适应学习。
AdaGrad算法:引入一个新的量r,梯度波动很大的时候学习率就会快速下降。
但是r的变化只和梯度有关,可能会让学习率过早的变小而不好控制。因此有了RMSProp算法,在r更新的公式中加入了可以手动调节的rho来控制优化过程。
-
动量&自适应学习Adam
将动量与自适应两者兼顾 。
- 反向传播算法
- 反向传播算法(Back-Propagation, BP),深度学习核心之一
反向传播算法就是神经网络中加速计算参数梯度值的方法。如下图,x经过两次线性变化得到L,产生了4个参数(w1,b1,w2,b2),这就是正向传播。之后从后向前计算梯度的方式就是反向传播。黄色表示上一步已经计算过了,后面计算可以直接拿来用。例如,第一步计算dL/dy2梯度,第二步就可以根据链式法将dL/dw2梯度分为dL/dy2梯度(上一步已经计算得到了)乘以dy2/dw2梯度,同理也求b2的梯度。以此往后推再得到w1和b1的梯度。
- 计算图(Computation Graphs)
计算机中对上面的线性变化表示有所不同,正向传播如下:
反向传播如下,和上述原理相同,最总得到4个参数的梯度,再根据梯度下降的方法去优化参数。
- 代码实现
- 激活函数
这里做只做一个简单的了解,详细理解参考blog:https://zhuanlan.zhihu.com/p/364620596
- 激活函数(Activation Function),为了增加神经元的非线性表达能力
- 饱和函数:sigmoid, tanh,存在梯度消失问题
sigmoid存在梯度消失问题,因为sigmoid函数的导数最大值0.25,如下图,这意味着每层神经网络反向传播更新参数的幅度缩小大约1/4,这将导致网络前面几层将不再更新参数,这就是梯度消失问题。
虽然说tanh在一定程度上缓解了梯度消失问题,但在极端情况下出现的饱和问题同样会导致梯度消失。 - 非饱和函数:修正线性单元(Rectified Linear Unit, ReLU),解决了上述问题,但存在神经元熄灭问题。
- ReLU → Leaky ReLU, Parametric ReLU,…。可以很好的解决上述问题。
- 虽然sigmod、tanh和ReLU存在一些缺陷,但是不在不同的问题或模型中,这些函数还会被使用。
- 参数初始化
- 参数初始化方法可以减缓梯度爆炸和梯度消失问题
- tanh一般使用Xavier初始化方法
- ReLU及其变种一般使用Kaiming初始化方法