写在前面
最近学习了一些RNN的内容,但是由于笔者之前没有接触过这方面的知识,加之学完之后觉得RNN其实是一个复杂程度不输于CNN的模块,因此在阶段学习之外进行总结一下,也算是重新巩固一下相关的知识。
循环神经网络结构
RNN网络
RNN的提出很大程度上是为了长序列的检测问题,我们都知道,基于CNN的网络的输入一般都是一副当前的图像,对于一个序列而言,CNN的网络并不能很好的关联起来,即当前的输入没有考虑到先前的信息。而RNN中的记忆单元刚还弥补了这个缺陷,记忆单元将上一个单元的内容保留下来,同时参与到当前的运算之中。
-
说道RNN,不得不提的就是它的折叠模型(fold)和展开模型(unfold)(不得不说这两个形容词用的真是太恰当了!)
一个2层的RNN的折叠模型和展开模型如下:
(emmm,图片大小不同,各位看官凑合着看~)
对于这样的结构,笔者的第一个感觉是:恩?这参数没有想象中的多啊。
然后仔细一想,不对,这参数也太多了吧?第一个感觉是因为整个网络学习的参数其实不多,有W1,W2,U,V1,V2(都是全连接层),但是对于其展开之后,一个长度为N的序列的模型将会有N×(W1+W2+U+V1+V2)个参数,对于比较大的N和隐含层而言,整个参数量还是很大的。
-
另一个必须要说的知识点就是前向传播了,不同于不带记忆单元的模型CNN,RNN在进行推理的时候一定是考虑前一个单元的输出的,例如上面的2层RNN模型, 他的前向传播公式如下:
S t + 1 ‾ = σ ( U X ‾ t + 1 + W 1 S ‾ t ) Z t + 1 ‾ = σ ( V 1 S ‾ t + 1 + W 2 Z ‾ t ) \overline{S_{t+1}} = \sigma{(U\overline{X}_{t+1}+W_1\overline{S}_{t})} \\ \overline{Z_{t+1}} = \sigma{(V_1\overline{S}_{t+1}+W_2\overline{Z}_{t})} St+1=σ(UXt+1+W1St)Zt+1=σ(V1St+1+W2Zt)其中 σ \sigma σ为sigmoid函数,急需注意的地方就是在进行本次推理的时候一定要加上上次对应层的状态。
-
最后一点就是反向传播,正如前向传播的时候需要考虑上一时刻的状态一样,反向传播的时候也要求必须考虑进后面的神经元的状态,一定需要记得是:不要仅仅考虑同层的误差传播,高层的误差传播也要考虑在内!!!
依旧以上图中的2层的RNN模型为例,我们来看t+1时刻对于最底层权重U的更新都需要什么变量参与进来:
a. 最直接和U相连的变量是 S ‾ t , S ‾ t + 1 \overline{S}_t, \overline{S}_{t+1} St,St+1;
b. 与 S ‾ t , S ‾ t + 1 \overline{S}_t, \overline{S}_{t+1} St,St+1相连的变量有 Z ‾ t , Z ‾ t + 1 \overline{Z}_t, \overline{Z}_{t+1} Zt,Zt+1,同时, S ‾ t \overline{S}_t St在t+1时刻与 S ‾ t + 1 \overline{S}_{t+1} St+1通过 W 1 W_1 W1关联;
c. 在t+1时刻,与 Z ‾ t + 1 \overline{Z}_{t+1} Zt+1直接相关的变量为 y ‾ t + 1 \overline{y}_{t+1} yt+1;
d. 在t+1时刻, Z ‾ t \overline{Z}_{t} Zt与 Z ‾ t + 1 \overline{Z}_{t+1} Zt+1通过 W 2 W_2 W2间接相关;
上述的相关性采用的是自下而上的方式,在back progagation中其实应该是自上而下的推理,因为这里模型比较简单,序列也不长,这里是为了梳理公式的方便使用自下而上的推理方式。
根据上述的相关性,可以计算出在t+1时刻,误差E对于U的梯度为:
∂ e ∂ U = ∂ e ∂ S ‾ t ∂ S ‾ t ∂ U + ∂ e ∂ S ‾ t + 1 ∂ S ‾ t + 1 ∂ U ( 根 据 a ) ∂ e ∂ S ‾ t = ∂ e ∂ Z ‾ t ∂ Z ‾ t ∂ S ‾ t + ∂ e ∂ S ‾ t + 1 ∂ S ‾ t + 1 ∂ S ‾ t ( 根 据 b ) ∂ e ∂ S ‾ t + 1 = ∂ e ∂ Z ‾ t + 1 ∂ Z ‾ t + 1 ∂ S ‾ t + 1 ( 根 据 b ) ∂ e ∂ Z ‾ t + 1 = ∂ e ∂ y t + 1 ∂ y t + 1 ∂ Z ‾ t + 1 ( 根 据 c ) ∂ e ∂ Z ‾ t = ∂ e ∂ Z ‾ t + 1 ∂ Z ‾ t + 1 ∂ Z ‾ t ( 根 据 d ) \frac{\partial{e}}{\partial{U}}=\frac{\partial{e}}{\partial{\overline{S}_t}}\frac{\partial{\overline{S}_t}}{\partial{U}}+\frac{\partial{e}}{\partial{\overline{S}_{t+1}}}\frac{\partial{\overline{S}_{t+1}}}{\partial{U}} \quad (根据a) \\ \frac{\partial{e}}{\partial{\overline{S}_t}}=\frac{\partial{e}}{\partial{\overline{Z}_t}}\frac{\partial{\overline{Z}_t}}{\partial{\overline{S}_t}}+\frac{\partial{e}}{\partial{\overline{S}_{t+1}}}\frac{\partial{\overline{S}_{t+1}}}{\partial{\overline{S}_t}} \quad (根据b) \\ \frac{\partial{e}}{\partial{\overline{S}_{t+1}}}=\frac{\partial{e}}{\partial{\overline{Z}_{t+1}}}\frac{\partial{\overline{Z}_{t+1}}}{\partial{\overline{S}_{t+1}}} \quad (根据b) \\ \frac{\partial{e}}{\partial{\overline{Z}_{t+1}}}=\frac{\partial{e}}{\partial{y_{t+1}}}\frac{\partial{y_{t+1}}}{\partial{\overline{Z}_{t+1}}} \quad (根据c) \\ \frac{\partial{e}}{\partial{\overline{Z}_{t}}}=\frac{\partial{e}}{\partial{\overline{Z}_{t+1}}}\frac{\partial{\overline{Z}_{t+1}}}{\partial{\overline{Z}_{t}}} \quad (根据d) ∂U∂e=∂St∂e∂U∂St+∂St+1∂e∂U∂St+1(根据a)∂St∂e=∂Zt∂e∂St∂Zt+∂St+1∂e∂St∂St+1(根据b)∂St+1∂e=∂Zt+1∂e∂St+1∂Zt+1(根据b)∂Zt+1∂e=∂yt+1∂e∂Zt+1∂yt+1(根据c)∂