深度学习中基本神经网络(二)

1. 循环神经网络的引入与简介

在前馈神经网络中,信息的传递是单向传递过程,这种学习方法使得网络很容易学习,但是也一定程度上限制了神经网络模型的学习能力。但是在很多任务中,存在一些网络的输入不仅和当前的输入有关系,也和网络的历史输入信息有关系,例如有限状态的自动机。时序数据的长度序列长度不是固定的,不可任意改变。循环神经网络在一定程度上解决了这一类问题,它是一种具有短期记忆能力的神经网络,广泛使用到语音识别、语言模型以及其他自然语言处理等等任务上。循环神经网络中的参数学习过程使用到随时间反向传播算法来进行学习。但是普通的神经网络学习过程中的长期依赖关系,会出现梯度爆炸和消失问题,对这个问题提出了LSTM,GRU以及能够使得循环神经网络加速的SRU神经网络。另外,循环神经网络很容易推广到广义上的记忆型神经网络:递归神经网络和图神经网络,当然也包含树形神经网络。

1.1 延时神经网络

延时神经网络中通过建立一个额外的延时单元来存储网络的历史信息(例如输入、输出、隐藏层状态信息等等)。延时神经网络中在 t t t时刻,第 l + 1 l+1 l+1层神经网络和第 l l l层神经元的最近 p p p次输出相关,即
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),ht1(l),...,htp(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=1pwiyti+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,xt1,...,xtp,yt1,yt2,...,ytp)

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(ht1,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(ht1,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+t1),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 T T的输入序列, y 1 , T = ( y 1 , . . . , y T ) y_{1,T}=(y_{1},...,y_{T}) y1,T=(y1,...,yT)为长度为 T T T的标签序列。我们定义时刻 t t t的损失函数为
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 t t时刻的输出, L L L为可微分的损失函数。那么整个序列的损失函数为
L = ∑ t = 1 T L t L=\sum\limits_{t=1}^{T}L_{t} L=t=1TLt

所以说,整个序列的损失函数 L L L关于参数 U U U的梯度为
∂ L ∂ U = ∑ t = 1 T ∂ L t ∂ U \frac{\partial L}{\partial U}=\sum\limits_{t=1}^{T}\frac{\partial L_{t}}{\partial U} UL=t=1TULt

所以通过这样可以进行梯度的传播。

2.1 BPTT算法

随时间反向传播算法中,主要计算上面偏导数 ∂ L ∂ U \frac{\partial L}{\partial U} UL

参数 U U U和隐藏层在每个时刻 k ( 1 ≤ k ≤ t ) k(1\leq k\leq t) k(1kt)的净输入 z k = U h k − 1 + W x k + b z_{k}=Uh_{k-1}+Wx_{k}+b zk=Uhk1+Wxk+b,所以说第 t t t时刻的损失函数 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}}} uijLt=k=1tuijzkzkLt

注意,这里的 ∂ z k ∂ u i j \frac{\partial z_{k}}{\partial u_{ij}} uijzk指的是直接的偏导数,即对于公式 z k = U h k − 1 + W x k + b z_{k}=Uh_{k-1}+Wx_{k}+b zk=Uhk1+Wxk+b中,把 h k − 1 h_{k-1} hk1作为常量来对其求偏导数。所以有以下求法
∂ 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}) uijzk=[0,...,[hk1]j,..,0]=Ii([hk1]j)

其中 [ h k − 1 ] j [h_{k-1}]_{j} [hk1]j为第 k − 1 k-1 k1时刻的隐藏层状态的第 j j j维, I i ( x ) \mathbb{I}_{i}(x) Ii(x)指的是除了第 i i i行值为 x x x外,其余为 0 0 0的行向量。

定义误差项 δ t , k = ∂ L t ∂ z k \delta_{t,k}=\frac{\partial L_{t}}{\partial z_{k}} δt,k=zkLt是第 t t t时刻的损失对第 k k k时刻隐藏层的净输入 z k z_{k} zk的导数,则当 1 ≤ k ≤ t 1\leq k\leq t 1kt
δ 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=zkLt=zkhkhkzk+1zk+1Lt=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} uijzk=k=1t[δt,k]i[hk1]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} ULt=k=1tδt,khk1T

最后得到整个序列的梯度更新公式:
∂ 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} UL=t=1Tk=1tδt,khk1T

同理得到
∂ 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} WL=t=1Tk=1tδ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} bL=t=1Tk=1tδt,k

2.2 RTRL算法

反向传播中的BPTT算法不同的是,实时循环学习是通过前向传播的方式来进行梯度计算。
设循环神经网络中第 t + 1 t+1 t+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} uijht+1=(uijzt+1+uijhtUT)zt+1ht+1=(Ii([ht]j)+uijhtUT)diag(f(zt+1))=(Ii([ht]j)+uijhtUT)(f(zt+1))T

其中 I i ( x ) \mathbb{I}_{i}(x) Ii(x)是除了第 i i i行值为 x x x之外,其余都为 0 0 0的行向量。
所以在实时循环学习中,通过迭代递归的方法来进行参数的学习。

这两种算法都是基于梯度下降算法,分别通过前向方法和反向方法应用链式法则来计算梯度。循环神经网络中,一般网络输出的维度远低于输入的维度,故而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 t t时刻输出的隐藏层为 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+Whhht1+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+Whhht1+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=1TLt

在梯度更新中,根据上面公式的讨论,我们知道了误差递推公式如下所示:
δ 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}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值