RNN,GRU,LSTM及其变种详解


参考Coursera-Sequence Models
https://www.coursera.org/learn/nlp-sequence-models/notebook/X20PE/building-a-recurrent-neural-network-step-by-step

1. 前馈神经网络的缺点

对于输入向量中个分量的位置信息不感知,也即无法利用序列型输入特征向量中的位置信息(将个分量调换顺序最后训练出的模型是等价的),但是在实际的任务中,各分量是有先后关系的。例如,我们在理解一段文本时,孤立地理解每个字或者词是不够的,还要将它们作为一个整体的序列来理解。

2. RNN的基本结构与数学定义

RNN的输入数据,一般有三个维度:batch大小,时间长度,特征维数。TensorFlow中的RNN层API的输入数据shape为[batch, timesteps, feature]。因为本节的图片来自Andrew NG的Coursera公开课中的例子,因此这里的RNN输入数据形状将以Andrew NG的习惯为例,这不影响原理的讲解。输入层的维数是 ( n x , m , T x ) (n_x,m,T_x) (nx,m,Tx),其中 n x n_x nx是每个训练样本的维数; m m m是一个batch的大小; T x T_x Tx是输入序列的长度。

输出层的维数是 ( n y , m , T y ) (n_y,m,T_y) (ny,m,Ty),其中 n y n_y ny是输出预测向量的维数; m m m是一个batch的大小; T y T_y Ty是输出序列的长度。

