淘先锋技术网

首页 1 2 3 4 5 6 7

写在前面

最近学习了一些RNN的内容,但是由于笔者之前没有接触过这方面的知识,加之学完之后觉得RNN其实是一个复杂程度不输于CNN的模块,因此在阶段学习之外进行总结一下,也算是重新巩固一下相关的知识。


 

循环神经网络结构

RNN网络

RNN的提出很大程度上是为了长序列的检测问题,我们都知道,基于CNN的网络的输入一般都是一副当前的图像,对于一个序列而言,CNN的网络并不能很好的关联起来,即当前的输入没有考虑到先前的信息。而RNN中的记忆单元刚还弥补了这个缺陷,记忆单元将上一个单元的内容保留下来,同时参与到当前的运算之中。

  1. 说道RNN,不得不提的就是它的折叠模型(fold)和展开模型(unfold)(不得不说这两个形容词用的真是太恰当了!)
    一个2层的RNN的折叠模型和展开模型如下:
    在这里插入图片描述在这里插入图片描述
    (emmm,图片大小不同,各位看官凑合着看~)
    对于这样的结构,笔者的第一个感觉是:恩?这参数没有想象中的多啊。
    然后仔细一想,不对,这参数也太多了吧?

    第一个感觉是因为整个网络学习的参数其实不多,有W1,W2,U,V1,V2(都是全连接层),但是对于其展开之后,一个长度为N的序列的模型将会有N×(W1+W2+U+V1+V2)个参数,对于比较大的N和隐含层而言,整个参数量还是很大的。

  2. 另一个必须要说的知识点就是前向传播了,不同于不带记忆单元的模型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函数,急需注意的地方就是在进行本次推理的时候一定要加上上次对应层的状态。

  3. 最后一点就是反向传播,正如前向传播的时候需要考虑上一时刻的状态一样,反向传播的时候也要求必须考虑进后面的神经元的状态,一定需要记得是:不要仅仅考虑同层的误差传播,高层的误差传播也要考虑在内!!!
    依旧以上图中的2层的RNN模型为例,我们来看t+1时刻对于最底层权重U的更新都需要什么变量参与进来:

a. 最直接和U相连的变量是 S ‾ t , S ‾ t + 1 \overline{S}_t, \overline{S}_{t+1} StSt+1
b. 与 S ‾ t , S ‾ t + 1 \overline{S}_t, \overline{S}_{t+1} StSt+1相连的变量有 Z ‾ t , Z ‾ t + 1 \overline{Z}_t, \overline{Z}_{t+1} ZtZt+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) Ue=SteUSt+St+1eUSt+1(a)Ste=ZteStZt+St+1eStSt+1(b)St+1e=Zt+1eSt+1Zt+1(b)Zt+1e=yt+1eZt+1yt+1(c)Zte=Zt+1eZtZt+1(d)
所以把上述的b,c,d的分式带入到a中就可以得到:
∂ e ∂ U = ∂ e ∂ y t + 1 ∂ y t + 1 ∂ Z ‾ t + 1 ∂ Z ‾ t + 1 ∂ S ‾ t + 1 ∂ S ‾ t + 1 ∂ U + ∂ e ∂ y t + 1 ∂ y t + 1 ∂ Z ‾ t + 1 ∂ Z ‾ t + 1 ∂ Z ‾ t ∂ Z ‾ t ∂ S ‾ t ∂ S ‾ t ∂ U + ∂ e ∂ y t + 1 ∂ y t + 1 ∂ Z ‾ t + 1 ∂ Z ‾ t + 1 ∂ S ‾ t + 1 ∂ S ‾ t + 1 ∂ S ‾ t ∂ S ‾ t ∂ U \frac{\partial{e}}{\partial{U}}=\frac{\partial{e}}{\partial{y_{t+1}}}\frac{\partial{y_{t+1}}}{\partial{\overline{Z}_{t+1}}}\frac{\partial{\overline{Z}_{t+1}}}{\partial{\overline{S}_{t+1}}}\frac{\partial{\overline{S}_{t+1}}}{\partial{U}}+\frac{\partial{e}}{\partial{y_{t+1}}}\frac{\partial{y_{t+1}}}{\partial{\overline{Z}_{t+1}}}\frac{\partial{\overline{Z}_{t+1}}}{\partial{\overline{Z}_{t}}}\frac{\partial{\overline{Z}_{t}}}{\partial{\overline{S}_{t}}}\frac{\partial{\overline{S}_{t}}}{\partial{U}}+\frac{\partial{e}}{\partial{y_{t+1}}}\frac{\partial{y_{t+1}}}{\partial{\overline{Z}_{t+1}}}\frac{\partial{\overline{Z}_{t+1}}}{\partial{\overline{S}_{t+1}}}\frac{\partial{\overline{S}_{t+1}}}{\partial{\overline{S}_t}}\frac{\partial{\overline{S}_{t}}}{\partial{U}} Ue=yt+1eZt+1yt+1St+1Zt+1USt+1+yt+1eZt+1yt+1ZtZt+1StZtUSt+yt+1eZt+1yt+1St+1Zt+1StSt+1USt
如果对于上面的式子进行多个输入的推广的话,基于时间的反向传播对于某个权重矩阵的偏导数可以写作如下形式:
∂ e ∂ W s = ∑ i = 1 N ∂ E ∂ y N ∂ y N ∂ S i ∂ S i ∂ W s ∂ e ∂ W x = ∑ i = 1 N ∂ E ∂ y N ∂ y N ∂ S i ∂ S i ∂ W x \frac{\partial{e}}{\partial{W_s}} = \sum_{i=1}^{N}{\frac{\partial{E}}{\partial{y_N}}\frac{\partial{y_N}}{\partial{S_i}}\frac{\partial{S_i}}{\partial{W_s}}} \\ \frac{\partial{e}}{\partial{W_x}} = \sum_{i=1}^{N}{\frac{\partial{E}}{\partial{y_N}}\frac{\partial{y_N}}{\partial{S_i}}\frac{\partial{S_i}}{\partial{W_x}}} Wse=i=1NyNESiyNWsSiWxe=i=1NyNESiyNWxSi
其中Ws是隐含层之间的权值矩阵,而Wx是输入与隐含层之间的权值矩阵。


 

