1. RNN前向传播
在介绍RNN之前,首先比较一下RNN与CNN的区别:
- RNN是一类用于处理序列数据的神经网络,CNN是一类用于处理网格化数据(如一幅图像)的神经网络。
- RNN可以扩展到更长的序列,大多数RNN也能处理可变长度的序列。CNN可以很容易地扩展到具有很大宽度和高度的图像,并且可以处理可变大小的图像。
![[外链图片转存失败(img-sEvsXPZN-1568360613787)(./images/RNN-前向.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/9acc48fb87e67c0b1c78df47077e0052.png)
RNN的前向传播如图所示,其中f(x)f(x)f(x)代表激活函数,输出的label可以使用one-hot形式。图中所有的U、W、V、b1、b2U、W、V、b_1、b_2U、W、V、b1、b2全部相同,类似于CNN中的权值共享。CNN通过权值共享可以处理任意大小的图片,RNN通过权值共享,可以处理任意序列长度的语音、句子。
损失函数:
J=∑i=1t∣∣oi−o^i∣∣2=J1+J2+...+Jt(Ji为MSE损失或CE损失)
J=\sum_{i=1}^{t}||o_i-\hat{o}_i||^2=J_1+J_2+...+J_t(J_i为MSE损失或CE损失)
J=i=1∑t∣∣oi−o^i∣∣2=J1+J2+...+Jt(Ji为MSE损失或CE损失)
2.RNN反向传播
在介绍RNN反向传播之前,先回顾一下基本神经元的反向传播算法:
![[外链图片转存失败(img-ZWqPXKqE-1568360613788)(./images/base.png)]](https://i-blog.csdnimg.cn/blog_migrate/33c5c04a99499d86e3b3e969c752761d.png)
{h=WX+bS=f(h)
\begin{array}{l}\left\{ \begin{matrix}
h=&WX+b\\
S=&f(h)
\end{matrix}\right.
\end{array}{h=S=WX+bf(h)
假设已知损失对SSS的梯度∂J∂S\frac{\partial J}{\partial S}∂S∂J:
{∂J∂h=∂J∂SdSdh∂J∂X=∂J∂hWT∂J∂W=XT∂J∂h∂J∂b=SumCol(∂J∂h)
\begin{array}{l}\left\{ \begin{matrix}
\frac{\partial J}{\partial h}=\frac{\partial J}{\partial S}\frac{d S}{d h}\\\\
\frac{\partial J}{\partial X}=\frac{\partial J}{\partial h}W^T\\ \\
\frac{\partial J}{\partial W}=X^T\frac{\partial J}{\partial h}\\ \\
\frac{\partial J}{\partial b}=SumCol(\frac{\partial J}{\partial h})
\end{matrix}\right.
\end{array}
⎩⎪⎪⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎪⎪⎧∂h∂J=∂S∂JdhdS∂X∂J=∂h∂JWT∂W∂J=XT∂h∂J∂b∂J=SumCol(∂h∂J)
具体推导过程请参考:https://zhuanlan.zhihu.com/p/79657669
下面介绍RNN的反向传播,如图所示:
![[外链图片转存失败(img-M9I1CVlS-1568360613789)(./images/RNN_bp1.png)]](https://i-blog.csdnimg.cn/blog_migrate/e682689764b46c1d75f605c4d19abea0.png)
![[外链图片转存失败(img-5dJgmaAG-1568360613789)(./images/RNN_bp2.png)]](https://i-blog.csdnimg.cn/blog_migrate/5186a8dcbb554895de191fbe20591699.png)
![[外链图片转存失败(img-Y14YeoM7-1568360613790)(./images/RNN_bp3.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/8411650c5bc1eabb05097a67f4eb0832.png)
因为共享权重,所以整个RNN网络对V、W、UV、W、UV、W、U的梯度为:
∂J∂V=∑i=1tsiT∂J∂oi;∂J∂W=∑i=1t−1siT∂J∂hi+1;∂J∂U=∑i=1txiT∂J∂hi
\frac{\partial J}{\partial V}=\sum_{i=1}^{t} s_{i}^{T} \frac{\partial J}{\partial o_{i}}; \quad \frac{\partial J}{\partial W}=\sum_{i=1}^{t-1} s_{i}^{T} \frac{\partial J}{\partial h_{i+1}}; \quad \frac{\partial J}{\partial U}=\sum_{i=1}^{t} x_{i}^{T} \frac{\partial J}{\partial h_{i}}
∂V∂J=i=1∑tsiT∂oi∂J;∂W∂J=i=1∑t−1siT∂hi+1∂J;∂U∂J=i=1∑txiT∂hi∂J
3. RNN并行加速计算
3.1 前向并行运算
因为RNN为延时网络,网络的每个输入都与前一个时刻的输出有关系,因此,当输入只有一句话时,无法并行计算。当有输入为一个batch时,如何并行计算呢?
![[外链图片转存失败(img-3fvXtcb8-1568360613790)(./images/RNN-并行1.png)]](https://i-blog.csdnimg.cn/blog_migrate/71f9a7cdd9a1160204f658683a6d98e2.png)
![[外链图片转存失败(img-o6IYluN2-1568360613790)(./images/RNN-并行2.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/b1be06ac47d4754fa731369f065e77fb.png)
也就是说,可以将一个batch的样本在某一个时刻的输入输出并行,加速计算,而不是将一个样本的整个过程并行(因为依赖性无法并行)。
3.2 反向并行计算
反向并行运算方式如下图所示:
![[外链图片转存失败(img-crDD94KP-1568360613791)(./images/RNN-并行3.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/5cd1707bd9559ae5df417f8231b507ee.png)
4. 双向RNN
![[外链图片转存失败(img-2LMHU1e8-1568360613791)(./images/RNN-双向.jpg)]](https://i-blog.csdnimg.cn/blog_migrate/f85e0b1ece5c0351c105006f72127d45.png)
注:图中的W与W^W与\hat{W}W与W^、U与U^U与\hat{U}U与U^、V与V^V与\hat{V}V与V^不同。
5. DeepRNN
![[外链图片转存失败(img-3XRkJ1F5-1568360613791)(./images/RNN-DeepRnn.png)]](https://i-blog.csdnimg.cn/blog_migrate/158169c68cc309b68ae68956f66ac12f.png)
参考资料:深度之眼

本文深入解析了RNN的前向与反向传播机制,对比了RNN与CNN在处理序列数据上的区别,详细介绍了RNN的并行加速计算方法,包括前向和反向并行运算,以及双向RNN和DeepRNN的概念。
1204





