循环神经网络(RNN)之网络结构解析

一、RNN的前向传播结构

在这里插入图片描述
在这里插入图片描述

t时刻输入: XtX_{t}St1S_{t-1}
t时刻输出: hth_{t}
t时刻中间状态: StS_{t}

上图是一个RNN神经网络的时序展开模型,中间t时刻的网络模型揭示了RNN的结构。可以看到,原始的RNN网络的内部结构非常简单。神经元A在t时刻的状态仅仅是(t-1)时刻神经元状态St1S_{t-1},与(t)时刻网络输入XtX_t的双曲正切函数的值;这个值不仅仅作为该时刻网络的输出,也作为该时刻网络的状态被传入到下一个时刻的网络状态中,这个过程叫做RNN的正向传播(forward propagation)

传播中的数学公式(含参数)

在这里插入图片描述

上图表示为RNN网络的完整的拓扑结构,以及RNN网络中相应的参数情况。我们通过对t时刻网络的行为进行数学的推导。在如下的内容中,会出现线性状态和激活状态两种表达,线性状态将用*号进行标注。
t时刻神经元状态
St=ϕ(St)S_t= {\phi}{(S{_t^*})}
St=(UXt+WSt1)S{_t^*}=(UX_t+WS_{t-1})
t时刻的输出状态
Ot=ψ(Ot)O_t=\psi{(O{_t^*})}
Ot=VStO{_t^*} = VS_t
我们该如何得到RNN模型中的U、V、W三个全局共享参数的具体值呢?在之后的RNN逆向传播中可以得出具体的情况。

二、BPTT(随时间变化的反向传播算法)

1、 损失函数的选取,在RNN中一般选取交叉熵(Cross Entropy),表达式如下:
Loss=i=0nyilnyiLoss = -{\sum_{i=0}^{n}y_ilny_i^*}
上式为交叉熵的标量的形式,yiy_i是真实的标签纸,yiy_i^*是模型给出的预测值,在多维输出值的时,则可以通过累加得出n维损失值。交叉熵在应用于RNN需进行微调:首先,RNN的输出是向量的形式,没有必要将所有的维度进行累加一起,直接把损失值用向量进行表达即可;其次,由于RNN模型是序列问题,因此其模型损失不能只是一个时刻的损失,应该包含全部N个时刻的损失。
因此RNN模型在t时刻的损失函数如下:
Losst=[ytln(Ot)+(yt1)ln(1Ot)]{Loss}_t = -[y_tln(O_t) + (y_t-1)ln(1-O_t)]
全部N个时刻的损失函数(全局损失)表达为如下形式:
Loss=t=1NLosst=t=1N[ytln(Ot)+(yt1)ln(1Ot)]Loss = -{\sum_{t=1}^NLoss_t}= -{\sum_{t=1}^N[y_tln(O_t) + (y_t-1)ln(1-O_t)]}

