RNN LSTM与GRU深度学习模型学习笔记

时间:2022-12-08 01:31:06

RNN(Recurrent Neural Network), LSTM(Long Short-Term Memory)与GRU(Gated Recurrent Unit)都是自然语言处理领域常见的深度学习模型。本文是一个关于这些模型的笔记,依次简单介绍了RNN, LSTM和GRU。在学习了大量的语言样本,从而建立一个自然语言的模型之后,可以实现下列两种功能。

  • 可以为一个句子打分,通过分值来评估句子的语法和语义的正确性。这个功能在机器翻译系统中非常有用。
  • 可以造句,能够模仿样本中语言的文风造出类似的句子。

RNN

RNN的定义

在传统的神经网络中,输入是相互独立的,但是在RNN中则不是这样。一条语句可以被视为RNN的一个输入样本,句子中的字或者词之间是有关系的,后面字词的出现要依赖于前面的字词。RNN被称为并发的(recurrent),是因为它以同样的方式处理句子中的每个字词,并且对后面字词的计算依赖于前面的字词。一个典型的RNN如下图所示。
RNN LSTM与GRU深度学习模型学习笔记
图中左边是RNN的一个基本模型,右边是模型展开之后的样子。展开是为了与输入样本匹配。假若输入时汉语句子,每个句子最长不超过20(包含标点符号),则把模型展开20次。

  • xt 代表输入序列中的第 t 步元素,例如语句中的一个汉字。一般使用一个one-hot向量来表示,向量的长度是训练所用的汉字的总数(或称之为字典大小),而唯一为1的向量元素代表当前的汉字。
  • st 代表第 t 步的隐藏状态,其计算公式为 st=tanh(Uxt+Wst1) 。也就是说,当前的隐藏状态由前一个状态和当前输入计算得到。考虑每一步隐藏状态的定义,可以把 st 视为一块内存,它保存了之前所有步骤的输入和隐藏状态信息。 s1 是初始状态,被设置为全0。
  • ot 是第 t 步的输出。可以把它看作是对第 t+1 步的输入的预测,计算公式为: ot=softmax(Vst) 。可以通过比较 ot xt+1 之间的误差来训练模型。
  • U,V,W 是RNN的参数,并且在展开之后的每一步中依然保持不变。这就大大减少了RNN中参数的数量。

假设我们要训练的中文样本中一共使用了3000个汉字,每个句子中最多包含50个字符,则RNN中每个参数的类型可以定义如下。

  • xtR3000 ,第 t 步的输入,是一个one-hot向量,代表3000个汉字中的某一个。
  • otR3000 ,第 t 步的输出,类型同 xt
  • stR50 ,第 t 步的隐藏状态,是一个包含50个元素的向量。RNN展开后每一步的隐藏状态是不同的。
  • UR503000 ,在展开后的每一步都是相同的。
  • VR300050 ,在展开后的每一步都是相同的。
  • WR5050 ,在展开后的每一步都是相同的。

其中 xt 是输入, U,V,W 是参数, st 是由输入和参数计算所得到的隐藏状态,而 ot 则是输出。 st ot 的计算公式已经给出,为清晰起见,重新写出。

  • st=tanh(Uxt+Wst1)
  • ot=softmax(Vst)

RNN的训练

为了训练网络,必须对其进行训练。需要计算预测字和输入字之间的误差来修改网络中的参数,进而优化模型。使用cross-entropy损失函数来计算误差。假设输入文本中有 N 个字(总字数, N 个字中间可能有重复出现的),而字典大小为 C ,则正确输入 y 和预测输出 o 之间的总误差可以用如下的公式来表示。
L(y,o)=1NΣnNynlogon
训练的目的是找到合适的 U,V,W ,使得误差函数的取值最小。按照深度学习的传统做法,使用随机梯度下降法SGD(Stochastic Gradient Descent),也就是要求出误差函数对 U,V,W 的偏导数 LU,LV,LW 。传统深度学习算法在对参数求导时,使用了后向传播(Backpropagation)算法,但是在RNN中,因为要考虑到时序因素,所以使用的是“经历时间的后向传播算法”,BPTT(Backpropagation Through Time)。下面通过例子展示它与传统的算法存在着不同。

为方便描述,在误差函数 L 的基础上,我们重新定义了一个函数。
Et(yt,ot)=ytlogot
那么,根据之前的定义,可以知道 L Et 之间存在着下述关系。
L=1NΣtNEt

不失一般性,考虑 E3 V 的求导。
E3V=E3o3o3V

