2020机器学习正向传播和反向传播


machine_learning.jpg

感谢李宏毅老师的机器学习,部分内容参考了李宏毅老师的讲义

今天我们来说一说正向传播和反向传播,这里感谢李宏毅老师讲义,让我受益匪浅,但是我这里并不是简单将李老师课程重复,而是加入自己认识,更重要的是我们通过 code 实现这些做法,帮助你更好理解反向传播。

正向传播和反向传播

这里有传播,那么我们说传播什么以及传播方式。这里传播的是导数,也就是找到我们参数对最终的输出的影响程度,对输出影响也就是说明参数对损失函数影响程度。根据求导方式一种正向传播和反向传播。那么我们为什么要做这件事呢?当然即使不了解反向传播也是完全可以做深度学习项目,因为现在流行框架 tensorflow 和 mxnet 已经将这些工作都封装好了,我们不了解这些一样可以设计好的模型。就是我们不知道1+1为什么等于 2 一样也是可以计算 1 + 1 = 2。定义好损失函数我们就是要做到损失函数梯度为零,在线性回归和logistic 回归,我们模型比较简单可能是一个线性方程或者是一个简单复合函数。对于这些模型函数求导很简单。

链式求导

我们需要复习一下求导,

第一种情况

y = g(x) \, z = h(y)
\Delta x \rightarrow \Delta y \rightarrow \Delta z
\frac{dz}{dx} = \frac{dz}{dy} \frac{dy}{dx}
第一种情况是复合函数求导,在复合函数求导方式如上,我这里就不赘述了。

第二种情况

\frac{dz}{dx} = \frac{dz}{dy} \frac{dy}{dx}
x=g(s)\, y=h(s)\, z = k(x,y)
\frac{dz}{ds} =\frac{dz}{dx} \frac{dx}{ds} + \frac{dz}{dy} \frac{dy}{ds}
第二种情况是x 通过两个途径来影响最终 z

在神经网络中,最终的损失函数是多个样本损失函数的集合,我们看一看 z 经过一系列运算得到 y 然后 y 用于计算损失函数,今天要看 z 的变化对最后的损失函数有多大影响。
而在在神经网中这件事就变得复杂多了,我们看一看损失函数是每一个样本经过神经网络的损失函数集合这个应该不难理解。
<img src=”images/bg_01.png” width=”20%”/>
L(\theta) = \sum_{i=1}^N l_{i}(\theta)
z \rightarrow y \rightarrow l(\theta)


bg_02.png

bg_03.png

\begin{cases} \frac{\partial z}{\partial w_1} \Rightarrow \frac{\partial z}{\partial w_1} = x_1 \\ \frac{\partial z}{\partial w_2} \Rightarrow \frac{\partial z}{\partial w_2} = x_2 \end{cases}
这个求导并不难,每一层线性函数 w 对于 z 求导就是该层神经元的输入。

<img src=”images/bg_05.png” width=”50%”/>
接下来就是经过激活函数,进入下一层。根据你选择激活函数就很好求导\sigma^{\prime} \frac{\partial l}{\partial z} = \frac{\partial a}{\partial z} \frac{\partial l}{\partial a} = \sigma^{\prime}\frac{\partial l}{\partial a}$$


bg_06.png

ndd_05.png

\begin{cases} z^{\prime} = a w_3 + b \Rightarrow \frac{\partial z^{\prime}}{\partial a} = w_3 \\ z^{\prime \prime} = a w_4 + b \Rightarrow \frac{\partial z^{\prime \prime}}{\partial a} = w_4 \\ \end{cases}
我们来读解一下下面代码,我们是不是有点数据,如果我们换一个角度来看,假设\frac{\partial l}{\partial z^{\prime}}\frac{\partial l}{\partial z^{\prime \prime}} 是已知那么,从右向左看这个不及时,值得注意区别这里\sigma^{\prime}(z) 是线性的。


bg_09.png

有时候我们这件事换个角度


bg_07.png

bg_10.png

我们换一个角度来,从输出反向神经网络来看,可以将\frac{\partial l}{\partial z^{\prime}}\frac{\partial l}{\partial z^{\prime \prime}} 看成输入,然后这里激活函数\sigma^{\prime}(z)是线性放大器。所以这件事我们反过来考虑就简单。


bg_11.png

bg_12.png

其实这里感觉是有点动态规划意思,我们参数求导这件事有点我们分两步做,先做正向传播计算\frac{\partial z}{\partial w},然后通过反向传播求出\frac{\partial l}{\partial z},\frac{\partial z}{\partial w} \times \frac{\partial l}{\partial z} = \frac{\partial l}{\partial w}

最后希望大家关注我们微信公众号


wechat.jpeg
https://www.jianshu.com/p/30e30e12917e

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论