文章目录
参考 红色石头Will
一、为何用RNN而不是CNN
- 序列模型用tensorflow独热编码实现
- CNN的缺点
- 不同样本的输入序列长度或输出序列长度不同
- CNN无法共享序列不同 x < t > x^{<t>} x<t>之间的特征
- RNN模型如下:
- RNN正向传播过程为:
a
<
t
>
=
g
(
W
a
a
a
<
t
−
1
>
+
W
a
x
x
<
t
>
+
b
a
)
a^{<t>}=g(W_{aa}a^{<t-1>}+W_{ax}x^{<t>}+b_a)
a<t>=g(Waaa<t−1>+Waxx<t>+ba)
y
^
<
t
>
=
g
(
W
y
a
a
<
t
>
+
b
y
)
\hat y^{<t>}=g(W_{ya}a^{<t>}+b_y)
y^<t>=g(Wyaa<t>+by)
为了简化表达式,对
a
<
t
>
a^{<t>}
a<t>整合:
W
a
a
a
<
t
−
1
>
+
W
a
x
x
<
t
>
=
[
W
a
a
W
a
x
]
[
a
<
t
−
1
>
x
<
t
>
]
=
W
a
[
a
<
t
−
1
>
,
x
<
t
>
]
W_{aa}a^{<t-1>}+W_{ax}x^{<t>}=[W_{aa} W_{ax}]\begin{bmatrix} a^{<t-1>} \\ x^{<t>} \\ \end{bmatrix}=W_a[a^{<t-1>},x^{<t>}]
Waaa<t−1>+Waxx<t>=[WaaWax][a<t−1>x<t>]=Wa[a<t−1>,x<t>]
则正向传播可表示为:
a
<
t
>
=
g
(
W
a
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
a
)
a^{<t>}=g(W_a[a^{<t-1>},x^{<t>}]+b_a)
a<t>=g(Wa[a<t−1>,x<t>]+ba)
y
^
<
t
>
=
g
(
W
y
a
<
t
>
+
b
y
)
\hat y^{<t>}=g(W_{y}a^{<t>}+b_y)
y^<t>=g(Wya<t>+by)
- RNN反向传播过程为:
进过RNN正向传播,单个元素的loss function为:
L
<
t
>
(
y
^
<
t
>
,
y
<
t
>
)
=
−
y
<
t
>
l
o
g
y
^
<
t
>
−
(
1
−
y
<
t
>
)
l
o
g
(
1
−
y
^
<
t
>
)
L^{<t>}(\hat y^{<t>},y^{<t>})=-y^{<t>}log \hat y^{<t>}-(1-y^{<t>})log(1-\hat y^{<t>})
L<t>(y^<t>,y<t>)=−y<t>logy^<t>−(1−y<t>)log(1−y^<t>)
该样本的所有元素的loss function为:
L
(
y
^
,
y
)
=
∑
t
=
i
T
y
L
<
t
>
(
y
^
<
t
>
,
y
<
t
>
)
L(\hat y,y)=\sum_{t=i}^{T_y}L^{<t>}(\hat y^{<t>},y^{<t>})
L(y^,y)=t=i∑TyL<t>(y^<t>,y<t>)
然后,反向传播过程就是从右到左分别计算
L
(
y
^
,
y
)
L(\hat y,y)
L(y^,y)对参数
W
a
,
W
y
,
b
a
,
b
y
W_a,W_y,b_a,b_y
Wa,Wy,ba,by的偏导数。
1.2、BRNN
输出
y
<
t
>
y^{<t>}
y<t>表达式为:
y
^
<
t
>
=
g
(
W
y
[
a
−
>
<
t
>
,
a
<
−
<
t
>
]
+
b
y
)
\hat y^{<t>}=g(W_y[a^{-><t>},a^{<-<t>}]+b_y)
y^<t>=g(Wy[a−><t>,a<−<t>]+by)
特点:
- 模型能够考虑前面的信息,也能考虑后面的信息。
- 模型必须是一个完整的数据的序列,才能预测任意位置。
1.3、Deep RNNs
Deep RNNs由多层RNN组成,其结构如下图所示:
Deep RNNs中
a
[
l
]
<
t
>
a^{[l]<t>}
a[l]<t>的表达式为:
a
[
l
]
<
t
>
=
g
(
W
a
[
l
]
[
a
[
l
]
<
t
−
1
>
,
a
[
l
−
1
]
<
t
>
]
+
b
a
)
a^{[l]<t>}=g(W_a^{[l]}[a^{[l]<t-1>},a^{[l-1]<t>}]+b_a)
a[l]<t>=g(Wa[l][a[l]<t−1>,a[l−1]<t>]+ba)
二、不同类型的RNNs
- many to many: T x = Y y T_x = Y_y Tx=Yy
- many to many: T x ≠ Y y T_x \neq Y_y Tx=Yy
- many to one: T x > 1 , T y = 1 T_x >1,T_y =1 Tx>1,Ty=1
- one to many: T x = 1 , Y y > 1 T_x =1,Y_y>1 Tx=1,Yy>1
- one to one:
T
x
=
1
,
Y
y
=
1
T_x =1, Y_y=1
Tx=1,Yy=1
三、利用RNN解决现实生活的问题
3.1、建立语言模型
- 什么是语言模型?
计算某个语句的概率,选择概率最大的语句作为正确的翻译。 - 如何使用RNN构建语言模型?
需要一个由大量的单词语句语料库corpus构成的训练集,然后对corpus的每句话进行切分词tokenize(建立vocabulary,对每个单词进行one-hot编码)。 - 达到什么效果?
对语料库的每条语句进行RNN模型训练,最终得到的模型可以根据给出语句的前几个单词预测其余部分。 - 补充
整个语句出现的概率等于语句中所有元素出现的条件概率乘积。例如某个语句包含 y < 1 > , y < 2 > , y < 3 > , y^{<1>},y^{<2>},y^{<3>}, y<1>,y<2>,y<3>,则整个语句出现的概率为:
P ( y < 1 > , y < 2 > , y < 3 > ) = P ( y < 1 > ) ∗ P ( y < 2 > ∣ y < 1 > ) ∗ P ( y < 3 > ∣ y < 1 > , y < 2 > ) P(y^{<1>},y^{<2>},y^{<3>})=P(y^{<1>})*P(y^{<2>}|y^{<1>})*P(y^{<3>}|y^{<1>},y^{<2>}) P(y<1>,y<2>,y<3>)=P(y<1>)∗P(y<2>∣y<1>)∗P(y<3>∣y<1>,y<2>)
3.2、新的序列采用
利用训练好的RNN语言模型,可以进行新的序列采样,从而随机产生新的语句。
四、RNN的缺点
4.1、梯度爆炸
4.1.1、解决1:梯度剪枝:设定一个阈值,一旦梯度最大值达到这个阈值,就对整个梯度向量进行尺度缩小。
- 梯度消失
- 解决1:添加记忆单元c,构建GRU
相应的表达式为:
c ~ < t > = t a n h ( W c [ Γ r ∗ c < t − 1 > , x < t > ] + b c ) \tilde{c}^{<t>}=tanh(W_c[\Gamma_{r}*c^{<t-1>},x^{<t>}]+b_c) c~<t>=tanh(Wc[Γr∗c<t−1>,x<t>]+bc)
Γ u = σ ( W u [ c < t − 1 > , x < t > ] + b u ) \Gamma_{u}=\sigma(W_u[c^{<t-1>},x^{<t>}]+b_u) Γu=σ(Wu[c<t−1>,x<t>]+bu)
Γ r = σ ( W r [ c < t − 1 > , x < t > ] + b r ) \Gamma_{r}=\sigma(W_r[c^{<t-1>},x^{<t>}]+b_r) Γr=σ(Wr[c<t−1>,x<t>]+br)
c < t > = Γ ∗ c ~ < t > + ( 1 − Γ u ) ∗ c < t − 1 > c^{<t>}=\Gamma*\tilde{c}^{<t>}+(1-\Gamma_{u})*c^{<t-1>} c<t>=Γ∗c~<t>+(1−Γu)∗c<t−1>
a < t > = c < t > a^{<t>}=c^{<t>} a<t>=c<t>
注意:
候选值: c ~ < t > \tilde{c}^{<t>} c~<t>,代替表示 c < t > c^{<t>} c<t>
相关性门: Γ r \Gamma_{r} Γr,计算出的下一个 c < t > c^{<t>} c<t>的候选值 c ~ < t > \tilde{c}^{<t>} c~<t>跟 c < t − 1 > c^{<t-1>} c<t−1>有多大的相关性。
更新门: Γ u \Gamma_{u} Γu,取值为0或1,0代表不更新,1代表更新。
- 解决1:添加记忆单元c,构建GRU
4.1.2、解决2:LSTM
相应表达式:
c
~
<
t
>
=
t
a
n
h
(
W
c
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
c
)
\tilde{c}^{<t>}=tanh(W_c[a^{<t-1>},x^{<t>}]+b_c)
c~<t>=tanh(Wc[a<t−1>,x<t>]+bc)
Γ
u
=
σ
(
W
u
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
u
)
\Gamma_{u}=\sigma(W_u[a^{<t-1>},x^{<t>}]+b_u)
Γu=σ(Wu[a<t−1>,x<t>]+bu)
Γ
r
=
σ
(
W
r
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
r
)
\Gamma_{r}=\sigma(W_r[a^{<t-1>},x^{<t>}]+b_r)
Γr=σ(Wr[a<t−1>,x<t>]+br)
Γ
o
=
σ
(
W
o
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
o
)
\Gamma_{o}=\sigma(W_o[a^{<t-1>},x^{<t>}]+b_o)
Γo=σ(Wo[a<t−1>,x<t>]+bo)
c
<
t
>
=
Γ
u
∗
c
~
<
t
>
+
Γ
f
∗
c
<
t
−
1
>
c^{<t>}=\Gamma_u*\tilde{c}^{<t>}+\Gamma_{f}*c^{<t-1>}
c<t>=Γu∗c~<t>+Γf∗c<t−1>
a
<
t
>
=
Γ
o
c
<
t
>
a^{<t>}=\Gamma_{o}c^{<t>}
a<t>=Γoc<t>
参数详情:
更新门:
Γ
u
\Gamma_{u}
Γu
遗忘门:
Γ
f
\Gamma_{f}
Γf
输出门:
Γ
o
\Gamma_{o}
Γo
如果考虑
c
<
t
−
1
>
c^{<t-1>}
c<t−1>对
Γ
u
、
Γ
f
、
Γ
o
\Gamma_{u}、\Gamma_{f}、\Gamma_{o}
Γu、Γf、Γo的影响,可加入
c
<
t
−
1
>
c^{<t-1>}
c<t−1>,则修改后的表达式为:
c
~
<
t
>
=
t
a
n
h
(
W
c
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
c
)
\tilde{c}^{<t>}=tanh(W_c[a^{<t-1>},x^{<t>}]+b_c)
c~<t>=tanh(Wc[a<t−1>,x<t>]+bc)
Γ
u
=
σ
(
W
u
[
a
<
t
−
1
>
,
x
<
t
>
,
c
<
t
−
1
>
]
+
b
u
)
\Gamma_{u}=\sigma(W_u[a^{<t-1>},x^{<t>},c^{<t-1>}]+b_u)
Γu=σ(Wu[a<t−1>,x<t>,c<t−1>]+bu)
Γ
r
=
σ
(
W
r
[
a
<
t
−
1
>
,
x
<
t
>
,
c
<
t
−
1
>
]
+
b
r
)
\Gamma_{r}=\sigma(W_r[a^{<t-1>},x^{<t>},c^{<t-1>}]+b_r)
Γr=σ(Wr[a<t−1>,x<t>,c<t−1>]+br)
Γ
o
=
σ
(
W
o
[
a
<
t
−
1
>
,
x
<
t
>
,
c
<
t
−
1
>
]
+
b
o
)
\Gamma_{o}=\sigma(W_o[a^{<t-1>},x^{<t>},c^{<t-1>}]+b_o)
Γo=σ(Wo[a<t−1>,x<t>,c<t−1>]+bo)
c
<
t
>
=
Γ
u
∗
c
~
<
t
>
+
Γ
f
∗
c
<
t
−
1
>
c^{<t>}=\Gamma_u*\tilde{c}^{<t>}+\Gamma_{f}*c^{<t-1>}
c<t>=Γu∗c~<t>+Γf∗c<t−1>
a
<
t
>
=
Γ
o
c
<
t
>
a^{<t>}=\Gamma_{o}c^{<t>}
a<t>=Γoc<t>