手撕CNN神经网络(二)反向传播(back propagation)

发布于:2023-01-08 ⋅ 阅读:(553) ⋅ 点赞:(0)

反向传播简单来说就是通过求偏导数从而更新神经网络中权重w的过程

首先先简单复习一下前向传播(forward propagation)

篇幅有限,bias(b)在图中就没画出来,大家知道有这么个东西就好 ,顺便再偷个懒,输出层的激活函数忘记画上去了~

在正式说反向传播之前,先说两个简单的概念

1.loss函数

 loss函数是一个描绘了我们的【预测值】和【实际值】之间误差的函数,它的自变量通常是一个或者多个weight,因变量是误差的大小,这点很重要。我们的神经网络能够优化的就是weight和bias,对于同样的输入结果x1,x2......调整不同的w和b,得到的loss会不一样。而loss函数就记录了在同样的一组输入结果x1,x2,......,xn下,使用不同的w和b以及它们与实际值之间的差值

2.梯度下降(gradient descent,GD)

梯度下降是一种帮助我们寻找loss函数最低点的最基础方法,这类方法有很多种,它们有一个统一的名字叫【优化器】

我举一个下山的例子,loss函数是一座连绵的山峰,我们要做的就是山的谷底,而我们的起点是一个随机的点

梯度下降的公式大致描述如下,以上图为例:

其中

\eta:学习率(learning rate),可以理解为我们下山的步伐,一步迈多少米,一定是正数

\frac{\delta _{loss}}{\delta a}:斜率,当前这个点的陡峭程度

以上图为例,当斜率小于0时,意味着a点往右移动,下山方向正确,当斜率大于0时,如c点,则向左移动,下山方向正确

从公式中可以看出,当斜率为0时,下山就停止了,算法认为我们已经到达了山谷。

但是,从图中我们可以看出,当a点下降到x1点时,算法认为我们到达了最低点,但是实际上,我们的最低点在x2,这就是陷入了局部最优的问题

那么要如何解决局部最优问题呢?其中一个方法就是调大学习率,让a点一步跨过去它右边那个山峰,跨到b点或者c点的位置,再继续下降。

但是,过大的学习率也会有一定的问题,就是使得a点在一个U形两端来回蹦跶,学名叫做无法收敛,如下图所示

所以,选取合适的学习率,是一门技术活

3.反向传播

接下来就来看看什么是反向传播

反向传播其实就是,通过前向传播画出的loss,使用梯度下降或者其他优化方法,找到那个使得loss函数值最小的一组w,将他更新到我们的神经网络中去

不过,在我们一般的实际应用中,通常会有很多很多个w,所以我们就要用到数学中的偏导数概念,下面直接拿例子来说明

 比如我想研究一下w5这个参数对于我最终的loss_{total}有什么影响,我们就要先梳理清楚w5的影响是怎么传播到total中去的

所以,对于求偏导数的过程,也是一样的传播道理

 

先看看w5对z有什么影响,再看看z对output1有什么影响(这里实际上就是对激活函数sigmoid求导),最后再看output1对losstotal有什么影响

在计算出了对于w5的偏导数之后,就可以使用梯度下降的公式进行更新了

接下来稍微加大一点难度,我想研究一下w1对最终的losstotal的影响,还是和前面一样,梳理清楚影响传播的路径

可以看到,与w5不同的是,w1对于losstotal的影响有两个分支,所以我们就需要分开来看,

然后最后把他们加起来,就是w1对于losstotal的影响 

最后使用梯度下降进行更新

本文含有隐藏内容,请 开通VIP 后查看