深度学习中的循环神经网络
1. 循环神经网络的引入与简介
在前馈神经网络中,信息的传递是单向传递过程,这种学习方法使得网络很容易学习,但是也一定程度上限制了神经网络模型的学习能力。但是在很多任务中,存在一些网络的输入不仅和当前的输入有关系,也和网络的历史输入信息有关系,例如有限状态的自动机。时序数据的长度序列长度不是固定的,不可任意改变。循环神经网络在一定程度上解决了这一类问题,它是一种具有短期记忆能力的神经网络,广泛使用到语音识别、语言模型以及其他自然语言处理等等任务上。循环神经网络中的参数学习过程使用到随时间反向传播算法来进行学习。但是普通的神经网络学习过程中的长期依赖关系,会出现梯度爆炸和消失问题,对这个问题提出了LSTM,GRU以及能够使得循环神经网络加速的SRU神经网络。另外,循环神经网络很容易推广到广义上的记忆型神经网络:递归神经网络和图神经网络,当然也包含树形神经网络。
1.1 延时神经网络
延时神经网络中通过建立一个额外的延时单元来存储网络的历史信息(例如输入、输出、隐藏层状态信息等等)。延时神经网络中在t tt时刻,第l + 1 l+1l+1层神经网络和第l ll层神经元的最近p pp次输出相关,即
h t ( l + 1 ) = f ( h t ( l ) , h t − 1 ( l ) , . . . , h t − p ( l ) ) h_{t}^{(l+1)}=f(h_{t}^{(l)},h_{t-1}^{(l)},...,h_{t-p}^{(l)})ht(l+1)=f(ht(l),ht−1(l),...,ht−p(l))
这样对网络中输入和输出进行延时和神经元存储处理,神经网络就有了短期的记忆能力。
一般情况下函数f ( . ) f(.)f(.)是一种自回归模型,用变量y t y_{t}yt的历史信息来预测自己的输出信息:
y t = w 0 + ∑ t = 1 p w i y t − i + b t y_{t}=w_{0}+\sum\limits_{t=1}^{p}w_{i}y_{t-i}+b_{t}yt=w0+t=1∑pwiyt−i+bt
这是一种不包含输入信息的一种递归神经网络,下面是一种有外部输入的非线性自回归模型:
y t = f ( x t , x t − 1 , . . . , x t − p , y t − 1 , y t − 2 , . . . , y t − p ) y_{t}=f(x_{t},x_{t-1},...,x_{t-p},y_{t-1},y_{t-2},...,y_{t-p})yt=f(xt,xt−1,...,xt−p,yt−1,yt−2,...,yt−p)
1.2 同步学习模式和异步学习模式
同步的序列到序列模式主要使用序列标注任务,每一时刻都有输入和输出,输入的序列和输出序列的长度相同。例如对单词尽心词性标注的任务就必须对每一个单词进行标注处理。设输入为x 1 : T = { x 1 , . . . , x T } x_{1:T}=\{x_{1},...,x_{T}\}x1:T={x1,...,xT},输出为y ^ 1 : T { y ^ 1 , . . . , y ^ T } \hat y_{1:T}\{\hat y_{1},...,\hat y_{T}\}y^1:T{y^1,...,y^T},通常模型表达为
h t = f ( h t − 1 , x t ) h_{t}=f(h_{t-1},x_{t})ht=f(ht−1,xt)
y ^ t = g ( h t ) \hat y_{t}=g(h_{t})y^t=g(ht)
异步的序列到序列模式也称作编码器-解码器模型,输入序列和输出序列不需要有严格的对应关系,也没必要保持有相同的长度信息。例如机器翻译中自然语言处理任务。设输入的序列为x 1 : T = { x 1 , . . . , x T } x_{1:T}=\{x_{1},...,x_{T}\}x1:T={x1,...,xT},输出序列为y ^ 1 : M = { y ^ 1 , . . . , y ^ M } \hat y_{1:M}=\{\hat y_{1},...,\hat y_{M}\}y^1:M={y^1,...,y^M},那么通常模型表达为
h t = f 1 ( h t − 1 , x t ) , ∀ t ∈ [ 1 , T ] h_{t}=f_{1}(h_{t-1},x_{t}),\forall{t}\in{[1,T]}ht=f1(ht−1,xt),∀t∈[1,T]
h T + t = f 2 ( h T + t − 1 ) , ∀ t ∈ [ 1 , M ] h_{T+t}=f_{2}(h_{T+t-1}),\forall{t}\in{[1,M]}hT+t=f2(hT+t−1),∀t∈[1,M]
y ^ t = g ( h T + t ) , ∀ t ∈ [ 1 , M ] \hat y_{t}=g(h_{T+t}),\forall{t}\in{[1,M]}y^t=g(hT+t),∀t∈[1,M]
2. 梯度训练BPTT算法与RTRL算法
在循环神经网络中,梯度更新的方法主要有随时间反向传播算法和实时循环学习方法。给定一个训练样本( x , y ) (x,y)(x,y),其中x 1 : T = ( x 1 , . . . , x T ) x_{1:T}=(x_{1},...,x_{T})x1:T=(x1,...,xT)为长度是T TT的输入序列,y 1 , T = ( y 1 , . . . , y T ) y_{1,T}=(y_{1},...,y_{T})y1,T=(y1,...,yT)为长度为T TT的标签序列。我们定义时刻t tt的损失函数为
L t = L ( y t , g ( h t ) ) L_{t}=L(y_{t},g(h_{t}))Lt=L(yt,g(ht))
其中g ( h t ) g(h_{t})g(ht)为t tt时刻的输出,L LL为可微分的损失函数。那么整个序列的损失函数为
L = ∑ t = 1 T L t L=\sum\limits_{t=1}^{T}L_{t}L=t=1∑TLt
所以说,整个序列的损失函数L LL关于参数U UU的梯度为
∂ L ∂ U = ∑ t = 1 T ∂ L t ∂ U \frac{\partial L}{\partial U}=\sum\limits_{t=1}^{T}\frac{\partial L_{t}}{\partial U}∂U∂L=t=1∑T∂U∂Lt
所以通过这样可以进行梯度的传播。
2.1 BPTT算法
随时间反向传播算法中,主要计算上面偏导数∂ L ∂ U \frac{\partial L}{\partial U}∂U∂L。
参数U UU和隐藏层在每个时刻k ( 1 ≤ k ≤ t ) k(1\leq k\leq t)k(1≤k≤t)的净输入z k = U h k − 1 + W x k + b z_{k}=Uh_{k-1}+Wx_{k}+bzk=Uhk−1+Wxk+b,所以说第t tt时刻的损失函数L t L_{t}Lt关于参数u i j u_{ij}uij的梯度为
∂ L t ∂ u i j = ∑ k = 1 t ∂ z k ∂ u i j ⋅ ∂ L t ∂ z k \frac{\partial L_{t}}{\partial u_{ij}}=\sum\limits_{k=1}^{t}\frac{\partial z_{k}}{\partial u_{ij}}\cdot{\frac{\partial L_{t}}{\partial z_{k}}}∂uij∂Lt=k=1∑t∂uij∂zk⋅∂zk∂Lt
注意,这里的∂ z k ∂ u i j \frac{\partial z_{k}}{\partial u_{ij}}∂uij∂zk指的是直接的偏导数,即对于公式z k = U h k − 1 + W x k + b z_{k}=Uh_{k-1}+Wx_{k}+bzk=Uhk−1+Wxk+b中,把h k − 1 h_{k-1}hk−1作为常量来对其求偏导数。所以有以下求法
∂ z k ∂ u i j = [ 0 , . . . , [ h k − 1 ] j , . . , 0 ] = I i ( [ h k − 1 ] j ) \frac{\partial z_{k}}{\partial u_{ij}}=[0,...,[h_{k-1}]_{j},..,0]=\mathbb{I}_{i}([h_{k-1}]_{j})∂uij∂zk=[0,...,[hk−1]j,..,0]=Ii([hk−1]j)
其中[ h k − 1 ] j [h_{k-1}]_{j}[hk−1]j为第k − 1 k-1k−1时刻的隐藏层状态的第j jj维,I i ( x ) \mathbb{I}_{i}(x)Ii(x)指的是除了第i ii行值为x xx外,其余为0 00的行向量。
定义误差项δ t , k = ∂ L t ∂ z k \delta_{t,k}=\frac{\partial L_{t}}{\partial z_{k}}δt,k=∂zk∂Lt是第t tt时刻的损失对第k kk时刻隐藏层的净输入z k z_{k}zk的导数,则当1 ≤ k ≤ t 1\leq k\leq t1≤k≤t时
δ t , k = ∂ L t ∂ z k = ∂ h k ∂ z k ⋅ ∂ z k + 1 ∂ h k ⋅ ∂ L t ∂ z k + 1 = diag ( f ′ ( z k ) ) U T δ t , k + 1 = f ′ ( z k ) ⊙ ( U T δ t , k + 1 ) \delta_{t,k}=\frac{\partial L_{t}}{\partial z_{k}}=\frac{\partial h_{k}}{\partial z_{k}}\cdot{\frac{\partial z_{k+1}}{\partial h_{k}}}\cdot{\frac{\partial L_{t}}{\partial z_{k+1}}}\\ =\text{diag}(f^{'}(z_{k}))U^{T}\delta_{t,k+1}\\ =f^{'}(z_{k})\odot(U^{T}\delta_{t,k+1})δt,k=∂zk∂Lt=∂zk∂hk⋅∂hk∂zk+1⋅∂zk+1∂Lt=diag(f′(zk))UTδt,k+1=f′(zk)⊙(UTδt,k+1)
所以我们得到
∂ z k ∂ u i j = ∑ k = 1 t [ δ t , k ] i [ h k − 1 ] j \frac{\partial z_{k}}{\partial u_{ij}}=\sum\limits_{k=1}^{t}[\delta_{t,k}]_{i}[h_{k-1}]_{j}∂uij∂zk=k=1∑t[δt,k]i[hk−1]j
写成矩阵的形式为
∂ L t ∂ U = ∑ k = 1 t δ t , k h k − 1 T \frac{\partial L_{t}}{\partial U}=\sum\limits_{k=1}^{t}\delta_{t,k}h_{k-1}^{T}∂U∂Lt=k=1∑tδt,khk−1T
最后得到整个序列的梯度更新公式:
∂ L ∂ U = ∑ t = 1 T ∑ k = 1 t δ t , k h k − 1 T \frac{\partial L}{\partial U}=\sum\limits_{t=1}^{T}\sum_{k=1}^{t}\delta_{t,k}h_{k-1}^{T}∂U∂L=t=1∑Tk=1∑tδt,khk−1T
同理得到
∂ L ∂ W = ∑ t = 1 T ∑ k = 1 t δ t , k x k T \frac{\partial L}{\partial W}=\sum\limits_{t=1}^{T}\sum_{k=1}^{t}\delta_{t,k}x_{k}^{T}∂W∂L=t=1∑Tk=1∑tδt,kxkT
∂ L ∂ b = ∑ t = 1 T ∑ k = 1 t δ t , k \frac{\partial L}{\partial b}=\sum\limits_{t=1}^{T}\sum_{k=1}^{t}\delta_{t,k}∂b∂L=t=1∑Tk=1∑tδt,k
2.2 RTRL算法
反向传播中的BPTT算法不同的是,实时循环学习是通过前向传播的方式来进行梯度计算。
设循环神经网络中第t + 1 t+1t+1时刻的状态h t + 1 h_{t+1}ht+1为
h t + 1 = f ( z t + 1 ) = f ( U h t + W x t + 1 + b ) h_{t+1}=f(z_{t+1})=f(Uh_{t}+Wx_{t+1}+b)ht+1=f(zt+1)=f(Uht+Wxt+1+b)
则有以下的表达式
∂ h t + 1 ∂ u i j = ( ∂ z t + 1 ∂ u i j + ∂ h t ∂ u i j U T ) ∂ h t + 1 ∂ z t + 1 = ( I i ( [ h t ] j ) + ∂ h t ∂ u i j U T ) diag ( f ′ ( z t + 1 ) ) = ( I i ( [ h t ] j ) + ∂ h t ∂ u i j U T ) ⊙ ( f ′ ( z t + 1 ) ) T \frac{\partial h_{t+1}}{\partial u_{ij}}=(\frac{\partial z_{t+1}}{\partial u_{ij}}+\frac{\partial h_{t}}{\partial u_{ij}}U^{T})\frac{\partial h_{t+1}}{\partial z_{t+1}}\\ =(\mathbb{I}_{i}([h_{t}]_{j})+\frac{\partial h_{t}}{\partial u_{ij}}U^{T})\text{diag}(f^{'}(z_{t+1}))\\ =(\mathbb{I}_{i}([h_{t}]_{j})+\frac{\partial h_{t}}{\partial u_{ij}}U^{T})\odot(f^{'}(z_{t+1}))^{T}∂uij∂ht+1=(∂uij∂zt+1+∂uij∂htUT)∂zt+1∂ht+1=(Ii([ht]j)+∂uij∂htUT)diag(f′(zt+1))=(Ii([ht]j)+∂uij∂htUT)⊙(f′(zt+1))T
其中I i ( x ) \mathbb{I}_{i}(x)Ii(x)是除了第i ii行值为x xx之外,其余都为0 00的行向量。
所以在实时循环学习中,通过迭代递归的方法来进行参数的学习。
这两种算法都是基于梯度下降算法,分别通过前向方法和反向方法应用链式法则来计算梯度。循环神经网络中,一般网络输出的维度远低于输入的维度,故而BPTT算法的计算量会更小,但是在BPTT算法中需要保存所有时刻的中间梯度,空间复杂度比较高。RTRL算法不需要梯度回传,适合于在线学习或者无限序列的任务当中。
3. 常见的循环神经网络及其变体
作为递归神经网络的循环神经网络,其中有各种各样的神经网络。其中最为代表性的有RNN、LSTM、GRU等循环神经网络。这里我们先介绍同步学习的方法,即输入长度和输出长度一致,在梯度更新中我们使用BPTT算法。假设输入变量x 1 : T = { x 1 , . . . , x T } x_{1:T}=\{x_{1},...,x_{T}\}x1:T={x1,...,xT},标签向量y 1 : T = { y ^ 1 , . . . , y ^ T } y_{1:T}=\{\hat y_{1},...,\hat y_{T}\}y1:T={y^1,...,y^T}。RNN中最大的一个特点是,神经网络的偏置和权重值是共享的,接下来会介绍各种神经网络的原理及其应用。
3.1 RNN神经网络
RNN中最为普通的循环神经网络,假设在t tt时刻输出的隐藏层为h t h_{t}ht,则会有
h t = f ( W i h x t + b i h + W h h h t − 1 + b h h ) h_{t}=f(W_{ih}x_{t}+b_{ih}+W_{hh}h_{t-1}+b_{hh})ht=f(Wihxt+bih+Whhht−1+bhh)
净输入
z t = W i h x t + b i h + W h h h t − 1 + b h h z_{t}=W_{ih}x_{t}+b_{ih}+W_{hh}h_{t-1}+b_{hh}zt=Wihxt+bih+Whhht−1+bhh
设t时刻的损失函数为L t = L ( y ^ t , y t ) L_{t}=L(\hat y_{t},y_{t})Lt=L(y^t,yt),并且
L = ∑ t = 1 T L t L=\sum\limits_{t=1}^{T}L_{t}L=t=1∑TLt
在梯度更新中,根据上面公式的讨论,我们知道了误差递推公式如下所示:
δ t , k = diag ( f ′ ( z k ) W h h T δ t , k + 1 ) \delta_{t,k}=\text{diag}(f^{'}(z_{k})W_{hh}^{T}\delta_{t,k+1})δt,k=diag(f′(zk)WhhTδt,k+1)
梯度更新的表达式如下所示:
∂ L ∂ W h h = ∑ t = 1 T ∑ k = 1 t δ t , k h k − 1 T \frac{\partial L}{\partial W_{hh}}=\sum\limits_{t=1}^{T}\sum_{k=1}^{t}\delta_{t,k}h_{k-1}^{T}∂Whh∂L=t=1∑Tk=1∑tδt,khk−1T
∂ L ∂ W i h = ∑ t = 1 T ∑ k = 1 t δ t , k x k T \frac{\partial L}{\partial W_{ih}}=\sum\limits_{t=1}^{T}\sum_{k=1}^{t}\delta_{t,k}x_{k}^{T}∂Wih∂L=t=1∑Tk=1∑tδt,kxkT
∂ L ∂ b i h = ∑ t = 1 T ∑ k = 1 t δ t , k \frac{\partial L}{\partial b_{ih}}=\sum\limits_{t=1}^{T}\sum_{k=1}^{t}\delta_{t,k}∂bih∂L=t=1∑Tk=1∑tδt,k
∂ L ∂ b h h = ∑ t = 1 T ∑ k = 1 t δ t , k \frac{\partial L}{\partial b_{hh}}=\sum\limits_{t=1}^{T}\sum_{k=1}^{t}\delta_{t,k}∂bhh∂L=t=1∑Tk=1∑tδt,k
其中误差传播的更新表达式:
δ t , k = f ′ ( z k ) ⊙ ( W h h T δ t , k + 1 ) \delta_{t,k}=f^{'}(z_{k})\odot(W_{hh}^{T}\delta_{t,k+1})δt,k=f′(zk)⊙(WhhTδt,k+1)
一个最为典型的RNN网络包含一个输入x xx,一个输出h hh和一个神经网络单元。这个神经网络中只存在一个简单的回归循环单元,上一个时刻的网络状态信息会作用于下一个时刻的网络状态。可以表示为如下
普通的RNN神经网络中最大的问题就是长期依赖中的梯度消失或者梯度爆炸的问题。在BPTT算法中,将误差传播的递推表达式展开可以得到:
δ t , k = ∏ τ = k t − 1 ( diag ( f ′ ( z τ ) ) W h h T ) δ t , t ) \delta_{t,k}=\prod_{\tau=k}^{t-1}(\text{diag}(f^{'}(z_{\tau}))W_{hh}^{T})\delta_{t,t})δt,k=τ=k∏t−1(diag(f′(zτ))WhhT)δt,t)
那么,若γ = ∣ ∣ diag ( f ′ ( z τ ) ) W h h T ∣ ∣ \gamma=||\text{diag}(f^{'}(z_{\tau}))W_{hh}^{T}||γ=∣∣diag(f′(zτ))WhhT∣∣,则
δ t , k = γ t − k δ t , t \delta_{t,k}=\gamma^{t-k}\delta_{t,t}δt,k=γt−kδt,t
显然,根据指数函数的性质可知,若γ > 1 \gamma>1γ>1时,γ t − k → ∞ \gamma^{t-k}\rightarrow\inftyγt−k→∞。所以当间隔t − k t-kt−k比较大的时候,梯度很大,神经网络系统会很不稳定,被称为梯度爆炸问题。
若γ < 1 \gamma<1γ<1时,γ t − k → 0 \gamma^{t-k}\rightarrow0γt−k→0。所以当间隔t − k t-kt−k比较大的时候,梯度非常小,神经网络系统会出现深层中的梯度消失问题。
为解决上述梯度消失和梯度爆炸等问题,所以在此提出了门控机制进一步解决这类问题,提出了LSTM神经网络和GRU神经网络。
3.2 LSTM神经网络
这种神经网络被称作为长短期记忆(Long Short-Term Memory,LSTM)神经网络,从而有效地解决了梯度消失或者梯度爆炸的问题。主要引入了两个方面的内容:新的内部状态关系以及门控机制。引入门控制机制主要是将隐藏层中的一些变量控制在[ 0 , 1 ] [0,1][0,1]区间内使得信息按照一定的比例通过。LSTM神经网络可以由以下的公式来表达:
i t = σ ( W i i x t + b i i + W h i h t − 1 + b h i ) f t = σ ( W i f x t + b i f + W h f h t − 1 + b h f ) o t = σ ( W i o x t + b i o + W h o h t − 1 + b h o ) g t = tanh ( W i g x t + b i g + W h g h t − 1 + b h g ) c t = f t ⊙ c t − 1 + i t ⊙ g t h t = o t ⊙ tanh ( c t ) i_{t}=\sigma(W_{ii}x_{t}+b_{ii}+W_{hi}h_{t-1}+b_{hi})\\ f_{t}=\sigma(W_{if}x_{t}+b_{if}+W_{hf}h_{t-1}+b_{hf})\\ o_{t}=\sigma(W_{io}x_{t}+b_{io}+W_{ho}h_{t-1}+b_{ho})\\ g_{t}=\tanh(W_{ig}x_{t}+b_{ig}+W_{hg}h_{t-1}+b_{hg})\\ c_{t}=f_{t}\odot c_{t-1}+i_{t}\odot g_{t}\\ h_{t}=o_{t}\odot\tanh(c_{t})it=σ(Wiixt+bii+Whiht−1+bhi)ft=σ(Wifxt+bif+Whfht−1+bhf)ot=σ(Wioxt+bio+Whoht−1+bho)gt=tanh(Wigxt+big+Whght−1+bhg)ct=ft⊙ct−1+it⊙gtht=ot⊙tanh(ct)
上述公式中的三个门分别是输入门i t i_{t}it、遗忘门f t f_{t}ft和输出门o t o_{t}ot。这三个门主要的作用如下所示:
- 遗忘门f t f_{t}ft用于控制上一个时刻的内部状态c t − 1 c_{t-1}ct−1需要遗忘多少信息;
- 输入门i t i_{t}it控制当前时刻的候选状态g t g_{t}gt需要多少信息用来保存;
- 输出门o t o_{t}ot用于控制当前时刻的内部状态c t c_{t}ct有多少信息需要输出到外部状态h t h_{t}ht
特别地,当f t = 0 , i t = 1 f_{t}=0,i_{t}=1ft=0,it=1时候,记忆单元将历史信息清空,并且将候选状态向量g t g_{t}gt写入神经元中。当f t = 1 , i t = 0 f_{t}=1,i_{t}=0ft=1,it=0时候,记忆单元将复制上一个时刻的内容,不写入新的信息。
σ ( . ) \sigma(.)σ(.)函数表示sigmoid激活函数,用于控制这些信息的流动大小。在BPTT算法中,依旧设t tt时刻的损失函数为L t = L ( y ^ t , y t ) L_{t}=L(\hat y_{t},y_{t})Lt=L(y^t,yt),则
L = ∑ t = 1 T L t L=\sum\limits_{t=1}^{T}L_{t}L=t=1∑TLt
设
z i t = W i i x t + b i i + W h i h t − 1 + b h i z f t = W i f x t + b i f + W h f h t − 1 + b h f z g t = W i g x t + b i g + W h g h t − 1 + b h g z o t = W i o x t + b i o + W h o h t − 1 + b h o zi_{t}=W_{ii}x_{t}+b_{ii}+W_{hi}h_{t-1}+b_{hi}\\ zf_{t}=W_{if}x_{t}+b_{if}+W_{hf}h_{t-1}+b_{hf}\\ zg_{t}=W_{ig}x_{t}+b_{ig}+W_{hg}h_{t-1}+b_{hg}\\ zo_{t}=W_{io}x_{t}+b_{io}+W_{ho}h_{t-1}+b_{ho}zit=Wiixt+bii+Whiht−1+bhizft=Wifxt+bif+Whfht−1+bhfzgt=Wigxt+big+Whght−1+bhgzot=Wioxt+bio+Whoht−1+bho
所以,对应的偏导数满足以下条件
∂ L t ∂ ( W h i ) j k = ∑ s = 1 t ∂ z i s ∂ ( W h i ) j k ⋅ ∂ L t ∂ z i s \frac{\partial L_{t}}{\partial (W_{hi})_{jk}}=\sum\limits_{s=1}^{t}\frac{\partial zi_{s}}{\partial (W_{hi})_{jk}}\cdot{\frac{\partial L_{t}}{\partial zi_{s}}}∂(Whi)jk∂Lt=s=1∑t∂(Whi)jk∂zis⋅∂zis∂Lt
∂ L t ∂ ( W h f ) j k = ∑ s = 1 t ∂ z f s ∂ ( W h f ) j k ⋅ ∂ L t ∂ z f s \frac{\partial L_{t}}{\partial (W_{hf})_{jk}}=\sum\limits_{s=1}^{t}\frac{\partial zf_{s}}{\partial (W_{hf})_{jk}}\cdot{\frac{\partial L_{t}}{\partial zf_{s}}}∂(Whf)jk∂Lt=s=1∑t∂(Whf)jk∂zfs⋅∂zfs∂Lt
∂ L t ∂ ( W h g ) j k = ∑ s = 1 t ∂ z g s ∂ ( W h g ) j k ⋅ ∂ L t ∂ z g s \frac{\partial L_{t}}{\partial (W_{hg})_{jk}}=\sum\limits_{s=1}^{t}\frac{\partial zg_{s}}{\partial (W_{hg})_{jk}}\cdot{\frac{\partial L_{t}}{\partial zg_{s}}}∂(Whg)jk∂Lt=s=1∑t∂(Whg)jk∂zgs⋅∂zgs∂Lt
∂ L t ∂ ( W h o ) j k = ∑ s = 1 t ∂ z o s ∂ ( W h o ) j k ⋅ ∂ L t ∂ z o s \frac{\partial L_{t}}{\partial (W_{ho})_{jk}}=\sum\limits_{s=1}^{t}\frac{\partial zo_{s}}{\partial (W_{ho})_{jk}}\cdot{\frac{\partial L_{t}}{\partial zo_{s}}}∂(Who)jk∂Lt=s=1∑t∂(Who)jk∂zos⋅∂zos∂Lt
根据求导公式可以得到
∂ z i s ∂ ( W h i ) j k = I j ( [ h s − 1 ] k ) \frac{\partial zi_{s}}{\partial (W_{hi})_{jk}}=\mathbb{I}_{j}([h_{s-1}]_{k})∂(Whi)jk∂zis=Ij([hs−1]k)
∂ z i s ∂ ( W h f ) j k = I j ( [ h s − 1 ] k ) \frac{\partial zi_{s}}{\partial (W_{hf})_{jk}}=\mathbb{I}_{j}([h_{s-1}]_{k})∂(Whf)jk∂zis=Ij([hs−1]k)
∂ z i s ∂ ( W h g ) j k = I j ( [ h s − 1 ] k ) \frac{\partial zi_{s}}{\partial (W_{hg})_{jk}}=\mathbb{I}_{j}([h_{s-1}]_{k})∂(Whg)jk∂zis=Ij([hs−1]k)
∂ z i s ∂ ( W h o ) j k = I j ( [ h s − 1 ] k ) \frac{\partial zi_{s}}{\partial (W_{ho})_{jk}}=\mathbb{I}_{j}([h_{s-1}]_{k})∂(Who)jk∂zis=Ij([hs−1]k)
其中,每一个导数的误差项,有以下的推导式
δ i t , s = ∂ L t ∂ z i s = ∂ h s ∂ z i s ⋅ ∂ z i s + 1 ∂ h s ⋅ ∂ L t ∂ z i s + 1 = ∂ h s ∂ z i s ( W h i T δ t , s + 1 ) \delta i_{t,s}=\frac{\partial L_{t}}{\partial zi_{s}}=\frac{\partial h_{s}}{\partial zi_{s}}\cdot{\frac{\partial zi_{s+1}}{\partial h_{s}}}\cdot{\frac{\partial L_{t}}{\partial zi_{s+1}}}\\ =\frac{\partial h_{s}}{\partial zi_{s}}(W_{hi}^{T}\delta_{t,s+1})δit,s=∂zis∂Lt=∂zis∂hs⋅∂hs∂zis+1⋅∂zis+1∂Lt=∂zis∂hs(WhiTδt,s+1)
δ f t , s = ∂ L t ∂ z f s = ∂ h s ∂ z f s ⋅ ∂ z f s + 1 ∂ h s ⋅ ∂ L t ∂ z f s + 1 = ∂ h s ∂ z f s ( W h f T δ f t , s + 1 ) \delta f_{t,s}=\frac{\partial L_{t}}{\partial zf_{s}}=\frac{\partial h_{s}}{\partial zf_{s}}\cdot{\frac{\partial zf_{s+1}}{\partial h_{s}}}\cdot{\frac{\partial L_{t}}{\partial zf_{s+1}}}\\ =\frac{\partial h_{s}}{\partial zf_{s}}(W_{hf}^{T}\delta f_{t,s+1})δft,s=∂zfs∂Lt=∂zfs∂hs⋅∂hs∂zfs+1⋅∂zfs+1∂Lt=∂zfs∂hs(WhfTδft,s+1)
δ g t , s = ∂ L t ∂ z g s = ∂ h s ∂ z g s ⋅ ∂ z g s + 1 ∂ h s ⋅ ∂ L t ∂ z g s + 1 = ∂ h s ∂ z g s ( W h g T δ g t , s + 1 ) \delta g_{t,s}=\frac{\partial L_{t}}{\partial zg_{s}}=\frac{\partial h_{s}}{\partial zg_{s}}\cdot{\frac{\partial zg_{s+1}}{\partial h_{s}}}\cdot{\frac{\partial L_{t}}{\partial zg_{s+1}}}\\ =\frac{\partial h_{s}}{\partial zg_{s}}(W_{hg}^{T}\delta g_{t,s+1})δgt,s=∂zgs∂Lt=∂zgs∂hs⋅∂hs∂zgs+1⋅∂zgs+1∂Lt=∂zgs∂hs(WhgTδgt,s+1)
δ o t , s = ∂ L t ∂ z o s = ∂ h s ∂ z o s ⋅ ∂ z o s + 1 ∂ h s ⋅ ∂ L t ∂ z o s + 1 = ∂ h s ∂ z o s ( W h f T δ o t , s + 1 ) \delta o_{t,s}=\frac{\partial L_{t}}{\partial zo_{s}}=\frac{\partial h_{s}}{\partial zo_{s}}\cdot{\frac{\partial zo_{s+1}}{\partial h_{s}}}\cdot{\frac{\partial L_{t}}{\partial zo_{s+1}}}\\ =\frac{\partial h_{s}}{\partial zo_{s}}(W_{hf}^{T}\delta o_{t,s+1})δot,s=∂zos∂Lt=∂zos∂hs⋅∂hs∂zos+1⋅∂zos+1∂Lt=∂zos∂hs(WhfTδot,s+1)
而
∂ h s ∂ z i s = ∂ h s ∂ c s ⋅ ∂ c s ∂ i s ⋅ ∂ i s ∂ z i s = o s ⊙ tanh ′ ( c s ) ⊙ g s ⋅ diag ( σ ′ ( z i s ) ) \frac{\partial h_{s}}{\partial zi_{s}}=\frac{\partial h_{s}}{\partial c_{s}}\cdot{\frac{\partial c_{s}}{\partial i_{s}}}\cdot{\frac{\partial i_{s}}{\partial zi_{s}}}=o_{s}\odot{\tanh^{'}(c_{s})}\odot{g_{s}}\cdot{\text{diag}(\sigma^{'}(zi_{s}))}∂zis∂hs=∂cs∂hs⋅∂is∂cs⋅∂zis∂is=os⊙tanh′(cs)⊙gs⋅diag(σ′(zis))
∂ h s ∂ z g s = ∂ h s ∂ c s ⋅ ∂ c s ∂ g s ⋅ ∂ g s ∂ z i s = o s ⊙ tanh ′ ( c s ) ⊙ i s ⋅ diag ( tanh ′ ( z i s ) ) \frac{\partial h_{s}}{\partial zg_{s}}=\frac{\partial h_{s}}{\partial c_{s}}\cdot{\frac{\partial c_{s}}{\partial g_{s}}}\cdot{\frac{\partial g_{s}}{\partial zi_{s}}}=o_{s}\odot{\tanh^{'}(c_{s})}\odot{i_{s}}\cdot{\text{diag}(\tanh^{'}(zi_{s}))}∂zgs∂hs=∂cs∂hs⋅∂gs∂cs⋅∂zis∂gs=os⊙tanh′(cs)⊙is⋅diag(tanh′(zis))
∂ h s ∂ z f s = ∂ h s ∂ c s ⋅ ∂ c s ∂ f s ⋅ ∂ f s ∂ z f s = o s ⊙ tanh ′ ( c s ) ⊙ c s − 1 ⋅ diag ( σ ′ ( z f s ) ) \frac{\partial h_{s}}{\partial zf_{s}}=\frac{\partial h_{s}}{\partial c_{s}}\cdot{\frac{\partial c_{s}}{\partial f_{s}}}\cdot{\frac{\partial f_{s}}{\partial zf_{s}}}=o_{s}\odot{\tanh^{'}(c_{s})}\odot{c_{s-1}}\cdot{\text{diag}(\sigma^{'}(zf_{s}))}∂zfs∂hs=∂cs∂hs⋅∂fs∂cs⋅∂zfs∂fs=os⊙tanh′(cs)⊙cs−1⋅diag(σ′(zfs))
∂ h s ∂ z o s = ∂ h s ∂ o s ⋅ ∂ o s ∂ z o s = tanh ( c s ) ⋅ diag ( σ ′ ( z o s ) ) \frac{\partial h_{s}}{\partial zo_{s}}=\frac{\partial h_{s}}{\partial o_{s}}\cdot{\frac{\partial o_{s}}{\partial zo_{s}}}=\tanh(c_{s})\cdot{\text{diag}(\sigma^{'}(zo_{s}))}∂zos∂hs=∂os∂hs⋅∂zos∂os=tanh(cs)⋅diag(σ′(zos))
所以有
δ i t , s = ∂ L t ∂ z i s = ( o s ⊙ tanh ′ ( c s ) ⊙ g s ) ⊙ diag ( σ ′ ( z i s ) ) W h i T δ t , s + 1 \delta i_{t,s}=\frac{\partial L_{t}}{\partial zi_{s}}=(o_{s}\odot{\tanh^{'}(c_{s})}\odot{g_{s}})\odot{\text{diag}(\sigma^{'}(zi_{s})})W_{hi}^{T}\delta_{t,s+1}δit,s=∂zis∂Lt=(os⊙tanh′(cs)⊙gs)⊙diag(σ′(zis))WhiTδt,s+1
δ g t , s = ∂ L t ∂ z g s = ( o s ⊙ tanh ′ ( c s ) ⊙ i s ) ⊙ diag ( tanh ′ ( z g s ) ) W h g T δ t , s + 1 \delta g_{t,s}=\frac{\partial L_{t}}{\partial zg_{s}}=(o_{s}\odot{\tanh^{'}(c_{s})}\odot{i_{s}})\odot{\text{diag}(\tanh^{'}(zg_{s})})W_{hg}^{T}\delta_{t,s+1}δgt,s=∂zgs∂Lt=(os⊙tanh′(cs)⊙is)⊙diag(tanh′(zgs))WhgTδt,s+1
δ f t , s = ( o s ⊙ tanh ′ ( c s ) ⊙ c s − 1 ) ⊙ diag ( σ ′ ( z f s ) ) W h f T δ f t , s + 1 \delta f_{t,s}=(o_{s}\odot{\tanh^{'}(c_{s})}\odot{c_{s-1}})\odot{\text{diag}(\sigma^{'}(zf_{s}))}W_{hf}^{T}\delta f_{t,s+1}δft,s=(os⊙tanh′(cs)⊙cs−1)⊙diag(σ′(zfs))WhfTδft,s+1
δ o t , s = tanh ( c s ) ⊙ diag ( σ ′ ( z o s ) ) W h o T δ o t , s + 1 \delta o_{t,s}=\tanh(c_{s})\odot{\text{diag}(\sigma^{'}(zo_{s}))}W_{ho}^{T}\delta o_{t,s+1}δot,s=tanh(cs)⊙diag(σ′(zos))WhoTδot,s+1
故而,用矩阵的方式表示梯度更新表达式为
∂ L ∂ W h i = ∑ t = 1 T ∑ s = 1 t δ i t , s h s − 1 T \frac{\partial L}{\partial W_{hi}}=\sum\limits_{t=1}^{T}\sum_{s=1}^{t}\delta i_{t,s}h_{s-1}^{T}∂Whi∂L=t=1∑Ts=1∑tδit,shs−1T
∂ L ∂ W h g = ∑ t = 1 T ∑ s = 1 t δ g t , s h s − 1 T \frac{\partial L}{\partial W_{hg}}=\sum\limits_{t=1}^{T}\sum_{s=1}^{t}\delta g_{t,s}h_{s-1}^{T}∂Whg∂L=t=1∑Ts=1∑tδgt,shs−1T
∂ L ∂ W h f = ∑ t = 1 T ∑ s = 1 t δ f t , s h s − 1 T \frac{\partial L}{\partial W_{hf}}=\sum\limits_{t=1}^{T}\sum_{s=1}^{t}\delta f_{t,s}h_{s-1}^{T}∂Whf∂L=t=1∑Ts=1∑tδft,shs−1T
∂ L ∂ W h o = ∑ t = 1 T ∑ s = 1 t δ o t , s h s − 1 T \frac{\partial L}{\partial W_{ho}}=\sum\limits_{t=1}^{T}\sum_{s=1}^{t}\delta o_{t,s}h_{s-1}^{T}∂Who∂L=t=1∑Ts=1∑tδot,shs−1T
同样,对于其他的权重矩阵有
∂ L ∂ W i i = ∑ t = 1 T ∑ s = 1 t δ i t , s x s T \frac{\partial L}{\partial W_{ii}}=\sum\limits_{t=1}^{T}\sum_{s=1}^{t}\delta i_{t,s}x_{s}^{T}∂Wii∂L=t=1∑Ts=1∑tδit,sxsT
∂ L ∂ W i g = ∑ t = 1 T ∑ s = 1 t δ g t , s x s T \frac{\partial L}{\partial W_{ig}}=\sum\limits_{t=1}^{T}\sum_{s=1}^{t}\delta g_{t,s}x_{s}^{T}∂Wig∂L=t=1∑Ts=1∑tδgt,sxsT
∂ L ∂ W i f = ∑ t = 1 T ∑ s = 1 t δ f t , s x s T \frac{\partial L}{\partial W_{if}}=\sum\limits_{t=1}^{T}\sum_{s=1}^{t}\delta f_{t,s}x_{s}^{T}∂Wif∂L=t=1∑Ts=1∑tδft,sxsT
∂ L ∂ W i o = ∑ t = 1 T ∑ s = 1 t δ o t , s x s T \frac{\partial L}{\partial W_{io}}=\sum\limits_{t=1}^{T}\sum_{s=1}^{t}\delta o_{t,s}x_{s}^{T}∂Wio∂L=t=1∑Ts=1∑tδot,sxsT
∂ L ∂ b i i = ∂ L ∂ b h i = ∑ t = 1 T ∑ s = 1 t δ i t , s \frac{\partial L}{\partial b_{ii}}=\frac{\partial L}{\partial b_{hi}}=\sum\limits_{t=1}^{T}\sum_{s=1}^{t}\delta i_{t,s}∂bii∂L=∂bhi∂L=t=1∑Ts=1∑tδit,s
∂ L ∂ b i g = ∂ L ∂ b h g = ∑ t = 1 T ∑ s = 1 t δ g t , s \frac{\partial L}{\partial b_{ig}}=\frac{\partial L}{\partial b_{hg}}=\sum\limits_{t=1}^{T}\sum_{s=1}^{t}\delta g_{t,s}∂big∂L=∂bhg∂L=t=1∑Ts=1∑tδgt,s
∂ L ∂ b i f = ∂ L ∂ b h f = ∑ t = 1 T ∑ s = 1 t δ f t , s \frac{\partial L}{\partial b_{if}}=\frac{\partial L}{\partial b_{hf}}=\sum\limits_{t=1}^{T}\sum_{s=1}^{t}\delta f_{t,s}∂bif∂L=∂bhf∂L=t=1∑Ts=1∑tδft,s
∂ L ∂ b i o = ∂ L ∂ b h o = ∑ t = 1 T ∑ s = 1 t δ o t , s \frac{\partial L}{\partial b_{io}}=\frac{\partial L}{\partial b_{ho}}=\sum\limits_{t=1}^{T}\sum_{s=1}^{t}\delta o_{t,s}∂bio∂L=∂bho∂L=t=1∑Ts=1∑tδot,s
所以这样我们就得到了LSTM神经网络中的BPTT算法权重矩阵和偏置矩阵的梯度更新公式。通过LSTM循环单元,整个神经网络可以建立较长距离的时序依赖关系。LSTM神经网络中的关系公式可以写为:
[ g t o t i t f t ] = [ tanh σ σ σ ] ( W [ x t h t − 1 ] + b ) \left[\begin{array}{cccc} g_{t}\\ o_{t}\\ i_{t}\\ f_{t} \end{array}\right]= \left[\begin{array}{cccc} \tanh\\ \sigma\\ \sigma\\ \sigma \end{array}\right] \left(\begin{array}{cccc} W \left[\begin{array}{cccc} x_{t}\\ h_{t-1} \end{array}\right]+b \end{array}\right)⎣⎢⎢⎡gtotitft⎦⎥⎥⎤=⎣⎢⎢⎡tanhσσσ⎦⎥⎥⎤(W[xtht−1]+b)
c t = f t ⊙ c t − 1 + i t ∗ g t h t = o t ⊙ tanh ( c t ) c_{t}=f_{t}\odot c_{t-1}+i_{t}*g_{t}\\ h_{t}=o_{t}\odot\tanh(c_{t})ct=ft⊙ct−1+it∗gtht=ot⊙tanh(ct)
其中t ∈ R e t\in{\mathbb{R}^{e}}t∈Re是当前时刻的输入,W ∈ R 4 d × ( d + e ) , b ∈ R 4 d W\in{\mathbb{R}^{4d\times(d+e)}},b\in{\mathbb{R}^{4d}}W∈R4d×(d+e),b∈R4d是网络中的权重矩阵和偏置矩阵参数。
在循环神经网络中隐藏层状态h hh存储了网络的历史信息,所以可以看作是一种记忆状态。简单的RNN中隐藏层的每一个时刻都会被重写状态信息,因此是一种短期记忆效应。在LSTM神经网络中,长期记忆可以看作是网络的参数,隐含了从训练数据中学习到的经验,但是更新速度远远慢于短期记忆的神经网络。记忆单元c cc可以在某一个时刻捕捉到某一个关键信息,并且有能力将关键信息保存一定的时间间隔。记忆单元中c cc中保存信息的生命周期要长于短期记忆h hh,但是又远远短于长期记忆,故而称之为长期记忆。
对于LSTM神经网络也有很多变体形式。我们举例下面几种形式
- 没有遗忘门的LSTM:最早提出的LSTM神经网络中并没有遗忘门,即表达为以下的形式:
i t = σ ( W i i x t + b i i + W h i h t − 1 + b h i ) o t = σ ( W i o x t + b i o + W h o h t − 1 + b h o ) g t = tanh ( W i g x t + b i g + W h g h t − 1 + b h g ) c t = c t − 1 + i t ⊙ g t h t = o t ⊙ tanh ( c t ) i_{t}=\sigma(W_{ii}x_{t}+b_{ii}+W_{hi}h_{t-1}+b_{hi})\\ o_{t}=\sigma(W_{io}x_{t}+b_{io}+W_{ho}h_{t-1}+b_{ho})\\ g_{t}=\tanh(W_{ig}x_{t}+b_{ig}+W_{hg}h_{t-1}+b_{hg})\\ c_{t}=c_{t-1}+i_{t}\odot g_{t}\\ h_{t}=o_{t}\odot\tanh(c_{t})it=σ(Wiixt+bii+Whiht−1+bhi)ot=σ(Wioxt+bio+Whoht−1+bho)gt=tanh(Wigxt+big+Whght−1+bhg)ct=ct−1+it⊙gtht=ot⊙tanh(ct)
但是其中会出现这个问题,即记忆单元c cc会不断增大。当输入的序列的长度非常打的时候,记忆单元的容量会饱和,从而大大降低LSTM的性能。
- peephole连接:三个门的不仅仅依赖于输入x t x_{t}xt和上一个时刻的隐藏状态h t − 1 h_{t-1}ht−1,也依赖于上一个时刻的记忆单元c t − 1 c_{t-1}ct−1:
i t = σ ( W i i x t + b i i + W h i h t − 1 + b h i + V c i c t − 1 + b c i ) f t = σ ( W i f x t + b i i + W h f h t − 1 + b h i + V c f c t − 1 + b c f ) o t = σ ( W i o x t + b i o + W h o h t − 1 + b h o + V c o c t − 1 + b c o ) g t = tanh ( W i g x t + b i g + W h g h t − 1 + b h g ) c t = f t ⊙ c t − 1 + i t ⊙ g t h t = o t ⊙ tanh ( c t ) i_{t}=\sigma(W_{ii}x_{t}+b_{ii}+W_{hi}h_{t-1}+b_{hi}+V_{ci}c_{t-1}+b_{ci})\\ f_{t}=\sigma(W_{if}x_{t}+b_{ii}+W_{hf}h_{t-1}+b_{hi}+V_{cf}c_{t-1}+b_{cf})\\ o_{t}=\sigma(W_{io}x_{t}+b_{io}+W_{ho}h_{t-1}+b_{ho}+V_{co}c_{t-1}+b_{co})\\ g_{t}=\tanh(W_{ig}x_{t}+b_{ig}+W_{hg}h_{t-1}+b_{hg})\\ c_{t}=f_{t}\odot c_{t-1}+i_{t}\odot g_{t}\\ h_{t}=o_{t}\odot\tanh(c_{t})it=σ(Wiixt+bii+Whiht−1+bhi+Vcict−1+bci)ft=σ(Wifxt+bii+Whfht−1+bhi+Vcfct−1+bcf)ot=σ(Wioxt+bio+Whoht−1+bho+Vcoct−1+bco)gt=tanh(Wigxt+big+Whght−1+bhg)ct=ft⊙ct−1+it⊙gtht=ot⊙tanh(ct)
其中,V c i , V c f , V c o V_{ci},V_{cf},V_{co}Vci,Vcf,Vco为对角矩阵。 - 耦合输入门和遗忘门:由于LSTM网络中输入们和遗忘门之间有些互补关系,因而同时用两个比较冗余。为了减少LSTM网络中的计算复杂度,所以将这两个门合并为一个门。
令
f t = 1 − i t f_{t}=1-i_{t}ft=1−it
这样LSTM更新状态为如下式:
i t = σ ( W i i x t + b i i + W h i h t − 1 + b h i ) o t = σ ( W i o x t + b i o + W h o h t − 1 + b h o ) g t = tanh ( W i g x t + b i g + W h g h t − 1 + b h g ) c t = ( 1 − i t ) ⊙ c t − 1 + i t ⊙ g t h t = o t ⊙ tanh ( c t ) i_{t}=\sigma(W_{ii}x_{t}+b_{ii}+W_{hi}h_{t-1}+b_{hi})\\ o_{t}=\sigma(W_{io}x_{t}+b_{io}+W_{ho}h_{t-1}+b_{ho})\\ g_{t}=\tanh(W_{ig}x_{t}+b_{ig}+W_{hg}h_{t-1}+b_{hg})\\ c_{t}=(1-i_{t})\odot c_{t-1}+i_{t}\odot g_{t}\\ h_{t}=o_{t}\odot\tanh(c_{t})it=σ(Wiixt+bii+Whiht−1+bhi)ot=σ(Wioxt+bio+Whoht−1+bho)gt=tanh(Wigxt+big+Whght−1+bhg)ct=(1−it)⊙ct−1+it⊙gtht=ot⊙tanh(ct)
3.3 GRU神经网络
门控循环单元(Gated Recurrent Unit,GRU)网络是一种改进版的RNN神经网络,相对于LSTM神经网络更加简单的循环神经网络。GRU网络引入门控制机制来控制信息的更新方式。GRU不引入额外的记忆单元,而是引入一个更新门来控制当前状态需要从历史状态中保留多少信息,以及需要从候选状态中接受多少信息。GRU神经网络的更新表达式如下:
r t = σ ( W i r x t + b i r + W h r h t − 1 + b h r ) z t = σ ( W i z x t + b i z + W h z h t − 1 + b h z ) n t = tanh ( W i n x t + b i n + r t ⊙ ( W h n h t − 1 + b h n ) ) h t = ( 1 − z t ) ⊙ n t + z t ⊙ h t − 1 r_{t}=\sigma(W_{ir}x_{t}+b_{ir}+W_{hr}h_{t-1}+b_{hr})\\ z_{t}=\sigma(W_{iz}x_{t}+b_{iz}+W_{hz}h_{t-1}+b_{hz})\\ n_{t}=\tanh(W_{in}x_{t}+b_{in}+r_{t}\odot{(W_{hn}h_{t-1}+b_{hn})})\\ h_{t}=(1-z_{t})\odot{n_{t}}+z_{t}\odot{h_{t-1}}rt=σ(Wirxt+bir+Whrht−1+bhr)zt=σ(Wizxt+biz+Whzht−1+bhz)nt=tanh(Winxt+bin+rt⊙(Whnht−1+bhn))ht=(1−zt)⊙nt+zt⊙ht−1
其中z t ∈ [ 0 , 1 ] z_{t}\in{[0,1]}zt∈[0,1]为更新门,由于LSTM神经网络中,输入门与遗忘门是互补关系,具有一定的冗余性。GRU神经网络中使用更新门来控制输入信息与遗忘信息之间的平衡性质。当z t = 0 z_{t}=0zt=0时,h t h_{t}ht和h t − 1 h_{t-1}ht−1之间为非线性关系;当z t = 1 z_{t}=1zt=1时,h t h_{t}ht和h t − 1 h_{t-1}ht−1之间为线性关系。
r t ∈ [ 0 , 1 ] r_{t}\in{[0,1]}rt∈[0,1]表示的是重置门,用于控制候选状态n t n_{t}nt是否依赖于上一个隐藏层状态h t − 1 h_{t-1}ht−1。当r t = 0 r_{t}=0rt=0时,候选状态n t = tanh ( W i n x t + b i n ) n_{t}=\tanh(W_{in}x_{t}+b_{in})nt=tanh(Winxt+bin)之和当前的输入x t x_{t}xt有关系,并不和历史状态有关;r t = 1 r_{t}=1rt=1时,候选状态中与当前输入以及历史状态信息有关,与简单循环神经网络一致。
从上面的公式可以明显看出,当z t = 0 , r t = 1 z_{t}=0,r_{t}=1zt=0,rt=1时,GRU退化为普通的RNN神经网络;当z t = 0 , r t = 0 z_{t}=0,r_{t}=0zt=0,rt=0时,当前状态h t h_{t}ht仅仅和当前输入x t x_{t}xt有关;当z t = 1 z_{t}=1zt=1时,当前的状态h t = h t − 1 h_{t}=h_{t-1}ht=ht−1与当前的输入状态x t x_{t}xt无关。
下面计算在BPTT算法中的梯度更新表达式。设损失函数
L t = ∑ s = 1 t L ( y ^ t , y t ) L_{t}=\sum\limits_{s=1}^{t}L(\hat y_{t},y_{t})Lt=s=1∑tL(y^t,yt)
L = ∑ t = 1 T L t L=\sum\limits_{t=1}^{T}L_{t}L=t=1∑TLt
显然,我们设
z r t = W i r x t + b i r + W h r h t − 1 + b h r zr_{t}=W_{ir}x_{t}+b_{ir}+W_{hr}h_{t-1}+b_{hr}zrt=Wirxt+bir+Whrht−1+bhr
z z t = W i z x t + b i z + W h z h t − 1 + b h z zz_{t}=W_{iz}x_{t}+b_{iz}+W_{hz}h_{t-1}+b_{hz}zzt=Wizxt+biz+Whzht−1+bhz
z n t = W i n x t + b i n + r t ⊙ ( W h n h t − 1 + b h n ) zn_{t}=W_{in}x_{t}+b_{in}+r_{t}\odot{(W_{hn}h_{t-1}+b_{hn})}znt=Winxt+bin+rt⊙(Whnht−1+bhn)
所以梯度更新表达式有
∂ L t ∂ ( W h r ) j k = ∑ s = 1 t ∂ z r s ∂ ( W h r ) j k ⋅ ∂ L t ∂ z r s \frac{\partial L_{t}}{\partial (W_{hr})_{jk}}=\sum\limits_{s=1}^{t}\frac{\partial zr_{s}}{\partial (W_{hr})_{jk}}\cdot{\frac{\partial L_{t}}{\partial zr_{s}}}∂(Whr)jk∂Lt=s=1∑t∂(Whr)jk∂zrs⋅∂zrs∂Lt
∂ L t ∂ ( W h z ) j k = ∑ s = 1 t ∂ z z s ∂ ( W h z ) j k ⋅ ∂ L t ∂ z z s \frac{\partial L_{t}}{\partial (W_{hz})_{jk}}=\sum\limits_{s=1}^{t}\frac{\partial zz_{s}}{\partial (W_{hz})_{jk}}\cdot{\frac{\partial L_{t}}{\partial zz_{s}}}∂(Whz)jk∂Lt=s=1∑t∂(Whz)jk∂zzs⋅∂zzs∂Lt
∂ L t ∂ ( W h n ) j k = ∑ s = 1 t ∂ z n s ∂ ( W h n ) j k ⋅ ∂ L t ∂ z n s \frac{\partial L_{t}}{\partial (W_{hn})_{jk}}=\sum\limits_{s=1}^{t}\frac{\partial zn_{s}}{\partial (W_{hn})_{jk}}\cdot{\frac{\partial L_{t}}{\partial zn_{s}}}∂(Whn)jk∂Lt=s=1∑t∂(Whn)jk∂zns⋅∂zns∂Lt
经过推导,同理有以下的梯度更新表达式:
δ r t , s = ∂ L t ∂ z r s = ∂ h s ∂ z r s ⋅ ∂ z r s + 1 ∂ h s ⋅ ∂ L t ∂ z r s + 1 = ∂ h s ∂ z r s ⋅ W h r T δ t , s + 1 \delta r_{t,s}=\frac{\partial L_{t}}{\partial zr_{s}}=\frac{\partial h_{s}}{\partial zr_{s}}\cdot{\frac{\partial zr_{s+1}}{\partial h_{s}}}\cdot{\frac{\partial L_{t}}{\partial zr_{s+1}}}=\frac{\partial h_{s}}{\partial zr_{s}}\cdot{W_{hr}^{T}\delta_{t,s+1}}δrt,s=∂zrs∂Lt=∂zrs∂hs⋅∂hs∂zrs+1⋅∂zrs+1∂Lt=∂zrs∂hs⋅WhrTδt,s+1
δ z t , s = ∂ L t ∂ z z s = ∂ h s ∂ z z s ⋅ ∂ z z s + 1 ∂ h s ⋅ ∂ L t ∂ z z s + 1 = ∂ h s ∂ z z s ⋅ W h z T δ t , s + 1 \delta z_{t,s}=\frac{\partial L_{t}}{\partial zz_{s}}=\frac{\partial h_{s}}{\partial zz_{s}}\cdot{\frac{\partial zz_{s+1}}{\partial h_{s}}}\cdot{\frac{\partial L_{t}}{\partial zz_{s+1}}}=\frac{\partial h_{s}}{\partial zz_{s}}\cdot{W_{hz}^{T}\delta_{t,s+1}}δzt,s=∂zzs∂Lt=∂zzs∂hs⋅∂hs∂zzs+1⋅∂zzs+1∂Lt=∂zzs∂hs⋅WhzTδt,s+1
δ n t , s = ∂ L t ∂ z n s = ∂ h s ∂ z n s ⋅ ∂ z n s + 1 ∂ h s ⋅ ∂ L t ∂ z n s + 1 = ∂ h s ∂ z n s ⋅ W h n T r s δ t , s + 1 \delta n_{t,s}=\frac{\partial L_{t}}{\partial zn_{s}}=\frac{\partial h_{s}}{\partial zn_{s}}\cdot{\frac{\partial zn_{s+1}}{\partial h_{s}}}\cdot{\frac{\partial L_{t}}{\partial zn_{s+1}}}=\frac{\partial h_{s}}{\partial zn_{s}}\cdot{W_{hn}^{T}r_{s}\delta_{t,s+1}}δnt,s=∂zns∂Lt=∂zns∂hs⋅∂hs∂zns+1⋅∂zns+1∂Lt=∂zns∂hs⋅WhnTrsδt,s+1
其中,
∂ h s ∂ z r s = ∂ h s ∂ n s ⋅ ∂ n s ∂ r s ⋅ ∂ r s ∂ z r s = ( 1 − z s ) ⊙ ( ( W h n h t − 1 + b h n ) ⊙ tanh ′ ( z n s ) ) ⋅ diag ( σ ′ ( z r s ) ) \frac{\partial h_{s}}{\partial zr_{s}}=\frac{\partial h_{s}}{\partial n_{s}}\cdot{\frac{\partial n_{s}}{\partial r_{s}}}\cdot{\frac{\partial r_{s}}{\partial zr_{s}}}=(1-z_{s})\odot{((W_{hn}h_{t-1}+b_{hn})\odot{\tanh^{'}(zn_{s})})}\cdot{\text{diag}(\sigma^{'}(zr_{s}))}∂zrs∂hs=∂ns∂hs⋅∂rs∂ns⋅∂zrs∂rs=(1−zs)⊙((Whnht−1+bhn)⊙tanh′(zns))⋅diag(σ′(zrs))
∂ h s ∂ z z s = ∂ h s ∂ z s ∂ z s ∂ z z s = ( − n s + h s − 1 ) ⋅ diag ( σ ′ ( z z s ) ) \frac{\partial h_{s}}{\partial zz_{s}}=\frac{\partial h_{s}}{\partial z_{s}}\frac{\partial z_{s}}{\partial zz_{s}}=(-n_{s}+h_{s-1})\cdot{\text{diag}(\sigma^{'}(zz_{s}))}∂zzs∂hs=∂zs∂hs∂zzs∂zs=(−ns+hs−1)⋅diag(σ′(zzs))
∂ h s ∂ z n s = ∂ h s ∂ n s ⋅ ∂ n s ∂ z n s = ( 1 − z s ) ⋅ diag ( σ ′ ( z n s ) ) \frac{\partial h_{s}}{\partial zn_{s}}=\frac{\partial h_{s}}{\partial n_{s}}\cdot{\frac{\partial n_{s}}{\partial zn_{s}}}=(1-z_{s})\cdot{\text{diag}(\sigma^{'}(zn_{s}))}∂zns∂hs=∂ns∂hs⋅∂zns∂ns=(1−zs)⋅diag(σ′(zns))
所以我们得到了梯度更新的表达式:
∂ L ∂ W h r = ∑ t = 1 T ∑ s = 1 t δ r t , s h s − 1 T \frac{\partial L}{\partial W_{hr}}=\sum\limits_{t=1}^{T}\sum\limits_{s=1}^{t}\delta r_{t,s}h_{s-1}^{T}∂Whr∂L=t=1∑Ts=1∑tδrt,shs−1T
∂ L ∂ W h z = ∑ t = 1 T ∑ s = 1 t δ z t , s h s − 1 T \frac{\partial L}{\partial W_{hz}}=\sum\limits_{t=1}^{T}\sum\limits_{s=1}^{t}\delta z_{t,s}h_{s-1}^{T}∂Whz∂L=t=1∑Ts=1∑tδzt,shs−1T
∂ L ∂ W h n = ∑ t = 1 T ∑ s = 1 t δ n t , s [ h s − 1 ⊙ r s ] T \frac{\partial L}{\partial W_{hn}}=\sum\limits_{t=1}^{T}\sum\limits_{s=1}^{t}\delta n_{t,s}[h_{s-1}\odot{r_{s}}]^{T}∂Whn∂L=t=1∑Ts=1∑tδnt,s[hs−1⊙rs]T
同样可以得到其他的权重矩阵以及偏置矩阵的梯度更新表达式:
∂ L ∂ W i r = ∑ t = 1 T ∑ s = 1 t δ r t , s x s T \frac{\partial L}{\partial W_{ir}}=\sum\limits_{t=1}^{T}\sum\limits_{s=1}^{t}\delta r_{t,s}x_{s}^{T}∂Wir∂L=t=1∑Ts=1∑tδrt,sxsT
∂ L ∂ W i z = ∑ t = 1 T ∑ s = 1 t δ z t , s x s T \frac{\partial L}{\partial W_{iz}}=\sum\limits_{t=1}^{T}\sum\limits_{s=1}^{t}\delta z_{t,s}x_{s}^{T}∂Wiz∂L=t=1∑Ts=1∑tδzt,sxsT
∂ L ∂ W i n = ∑ t = 1 T ∑ s = 1 t δ n t , s x s T \frac{\partial L}{\partial W_{in}}=\sum\limits_{t=1}^{T}\sum\limits_{s=1}^{t}\delta n_{t,s}x_{s}^{T}∂Win∂L=t=1∑Ts=1∑tδnt,sxsT
∂ L ∂ b i r = ∂ L ∂ b h r = ∑ t = 1 T ∑ s = 1 t δ r t , s \frac{\partial L}{\partial b_{ir}}=\frac{\partial L}{\partial b_{hr}}=\sum\limits_{t=1}^{T}\sum\limits_{s=1}^{t}\delta r_{t,s}∂bir∂L=∂bhr∂L=t=1∑Ts=1∑tδrt,s
∂ L ∂ b i z = ∂ L ∂ b h z = ∑ t = 1 T ∑ s = 1 t δ z t , s \frac{\partial L}{\partial b_{iz}}=\frac{\partial L}{\partial b_{hz}}=\sum\limits_{t=1}^{T}\sum\limits_{s=1}^{t}\delta z_{t,s}∂biz∂L=∂bhz∂L=t=1∑Ts=1∑tδzt,s
∂ L ∂ b i n = ∑ t = 1 T ∑ s = 1 t δ n t , s \frac{\partial L}{\partial b_{in}}=\sum\limits_{t=1}^{T}\sum\limits_{s=1}^{t}\delta n_{t,s}∂bin∂L=t=1∑Ts=1∑tδnt,s
∂ L ∂ b h n = ∑ t = 1 T ∑ s = 1 t δ n t , s ⊙ r s \frac{\partial L}{\partial b_{hn}}=\sum\limits_{t=1}^{T}\sum\limits_{s=1}^{t}\delta n_{t,s}\odot{r_{s}}∂bhn∂L=t=1∑Ts=1∑tδnt,s⊙rs
3.4 SRU神经网络
在RNN,LSTM,GRU神经网络提出来之后,在很多方面例如机器翻译,语言模型,问答系统等等方面具有很大的成就,RNN类神经网络的循环结构使得对于处理时间序列的问题上具有较好的处理结果。但是正式由于串行结构的神经网络使得RNN神经网络在处理中限制了模型的训练速度,所以RNN并不能够进行并行化处理问题,由此提出了一种能够将大部分运算放在并行处理的问题中,将有些小部分的运算问题放在串行计算中。
SRU神经网络的计算架构如下所示。
x ~ t = W x t f t = σ ( W f x t + b f ) r t = σ ( W r x t + b r ) c t = f t ⊙ c t − 1 + ( 1 − f t ) ⊙ x ~ h t = r t ⊙ g ( c t ) + ( 1 − r t ) ⊙ x t \tilde x_{t}=Wx_{t}\\ f_{t}=\sigma(W_{f}x_{t}+b_{f})\\ r_{t}=\sigma(W_{r}x_{t}+b_{r})\\ c_{t}=f_{t}\odot{c_{t-1}}+(1-f_{t})\odot{\tilde x}\\ h_{t}=r_{t}\odot{g(c_{t})}+(1-r_{t})\odot{x_{t}}x~t=Wxtft=σ(Wfxt+bf)rt=σ(Wrxt+br)ct=ft⊙ct−1+(1−ft)⊙x~ht=rt⊙g(ct)+(1−rt)⊙xt
在前馈神经网络中,矩阵相乘是计算中最为耗费时间的部分,所以SRU的主要设计原理就是:门的计算只依赖于当前的输入循环,这样使得模型只有逐点相乘的计算是依赖于之前的时间步的,从而能够让网络容易进行并行化处理。
4. 双向(Bidirectional)循环神经网络和多层(MultiLayers)神经网络。
为了增强循环神经网路中捕获信息的能力,所以在某些模型训练的场合下增加网络的深度而增强循环神经网络的能力。所以就提出了两种类型的神经网络,即双向循环神经网络和多层循环神经网络。
4.1 双向循环神经网络
在有些任务中,数据信息的输出不仅和过去的信息有关系,也和后续时刻的信息有关系,例如自然语言处理中的句子信息,它的含义是和上下文都有关系的,即包含句子左右两边的信息。按照这样的一个思路,我们就可以增加一个神经网络的逆序来建立和传递信息。
双向循环神经网络是由两层循环神经网络组成,输入相同,但是信息传递的方向并不相同。
假设神经网络中按照时间顺序传播,第二层按照时间逆序传播,在t tt时刻的状态定义为h t → \mathop{h_{t}} \limits ^{\rightarrow}ht→和h t ← \mathop{h_{t}} \limits ^{\leftarrow}ht←,那么对于简单的RNN神经网络就有
h t → = f ( U → h t → + W → h t → + b → ) h t ← = f ( U ← h t ← + W ← h t ← + b ← ) \mathop{h_{t}}\limits^{\rightarrow}=f(\mathop{U}\limits^{\rightarrow}\mathop{h_{t}}\limits^{\rightarrow}+\mathop{W}\limits^{\rightarrow}\mathop{h_{t}}\limits^{\rightarrow}+\mathop{b}\limits^{\rightarrow})\\ \mathop{h_{t}}\limits^{\leftarrow}=f(\mathop{U}\limits^{\leftarrow}\mathop{h_{t}}\limits^{\leftarrow}+\mathop{W}\limits^{\leftarrow}\mathop{h_{t}}\limits^{\leftarrow}+\mathop{b}\limits^{\leftarrow})ht→=f(U→ht→+W→ht→+b→)ht←=f(U←ht←+W←ht←+b←)
h t = [ h t → , h t ← ] h_{t}=[\mathop{h_{t}}\limits^{\rightarrow},\mathop{h_{t}}\limits^{\leftarrow}]ht=[ht→,ht←]
h t h_{t}ht为两个前向传播和后向传播的拼接操作。
4.2 多层循环神经网络
另外一种常见的操作就是将多个神经网络进行堆叠,并成为多层循环神经网络,或者被称作是堆叠式循环神经网络(Stacked Recurrent Neural Network)。对于简单的RNN神经网络,它的表达如下所示:
h t ( l ) = f ( U ( l ) h t − 1 ( l ) + W ( l ) h t − 1 ( l ) + b ( l ) ) h_{t}^{(l)}=f(U^{(l)}h_{t-1}^{(l)}+W^{(l)}h_{t-1}^{(l)}+b^{(l)})ht(l)=f(U(l)ht−1(l)+W(l)ht−1(l)+b(l))
其中,U ( l ) U^{(l)}U(l)、W ( l ) W^{(l)}W(l)、b ( l ) b^{(l)}b(l)为神经网络中权重矩阵和偏置矩阵。
5. 应用举例(用theano和pytorch实现循环神经网络)
循环神经网络常常用作自然语言处理中文本分类或者其他一些预测信息,所以我们对RNN神经网络实验的设计在自然语言处理上。
5.1 实验设计
实验中我们对一个自然语言处理问题做一个基本的实验。SICK数据集用于2014年SemEval-任务1:评估成分分布,通过语义相关性和文本蕴涵的完整句子语义模型。当前版本是代表任务1测试数据的数据集的子集(4927个句子对)SICK数据集由10,000个英语句子对组成,从两个现有句子对开始构建复述集:8K ImageFlickr数据集和SEMEVAL-2012语义文本相似性视频描述数据集。每个句子对都有注释含义上的相关性以及两个元素之间的必然关系。实验中的数据信息表示如下所示:
句子对ID、句子A、句子B、语义相关性分值(以1-5的连续分值)、文字蕴含的分值(NEUTRAL, ENTAILMENT, CONTRADICTION)
模型的结构如下所示:
数据中的目标值分数我们将其转化为一个稀疏离散分布的表示,即:
p i = { y − ⌊ y ⌋ , i = ⌊ y ⌋ + 1 ⌊ y ⌋ − y + 1 , i = ⌊ y ⌋ 0 , otherwise p_{i}=\begin{cases} y-\lfloor y\rfloor&,i=\lfloor y\rfloor+1\\ \lfloor y\rfloor-y+1&,i=\lfloor y\rfloor\\ 0&,\text{otherwise} \end{cases}pi=⎩⎪⎨⎪⎧y−⌊y⌋⌊y⌋−y+10,i=⌊y⌋+1,i=⌊y⌋,otherwise
这样,设r = [ 1 , 2 , 3 , . . . , K ] r=[1,2,3,...,K]r=[1,2,3,...,K],那么语义相关性分值可以表示为y ≈ r T p y \approx r^{T}py≈rTp。
5.2 实验训练和结果分析
实验结果的评价这里使用到了MSE \text{MSE}MSE指标和Peason \text{Peason}Peason指标。这两个指标分别表示的意义为:
v MSE = 1 N ∑ k = 1 N ( p o − p t ) 2 v_{\text{MSE}}=\frac{1}{N}\sum\limits_{k=1}^{N}(p_{o}-p_{t})^{2}vMSE=N1k=1∑N(po−pt)2
v Peason = cov ( p o , p t ) σ p o σ p t = ∑ p o p t − 1 N ∑ p o ∑ p t ( ∑ p o 2 − 1 N ( ∑ p o ) 2 ) ( ∑ p t 2 − 1 N ( ∑ p t ) 2 ) v_{\text{Peason}}=\frac{\text{cov}(p_{o},p_{t})}{\sigma_{p_{o}}\sigma_{p_{t}}}=\frac{\sum{p_{o}p_{t}}-\frac{1}{N}\sum{p_{o}}\sum{p_{t}}}{\sqrt{(\sum{p_{o}^{2}}-\frac{1}{N}(\sum{p_{o}})^{2})(\sum{p_{t}^{2}}-\frac{1}{N}(\sum{p_{t}})^{2})}}vPeason=σpoσptcov(po,pt)=(∑po2−N1(∑po)2)(∑pt2−N1(∑pt)2)∑popt−N1∑po∑pt
实验的结果如下所示,由于训练最后得到的数据太多,我们这里只列举了BiGRU循环神经网络的训练结果:


经过多次实验,可以发现,三种神经网络中性能优劣的比较如下所示:
RNN<LSTM<GRU
多层神经网络以及双向神经网络对于数据信息的拟合结果会更好一些。具体代码可以参见笔者github。另外笔者使用theano实现了时间序列预测的一些实验,参见笔者github
小结
本小节介绍了基本的循环神经网络的原理与梯度更新的方法,在文章的最后实现了循环神经网络的设计实验。最重要的一点就是,必须很好地把握住循环神经网络中的数学原理和实验设计原理,能够更好地应用到实际中。
参考文献
[1] 神经网络与深度学习,邱锡鹏
[2] Train RNNs as fast as CNNs
[3] Pattern Recognition and machine learning,BiShop