CNN的反向传播算法 详细易懂

CNN的反向传播算法 详细易懂_第1张图片

 这里假设激活函数为f,可以取为relu,sigmoid等任意常用的激活函数。

正向传播:

正向传播是非常简单的,首先是对

W1=[w11,w12,13,w14]

                                                       W2=[w21,w22,w23,w24],

                                                       W3=[w31,w32]

随机取值,以便于能够完成一次正向的传播,从而根据误差来改变现有的并不准确的参数。

对于每一层产生输出的方式是一致的,且上一层的输出是当前层的输入:

以第二层为例:Z2=f(W2*Z1+b2),其中Z1是第一层经过线性组合以及激活函数之后的输出,对于其他层也是一样的。一直经过这样的操作直至输出结果out.接下来就是反向传播的过程。

反向传播:我们已经得到了一个输出结果也就是预测值 out ,该结果与真实值之间一定是存在差距的,需要利用一个函数来表达该差距,例如:均方误差,交叉熵损失。总之会有一个函数来反映预测值与真实值之间的差距,设该函数为J(W,b).反向传播的目的是通过改变之前的参数值来缩小这个损失,使得预测值与真实值之间足够接近。所以与要通过求导,来改变参数,其实就是找到参数改变的一个方向。

                     \frac {\partial J }{\partial W3}=\frac {\partial J }{\partial out}*J'(W3Z3+b3)*\frac {\partial out }{\partial W3}=\frac {\partial J }{\partial out}*J'(W3Z3+b3)*Z3

                             \frac {\partial J }{\partial b3}=\frac {\partial J }{\partial out}*J'(W3Z3+b3)*\frac {\partial out }{\partial b3}=\frac {\partial J }{\partial out}*J'(W3Z3+b3)

此时J'(WZ+b)是已知的,因为我们采用的损失函数已知,WZ+b的值也是已知的,从而J'(WZ+b)的之也是已知的,\frac{\partial J}{\partial out}是已知的,Z也是已知的,从而就可以得到\frac{\partial J}{\partial W}以及\frac{\partial J }{\partial b}的值,此时就可以利用学习率   \eta   来更新参数,设当前的正向传播为第t轮,

                                                      Wt+1=Wt-\eta *Wt

这里的 η 是可以设定的,一般值越小越有可能拿到好的结果,但是就会使得训练的速度变慢。

通过这种方式使得最后一层的参数得到了更新,那么现在还存在一个问题如何更新上一层的参数呢?

其实同理:我也可以通过以下方式对W2进行求导:

\frac{\partial J}{\partial W2}=\frac{\partial J}{\partial out} * \frac{\partial out}{\partial Z3} * f'(W2Z2+b2)*Z2

=\frac{\partial J}{\partial out} * \frac{\partial out}{\partial Z3} * \frac{\partial Z3}{\partial W2}

= \frac{\partial J}{\partial out} * W3 *( f'(W2Z2+b2)*Z2)

同理,\frac{\partial J}{\partial out}已知,W3已知(注意:此处的W3是更新之前的W3),( f'(W2Z2+b2)*Z2)

已知,从而通过相同的方式可以更新上一层的参数,以此类推可以使得所有的参数得到更新。

b站有一课程(不是我):应该算是讲的比较清晰,链接如下:

5分钟-通俗易懂 - 神经网络 反向传播算法(手算)_哔哩哔哩_bilibili

初次在CSDN发自己的东西,如有不正确的地方,望各位批评指正。

如果有丁点用,希望点赞鼓励一下。谢谢大家!

你可能感兴趣的:(cnn,深度学习)