1 RNN结构

    RNN,循环神经网络。首先看一个简单的循环神经网络,由输入层、一个隐藏层和一个输出层组成:

NLP_task8:循环神经网络

其中,U是输入层到隐藏层的权重矩阵,o是输出层的值,V是隐藏层到输出层的权重矩阵,权重矩阵W是隐藏层上一次的值作为下一次输入的权重。一般的循环神经网络如下图:

NLP_task8:循环神经网络

在这个网络中,时刻t接收到输入NLP_task8:循环神经网络之后,隐藏层的值是NLP_task8:循环神经网络,输出值是NLP_task8:循环神经网络。从网络中可以看出,NLP_task8:循环神经网络不仅取决于NLP_task8:循环神经网络,还取决于NLP_task8:循环神经网络。我们可以用下面的公式来表示循环神经网络的计算方法:

                                                    NLP_task8:循环神经网络

相应的RNN总括图:

NLP_task8:循环神经网络

上述来自博客:一文搞懂RNN(循环神经网络)基础篇

2 双向RNN

BiRNN(Bi-directional RNN)由Schuster在“Bidirectional recurrent neural networks,1997”中提出,是单向RNN的一种扩展形式。普通RNN只关注上文,而BiBRNN则同时关注上下文,能够利用更多的信息进行预测。结构上,BiRNN由两个方向相反的RNN构成,这两个RNN连接着同一个输出层。这就达到了上述的同时关注上下文的目的。其具体结构如下:

NLP_task8:循环神经网络

 

3 LSTM的结构

为解决Gradient Vanish的问题,Hochreiter&Schmidhuber在论文“Long short-term memory,1997”中提出了LSTM(Long Short-Term Memory)。原始的LSTM只有Input Gate、Output Gate。由Gers在“Learning to Forget: Continual Prediction with LSTM,2000”中提出的改进版本,有Forget Gate。后来在"LSTM Recurrent Networks Learn Simple Context Free and Context Sensitive Languages, 2001"中 Gers 又加入了 Peephole Connection 的概念。同时,现在常用的深度学习框架 Tensorflow、Pytorch 等在实现 LSTM 上也有一些细微的区别。以上所说的虽然本质都是 LSTM,但结构上还是有所区别,在使用时需要注意一下。下文介绍的 LSTM 是"Traditional LSTM with Forget Gates"版本。

Traditional LSTM with Forget Gates

LSTM 其实就是将 RNN 中 Hidden Layer 的一个神经元,用一个更加复杂的结构替换,称为 Memory Block。单个 Memory Block 的结构如下(图中的虚线为 Peephole Connection,忽略即可)

NLP_task8:循环神经网络

先对其中结构进行简要介绍:

1)Input Gate, Output Gate, Forget Gate:这三个 Gate 本质上就是权值,形象点则类似电路中用于控制电流的开关。当值为1,表示开关闭合,流量无损耗流过;当值为0,表示开关打开,完全阻塞流量;当值介于(0,1),则表示流量通过的程度。而这种NLP_task8:循环神经网络的取值,其实就是通过 Sigmoid 函数实现的

2)Cell:Cell 表示当前 Memory Block 的状态,对应于原始 RNN 中的 Hidden Layer 的神经元

3)Activation Function:图中多处出现了 Activation Function(小圆圈+ sigmoid 曲线的图案),对这些 Activation Function 的选择有一个通用的标准。一般,对 Input Gate, Output Gate, Forget Gate,使用的 Activation Function 是 sigmoid 函数;对于 Input 和 Cell, Activation Function 使用 tanh 函数

其具体公式如下:

                                                             NLP_task8:循环神经网络

其中,NLP_task8:循环神经网络分别表示 Input Gate, Output Gate, Forget Gate;NLP_task8:循环神经网络表示 Input;NLP_task8:循环神经网络表示 Output;NLP_task8:循环神经网络表示 Cell 在时刻NLP_task8:循环神经网络的状态;NLP_task8:循环神经网络表示向量 element-wise 的乘法.

4 GRU的结构

GRU(Gated Recurrent Unit) 是由 K.Cho 在"Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation, 2014"中提出的。它是 LSTM 的简化版本,但在大多数任务中其表现与 LSTM 不相伯仲,因此也成为了常用的 RNN 算法之一。

GRU 的具体结构与对应的公式如下:

NLP_task8:循环神经网络

                                                                                   NLP_task8:循环神经网络

      其中,NLP_task8:循环神经网络分别被称为 Reset Gate 和 Update Gate。可以看出,GRU 与 LSTM 有一定的相似性,而区别主要在于:

      1)LSTM 有三个 Gate,而 GRU 仅两个;

      2)GRU 没有 LSTM 中的 Cell,而是直接计算输出;

      3)GRU 中的 Update Gate 类似于 LSTM 中 Input Gate 和 Forget Gate 的融合;而观察它们结构中与上一时刻相连的 Gate,就能看出 LSTM 中的 Forget Gate 其实分裂成了 GRU 中的 Update Gate 和 Reset Gate。

很多实验都表明 GRU 跟 LSTM 的效果差不多,而 GRU 有更少的参数,因此相对容易训练且过拟合的问题要轻一点,在训练数据较少时可以试试。

5 LSTM梯度消失、爆炸的解决方案

在3节中提及的LSTM是为了解决RNN的Gradient Vanish的问题所提出的。RNN关于Gradient Vanish,本秩原因是因为矩阵高次幂导致的。在RNN的训练z中,更新参数的方式是BPTT(Back Propagation Through Time)。其计算梯度的方式和DNN中的BP类似,所以会存在Gradient Vanish和Gradient Explode。

下面介绍LSTM如何能够避免Gradient Vanish:

对于LSTM,有如下公式:NLP_task8:循环神经网络

模仿 RNN,我们对 LSTM 计算NLP_task8:循环神经网络,有

                                                                                         NLP_task8:循环神经网络

可以看出当NLP_task8:循环神经网络时,就算其余项很小,梯度仍然可以很好地传导到上一个时刻,此时即使层数较深也不会发生 Gradient Vanish 的问题;当NLP_task8:循环神经网络时,即上一时刻的信号不影响到当前时刻,则此项也会为0;NLP_task8:循环神经网络在这里控制着梯度传导到上一时刻的衰减程度,与它 Forget Gate 的功能一致。

对于 Gradient Explode,一般处理方法就是将梯度限制在一定范围内,即 Gradient Clipping。可以是通过阈值,也可以做动态的放缩.

上述来自博客:当我们在谈论 Deep Learning:RNN 其常见架构

6 Text-RNN原理

Text-RNN的结构:降维--->BiLSTM--->concat输出--->平均--->softmax

从结构上面简单来讲,就是根据BiLSTM做文本分类工作。

7 Recurrent Convolutional Neural Networks(RCNN)原理

RCNN结构:input--->embedding--->RNN+CNN--->max pooling--->Dense+softmax

它用左侧文本和右侧文本学习句子或文档中的每个单词表示:

表示当前单词=[left_side_context_vector,current_word_embedding,right_side_context_vector]

对于左侧文本,它使用一个循环结构,前一个单词的非线性转换和左侧上一个文本;类似于右侧文本。