Recurrent Neural Networks(RNN)
1. 模型
h
t
=
t
a
n
h
[
W
h
x
X
t
+
W
h
h
h
t
−
1
+
b
h
]
h_t = tanh[W_{hx}X_t + W_{hh}h_{t-1}+b_h]
ht=tanh[WhxXt+Whhht−1+bh]
z
t
=
f
(
W
h
y
h
t
+
b
z
)
z_t=f(W_{hy}h_t+b_z)
zt=f(Whyht+bz)
- t a n h ( v ) = e x p ( 2 v ) − 1 e x p ( 2 v ) + 1 tanh(v) = \frac{exp(2v)-1}{exp(2v)+1} tanh(v)=exp(2v)+1exp(2v)−1
- W h h , W x h , W h y W_{hh},W_{xh},W_{hy} Whh,Wxh,Why都是可训练的权重矩阵。
- b h , b z b_h,b_z bh,bz都是可训练的偏差向量。
- X t X_t Xt和 z t z_t zt分别是时间 t t t的输入和输出。
2.损失函数
L
τ
(
θ
)
=
∑
t
∈
τ
L
(
y
t
,
z
t
)
L_\tau(\theta) = \sum_{t\in\tau}L(y_t,z_t)
Lτ(θ)=t∈τ∑L(yt,zt)
这里的
τ
\tau
τ是输出序列。
3.不同形态的RNN
应用场景:
- One-to-many: image captioning;
- Many-to-one: text sentiment classification;
- Many-to-many: machine translation.
4. 多层RNN
回想一下单层RNN:
h
t
=
t
a
n
h
[
W
h
x
X
t
+
W
h
h
h
t
−
1
+
b
h
]
=
t
a
n
h
[
W
(
X
t
h
t
−
1
1
)
]
h_t = tanh[W_{hx}X_t + W_{hh}h_{t-1}+b_h]=tanh\begin{bmatrix}W\begin{pmatrix}X_t\\h_{t-1}\\1\end{pmatrix}\end{bmatrix}
ht=tanh[WhxXt+Whhht−1+bh]=tanh⎣⎡W⎝⎛Xtht−11⎠⎞⎦⎤
多层RNN是单层RNN堆叠而来的:
h t l = t a n h [ W ( h t l − 1 h t − 1 1 ) ] h_t^l =tanh\begin{bmatrix}W\begin{pmatrix}h_t^{l-1}\\h_{t-1}\\1\end{pmatrix}\end{bmatrix} htl=tanh⎣⎡W⎝⎛htl−1ht−11⎠⎞⎦⎤
高层的隐含状态 h t l h_t^l htl由老的状态 h t − 1 l h_{t-1}^l ht−1l和低层的隐含状态 h t ( l − 1 ) h_t^(l-1) ht(l−1)决定。
5. RNN存在的问题
普通RNN的一个显著缺点是,当序列长度很大时,RNN难以捕获序列数据中的长依赖项。这有时是梯度消失/爆炸造成的。
在下面的例子中,计算
∂
L
τ
∂
h
1
\frac{\partial L_\tau}{\partial h_1}
∂h1∂Lτ时,根据链式求导法则,我们需要计算
∏
t
=
1
3
(
∂
h
t
+
1
∂
h
t
)
\prod_{t=1}^3(\frac{\partial h_{t+1}}{\partial h_t})
∏t=13(∂ht∂ht+1)。
如果序列很长,这个乘积将是许多雅可比矩阵的乘积,这通常会得到指数大或指数小的奇异值。