我们先研究输入向量和输出向量相等,即 n x = n y n_x=n_y nx=ny的情况,结构图如下所示(图片来源https://www.coursera.org/learn/nlp-sequence-models/notebook/X20PE/building-a-recurrent-neural-network-step-by-step)。
在这里插入图片描述

图2.1 RNN基本结构-输入输出维数相等

上下标说明: a 5 ( 2 ) [ 3 ] < 4 > a_5^{(2)[3]<4>} a5(2)[3]<4>表示第2个训练样本,第3层,第4个时刻,激活函数输出向量的第5维。
在这里插入图片描述

图2.2 RNN的一个基本单元

注意,输出 y ^ \hat y y^是状态向量 a a a经过线性变换再经过softmax变换得到的。

a ⟨ t ⟩ = t a n h ( W a x x ⟨ t ⟩ + W a a a ⟨ t − 1 ⟩ + b a ) y ^ ⟨ t ⟩ = s o f t m a x ( W y a a ⟨ t ⟩ + b y ) (2-1) \begin{aligned} a^{\langle t\rangle}&=tanh\left(W_{ax}x^{\langle t\rangle}+W_{aa}a^{\langle t-1\rangle}+b_a\right)\\ \hat y^{\langle t\rangle}&=softmax\left(W_{ya}a^{\langle t\rangle}+b_y\right)\\ \tag{2-1} \end{aligned} aty^t=tanh(Waxxt+Waaat1+ba)=softmax(Wyaat+by)(2-1)

3. GRU(Gated Recurrent Unit)

GRU的提出是为了解决RNN难以学习到输入序列中的长距离信息的问题。
GRU引入一个新的变量——记忆单元,简称 C C C C ⟨ t ⟩ C^{\langle t\rangle} Ct其实就是 a ⟨ t ⟩ a^{\langle t\rangle} at
C C C的表达式不是一步到位的,首先定义 C C C的候选值 C ~ \tilde C C~:
C ~ ⟨ t ⟩ = t a n h ( W c [ C ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b c ) \tilde C^{\langle t\rangle}=tanh\left(W_c[C^{\langle t-1\rangle},x^{\langle t\rangle}]+b_c\right) C~t=tanh(Wc[Ct1,xt]+bc)
更新门:
Γ u = σ ( W u [ C ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b u ) \Gamma_u=\sigma\left(W_u[C^{\langle t-1\rangle},x^{\langle t\rangle}]+b_u\right) Γu=σ(Wu[Ct1,xt]+bu)
在实际训练好的网络中 Γ \Gamma Γ要么很接近1要么很接近0,对应着输入序列里面有些元素起作用有些元素不起作用。
C ⟨ t ⟩ = Γ u ∗ C ~ ⟨ t ⟩ + ( 1 − Γ u ) ∗ C ⟨ t − 1 ⟩ C^{\langle t\rangle}=\Gamma_u*\tilde C^{\langle t\rangle}+(1-\Gamma_u)* C^{\langle t-1\rangle} Ct=ΓuC~t+1ΓuCt1

也即输入序列的有些元素,记忆单元不需要更新,有些元素需要更新。

The cat, which already ate …, was full
cat后面的词直到was之前,都不需要更新 C C C,直接等于cat对应的 C C C
可以解决梯度消失的问题.输出层的梯度可以传播到cat处

注: C C C Γ \Gamma Γ都可以是想聊,它们在相乘时采用的是element-wise的乘法。当为向量时,与cat的单复数无关的词对应的 Γ \Gamma Γ可能有些维度为零,有些维度不为零。为零的维度,是用来保留cat的单复数信息的;不为零的维度可能是保留其他语义信息的,比如是不是food呀之类的
目前讨论的是简化版的GRU,结构图如下
在这里插入图片描述

完整的GRU:

C ~ ⟨ t ⟩ = t a n h ( W c [ Γ r ∗ C ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b c ) Γ u = σ ( W u [ C ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b u ) Γ r = σ ( W r [ C ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b r ) C ⟨ t ⟩ = Γ u ∗ C ~ ⟨ t ⟩ + ( 1 − Γ u ) ∗ C ⟨ t − 1 ⟩ a ⟨ t ⟩ = C ⟨ t ⟩ (3-1) \begin{aligned} \tilde C^{\langle t\rangle}&=tanh\left(W_c[\Gamma_r*C^{\langle t-1\rangle},x^{\langle t\rangle}]+b_c\right)\\ \Gamma_u&=\sigma\left(W_u[C^{\langle t-1\rangle},x^{\langle t\rangle}]+b_u\right)\\ \Gamma_r&=\sigma\left(W_r[C^{\langle t-1\rangle},x^{\langle t\rangle}]+b_r\right)\\ C^{\langle t\rangle}&=\Gamma_u*\tilde C^{\langle t\rangle}+(1-\Gamma_u)* C^{\langle t-1\rangle}\\ a^{\langle t\rangle}&=C^{\langle t\rangle}\\ \tag{3-1} \end{aligned} C~tΓuΓrCtat=tanh(Wc[ΓrCt1,xt]+bc)=σ(Wu[Ct1,xt]+bu)=σ(Wr[Ct1,xt]+br)=ΓuC~t+1ΓuCt1=Ct(3-1)
Γ r \Gamma_r Γr表示了 C ~ ⟨ t ⟩ \tilde C^{\langle t\rangle} C~t C ⟨ t − 1 ⟩ C^{\langle t-1\rangle} Ct1之间的相关程度

4 LSTM(Long Short-Term Memory)

没有了 Γ r \Gamma_r Γr,将 1 − Γ u 1-\Gamma_u 1Γu Γ f \Gamma_f Γf代替
C ~ ⟨ t ⟩ = t a n h ( W c [ a ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b c ) Γ u = σ ( W u [ a ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b u ) Γ f = σ ( W f [ a ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b f ) Γ o = σ ( W o [ a ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b o ) C ⟨ t ⟩ = Γ u ∗ C ~ ⟨ t ⟩ + Γ f ∗ C ⟨ t − 1 ⟩ a ⟨ t ⟩ = Γ o ∗ t a n h ( C ⟨ t ⟩ ) y ~ ⟨ t ⟩ = s o f t m a x ( a ⟨ t ⟩ ) (4-1) \begin{aligned} \tilde C^{\langle t\rangle}&=tanh\left(W_c[a^{\langle t-1\rangle},x^{\langle t\rangle}]+b_c\right)\\ \Gamma_u&=\sigma\left(W_u[a^{\langle t-1\rangle},x^{\langle t\rangle}]+b_u\right)\\ \Gamma_f&=\sigma\left(W_f[a^{\langle t-1\rangle},x^{\langle t\rangle}]+b_f\right)\\ \Gamma_o&=\sigma\left(W_o[a^{\langle t-1\rangle},x^{\langle t\rangle}]+b_o\right)\\ C^{\langle t\rangle}&=\Gamma_u*\tilde C^{\langle t\rangle}+\Gamma_f* C^{\langle t-1\rangle}\\ a^{\langle t\rangle}&=\Gamma_o*tanh\left(C^{\langle t\rangle}\right)\\ \tilde y^{\langle t\rangle}&=softmax(a^{\langle t\rangle})\\ \tag{4-1} \end{aligned} C~tΓuΓfΓoCtaty~t=tanh(Wc[at1,xt]+bc)=σ(Wu[at1,xt]+bu)=σ(Wf[at1,xt]+bf)=σ(Wo[at1,xt]+bo)=ΓuC~t+ΓfCt1=Γotanh(Ct)=softmax(at)(4-1)
(注意公式里面的 Γ u \Gamma_u Γu等价于图片中的 Γ i \Gamma_i Γi)
在这里插入图片描述

图4.1 LSTM的一个基本单元

在这里插入图片描述

图4.2 标准LSTM模型-输入维数等于输出维数]

4.1. peephole连接

在这里插入图片描述

图4.3 LSTM变种-peephole

C ~ ⟨ t ⟩ = t a n h ( W c [ a ⟨ t − 1 ⟩ , a ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b c ) Γ u = σ ( W u [ c ⟨ t − 1 ⟩ , a ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b u ) Γ f = σ ( W f [ c ⟨ t − 1 ⟩ , a ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b f ) Γ o = σ ( W o [ c ⟨ t ⟩ , a ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b o ) C ⟨ t ⟩ = Γ u ∗ C ~ ⟨ t ⟩ + Γ f ∗ C ⟨ t − 1 ⟩ a ⟨ t ⟩ = Γ o ∗ t a n h ( C ⟨ t ⟩ ) y ~ ⟨ t ⟩ = s o f t m a x ( a ⟨ t ⟩ ) (4-2) \begin{aligned} \tilde C^{\langle t\rangle}&=tanh\left(W_c[a^{\langle t-1\rangle},a^{\langle t-1\rangle},x^{\langle t\rangle}]+b_c\right)\\ \Gamma_u&=\sigma\left(W_u[c^{\langle t-1\rangle},a^{\langle t-1\rangle},x^{\langle t\rangle}]+b_u\right)\\ \Gamma_f&=\sigma\left(W_f[c^{\langle t-1\rangle},a^{\langle t-1\rangle},x^{\langle t\rangle}]+b_f\right)\\ \Gamma_o&=\sigma\left(W_o[c^{\langle t\rangle},a^{\langle t-1\rangle},x^{\langle t\rangle}]+b_o\right)\\ C^{\langle t\rangle}&=\Gamma_u*\tilde C^{\langle t\rangle}+\Gamma_f* C^{\langle t-1\rangle}\\ a^{\langle t\rangle}&=\Gamma_o*tanh\left(C^{\langle t\rangle}\right)\\ \tilde y^{\langle t\rangle}&=softmax(a^{\langle t\rangle})\\ \tag{4-2} \end{aligned} C~tΓuΓfΓoCtaty~t=tanh(Wc[at1,at1,xt]+bc)=σ(Wu[ct1,at1,xt]+bu)=σ(Wf[ct1,at1,xt]+bf)=σ(Wo[ct,at1,xt]+bo)=ΓuC~t+ΓfCt1=Γotanh(Ct)=softmax(at)(4-2)

4.2 projection

对隐藏层状态a进行一次线性变换,降低其维数
C ~ ⟨ t ⟩ = t a n h ( W c [ a ⟨ t − 1 ⟩ , a ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b c ) Γ u = σ ( W u [ c ⟨ t − 1 ⟩ , a ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b u ) Γ f = σ ( W f [ c ⟨ t − 1 ⟩ , a ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b f ) Γ o = σ ( W o [ c ⟨ t ⟩ , a ⟨ t − 1 ⟩ , x ⟨ t ⟩ ] + b o ) C ⟨ t ⟩ = Γ u ∗ C ~ ⟨ t ⟩ + Γ f ∗ C ⟨ t − 1 ⟩ a 0 ⟨ t ⟩ = Γ o ∗ t a n h ( C ⟨ t ⟩ ) a ⟨ t ⟩ = W p r o j a 0 ⟨ t ⟩ + b p r o j y ~ ⟨ t ⟩ = s o f t m a x ( a ⟨ t ⟩ ) (4-3) \begin{aligned} \tilde C^{\langle t\rangle}&=tanh\left(W_c[a^{\langle t-1\rangle},a^{\langle t-1\rangle},x^{\langle t\rangle}]+b_c\right)\\ \Gamma_u&=\sigma\left(W_u[c^{\langle t-1\rangle},a^{\langle t-1\rangle},x^{\langle t\rangle}]+b_u\right)\\ \Gamma_f&=\sigma\left(W_f[c^{\langle t-1\rangle},a^{\langle t-1\rangle},x^{\langle t\rangle}]+b_f\right)\\ \Gamma_o&=\sigma\left(W_o[c^{\langle t\rangle},a^{\langle t-1\rangle},x^{\langle t\rangle}]+b_o\right)\\ C^{\langle t\rangle}&=\Gamma_u*\tilde C^{\langle t\rangle}+\Gamma_f* C^{\langle t-1\rangle}\\ a_0^{\langle t\rangle}&=\Gamma_o*tanh\left(C^{\langle t\rangle}\right)\\ a^{\langle t\rangle}&=W_{proj}a_0^{\langle t\rangle}+b_{proj}\\ \tilde y^{\langle t\rangle}&=softmax(a^{\langle t\rangle})\\ \tag{4-3} \end{aligned} C~tΓuΓfΓoCta0taty~t=tanh(Wc[at1,at1,xt]+bc)=σ(Wu[ct1,at1,xt]+bu)=σ(Wf[ct1,at1,xt]+bf)=σ(Wo[ct,at1,xt]+bo)=ΓuC~t+ΓfCt1=Γotanh(Ct)=Wproja0t+bproj=softmax(at)(4-3)

5. RNN的反向传播

d L / d i = d L / d a ⋅ d a / d z ⋅ d z / d i dL/di=dL/da\cdot da/dz\cdot dz/di dL/di=dL/dada/dzdz/di

5. RNN实战技巧

5.1. 对梯度的范围进行限制

在反向传播的过程中,为了避免梯度爆炸,可以对梯度的值进行限制,具体来说,可以给定一个区间[-a,a],小于-a的值强行定为-a,大于a的值强行定为a

5.2. 对输出值进行采样

  • 0
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值