2、 softmax函数的求导公式为(下文用ψ\psi 表示
ψ(x)=ψ(x)(1ψ(x))\psi'(x)=\psi(x)(1-\psi(x))

3、 激活函数的求导公式为(选取tanh(x)作为激活函数)
ϕ(x)=tanh(x)\phi(x) = tanh(x)
ϕ(x)=(1ϕ2(x))\phi'(x)=(1-{\phi^2(x)})

4、 BPTT算法
注: 由于RNN模型与时间序列有关,所以使用Back Propagation Through Time(随时间变化反向传播的算法),但依旧遵循链式求导法则。在损失函数中,虽然RNN的额全局损失是与N个时刻有关的,但下面的推导仅涉及某个t时刻。
(1)求出t时刻下的损失函数关于OtO_t^*的微分:
LtOt=LtOtOtOt=LtOtψ(Ot)Ot=LtOtψ(Ot)\frac{\partial{L_t}}{\partial{O_t^*}} =\frac{\partial{L_t}}{\partial{O_t}} * \frac{\partial{O_t}} {\partial{O_t^*}}=\frac{\partial{L_t}}{\partial{O_t}} * \frac{\partial{\psi{(O_t^*)}}} {\partial{O_t^*}}=\frac{\partial{L_t}}{\partial{O_t}} * \psi'(O_t^*)
(2)求出损失函数关于参数V的微分(需要(1)中的结论):
LtV=Lt(VSt)(VSt)V=LtOtSt=LtOtψ(Ot)St\frac{\partial{L_t}}{\partial{V}} = \frac{\partial{L_t}}{\partial{(VS_t)}} * \frac{\partial{(VS_t)}} {\partial{V}}=\frac{\partial{L_t}}{\partial{O_t^*}} * S_t=\frac{\partial{L_t}}{\partial{O_t}} * \psi'(O_t^*)* S_t
因此,全局关于参数V的微分为:
LV=t=1NLtV=t=1NLtOtψ(Ot)St\frac{\partial{L}}{\partial{V}}={\sum_{t=1}^{N}}\frac{\partial{L_t}}{\partial{V}}={\sum_{t=1}^{N}}\frac{\partial{L_t}}{\partial{O_t}} * \psi'(O_t^*)* S_t
(3)求出t时刻的损失函数关于StS_t^*的微分:
LtSt=Lt(VSt)(VSt)StStSt=LtOtVϕ(St)=LtOtψ(Ot)Vϕ(St)\frac{\partial{L_t}}{\partial{S_t^*}} = \frac{\partial{L_t}}{\partial{(VS_t)}} * \frac{\partial{(VS_t)}} {\partial{S_t}} * \frac{\partial{S_t}} {\partial{S_t^*}}=\frac{\partial{L_t}}{\partial{O_t^*}}*V*\phi'(S_t^*)=\frac{\partial{L_t}}{\partial{O_t}}*\psi'(O_t^*)*V*\phi'(S_t^*)
(4)求出t时刻的损失函数关于St1S_{t-1}的微分
LtSt1=LtStStSt1=LtSt[Wϕ(St1)+UXt]St1=LtStWϕ(St1)\frac{\partial{L_t}}{\partial{S_{t-1}^*}}=\frac{\partial{L_t}}{\partial{S_t^*}} *\frac{\partial{S_t^*}}{\partial{S_{t-1}^*}}= \frac{\partial{L_t}}{\partial{S_t^*}} *\frac{\partial{[W\phi(S_{t-1}^*)}+UX_t]}{\partial{S_{t-1}^*}} = \frac{\partial{L_t}}{\partial{S_t^*}} *W\phi'(S_{t-1}^*)
(5)求出t时刻关于参数U的偏微分
注:因为是时间序列模型,因此t时刻关于U
的微分与前(t-1)个时刻都相关,在具体计算时可以限定最远回溯到前n个时刻,但在推导时需将(t-1)个时刻全部代入计算
LtU=k=1tLtSkSkU=k=1tLtSk(WSk1+UXk)U=k=1tLtSkXk\frac{\partial L_t}{\partial U}=\sum_{k=1}^{t}\frac{\partial L_t}{\partial S_k^*}\frac{\partial S_k^*}{\partial U}=\sum_{k=1}^{t}\frac{\partial L_t}{\partial S_k^*}\frac{\partial ({WS_{k-1}}+UX_k)}{\partial U}=\sum_{k=1}^{t}\frac{\partial L_t}{\partial S_k^*}*X_k
因此,全局关于U的损失偏微分为:
LU=t=1NLtU=t=1Nk=1tLtSkSkU=t=1Nk=1tLtSkXk\frac{\partial L}{\partial U}=\sum_{t=1}^{N}\frac{\partial L_t}{\partial U}=\sum_{t=1}^{N}\sum_{k=1}^{t}\frac{\partial L_t}{\partial S_k^*}\frac{\partial S_k^*}{\partial U}=\sum_{t=1}^{N}\sum_{k=1}^{t}\frac{\partial L_t}{\partial S_k^*}*X_k
(6)求出t时刻关于参数W的偏微分(同上)
LtW=k=1tLtSkSkW=k=1tLtSk(WSk1+UXk)W=k=1tLtSkSk1\frac{\partial L_t}{\partial W}=\sum_{k=1}^{t}\frac{\partial L_t}{\partial S_k^*}\frac{\partial S_k^*}{\partial W}=\sum_{k=1}^{t}\frac{\partial L_t}{\partial S_k^*}\frac{\partial ({WS_{k-1}}+UX_k)}{\partial W}=\sum_{k=1}^{t}\frac{\partial L_t}{\partial S_k^*}*S_{k-1}
因此,全局关于U的损失偏微分为:
LW=t=1NLtW=t=1Nk=1tLtSkSkW=t=1Nk=1tLtSkSk1\frac{\partial L}{\partial W}=\sum_{t=1}^{N}\frac{\partial L_t}{\partial W}=\sum_{t=1}^{N}\sum_{k=1}^{t}\frac{\partial L_t}{\partial S_k^*}\frac{\partial S_k^*}{\partial W}=\sum_{t=1}^{N}\sum_{k=1}^{t}\frac{\partial L_t}{\partial S_k^*}*S_{k-1}
(7)由于大多数的输出为softmax函数,我们在对OtO_t^*进行softmax运算后求导可得
ψ(Ot)=Ot(1Ot)\psi'(O_t^*)=O_t(1-O_t)
所以在OtO_t进行微分求偏导可得(采用交叉熵作为损失函数)
LtOt=[t=1N[ytln(Ot)+(yt1)ln(1Ot)]Ot=(ytOt+ytOt1Ot)=ytOtOt(1Ot)\frac{\partial L_t }{\partial O_t}=\frac{-\partial [\sum_{t=1}^N[y_tln(O_t) + (y_t-1)ln(1-O_t)]}{\partial O_t}=-(\frac {y_t}{O_t}+\frac{y_t-O_t}{1-O_t})=-{\frac{y_t-O_t}{O_t(1-O_t)}}
LtOtψ(Ot)=ytOtOt(1Ot)Ot(1Ot)=Otyt\frac{\partial L_t }{\partial O_t}*\psi'(O_t^*)=-{\frac{y_t-O_t}{O_t(1-O_t)}}*O_t(1-O_t)=O_t-y_t
LtSt=LtOtψ(Ot)Vϕ(St)=[V(Otyt)][1ϕ2(st)]=[V(Otyt)][1St2]\frac{\partial{L_t}}{\partial{S_t^*}} =\frac{\partial{L_t}}{\partial{O_t}}*\psi'(O_t^*)*V*\phi'(S_t^*)= [V*(O_t-y_t)]*[1-{\phi^2(s_t^*)}]= [V*(O_t-y_t)]*[1-S_t^2]
LtSt1=LtStWϕ(St1)=LtStW[1St12]\frac{\partial{L_t}}{\partial{S_{t-1}^*}}= \frac{\partial{L_t}}{\partial{S_t^*}} *W\phi'(S_{t-1}^*)= \frac{\partial{L_t}}{\partial{S_t^*}}*W*[1-S_{t-1}^2]

综上:
LV=t=1NLtV=t=1N(Otyt)St\frac{\partial{L}}{\partial{V}}={\sum_{t=1}^{N}}\frac{\partial{L_t}}{\partial{V}}={\sum_{t=1}^{N}}(O_t-y_t) *S_t
其余得类似
(8)我们逐步更新V,U,W三者得参数,直至它们收敛为之
V:=VηLVV:=V-\eta*\frac{\partial L}{\partial V}
U:=UηLUU:=U-\eta*\frac{\partial L}{\partial U}
W:=WηLWW:=W-\eta*\frac{\partial L}{\partial W}

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章