记录一下对RNN,LSTM,GRU基本原理(正向过程以及简单的反向过程)的个人理解
RNN
Recurrent Neural Networks,循环神经网络
(注意区别于recursive neural network,递归神经网络)
为了解决DNN存在着无法对时间序列上的变化进行建模的问题(如自然语言处理、语音识别、手写体识别),出现的另一种神经网络结构——循环神经网络RNN。
RNN结构

- 第
t
层神经元的输入,除了其自身的输入
xt
,还包括上一层神经元的隐含层输出
st−1
- 每一层的参数U,W,V都是共享的

- 每一层并不一定都得有输入和输出,如对句子进行情感分析是多到一,文本翻译多到多,图片描述一到多
数学描述
(以下开始符号统一)
回忆一下单隐含层的前馈神经网络
输入为
X∈Rn×x
(n个维度为x的向量)
隐含层输出为
H=ϕ(XWxh+bh)
输出层输入
H∈Rn×h
输出为
Y^=softmax(HWhy+by)
现在对
X
、
H
、
Y
都加上时序下标
同时引入一个新权重
Whh∈Rh×h
得到RNN表达式
Ht=ϕ(XtWxh+Ht−1Whh+bh)
Y^t=softmax(HtWhy+by)
H0
通常置零
深层RNN和双向RNN

通过时间反向传播和随之带来的问题
输入为
xt∈Rx
不考虑偏置
隐含层变量为
ht=ϕ(Whxxt+Whhht−1)
输出层变量为
ot=Wyhht
则损失函数为
L=1T∑t=1Tℓ(ot,yt)
以一个三层为例
三个参数更新公式为
Whx=Whx−η∂L∂Whx
Whh=Whh−η∂L∂Whh
Wyh=Wyh−η∂L∂Wyh
明显的
∂L∂ot=∂ℓ(ot,yt)T⋅∂ot
根据链式法则
∂L∂Wyh=∑t=1Tprod(∂L∂ot,∂ot∂Wyh)=∑t=1T∂L∂oth⊤t
先计算目标函数有关最终时刻隐含层变量的梯度
∂L∂hT=prod(∂L∂oT,∂oT∂hT)=W⊤yh∂L∂oT
假设
ϕ(x)=x
(RNN中用激活函数relu还是tanh众说纷纭,有点玄学)
∂L∂ht=prod(∂L∂ht+1,∂ht+1∂ht)+prod(∂L∂ot,∂ot∂ht)=W⊤hh∂L∂ht+1+W⊤yh∂L∂ot
通项为
∂L∂ht=∑i=tT(W⊤hh)T−iW⊤yh∂L∂oT+t−i
注意上式,当每个时序训练数据样本的时序长度T较大或者时刻t较小,目标函数有关隐含层变量梯度较容易出现衰减和爆炸
∂L∂Whx=∑t=1Tprod(∂L∂ht,∂ht∂Whx)=∑t=1T∂L∂htx⊤t
∂L∂Whh=∑t=1Tprod(∂L∂ht,∂ht∂Whh)=∑t=1T∂L∂hth⊤t−1
梯度裁剪
为了应对梯度爆炸,一个常用的做法是如果梯度特别大,那么就投影到一个比较小的尺度上。
θ
为设定的裁剪“阈值”,为标量,若梯度的范数大于此阈值,将梯度缩小,若梯度的范数小于此阈值,梯度不变
g=min(θ∥g∥,1)g
LSTM
RNN的隐含层变量梯度可能会出现衰减或爆炸。虽然梯度裁剪可以应对梯度爆炸,但无法解决梯度衰减。因此,给定一个时间序列,例如文本序列,循环神经网络在实际中其实较难捕捉两个时刻距离较大的文本元素(字或词)之间的依赖关系。
LSTM(long short-term memory)由Hochreiter和Schmidhuber在1997年被提出。
LSTM结构
这里两张图先不用细看,先着重记住公式后再回来看

数学描述
(同上,符号统一)
设隐含状态长度
h
,h
,
t
时刻输入
Xt∈Rn×x
(
x
维)及
t−1
时刻隐含状态
H