根据 o3 的定义,它的值取决于 V s3 的乘积,而 s3 的取值与 V 无关,所以上面式子成立。值得注意的是, E3 的运算结果是一个one-hot向量, V 是一个矩阵。所以 E3V 是一个矩阵的形式,初步展开如下。
E3= y(1)3logo(1)3  ......  y(3000)3logo(3000)3 E3V= (y(1)3logo(1)3)/V  ......  (y(3000)3logo(3000)3)/V 

从上面式子可以看出,误差函数对参数 V 的求导与输入的序列特性没有关系。但是,对参数 W 的求导则不同。首先,求偏导的式子应该如下定义。
E3W=E3o3o3s3s3W

但是 s3W 的计算则比较复杂。因为根据 s3 的定义 s3=tanh(Uxt+Ws2) s2 也是一个与输入 W 有关的函数。所以有下列式子。
s3W=s3W+s3s2s2W

依次类推下去,可以有下列等式。
E3W=E3o3o3s3(s3W+s3s2s2W+s3s2s2s1s1W)

从上面式子可知,在对 W 求导时,需要从当前步骤的输入回溯到之前所有步骤,因此不可避免有偏导数的反馈消失问题。

LSTM

LSTM是为了解决RNN中的反馈消失问题而被提出的模型,它也可以被视为RNN的一个变种。与RNN相比,增加了3个门(gate):input门,forget门和output门,门的作用就是为了控制之前的隐藏状态、当前的输入等各种信息,确定哪些该丢弃,哪些该保留,如下图所示。
RNN LSTM与GRU深度学习模型学习笔记
LSTM的隐藏状态 g 的计算公式与RNN的类似: g=tanh(Ugxt+Wgst1) 。但是这个隐藏状态的输出却受到了各种门的控制。内部存储用 c 来表示,它由前一步的内部存储和当前的隐藏状态计算得出,并且受到input门和forget门的控制。前者确定当前隐藏状态中需要保留的信息,后者确定前一步的内部存储中需要保留的信息: ct=ct1f+gi 。LSTM的输出则使用 st 来表示,并且受输出门的控制: st=tanh(ct)o 。综上所述,第t步的LSTM中输出信息的计算公式如下。

  • i=σ(Uixt+Wist1)
  • f=σ(Ufxt+Wfst1)
  • o=σ(Uoxt+Wost1)
  • g=tanh(Ugxt+Wgst1)
  • ct=ct1f+gi
  • st=tanh(ct)o

公式中的变量 i,f,o,g,ct 的数据类型与 st 一样,是一个向量。圆点表示向量之间逐个元素相乘而得到一个新向量。这些式子具有以下特点。

  • 三个门input、forget、output具有相同的形式,只是参数不同。它们各自的参数 U,W 都需要在对样本的训练过程中学习。
  • 隐藏状态 g 的计算与RNN中的隐藏状态相同,但是不能直接使用,必须通过input门的约束,才能够作用到内部存储 ct 之中。
  • 当前的内部存储的计算,不仅依赖于当前的隐藏状态,也依赖于前一步的内部存储 ct1 ,并且 ct1 受forget门的约束。
  • 输出信息在 ct 的基础上又施加了一层tanh函数,并且受到输出门的约束。
  • 如果input门全为1,forget门全为0,output门全为1的话,则LSTM与RNN相似,只是多了一层tanh函数的作用。

总之,门机制的存在,就使得LSTM能够显示地为序列中长距离的依赖建模,通过对门参数的学习,网络能够找到合适的内部存储行为。

GRU

GRU具有与LSTM类似的结构,但是更为简化,如下图所示。
RNN LSTM与GRU深度学习模型学习笔记
GRU中状态与输出的计算包含以下步骤。

  • z=σ(Uzxt+Wzst1)
  • r=σ(Urxt+Wrst1)
  • h=tanh(Uhxt+Wh(st1r))
  • st=(1z)h+zst1

与LSTM相比,GRU存在着下述特点。

  • 门数不同。GRU只有两个门reset门r和update门z。
  • 在GRU中,r和z共同控制了如何从之前的隐藏状态( st1 )计算获得新的隐藏状态( st ),而取消了LSTM中的output门。
  • 如果reset门为1,而update门为0的话,则GRU完全退化为一个RNN。

LSTM与GRU的比较

经过实验,一般认为,LSTM和GRU之间并没有明显的优胜者。因为GRU具有较少的参数,所以训练速度快,而且所需要的样本也比较少。而LSTM具有较多的参数,比较适合具有大量样本的情况,可能会获得较优的模型。