RNN、LSTM、GRU比较及部分部分代码实现与讲解

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

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

RNN

RNN的定义

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

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

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

  • x t R 3000  xt∈R3000,第t t步的输入,是一个one-hot向量,代表3000个汉字中的某一个。
  • o t R 3000  ot∈R3000,第t t步的输出,类型同x t  xt
  • s t R 50  st∈R50,第t t步的隐藏状态,是一个包含50个元素的向量。RNN展开后每一步的隐藏状态是不同的。
  • UR 503000  U∈R50∗3000,在展开后的每一步都是相同的。
  • VR 300050  V∈R3000∗50,在展开后的每一步都是相同的。
  • WR 5050  W∈R50∗50,在展开后的每一步都是相同的。

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

  • s t =tanh(Ux t +Ws t1 ) st=tanh(Uxt+Wst−1)
  • o t =softmax(Vs t ) ot=softmax(Vst)
RNN的训练

为了训练网络,必须对其进行训练。需要计算预测字和输入字之间的误差来修改网络中的参数,进而优化模型。使用cross-entropy损失函数来计算误差。假设输入文本中有N N个字(总字数,N N个字中间可能有重复出现的),而字典大小为C C,则正确输入y y和预测输出o o之间的总误差可以用如下的公式来表示。

L(y,o)=1N Σ nN y n logo n  L(y,o)=−1NΣn∈Nynlogon

训练的目的是找到合适的 U,V,W U,V,W,使得误差函数的取值最小。按照深度学习的传统做法,使用随机梯度下降法SGD(Stochastic Gradient Descent),也就是要求出误差函数对 U,V,W U,V,W的偏导数 LU ,LV ,LW  ∂L∂U,∂L∂V,∂L∂W。传统深度学习算法在对参数求导时,使用了后向传播(Backpropagation)算法,但是在RNN中,因为要考虑到时序因素,所以使用的是“经历时间的后向传播算法”,BPTT(Backpropagation Through Time)。下面通过例子展示它与传统的算法存在着不同。

为方便描述,在误差函数L L的基础上,我们重新定义了一个函数。

E t (y t ,o t )=y t logo t  Et(yt,ot)=−ytlogot

那么,根据之前的定义,可以知道 L L E t  Et之间存在着下述关系。
L=1N Σ tN E t  L=1NΣt∈NEt

不失一般性,考虑E 3  E3V V的求导。

E 3 V =E 3 o 3  o 3 V  ∂E3∂V=∂E3∂o3∂o3∂V

根据o 3  o3的定义,它的值取决于V Vs 3  s3的乘积,而s 3  s3的取值与V V无关,所以上面式子成立。值得注意的是,E 3  E3的运算结果是一个one-hot向量,V V是一个矩阵。所以E 3 V  ∂E3∂V是一个矩阵的形式,初步展开如下。

E 3 =⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢  y (1) 3 logo (1) 3   ......  y (3000) 3 logo (3000) 3   ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ E 3 V =⎡ ⎣ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢ ⎢  (y (1) 3 logo (1) 3 )/V  ......  (y (3000) 3 logo (3000) 3 )/V  ⎤ ⎦ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥ ⎥  E3=[ −y3(1)logo3(1)  ......  −y3(3000)logo3(3000) ]⇒∂E3∂V=[ ∂(−y3(1)logo3(1))/∂V  ......  ∂(−y3(3000)logo3(3000))/∂V ]

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

E 3 W =E 3 o 3  o 3 
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值