RNN model
1、Notation
吴恩达深度学习课程中采用了如下的记号
以命名体识别为例子来举例,如输入一句话,识别出哪个单词是人名,有以下句子:
He said,“Teddy Roosevelt was a great President”.
N o t a t i o n : Notation: Notation:
- T x T^{x} Tx表示输入序列的长度,如上面这句话有8个单词所以 T x = 8 T^{x}=8 Tx=8, T y T^{y} Ty表示输出序列长度,本例中 T x = T y T^{x}=T^{y} Tx=Ty
- x < 1 > , x < 2 > . . . x T x x^{<1>},\ x^{<2>}...x^{T_x} x<1>, x<2>...xTx 表示输入语句的序列,如 x < 1 > x^{<1>} x<1>表示第一个单词He
- y < i > y^{<i>} y<i>是根据已经输入的信息计算的结果,如果是二分类,如人名识别可以是0或者1,1表示 x < i > x^{<i>} x<i>是一个人名,比如第三个和第四个单词Teddy,Roosevelt是人名,所以希望 y < 3 > = 1 , y < 4 > = 1 y^{<3>}=1,y^{<4>}=1 y<3>=1,y<4>=1
- a < i > a^{<i>} a<i>是由 x < i > x^{<i>} x<i>和 a i − 1 a^{i-1} ai−1(之前的信息)计算出来的激活值,其中 a < 0 > a^{<0>} a<0>是随机生成的向量
2、Forward Propagation
basic notation
符号 w y a w_{ya} wya中的第一个下标表示这个参数最终要计算的是 y y y,而第二个参数表示这个参数将会乘以一个 a a a, w a a w_{aa} waa同理
首先为了计算前向传播,现将上图蓝色框框住的参数进行随机初始化,包括
a
<
0
>
,
W
a
a
,
W
a
x
,
W
y
a
a^{<0>},W_{aa},W_{ax},W_{ya}
a<0>,Waa,Wax,Wya
I
n
i
t
i
a
l
i
z
e
:
a
<
0
>
=
0
⃗
,
W
a
a
,
W
a
x
,
W
y
a
Initialize: a^{<0>} = \vec0,W_{aa},W_{ax},W_{ya}
Initialize:a<0>=0,Waa,Wax,Wya
RNN的计算过程如上图中间的箭头方向所示,从左向右进行计算,每一时间步都有当前这一步的文本输入
x
<
t
>
x^{<t>}
x<t>,和前一步的激活值
a
<
t
−
1
>
a^{<t-1>}
a<t−1>,利用这些输入分别和对应的参数
W
a
x
,
W
a
a
W_{ax},W_{aa}
Wax,Waa进行线性运算再经过激活函数得到当前这步的激活值
a
<
t
>
a^{<t>}
a<t>
a
<
1
>
=
g
1
(
W
a
a
a
<
0
>
+
W
a
x
x
<
1
>
+
b
a
)
,
w
h
e
r
e
g
1
(
x
)
c
a
n
b
e
s
i
g
m
o
i
d
/
t
a
n
h
/
R
e
l
u
(
X
)
.
.
.
a^{<1>}=g_1(W_{aa}a^{<0>}+W_{ax}x^{<1>}+b_a), where\ g_1(x)\ can\ be\ sigmoid/tanh/Relu(X)...
a<1>=g1(Waaa<0>+Waxx<1>+ba),where g1(x) can be sigmoid/tanh/Relu(X)...
得到当前时间步t的激活值
a
<
t
>
a^{<t>}
a<t>之后,用
a
<
t
>
a^{<t>}
a<t>和对应的参数
W
y
a
W_{ya}
Wya进行线性运算再经过激活函数得到输出
y
<
t
>
y^{<t>}
y<t>,如果需要输出多个值,激活函数可以选择
s
o
f
t
m
a
x
softmax
softmax激活函数
y
<
1
>
=
g
2
(
W
y
a
a
<
1
>
+
b
y
)
,
w
h
e
r
e
g
2
(
x
)
c
a
n
b
e
s
o
f
t
m
a
x
(
x
)
.
.
.
y^{<1>}=g_2(W_{ya}a^{<1>}+b_y),where\ g_2(x)\ can \ be \ softmax(x)...
y<1>=g2(Wyaa<1>+by),where g2(x) can be softmax(x)...
.
.
.
...
...
每一步都按照上面的公式进行计算,并且每一步的参数
W
a
a
,
W
a
x
,
W
y
a
W_{aa},W_{ax},W_{ya}
Waa,Wax,Wya使用的都是同一套参数(在每个时间步上参数是共享的)
a
<
t
>
=
g
1
(
W
a
a
a
<
t
−
1
>
+
W
a
x
x
<
t
>
+
b
a
)
a^{<t>} = g_1(W_{aa}a^{<t-1>}+W_{ax}x^{<t>}+b_a)
a<t>=g1(Waaa<t−1>+Waxx<t>+ba)
y < t > = g 2 ( W y a a < t > + b y ) y^{<t>} = g_2(W_{ya}a^{<t>}+b_y) y<t>=g2(Wyaa<t>+by)
why RNN works?
RNN优点:
RNN 可以对整个句子序列进行表示,保持完整的上文信息。尤其是较长距离(超过卷积窗口)的词汇间的关联信息。(理论上)
从上图以及前向传播的过程可以看出:RNN的计算结果不仅仅取决于当前时间步的输入 x < t > x^{<t>} x<t>,而是在时间步t上加入了前一步的激活值 a < t > a^{<t>} a<t>从而综合考虑了前面 x < 1 > , x < 2 > , . . . x < t − 1 > x^{<1>},x^{<2>},...x^{<t-1>} x<1>,x<2>,...x<t−1>的输入对当前输出的影响。如上图中 h 3 h_3 h3的输出不仅仅和 x 3 x_3 x3有关,而且还受 x 0 x_0 x0和 x 1 x_1 x1的影响。正是因为RNN这种考虑当前输出不仅仅和当前输入有关,还与之前的输入有关的特性(可以称为RNN具有记忆能力,记忆了之前输入的信息),使得RNN对于序列数据具有很好的建模能力。
Simplified RNN notation
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 ) y^{<t>} = g(W_{ya}a^{<t>}+b_y) y<t>=g(Wyaa<t>+by)
将
w
a
a
w_{aa}
waa和
w
a
x
w_{ax}
wax按列水平堆叠起来得到新的矩阵
w
a
w_{a}
wa,
W
a
=
[
W
a
a
,
W
a
x
]
W_a= \begin{bmatrix} W_{aa},W_{ax} \end{bmatrix}
Wa=[Waa,Wax]
然后将
a
<
t
−
1
>
a^{<t-1>}
a<t−1>和
x
<
t
>
x^{<t>}
x<t>按行纵向堆叠起来得到:
[
a
<
t
−
1
>
x
<
t
>
]
\begin{bmatrix} a^{<t-1>}\\ x^{<t>} \end{bmatrix}
[a<t−1>x<t>]
所以得到:
W
a
[
a
<
t
−
1
>
x
<
t
>
]
=
[
W
a
a
,
W
a
x
]
[
a
<
t
−
1
>
x
<
t
>
]
=
W
a
a
a
<
t
−
1
>
+
W
a
x
x
<
t
>
W_a\begin{bmatrix} a^{<t-1>}\\ x^{<t>} \end{bmatrix}= \begin{bmatrix} W_{aa},W_{ax} \end{bmatrix} \begin{bmatrix} a^{<t-1>}\\ x^{<t>} \end{bmatrix}=W_{aa}a^{<t-1>}+W_{ax}x^{<t>}
Wa[a<t−1>x<t>]=[Waa,Wax][a<t−1>x<t>]=Waaa<t−1>+Waxx<t>
所以最初的公式可以简化如下:
a
<
t
>
=
g
(
W
a
[
a
<
t
−
1
>
x
<
t
>
]
+
b
a
)
a^{<t>}=g(W_a\begin{bmatrix} a^{<t-1>}\\ x^{<t>} \end{bmatrix}+b_a)
a<t>=g(Wa[a<t−1>x<t>]+ba)
y < t > = g ( W y a < t > + b y ) , W y = W y a y^{<t>}=g(W_ya^{<t>}+b_y),W_y=W_{ya} y<t>=g(Wya<t>+by),Wy=Wya
以上就是RNN的前向传播过程
3、Rough Sense of Backprop Works in RNN
前向传播的计算图如下:
首先前向传播:用
a
<
0
>
a^{<0>}
a<0>,
x
<
1
>
x^{<1>}
x<1>计算出
a
<
1
>
a^{<1>}
a<1>,由
a
<
1
>
a^{<1>}
a<1>计算出
y
^
<
1
>
\hat y^{<1>}
y^<1>,到此完成了第一步的前向传播…以此类推由
a
<
t
−
1
>
,
x
<
t
>
a^{<t-1>},x^{<t>}
a<t−1>,x<t>计算出
a
<
t
>
a^{<t>}
a<t>,然后由
a
<
t
>
a^{<t>}
a<t>计算出
y
^
<
t
>
\hat y^{<t>}
y^<t>,到此完成了第t步的前向传播。
以下计算图中的红色箭头表示反向传播的步骤
首先定义在每一个时间步上的损失函数,这里使用交叉熵损失函数:
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>})=-\hat y^{<t>}log(\hat y^{<t>})-(1-y^{<t>})log(1-y^{<t>})
L<t>(y^<t>,y<t>)=−y^<t>log(y^<t>)−(1−y<t>)log(1−y<t>)
对每一时间步的损失加起来,得到总的损失:
L
=
(
y
^
,
y
)
=
∑
t
=
1
T
x
L
<
t
>
(
y
^
<
t
>
,
y
<
t
>
)
L=(\hat y, y)=\sum_{t=1}^{T^x}L^{<t>}(\hat y^{<t>},y^{<t>})
L=(y^,y)=t=1∑TxL<t>(y^<t>,y<t>)
反向传播的方向如上图红色箭头所示
4、Different types of RNNS
1、one-to-many
应用场景音乐生成,或者序列生成。给定一个整数表示序列、音乐的种类,然后生成一段序列、音乐
2、many-to-one
应用场景情感分类。给定一个文本序列,通过RNN模型给出对该段文本的情感评价,1-5的一个整数,越大表示文本情感越接近积极
3、many-to-many
3.1输入序列和输出序列长度相等
命名体识别。给定一段文本,识别文本中的人名,输出向量和输入的文本单词数一样( T x = T y T^x=T^y Tx=Ty, T x T^x Tx表示输入序列长度, T y T^y Ty表示输出序列长度),输出向量中为1的表示该单词为名字,为0的表示不是。
3.2输入序列和输出序列长度不相等
机器翻译。给定一段文本将其翻译成另一种语言的文本( T x ̸ = T y T^x \not = T_y Tx̸=Ty, T x T^x Tx表示输入序列长度, T y T^y Ty表示输出序列长度)