RNN原理

1.经典RNN结构

RNN全称是Recurrent Neural Networks,即循环神经网络。它是一种对序列型数据进行建模的深度模型。

首先复习一下基本的单层神经网络

【深度学习基础】RNN、LSTM基本结构
单层神经网络的输入是xx,经过变换Wx+bWx+b和**函数ff得到输出y。
在实际应用中,还会遇到一些序列数据。
【深度学习基础】RNN、LSTM基本结构
原始的神经网络不太好处理序列数据。为了处理序列建模问题,RNN引入了隐状态
hh的概念。
hh可以对序列化的数据提取特征,接着再转换为输出。
【深度学习基础】RNN、LSTM基本结构
图中UWU、W是参数矩阵,b是偏置项参数,f是**函数,经典RNN中使用tanh。
h2h_2的计算与h1h_1类似。需要注意的是每个步骤中的参数都是共享的,这是RNN的重点特点。【深度学习基础】RNN、LSTM基本结构
依次画出剩下的h。(使用相同的参数U、W、b)
【深度学习基础】RNN、LSTM基本结构
我们目前的RNN还没有输出,得到输出值的方法就是直接通过h进行计算:
【深度学习基础】RNN、LSTM基本结构
这里的V和c是新的参数。对于分类问题,通常使用Softmax函数将其转变为各个类别的概率。

剩下的输出类似进行(使用和y1同样的参数V和c):
【深度学习基础】RNN、LSTM基本结构
这就是最经典的RNN结构。
它的输入是x1,x2,.....xnx_1, x_2, .....x_n,输出为y1,y2,...yny_1, y_2, ...y_n,也就是说,输入和输出序列必须要是等长的。

由于这个限制,RNN的适用范围比较小。

RNN公式

最后给出RNN结构的严格数学定义:

设输入是x1,x2,.....xTx_1, x_2, .....x_T,对应的隐状态为h1,h2,.....hTh_1, h_2, .....h_T,输出为y1,y2,...yTy_1, y_2, ...y_T

经典RNN的运算过程可以表示为

ht=f(Uxt+Wht1+b)h_t=f(Ux_t+Wh_{t-1}+b)
yt=softmax(Vht+c)y_t=softmax(Vh_t+c)

这里UVWb,cU、V、W,b,c均为参数。f表示**函数,通常为tanh函数

LSTM原理

本节介绍RNN的一种改进版LSTM(Long Short Term Memory)。

回顾RNN的公式
ht=f(Uxt+Wht1+b)h_t=f(Ux_t+Wh_{t-1}+b)

从这个公式可以看出
RNN每一层的隐状态都由前一层的隐状态经过变换和**函数得到。反向传播求导时最终得到的导数会包含每一步梯度的连乘,这会引起梯度爆炸或梯度消失。所以RNN很难处理"长程依赖",即无法学到序列中蕴含的间隔较长的规律。

LSTM在隐状态计算的时候以加法代替了这里的迭代变化,可以避免梯度消失的问题,使网络学到长程的依赖。
【深度学习基础】RNN、LSTM基本结构
【深度学习基础】RNN、LSTM基本结构
一个RNN单元的输入由两部分组成:前一步的隐状态和当前步的外部输入。有一个输出。从外观来看,LSTM与RNN的输入输出一模一样。同样是在每一步接收外部的输入和前一阶段的隐状态并输出一个值。

和RNN有所不同,LSTM的隐状态有两部分,一部分是hth_t,一部分是CtC_t.CtC_t是各个步骤间传递的主要信息。通过加法,CtC_t可以无障碍地在这条主干道上传递,因此较远的梯度也可以在长程上传播,这就是LSTM的核心思想。
【深度学习基础】RNN、LSTM基本结构

不过,每一步的信息CtC_t并不是完全照搬前一步的Ct1C_{t-1},而是在Ct1C_{t-1}的基础上"遗忘"一些内容,以及"记住"一些新内容。

遗忘门

LSTM的每一个单元都有一个"遗忘门",用来控制遗忘掉Ct1C_{t-1}的那些部分。如下图所示:
【深度学习基础】RNN、LSTM基本结构
ft=σ(Wf[xt,ht1]+bf)f_t=\sigma(W_f[x_t,h_{t-1}]+b_f)

σ\sigma是Sigmoid**函数,它的输出在0~1之间。最终遗忘门的输出是和Ct1C_{t-1}相同形状的矩阵,这个矩阵会和Ct1C_{t-1}逐点相乘,决定要忘记哪些部分。

显然,遗忘门输出中越接近0的部分是要以遗忘的,而接近1的部分是要保留的。遗忘门的输入是xtx_t(当前时刻的输入)和ht1h_{t-1}(上一时刻的隐状态)

记忆门

光遗忘不行,LSTM还需要记住新东西。所以就有了记忆门
记忆门的输入同样是xtx_t(当前时刻的输入)和ht1h_{t-1}(上一时刻的隐状态)。
输出有两项,一项是iti_t,iti_t同样需要经过Sigmoid函数运算得到,因此值都在0~1之间。另一项是Ct~\widetilde{C_t}
最终要记住的部分是iti_tCt~\widetilde{C_t}逐点相乘。
【深度学习基础】RNN、LSTM基本结构
it=σ(Wi[ht1,xt]+bi)i_t=\sigma{(W_i[h_{t-1},x_t]+b_i)}
Ct~=tanh(WC[ht1,xt]+bC)\widetilde{C_t}=tanh{(W_C[h_{t-1},x_t]+b_C)}

遗忘记忆结合

“遗忘”“记忆”的过程如下图所示,ftf_t是遗忘门的输出( 0~l 之间 ), 而 Ct~it\widetilde{C_t}、i_t是要记住的新东西。

Ct=Ct1ft+Ct~itC_t=C_{t-1}*f_t+\widetilde{C_t}*i_t

这里得到的CtC_t是在各个RNN中传递的主要信息

【深度学习基础】RNN、LSTM基本结构

输出门

输出门用于计算另一个隐状态hth_t的值。真正的输出需要通过hth_t做进一步运算得到。
【深度学习基础】RNN、LSTM基本结构
输出门的输入同样是xtx_t(当前时刻的输入)和ht1h_{t-1}(上一时刻的隐状态)。并且需要加上遗忘门和记忆门中得到的CtC_t

输出是隐状态hth_t

ot=σ(Wo[ht1,xt]+bo)o_t={\sigma(W_o[h_{t-1},x_t]+b_o)}
ht=tanh(Ct)oth_t=tanh(C_t)*o_t

总结一下:在LSTM中,每一步的输入是xtx_t,隐状态是hth_tCtC_t,最终输出通过hth_t进一步变换得到。

相关文章: