误差反向传播(手把手教你推导如何通过反向传播更新参数)

冷不防 2022-11-21 01:17 430阅读 0赞

在讲解误差反向传播之前我们 先来了解下基本概念,顺着我的思路下去,后面的推导你就可能不会糊涂。

【一些基础概念】

误差反向传播(Error Back Propagation, BP)算法
1、BP算法的基本思想是:学习过程由信号的正向传播与误差的反向传播两个过程组成。
1)正向传播:输入样本->输入层->隐藏层(处理)->输出层
举一个正向传播的例子,如下所示:

20201029145546883.png

我们通过单个的神经元来观察下输入数据从输入到输出需要经历哪些步骤:

第一步:每个输入都跟一个权重相乘(红色)

20201029145845938.png

第二步:加权后的输入求和,加上一个偏差b(绿色)

20201029145924475.png

第三步:这个结果传递给一个激活函数f(x)

2020102915000541.png

激活函数的作用是将一个无边界的输入,转变成一个可预测的形式。常用的激活函数就就是S型函数,如下所示:

20201029150325245.png

S型函数的值域是(0, 1)。简单来说,就是把(−∞, +∞)压缩到(0, 1) ,很大的负数约等于0,很大的正数约等于1。

这里我们为上面的变量赋值,然后通过正向传播得到一个结果如下所示:

20201029150633191.png

上面通过单个神经元来讲解的,那如果我有一个简单的神经网络该怎么正向传播,做法跟上面是一样的,比如下面的这个简单的神经网络:

20201029151730896.png

我们就使用上图所示的神经网络,并假设所有神经元的权重都为[0,1],偏置都为0,激活都使用Sigmoid函数。

我们将这些数字标记在神经网络上,如下所示:

2020102915243290.png

通过上面的计算,输出的过程就为:

20201029152527298.png

20201029152537611.png

因为上面的神经网络相对简单所以计算步骤没有那么繁琐,对于一些神经元较多的神经网络我们的计算方式也是这样的。

我们通过正向传播计算出来的结果一般都需要经过损失函数来衡量,如果损失函数的值较大(也就是说实际值与预测值之差),那说明我们预测的结果往往不理想,为了解决这个问题,我们需要选择一种方法来量化神经网络预测得有多“好”,在这里我们使用的是均方误差(MSE)损失:

20201029154041334.png

  • n 是样本数量
  • y 是目标量
  • 20201029154539818.png 是真实的结果(正确答案)
  • 20201029154613297.png是预测的结果,就是神经网络输出的结果。

20201029154731522.png被称作方差(平方误差),我们这里的损失函数只是取所有方差的平均值(故名“均方差”“mean squared error”)。预测效果越好,损失函数的值就会越低。

为了最小化损失值,接下来就要引入我们的反向传播通过改变神经网络的权重和偏置来影响它的预测结果。

2)误差反向传播:输出误差(某种形式)->隐层(逐层)->输入层
其主要目的是通过将输出误差反传,将误差分摊给各层所有单元,从而获得各层单元的误差信号,进而修正各单元的权值(其过

程,是一个权值调整的过程)。

20201029155318632.png

接下来我们通过上面这张图来通过反向传播进行参数的更新,但是我们第一步需要先通过正向传播来计算每个神经元里面的值。

我们先算h1和h2这两个神经元:

sum_h1 = x1*w1 + x2*w2 + b1 h1 = Sigmoid(sum_h1)

sum_h2 = x2*w4 + x2*w2 + b2 h2 = Sigmoid(sum_h2)

PS:通过激活函数求得的h1相当于输入的x1,,然后参与下一个神经元的运算

接下来再算O1这个神经元:

sum_O1 = h1*w5 + h2*w6 + b3 O1 = Sigmoid(sum_O1)

要更新神经元上相关的参数,那么我们需要使用链式法则来进行求解

这里补充下因为我们使用的是Sigmoid函数:2020102916170623.png

那么对f(x)求导之后f`(x) = f(x)( 1 - f(x) ),所以我在这里令Sigmoid求导后的函数为:deriv_sigmoid(x)

20201029162854937.png

接下来我们通过从神经元O1开始对h1、h2、w5、w6、b3求梯度:

用数学知识看这个式子:sum_O1 = h1*w5 + h2*w6 + b3 然后分别求梯度,对应下面的式子

d_h1 = w5*deriv_sigmoid(sum_O1)

d_h2 = w6*deriv_sigmoid(sum_O1)

d_w5 = h1*deriv_sigmoid(sum_O1)

d_w6 = h2*deriv_sigmoid(sum_O1)

d_b3 = deriv_sigmoid(sum_O1)

接下来我们继续反向对w1、w2、w3、w4、b1、b2求梯度

20201029163157511.png

同样的,用数学知识看这个式子:sum_h1 = x1*w1 + x2*w2 + b1 sum_h2 = x1*w3 + x2*w4 + b2

分别求梯度,对应下面的式子

d_h1_w1 = x1*deriv_sigmoid(sum_h1)

d_h1_w2 = x2*deriv_sigmoid(sum_h1)

d_h2_w3= x1*deriv_sigmoid(sum_h2)

d_h2_w4 = x2*deriv_sigmoid(sum_h2)

d_h1_b1 = deriv_sigmoid(sum_h1)

d_h2_b2 = deriv_sigmoid(sum_h2)

至此,我们将上面的一些参数的梯度求解完成了,接下来我们需要做的就是对每个参数通过链式法则求偏导

20201029170004927.png

20201029171306557.png

20201029165822331.png

通过上面我们所求的梯度我们知道20201029170803374.png20201029170847812.png

那么我们就可以得到:20201029171501915.png

然后我们将上面对应的梯度带入进去就可以求得相应的偏导

下面我们就需要去更新这些参数了,怎么更新,通过下面这个式子:

20201029163851557.png

其中lr代表的是学习率,这里我们就以w1为例进行参数的更新:

20201029184121649.png

同理,对于其他的参数更新我们也可以使用上面一样的方法去求解。

当然了,这里我们给出的是一次参数的更新,如果是n次的话也是这个原理,求到最后参数的值也是在不断的减小,最终求得损失函数最小化的参数就停止反向传播。

文章有写的不好的地方请多多指正。

【相关参考】

1.https://blog.csdn.net/loopy_/article/details/89742157

2.https://www.pianshen.com/article/19911551579/

发表评论

表情:
评论列表 (有 0 条评论,430人围观)

还没有评论,来说两句吧...

相关阅读

    相关 反向传播

    最近在看深度学习的东西,一开始看的吴恩达的UFLDL教程,有中文版就直接看了,后来发现有些地方总是不是很明确,又去看英文版,然后又找了些资料看,才发现,中文版的译者在翻译的时候

    相关 误差反向传播算法(BP)

    优化算法基本上都是在反向传播算出梯度之后进行改进的,因为反向传播算法是一个递归形式,通过一层层的向后求出传播误差即可。 计算Loss函数的目的:\\计算出当前神经网络建模出来

    相关 反向传播的数学推导

    前一篇手写识别的博文《[深度学习数学基础—反向传播][Link 1]》中已经简单分析和推导过反向传播的原理,但是基于特定的场景给出的推导过程,现在我们再来系统的加深下神经网络反

    相关 BP反向传播详细推导

    BP神经网络是反向传播算法,他是一个非线性的前馈神经网络。由于网络参数需要更新,反向指的是参数梯度的反向传播,输入向前传播。非线性是因为神经元的激活函数是一个非线性可导的sig