RNN(Recurrent Neural Networks)

Simple Introduction to RNN

作者 Lutein 日期 2018-04-17
RNN(Recurrent Neural Networks)

结构

structure of RNN

RNN包含循环,允许信息持久化

前向传播

$h^{(t)}$为隐藏状态,$L^{(t)}$为损失函数,$o^{(t)}$是模型输出,$\hat{y}^{(t)}$是真实输出。

t时刻的隐藏状态$h^{(t)}=\sigma(Ux^{(t)}+Wh^{(t-1)}+b)$, $\sigma$为激活函数,一般为tanh,也就是说当前的隐藏状态由输入和上一时刻的隐藏态决定。

由于RNN是识别类的分类模型,激活函数为softmax

反向传播

BPTT(back propagation through time)

模型参数$U, W, V, b ,c$在序列的各个位置共享,反向传播更新相同的参数

?什么是更新相同的参数……

就是说将每一时刻的梯度计算出来相加得到最终的梯度。

损失函数定义为对数损失函数,最终的损失函数$L=\sum_{t=1}^\tau L^{(t)}$

对数损失函数logstic loss function, log-likelihood loss function在logstic regression中使用

MLE(Maximum Likelihood Estimation)

$cost(\hat{y},y)=-y_i\log (\hat{y}))-(1-y_i)\log(1-\hat{y})$

针对二分类问题的表示,当y=1时,如果预测结果也为1则损失为0,如果预测为0则损失非常大,同理,y=0时一样

针对多分类问题,有NLLLoss(negative log likelihood loss), torch.nn.NLLLoss

$l=-\frac{\sum_{i=0}^{N-1} t_i\log y_i}{N}$

$t_i$是gt的one hot,y是网络输出

输入每一类概率的对数(logsoftmax)

fc + cross entropy loss = fc + logsoftmax + NLLLoss

中间推导过程:

-log softmax求导:

cross entropy链式求导
https://blog.csdn.net/qian99/article/details/78046329

softmax求导:分为$i=j,i\neq j$两种情况

cross entropy导数推导

定义$C=-\sum_iy_i\ln a_i, a_i=\frac{e^{z_i}}{\sum_ke^{z_k}}$

$\frac{\partial C}{\partial a_j}=\frac{\partial(-\sum_jy_j\ln a_j)}{\partial a_j}=-\sum_jy_j\frac{1}{a_j}$

最终合成的结果:

对于分类问题而言,y是one-hot,和为1,则最终结果为$-y_i+a_i$

$V$与$c$相比只是多了一项$h^{(t)}$

其余三个参数$W, V, b$的计算涉及到时序,比较复杂,定义序列索引$t$位置隐藏态梯度为$\delta^{(t)}=\frac{\partial L}{\partial h^{(t)}}$,然后从$\delta^{(t+1)}$递推$\delta^{(t)}$:

对于$\delta^{(\tau)}$,已经是最后一个索引序列:

tanh的导数:$f’(x)=1-f^2$

sigmoid的导数:
$f(x)=\frac{1}{1+e^{-z}},f’(x)=f(1-f)$

根据递推式计算出$\delta^{(t)}$后可以计算相对于$W, U, b$的导数: