6 Recurrent Neural Networks¶
Link
6.1 Introduction¶
RNN 这个框架的引入主要是为了处理具有序列特性的数据
!!! "具有序列特性的数据"
就是**符合时间顺序,逻辑顺序,或者其他顺序就叫序列特性**,举几个例子:
- 拿人类的某句话来说,也就是人类的自然语言,是不是符合某个逻辑或规则的字词拼凑排列起来的,这就是符合序列特性。
- 语音,我们发出的声音,每一帧每一帧的衔接起来,才凑成了我们听到的话,这也具有序列特性、
- 股票,随着时间的推移,会产生具有顺序的一系列数字,这些数字也是具有序列特性。
RNN 处理序列数据有五种不同模式。
One to One:传统的前馈神经网络,如用于图像分类的全连接层。输入是一个图像,输出是该图像所属类别的概率分布。
One to Many:给定一个起始词或短语,生成一段文本。例如,自动写诗或故事生成器。输入可以是一个单词或短语,输出是一系列连续的单词。Image Captioning
Many to One:情感分析。输入是一段文本(多个单词),输出是对这段文本的情感分类(如正面、负面或中性)。
Many to Many (Asynchronous):多个输入对应多个输出,但输入和输出的长度可以不同。比如说机器翻译。输入是一种语言的句子(多个单词),输出是另一种语言的翻译结果(也可能包含不同数量的单词)。图中特别标注了一个例子:“Video classification on frame level”,即基于帧级别的视频分类,输入是视频的多个帧,输出是对每个帧的分类结果。
Many to Many (Synchronous):多个输入对应多个输出,且输入和输出的长度相同。如命名实体识别(Named Entity Recognition, NER)。输入是一段文本(多个单词),输出是每个单词对应的标签(如人名、地名等)。
对于非序列化的数据我们也可以通过序列化的方式进行处理,RNN可以通过逐个处理这些局部视图,逐步构建对整个图像的理解,并最终进行分类。
比如说上面这张手写图,RNN可能会依次关注这些小方格中的数字,就像人眼在阅读时会逐字逐句地扫描文本一样。
6.2 Architecture¶
大致的单元结构就是引入了隐藏层,然后隐藏层根据上个时刻的隐藏层以及当前的输入来更新,然后相应的 y 通过隐藏层得出。
这个可以被看做一个递归,然后每一次递归的系数是一样的
对于一个 Many to Many 的计算图展开如下
Many to One 的计算图展开如下
One to Many 的计算图展开如下
对于 Many to Many 的异步情况,也被称为 Sequence to Sequence, 可以通过将 Many to One 和 One to Many 进行结合得到,一个负责译码一个负责解码
6.3 TBPTT¶
如果按照之前的的 BPTT 的做法,梯度需要通过整个时间序列进行反向传播,这会导致计算量和内存需求随着序列长度的增加而显著增加。
于是我们引入 Truncated Backpropagation Through Time (TBPTT) 的方法,将传播过程进行截断,从而降低反向传播的步骤
整个过程大致就是每次走 t 步,然后反向传播求梯度(只更新刚刚走的),更新相应的参数,然后继续走 t 步
一个类比
你可以把 TBPTT 想象成一个人在长路上跑步:
-
他每次跑 10 步(前向传播)
-
然后停下来,回头看看这 10 步走得怎么样(反向传播)
-
调整一下姿势(参数更新)
-
然后继续往前跑下一个 10 步
6.4 Image Captioning¶
图片标注是 CNN 和 RNN 结合起来应用的一个很好的例子
之前的 CNN 框架最后会用一个全连接层得到各个分类的分数然后通过 softmax 计算 loss。在这里和 RNN 链接的时候去掉这一层全连接层,将之前得到的特征直接作为 RNN 的输入。
将得到的 y0 作为一个概率分布对词汇表进行采样从而得到下一个单词,直到采样到 \
在 Image Captioning 中引入 Attention 的机制,让模型动态地关注某些图片特征。
整个过程首先通过卷积神经网络(CNN)对输入图像进行处理,从图像中提取出一系列的空间特征,CNN的输出是一个由 \(L\)个位置组成的特征映射,每个位置由一个DD维向量描述,形成一个\(L×D\)的矩阵表示。随后,利用第一隐藏层 \(h_0\) 作为注意力机制的初始上下文,模型计算在这些 \(L\) 个空间位置上的分布 \(a_1\),确定每个位置的相对重要性,并通过应用注意力权重到每个位置的特征向量得到加权后的特征向量 \(z_1\) 于预测第一个单词;这一过程通过不断迭代,每一步都利用上一步生成的隐藏状态和注意力权重更新对特征的关注点,并逐步构建完整的句子描述
这个注意力机制不仅应用于图片标注,还应用于 Visual Question Answering 等等问题上
6.5 LSTM¶
在之前的 RNN 框架中有一个问题,在下图这样的单元进行反向传播的时候,得到 \(h_{t-1}\) 的梯度的时候实际上是对 \(h_t\) 乘上一个 \(W_{hh}\) 的转置。那么当这个单元数较多的时候,计算 \(h_0\) 的梯度的时候我们就乘上了好多好多的矩阵,如果这个矩阵的最大奇异值大于1,则会造成梯度爆炸;如果小于1,则会导致梯度消失
针对梯度爆炸的问题,一个解决方法是采取 Gradient clipping,当梯度的范数超过某个值的时候对其进行缩放
然而对于梯度消失的问题,我们只能改变 RNN 结构,于是我们引入了 LSTM 这种结构
每个 cell 的结构大致如下:

f 就是一个遗忘门,i 和 g 是输入相关的门,o 是负责输出的
那为什么这样我们就可以解决梯度消失的问题呢?因为我们为梯度提供了一条快速通道!
就像上图红线所表示的那样,计算 \(c_t\) 的梯度的时候,我们就可以仅仅只乘以 \(f\),而不用乘以矩阵 W 了。因此可以更好地控制梯度的大小,减少梯度消失或梯度爆炸的风险。
如何控制梯度大小
一般情况下,我们可以将计算 f 的初始偏置项设置的比较大,这样我们得到的 f 就接近1了,也就是说我们的网路倾向于不遗忘。这样我们就可以更好地控制梯度,防止梯度直接消失