这周的内容还是比较多的,得反复看很多遍才能领会,尤其是在吃瓜子不吃瓜子就打瞌睡的情况下。
为什么要用RNN1?
1. 序列数据及问题示例
从输入与输出数量不同可以分为:
- many to many
- 长度相同:命名实体识别
- 长度不同:语音识别/机器翻译
- many to one:情感分析/视频动作识别
- one to many:音乐合成
2. 符号
x < t > x^{<t>} x<t>: 一个样本中t时刻的值
T x T_x Tx: 输入序列的长度
y < t > y^{<t>} y<t>:一个样本中的第t个输出(不一定与 x x x对应)
T y T_y Ty:输出的序列长度
3. 基本的RNN单元
a < t > = tanh ( W a a a < t − 1 > + W a x x < t > + b a ) a^{<t>} = \tanh (W_{aa}a^{<t-1>} + W_{ax}x^{<t>} + b_a) a<t>=tanh(Waaa<t−1>+Waxx<t>+ba)
y < t > = softmax ( W y a a < t > + b y ) y^{<t>} = \text{softmax}(W_{ya}a^{<t>} + b_y) y<t>=softmax(Wyaa<t>+by)
将W矩阵做列增广、a和x做行增广,可以简化写法(就是简单的
1
×
2
1\times2
1×2和矩阵和
2
×
1
2\times1
2×1的矩阵相乘)。
a
<
t
>
=
tanh
(
[
W
a
a
⋮
W
a
x
]
[
a
<
t
−
1
>
x
<
t
>
]
+
b
a
)
a^{<t>} = \tanh (\left[ W_{aa} \vdots W_{ax} \right ] \begin{bmatrix} a_{<t-1>}\\ x^{<t>} \end{bmatrix} + b_a)
a<t>=tanh([Waa⋮Wax][a<t−1>x<t>]+ba)
图中 a < 0 > = 0 ⃗ a^{<0>} = \vec{0} a<0>=0。
很明显图没有公式直观,但是看懂公式了再回过头来看图还是可以的。
4. Language model
RNN也是可以用来学习语言模型的,下图在老师的图上进行了一些修改。
5. Gated Recurrent Unit (GRU)
RNN也面临严峻的Vanishing Gradients的问题,GRU是一种解决方案。
RNN Unit
a
<
t
>
=
g
(
W
a
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
a
)
a^{<t>} = g(W_a \left[ a^{<t-1>}, x^{<t>} \right] + b_a)
a<t>=g(Wa[a<t−1>,x<t>]+ba)
Gate RNN Unit
c
~
<
t
>
=
tanh
(
W
c
[
Γ
r
×
c
<
t
−
1
>
,
x
<
t
>
]
+
b
c
)
Γ
u
=
σ
(
W
u
[
c
<
t
−
1
>
,
x
<
t
>
]
+
b
u
)
Γ
r
=
σ
(
W
r
[
c
<
t
−
1
>
,
x
<
t
>
]
+
b
r
)
c
<
t
>
=
Γ
u
×
c
~
<
t
>
+
(
1
−
Γ
u
)
×
c
<
t
−
1
>
\begin{matrix} \tilde{c}^{<t>}&= \tanh (W_c \left[ \Gamma_r \times c^{<t-1>}, x^{<t>} \right] + b_c) \\ \Gamma_u &= \sigma(W_u \left[ c^{<t-1>}, x^{<t>} \right] + b_u)\\ \Gamma_r &= \sigma(W_r \left[ c^{<t-1>}, x^{<t>} \right] + b_r)\\ c^{<t>} &= \Gamma_u \times \tilde{c}^{<t>} + (1-\Gamma_u) \times c^{<t-1>} \end{matrix}
c~<t>ΓuΓrc<t>=tanh(Wc[Γr×c<t−1>,x<t>]+bc)=σ(Wu[c<t−1>,x<t>]+bu)=σ(Wr[c<t−1>,x<t>]+br)=Γu×c~<t>+(1−Γu)×c<t−1>
其中,
- 记忆单元 c < t > = a < t > c^{<t>} = a^{<t>} c<t>=a<t>
- Γ u \Gamma_u Γu: update
- Γ r \Gamma_r Γr: relevance
理解了计算逻辑之后,再用图片2 简化一下记忆。符号略有差异,但是应该对理解问题没有障碍。
6. Long Short Term Memeory (LSTM) network
LSTM Unit
Forget gate
Γ
f
<
t
>
=
σ
(
W
f
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
f
)
\Gamma_f^{<t>} = \sigma(W_f[a^{<t-1>}, x^{<t>}] + b_f)
Γf<t>=σ(Wf[a<t−1>,x<t>]+bf)
Update gate
Γ
u
<
t
>
=
σ
(
W
u
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
u
)
\Gamma_u^{<t>} = \sigma(W_u[a^{<t-1>}, x^{<t>}] + b_u)
Γu<t>=σ(Wu[a<t−1>,x<t>]+bu)
Updating the cell
c
~
<
t
>
=
tanh
(
W
c
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
c
)
c
<
t
>
=
Γ
f
<
t
>
∗
c
<
t
−
1
>
+
Γ
u
<
t
>
∗
c
~
<
t
>
\begin{matrix} \tilde{c}^{<t>} & = \tanh(W_c[a^{<t-1>}, x^{<t>}] + b_c)\\ c^{<t>} & = \Gamma_f^{<t>} * c^{<t-1>} + \Gamma_u^{<t>} * \tilde{c}^{<t>} \end{matrix}
c~<t>c<t>=tanh(Wc[a<t−1>,x<t>]+bc)=Γf<t>∗c<t−1>+Γu<t>∗c~<t>
Output gate
Γ
o
<
t
>
=
σ
(
W
o
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
o
)
a
<
t
>
=
Γ
o
<
t
>
∗
tanh
(
c
<
t
>
)
\begin{matrix} \Gamma_o^{<t>} & = \sigma (W_o[a^{<t-1>}, x^{<t>}] + b_o) \\ a^{<t>} & = \Gamma_o^{<t>} * \tanh(c^{<t>}) \end{matrix}
Γo<t>a<t>=σ(Wo[a<t−1>,x<t>]+bo)=Γo<t>∗tanh(c<t>)
仍然是理解了计算之后再来看图就容易理解多了
7. Bidirectional RNN & Deep RNN
- 在自然语言处理中双向RNN的使用应该是比较自然的。
- 叠加多层可以捕捉更复杂的模式,一般不会太多(两三层)
没什么想法,就是感觉电费在燃烧。
a 未标注的图上均是来自课程的PPT加工而来 ↩︎
图片来自wikipedia Gated Recurrent Unit ↩︎