为什么需要\(RNN(Recurrent-Neural-Network)\)
假设我们在用一个全连接的神经网络去做一个英文词性分类的任务,当有这么一个句子"\(I\) \(saw\) \(a\) \(saw\)",这句话的意思是"我看见了一个锯子",前一个\(saw\)的意思是"看见"的意思,而后面那个\(saw\)是"锯子"的意思,前一个词的词性是动词,而后面那个词的词性是名词,显然,神经网络是无法区分这两个词的词性的,而\(RNN\)则可以完成这个任务,因为它兼顾了句子中每个词的先后顺序,即前面的词对后面的词的影响。
\(RNN\)的结构

\(RNN\)前向传播公式为:
\[s_{t}=f(Ws_{t-1}+Ux_{t}+b_{t})
\]
\[o_{t-1}=Vs_{t}
\]
\[\hat{y}_{t}=softmax(o_{t})
\]
\(s_{t}\)为\(t\)时刻的隐藏层的状态值,其中\(s_{0}\)为随机化产生的一个向量,\(o_{t}\)为\(t\)时刻的输出值,而该输出值还需要经过\(softmax\)函数处理才是最终的输出,\(W,U,V\)为参数矩阵,由所有输入共享,且由学习得到,\(f(\cdot)\)为激活函数。
\(RNN\)的损失函数为:
\[loss=-\sum_{t=1}^{T}y_{t}\log{\hat{y}_{t}}
\]
其中\(T\)为时间序列的总长度,\(y_{t}\)为\(t\)时刻的真实输出值。
\(RNN\)反向传播算法(\(backpropagation\quad through\quad time\))
\(BPTT\)本质还是梯度下降法,对于\(RNN\)而言,其有三个参数\(W,U,V\),因此需要分别对其求偏导。
首先来看\(loss\)(设为\(L\))对\(W\)的偏导,要求这个偏导,先要弄清楚\(L\)到\(W\)的函数关系。令\(z_{t}=Ws_{t-1}+Ux_{t}\),则\(L\)与\(W\)的链式关系如下:
\[L_{t}=-y_{t}\log{\hat{y}_{t}}
\]
\[\hat{y}_{t}=softmax(Vs_{t})
\]
\[s_{t}=f(z_{t})
\]
\[z_{t}=Ws_{t-1}+Ux_{t}+b_{t}
\]
\[s_{t-1}=f(z_{t-1})
\]
\[...
\]
\[z_{1}=Ws_{0}+Ux_{t}+b_{t}
\]
\(t\)时刻时产生的损失函数为:
\[L_{t}=-y_{t}\log{\hat{y}_{t}}
\]
由于\(L_{t}\)是\(k\in[1,t]\)时刻时\(z_{k}\)的函数,而\(z_{k}\)均与\(W\)有关,因此,\(t\)时刻\(L_{t}\)对\(W\)的偏导为:
\[\frac{\partial L_{t}}{\partial W}=\sum_{k=1}^{t}\frac{\partial L_{t}}{\partial z_{k}}\cdot\frac{\partial z_{k}}{\partial W}
\]
\(k<t\)时,
\[\frac{\partial L_{t}}{\partial z_{k}}=\frac{\partial L_{t}}{\partial z_{k+1}}\cdot \frac{\partial z_{k+1}}{\partial s_{k}}\cdot \frac{\partial s_{k}}{\partial z_{k}}
\]
\[=\frac{\partial L_{t}}{\partial z_{k+1}}\cdot W\cdot f^{'}(z_{k})
\]
令\(\delta_{t,k}=\frac{\partial L_{t}}{\partial z_{k}}\),则
\[\delta_{t,k}=\delta_{t,k+1}\cdot W\cdot f^{'}(z_{k})
\]
\(k=t\)时,
\[\frac{\partial L_{t}}{\partial z_{t}}=\frac{\partial L_{t}}{\partial s_{t}}\cdot f^{'}(z_{t})
\]
而
\[\frac{\partial z_{k}}{\partial W}=s_{k-1}
\]
因此
\[\frac{\partial L_{t}}{\partial W}=\sum_{k=1}^{t}\delta_{t,k}\cdot s_{k-1}
\]
由于共有\(T\)个序列(时刻),因此
\[\frac{\partial L}{\partial W}=\sum_{t=1}^{T}\sum_{k=1}^{t}\delta_{t,k}\cdot s_{k-1}
\]
同理有
\[\frac{\partial L}{\partial U}=\sum_{t=1}^{T}\sum_{k=1}^{t}\delta_{t,k}\cdot x_{k}
\]
\[\frac{\partial L}{\partial b}=\sum_{t=1}^{T}\sum_{k=1}^{t}\delta_{t,k}
\]
而\(L\)对\(V\)的偏导则简单很多,因为\(V\)和\(s\)的各个状态没有关系,
\[\frac{\partial L}{\partial V}=\sum_{t=1}^{T}\frac{\partial L_{t}}{\partial V}
\]