LSTM网络

LSTM的提出主要是为了克服RNN网络不能处理太长序列的问题,该结果一是因为太久远的信息会随着经过激活函数的数量一次次的损失,二是因为反向传播时候的梯度消失。而LSTM结构在很大程度上解决了长期记忆消失的问题。
LSTM网络就是由很多LSTM单元构成的一个循环神经网络,LSTM单元如下:
在这里插入图片描述
与RNN单元不同的是,LSTM单元的隐含层是两条线路,上面一条流过的数据称为Long Term Memory,下面一条流过的数据称为Short Term Memory,两个memory之间会相互作用,保证对方的信息都是可用而且正确的。
LSTM单元主要由四个门,分别是学习门,遗忘门,记忆门和应用门,这四个门也是整个单元核心力量的体现。下面对这四个门进行简单的介绍。

 

学习门(learn gate)

学习门在LSTM单元中的位置如下。
在这里插入图片描述
学习门在整个单元的运行中是一个很重要的地方,因为在该处信息将经过学习和筛选的过程。
学习门的步骤如下图所示:
在这里插入图片描述
短期记忆和当前的输入会通过一个sigmoid函数生成一个权值向量 i i i,权值高则表示该部分信息要被保留,权值低表明该部分信息要被忽略;同样,短期记忆与当前的输入经过concat操作之后会经过一个激活单元,表示对新的短期记忆进行了学习,得到了向量 N N N;之后将两者想乘就得到了新的记忆(不是长期也不是短期)。

 

遗忘门(forget gate)

遗忘门在LSTM单元中的位置如下。
在这里插入图片描述
遗忘门的操作和原理都很简单,就是根据当前的信息和短期记忆来决定哪些长期记忆是要被遗忘掉的。
遗忘门的步骤如下:
在这里插入图片描述
短期记忆和当前的输入经过一个全连接和激活函数之后得到权值向量 f f f,之后和短期记忆进行向量想乘,得到新的记忆(注意这时的记忆依然是一个暂时的记忆,既不是短期的,也不是长期的)。

 

记忆门(Remember Gate)

记忆门在LSTM单元中的位置如下。
在这里插入图片描述
可以看到,记忆门的操作相当的简单,仅仅是将学习门和遗忘门得到的两个暂时性的记忆加在一起得到新的长期记忆,这里不再赘述。

 

应用门(Use Gate)

应用门在LSTM单元中的位置如下。
在这里插入图片描述
可以看到,应用门类似于学习门,不过学习门是对短期的东西学习之后进行了筛选过滤,而应用门是对长期的东西进行了学习和过滤,产生新的短期记忆。
应用门的步骤如下:
在这里插入图片描述
上图中t-1时刻的长期记忆应该经过了遗忘门和应用门,即输入是新的长期记忆,也就是说U的公式应该为 U t = t a n h ( W u L T M t + b u ) U_t=tanh(W_uLTM_t+b_u) Ut=tanh(WuLTMt+bu)

 

小结LSTM

其实笔者在学习这部分的时候,每个门的东西其实都是可以看明白的,但是实际应用中,这些门到底是如何进行信息的保留和筛选的其实不是很明白,但是其实稍微举个例子就会明白很多,比如下面这个例子:
我们的网络在处理一个长视频,视频的前半段是关于细胞的,后半段是关于野生动物的,现在时刻t处于视频的后半段,此时长期记忆中还保留着前半段一些关于细胞的事情,短期记忆已经完全是关于野生动物的了,对于当前的输入 E t E_t Et

  • 经过学习门之后,短期记忆和当前输入的集合中的一些部分会被删除掉,例如之前的某些时刻网络记得了一些树的信息(因为介绍野生动物,树必然会存在,但是次数一定不会很多),而此时输入的是一只猴子,那么经过学习门之后,猴子的信息添加进(如果之前就有猴子的信息,那么猴子的信息会被保留)暂时的短期记忆A中(此时其他的动物的权重怎么变化还不好说),而树的信息会被削弱;
  • 经过遗忘门之后,因为短期记忆和当前看到的东西都是关于动物的,因此长期记忆中细胞的部分会被进一步的削弱,而动物部分的信息会被尽量保留,此时生成暂时的长期记忆B;
  • 经过记忆门之后,将暂时的记忆A和长期的记忆B相加,得到新的长期记忆,这个地方很重要,因为随着时间的向前推移,长期记忆一定要尽量加入当前时刻的输入;
  • 最后,经过应用门,长期记忆会根据短期记忆和当前的输入来从中选出一些作为新的短期记忆,比如当前输入的是一个猴子,且短期记忆中动物的比重都比较大,那么新的短期记忆中可能就会把长期记忆中关于植物和细胞的部分都删除掉,只剩下一些动物的信息。

当然,上述的过程其实都是笔者YY的想象,对于网络真正运行的时候,其内部的数据流形式一定不是这么简单的,因为对于目前的深度学习框架而言,长期记忆的隐含层和短期记忆的隐含层的单元数都是一样的,所以笔者目前对于其内部的流动也不是特别的清晰,只能先总结到这个程度。


总结

以上就是初学RNN时候的一些总结,鉴于知识越来越多,很多东西学了一遍不总结真的跟没学一样,以后还是要勤于总结。一个比较好的帖子可以参考