文章目录
前言
这一系列博文记录学习深度学习的一些零散的笔记。从神经网络的基础到优化算法,再到深度学习神经网络(DNN)、卷积神经网络(CNN)和循环神经网络(RNN)。
深度学习以处理非结构化数据而著称。除常见的应用在图像领域的CNN外,对于语音和文本等非结构化数据,CNN的处理效果并不好。接下来介绍一种在自然语言处理领域应用十分广泛的序列网络模型——循环神经网络(Recurrent Neural Network, RNN).
五、循环神经网络(RNN)
CNN致力于解决如何让计算机理解图像的问题,但仅仅是视觉层面,远远谈不上人工智能。人工智能除了要具备视觉能力外,还要具备听写和读写的功能。所谓自然语言处理(Natural Language Processing, NLP),就是让计算机具备处理、理解和运用人类语言的能力。
之前介绍的DNN和CNN在处理文本序列数据时存在如下两点问题:
- 输入、输出的长度是否相等以及输入大小不固定;
- 普通神经网络不能共享从文本不同位置上学到的特征。
下图所示是RNN的基本结构。左边是一个统一的表现形式,右边是左边的展开图解。在这样的循环神经网络中,当预测 y t y_t yt时,不仅要使用 x t x_t xt的信息,还要使用到 x t − 1 x_{t-1} xt−1的信息,因为在横轴路径上的隐状态激活信息可以预测 y t y_t yt。
所以,RNN单元结构通常需要进行两次激活计算,一次是结合上一个时间步的隐状态值和输入的计算,另一次是基于当前隐状态值得输入输出。
两次激活公式计算如下:
a
t
=
t
a
n
h
(
w
x
x
t
+
w
a
a
t
−
1
+
b
a
)
y
t
=
s
o
f
t
m
a
x
(
w
y
a
t
+
b
y
)
a_t = tanh(w_x x_t + w_a a_{t-1} + b_a) \\ y_t = softmax(w_y a_t + b_y)
at=tanh(wxxt+waat−1+ba)yt=softmax(wyat+by) 其中隐藏层得激活函数一般使用tanh,而输入、输出的激活函数一般使用sigmoid或softmax。当多个这样的RNN单元组合到一起便是RNN,一个RNN结构如下图所示。
上述介绍的是RNN最基本的形式,但NLP等序列建模问题多样且复杂,针对不同的任务类型,RNN可以分为如下表所示的四种形式:
结构类型 | 简称 | 适用场景 |
---|---|---|
一对多 | 1 vs N | 根据类型生成对应音乐或图像等 |
多对一 | N vs 1 | 情感分析、文本分类等 |
多对多(等长) | N vs N | 视频每帧分类等 |
多对多(不等长) | N vs M | 机器翻译、语音识别等 |
四种形式的RNN的结构如下图所示:
上述四种RNN结构,最常用的就是不等长的多对多结构,即输入和输出都是多个,但是并不相等,这种不等长的输入、输出模型也叫做seq2seq(序列对序列)模型,不等长的多对多结构符合实际序列建模的大多数情况。对于这种情况,RNN的做法通常是先将输入序列编码成一个上下文向量
C
C
C,如图10.10。编码完成后再用一个RNN对
C
C
C的结果进行编码,简而言之就是将
C
C
C作为初始状态的隐变量输入到解码网络。如下图所示
不等长的多对多结构因为对输入、输出长度没有限制,因此有着非常广泛的应用,主要包括语音识别、机器翻译、文本摘要生成和阅读理解等。
六、长短期记忆网络(LSTM)
普通RNN网络结构不足以处理较复杂的序列建模问题,存在严重的梯度消失问题,最直观的现象就是随着网络层数的增加,网络会变得无法训练。长短期记忆网络(Long Short Time Memory, LSTM)正是为了解决梯度消失问题而设计的一种特殊RNN结构。
6.1 梯度消失与梯度爆炸
神经网络通过设置损失函数,建立损失函数关于各层网络输入、输出的梯度计算,当网络开始训练的时,系统便按照反向传播机制来更新各层参数直到停止训练。当层数不断加深的时,系统经常会出现一些问题,其中梯度消失和梯度爆炸是两个较严重的问题。
所谓梯度消失,就是指训练过程中梯度变得越来越小以至于梯度得不到更新的情形。当网络加深时,网络深处的误差因为梯度的减小很难影响到前层网络的权重更新,一旦权重得不到有效的计算,神经网络的训练机制也就失效了。
所谓梯度爆炸,就是指训练过程中梯度变得越来越大导致神经网络权重疯狂更新的情况。这种情况很容易发生,因为梯度过大,计算更新得到的参数也会大到崩溃,这时就可能看到更新的参数值中有很多NaN(未定义或不可表示值),这说明梯度爆炸已经使得参数更新到数值溢出。
总体来说,在神经网络的训练过程中梯度过大或过小引起的参数过大或过小都会导致神经网络失效,那我们的目的就是让梯度计算回归到正常的范围。梯度爆炸处理较容易,在实际训练过程中进行修剪即可;梯度消失的一个关键在于激活函数,sigmoid激活函数本身就更容易产生这个问题,所以一般而言,使用ReLU激活函数以及给神经网络加上归一化激活函数层(BN层),一般问题都可以得到解决,但有些情形不可以使用,比如RNN网络。
6.2 LSTM
针对梯度消失和梯度爆炸的问题,研究人员在RNN结构基础上,给出了一些著名的改进方案,比较著名的就是循环门控制单元(GRU)和长短期记忆网络(LSTM),这里介绍LSTM。
- LSTM的本质是一种RNN网络;
- LSTM在传统的RNN结构上做了相对复杂的改进,这些改进使得LSTM相对于经典RNN能够更好地解决梯度消失和梯度爆炸的问题,让循环神经网络具备更强、更好的记忆性能。
下图是标准RNN结构和LSTM结构的示意图:
图11.3中可以看出,相较于RNN,LSTM单元要复杂得多。每个LSTM单元包含了4个交互的网络层,下图将LSTM单元放大,并标注上各个结构名称
一个完整的LSTM单元可以用下式表示,其中
[
]
[ ]
[]符号表示两个变量合并
Γ
t
f
=
σ
(
w
f
[
a
t
−
1
,
x
t
]
+
b
f
)
Γ
t
u
=
σ
(
w
u
[
a
t
−
1
,
x
t
]
+
b
u
)
c
t
′
=
t
a
n
h
(
w
c
[
a
t
−
1
,
x
t
]
+
b
c
)
c
t
=
Γ
t
f
c
t
−
1
+
Γ
t
u
c
t
′
Γ
t
o
=
σ
(
w
o
[
a
t
−
1
,
x
t
]
+
b
o
)
a
t
=
Γ
t
o
t
a
n
h
(
c
t
)
\Gamma _{t}^{f} = \sigma(w_f [a_{t-1}, x_t] + b_f) \\ \Gamma _{t}^{u} = \sigma(w_u [a_{t-1}, x_t] + b_u) \\ c_t^{'} = tanh(w_c[a_{t-1}, x_t] + b_c) \\ c_t = \Gamma _{t}^{f} c_{t-1} + \Gamma _{t}^{u} c_t^{'} \\ \Gamma _{t}^{o} = \sigma(w_o [a_{t-1}, x_t] + b_o) \\ a_t = \Gamma _{t}^{o} tanh(c_t)
Γtf=σ(wf[at−1,xt]+bf)Γtu=σ(wu[at−1,xt]+bu)ct′=tanh(wc[at−1,xt]+bc)ct=Γtfct−1+Γtuct′Γto=σ(wo[at−1,xt]+bo)at=Γtotanh(ct) 下面根据LSTM结构图和公式推导逐块解释LSTM。
(1)遗忘门
遗忘门(Forget Gate)的计算公式如下
Γ
t
f
=
σ
(
w
f
[
a
t
−
1
,
x
t
]
+
b
f
)
\Gamma _{t}^{f} = \sigma(w_f [a_{t-1}, x_t] + b_f)
Γtf=σ(wf[at−1,xt]+bf) 遗忘门的作用是决定从记忆细胞
c
c
c中是否丢弃某些信息,这些过程可以通过一个sigmoid函数来进行处理。从LSTM结构图中可以看出遗忘门接受来自输入
x
t
x_t
xt和上一层隐状态
a
t
−
1
a_{t-1}
at−1的值进行合并后再加权计算处理。
(2)记忆细胞候选值和更新门
更新门(Update Gate)表示需要将什么样的信息存入记忆细胞中。除计算更新门外,还需要使用tanh计算记忆细胞的候选值
c
t
′
c_t^{'}
ct′. 记忆细胞候选值和更新门的计算公式如下
Γ
t
u
=
σ
(
w
u
[
a
t
−
1
,
x
t
]
+
b
u
)
c
t
′
=
t
a
n
h
(
w
c
[
a
t
−
1
,
x
t
]
+
b
c
)
\Gamma _{t}^{u} = \sigma(w_u [a_{t-1}, x_t] + b_u) \\ c_t^{'} = tanh(w_c[a_{t-1}, x_t] + b_c)
Γtu=σ(wu[at−1,xt]+bu)ct′=tanh(wc[at−1,xt]+bc)(3)记忆细胞
c
t
−
1
>
>
c
t
c_{t-1}>>c_t
ct−1>>ct
相较于RNN,LSTM提供了 c c c作为记忆细胞输入,记忆细胞提供了记忆功能,在网络结构加深时仍然能够传递前后层的网络信息。这样贯穿的记忆细胞使得记忆信息在网络之间很容易保持下去。
结合遗忘门
Γ
t
f
\Gamma _{t}^{f}
Γtf、更新门
Γ
t
u
\Gamma _{t}^{u}
Γtu、上一个单元记忆细胞值
c
t
−
1
c_{t-1}
ct−1和记忆细胞候选值
c
t
′
c_t^{'}
ct′来共同决定和更新当前细胞状态,即
c
t
=
Γ
t
f
c
t
−
1
+
Γ
t
u
c
t
′
c_t = \Gamma _{t}^{f} c_{t-1} + \Gamma _{t}^{u} c_t^{'}
ct=Γtfct−1+Γtuct′ (4)输出门
LSTM提供了单独的输出门(Output Gate),其计算公式如下
Γ
t
o
=
σ
(
w
o
[
a
t
−
1
,
x
t
]
+
b
o
)
a
t
=
Γ
t
o
t
a
n
h
(
c
t
)
\Gamma _{t}^{o} = \sigma(w_o [a_{t-1}, x_t] + b_o) \\ a_t = \Gamma _{t}^{o} tanh(c_t)
Γto=σ(wo[at−1,xt]+bo)at=Γtotanh(ct) 以上便是LSTM的完整结构。LSTM在NLP、问答系统、股票预测等领域都有着广泛而深入的应用。
七、seq2seq与注意力模型
seq2seq作为一种输入、输出不等长的多对多模型有着十分广泛的应用场景。注意力(Attention)模型则是一种模拟人类注意力直觉的机制,二者结合会使得模型取得更好的效果。
7.1 seq2seq 简介
seq2seq本质上就是一种多对多(N vs M)的RNN模型,即输入序列和输出序列不等长的RNN模型。其由一个编码器(Encoder)和一个解码器(Decoder)构成,编码器先将输入序列转化为一个上下文向量 C C C,然后再利用一个解码器将上下文向量 C C C转化为最终输出。
7.2 注意力模型
单纯的编码-解码框架并不能有效地聚焦到输入目标上,这使得像seq2seq的模型在独自使用时并不能发挥其最大功效。
注意力模型就是基于编码-解码框架下的一种模拟人类注意力直觉的一种模型。人脑的注意力机制本质上是一种注意力资源分配的模型。注意力模型的使用更多的是在自然语言处理领域,在机器翻译等序列模型应用上有着更为广泛的应用。
带有注意力机制的seq2seq模型结构示意图如下
编码器将输入编码成上下文向量
C
C
C,在解码时每个输出
Y
Y
Y都会不加区分地使用这个
C
C
C进行解码。而注意力模型要做的就是根据序列的每个时间步将解码器编码为不同的
C
C
C,在解码时,结合每个不同的
C
C
C进行解码输出,这样得到的结果会更加准确。
y
1
=
f
(
C
1
)
y
2
=
f
(
C
2
+
y
1
)
y
3
=
f
(
C
3
+
y
1
+
y
2
)
.
.
.
\begin{aligned} y_1&=f(C_1) \\ y_2&=f(C_2+y_1) \\ y_3&=f(C_3+y_1+y_2) \\ & ... \end{aligned}
y1y2y3=f(C1)=f(C2+y1)=f(C3+y1+y2)... 下面来看注意力机制的公式描述:
e
i
=
a
(
u
,
v
i
)
α
i
=
e
i
∑
j
e
j
C
=
∑
i
α
i
v
i
\begin{aligned} e_i = a(u,v_i) \\ \alpha_i = \frac{e_i}{\sum_j e_j} \\ C = \sum_i \alpha_i v_i \end{aligned}
ei=a(u,vi)αi=∑jejeiC=i∑αivi 注意力模型通常由上述三个公式来描述:(1) 计算注意力得分;(2) 进行标准化处理;(3) 结合注意力得分和隐状态值计算上下文状态
C
C
C.
其中, u u u为解码中某个时间步的状态值,也就是匹配当前任务的特征向量, v i v_i vi是编码中第 i i i个时间步的状态值, a a a为计算 u u u和 v i v_i vi的函数。函数 a a a可以有各种形式,具体如下:
类型 | 具体形式 |
---|---|
乘积函数 | u T w v , u T v u^Twv, u^Tv uTwv,uTv |
加性函数 | w 2 T t a n h ( w 1 [ u ; v ] ) w_2^Ttanh(w_1[u;v]) w2Ttanh(w1[u;v]) |
多层感知机函数 | σ ( w 2 T t a n h ( w 1 [ u ; v ] + b 1 ) + b 2 ) \sigma(w_2^Ttanh(w_1[u;v]+b_1)+b_2) σ(w2Ttanh(w1[u;v]+b1)+b2) |
下面用一个机器翻译的例子来展示注意力得分的计算。下图是某个机器翻译例子的局部注意力得分计算过程。
其中注意力得分由编码中的隐状态 h h h和解码中的隐状态 h ′ h^{'} h′计算得到。所以,每一个上下文向量 C C C会自动选取与当前所输出的 y y y最合适的上下文信息。具体来说, a i j a_{ij} aij用来衡量Encoder中第 j j j阶段的 h j h_j hj和解码时第 i i i阶段的相关性,最终Decoder中第 i i i阶段输入的上下文信息 C i C_i Ci就来自所有 h j h_j hj对 a i j a_{ij} aij的加权和。
下图所示是一段汉译英的机器翻译注意力模型图解示意图。