
- 1、符号定义
- 2、构建循环神经网络-Recurrent Neural Network
- 2.1 RNN中的反向传播
- 2.2 不同架构的RNN
- 3、语言模型的RNN架构
- 3.1 架构
- 3.2 序列采样
- 4、RNN的梯度消失问题-vanishing gradients
- 4.1 门控制单元-Gate Recurrent Unit
- 4.2 长短期记忆单元-Long Short Term Memory
- 5、双向RNN-Bidirectional RNN
- 6、深度RNN-Deep RNN
- 7、词汇嵌入-Word Embedding
- 7.1 使用词汇嵌入做词汇类比推理
- 7.2 嵌入矩阵
- 7.3 Word 2 Vec
- 7.4 负采样法-negative sampling
- 7.5 Global Vector for word Representation-GloVe
- 7.6 使用word embedding做情感分类
- 7.7 word embedding 除偏
- 8、序列到序列模型-SeqtoSeq
- 8.1 基本模型
- 8.2 束搜索-beam search
- 8.3 束搜索的改进措施
- 8.4 beam search的误差分析
- 9、注意力模型-Attention Model
- 10、Transformer 模型
- 10.1 self-attention机制
- 10.2 multi head attention机制
- Transformer model
- THE END
\qquad 在生活中,有许多领域都用到了序列模型,如语音识别,音乐创作,情感分类,DNA序列分析,机器翻译,视频动作检测,名称实体识别等。 1、符号定义
\qquad
对于训练数据中的输入序列X和输出序列Y,令
x
(
i
)
<
t
>
x^{(i)
\qquad
使用标准神经网络(ANN)处理序列问题问题的缺陷:首先,序列问题下不同的训练数据的输入和输出很大可能下会不同;其次,也是比较重要的缺陷在于,ANN不会共享从不同文本文职学习到的特征。
\qquad
循环神经网络(RNN)的结构如下图所示:
\qquad
其中,
a
<
i
>
a^{}
a<i>表示通过神经网络层和激活函数计算之后的值,其中
a
<
0
>
a^{<0>}
a<0>一般初始化为全0向量;
w
a
x
,
w
a
a
,
w
y
a
w_{ax},w_{aa},w_{ya}
wax,waa,wya表示权重系数。如:
a
<
1
>
=
g
(
w
a
a
a
<
0
>
+
w
a
x
x
<
1
>
+
b
a
)
y
^
<
1
>
=
g
(
w
y
a
a
<
1
>
+
b
y
)
a^{<1>}=g(w_{aa}a^{<0>}+w_{ax}x^{<1>}+b_a) \\ \widehat{y}^{<1>}=g(w_{ya}a^{<1>}+b_y)
a<1>=g(waaa<0>+waxx<1>+ba)y
<1>=g(wyaa<1>+by)
\qquad
其中,g表示激活函数,计算
a
a
a时候的激活函数和计算
y
y
y时候的激活函数不一定为一种激活函数。计算
a
a
a时候的激活函数通常使用
t
a
n
h
tanh
tanh或者
R
e
l
u
Relu
Relu;计算
y
y
y的时候,激活函数通常使用
s
i
g
m
o
i
d
sigmoid
sigmoid(用于二元分类问题)或者
s
o
f
t
m
a
x
softmax
softmax(用于多元分类问题)。上述拓展公式扩展到第
t
t
t步时的计算方法如下所示:
a
<
t
>
=
g
(
w
a
a
a
<
t
−
1
>
+
w
a
x
x
<
t
>
+
b
a
)
y
^
<
t
>
=
g
(
w
y
a
a
<
t
>
+
b
y
)
a^{
\qquad
使用
[
w
a
a
;
w
a
x
]
=
w
a
[w_{aa};w_{ax}]=w_a
[waa;wax]=wa,可以将上式
a
t
a^{t}
at的表达形式进行简化为:
a
<
t
>
=
g
(
w
a
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
a
)
a^{
y
^
<
t
>
=
g
(
w
y
a
<
t
>
+
b
y
)
\widehat{y}^{
\qquad
RNN正向传播的简化示意图如下图所示:
\qquad
下面定义出序列模型的单个时间步下的交叉熵误差计算式:
L
(
t
)
(
y
^
<
t
>
,
y
<
t
>
)
=
−
y
<
t
>
l
o
g
(
y
^
<
t
>
)
−
(
1
−
y
<
t
>
)
l
o
g
(
1
−
y
^
<
t
>
)
L^{(t)}(\widehat{y}^{
\qquad
多对多RNN,many-to-many,输入序列有多个元素,输出序列也有多个元素,输入输出序列长度相同的示意如下所示:
\qquad
多对多RNN,many-to-many,输入序列有多个元素,输出序列也有多个元素,输入输出序列长度不同的示意如下所示:
\qquad
多对一RNN,输入序列中有多个元素,输出序列中只有一个元素:
\qquad
一对多RNN,输入序列只有一个元素,输出序列中包含多个元素:
\qquad
基于RNN的语言模型的架构如下所示:
\qquad
损失函数使用交叉熵误差,形式如下所示:
L
(
t
)
(
y
^
<
t
>
,
y
<
t
>
)
=
−
∑
i
T
x
y
i
<
t
>
l
o
g
(
y
^
i
<
t
>
)
L
(
y
^
,
y
)
=
∑
t
T
x
L
<
t
>
(
y
<
t
>
,
y
^
i
<
t
>
)
L^{(t)}(\widehat{y}^{
\qquad
下图展示了怎样从一个训练好的RNN模型中提取出结果序列。
\qquad 若输入序列的长度过长,后续RNN在预测时,对于很早之前的输入信息会变得不太“敏感”,若很早之前输入的信息对于RNN后续预测影响很大,则会使得RNN的效果变得很差,使得RNN不擅长捕捉远程依赖关系。
4.1 门控制单元-Gate Recurrent Unit
\qquad
GRU通过修改RNN的隐藏层,使得RNN可以更好地捕捉长距离的关系,有助于减少梯度消失的问题。
\qquad
简化版的GRU单元如下所示:
\qquad
其中
C
C
C表示记忆单元(memory cell),
C
~
<
t
>
=
t
a
n
h
(
w
c
[
C
<
t
−
1
>
,
x
<
t
>
]
+
b
c
)
\widetilde{C}^{
\qquad
完整版的GRU需要引入一个新的门控单元-相关性门控
Γ
r
\Gamma_r
Γr表示
t
−
1
t-1
t−1时间步的记忆单元和
t
t
t时间步的记忆单元之间的相关性,所以需要对
C
~
<
t
>
\widetilde{C}^{
\qquad
下图罗列出了在GRU中使用的机制:
\qquad
LSTM相对于GRU是一种更加有效,更加泛化的克服梯度消失问题的工具。在LSTM中,
a
<
t
>
a^{
C
~
<
t
>
=
t
a
n
h
(
w
c
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
c
)
Γ
u
=
s
i
g
m
o
i
d
(
w
u
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
u
)
Γ
f
=
s
i
g
m
o
i
d
(
w
f
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
f
)
Γ
o
=
s
i
g
m
o
i
d
(
w
o
[
a
<
t
−
1
>
,
x
<
t
>
]
+
b
o
)
C
<
t
>
=
Γ
u
∗
C
~
<
t
>
+
Γ
f
∗
C
<
t
−
1
>
a
<
t
>
=
Γ
o
∗
t
a
n
h
(
C
<
t
>
)
\widetilde{C}^{
\qquad
LSTM的示意图如下图所示:
\qquad
BRNN是为了同时考虑过去的信息和未来的信息,在某个时间步
t
t
t下进行决策,BRNN的示意图如下图所示:
\qquad
其中,在某个时间步
t
t
t下的预测值区别于RNN,需要同时考虑前向输入和后向输入
y
<
t
>
=
g
(
w
y
[
a
→
<
t
>
,
a
←
<
t
>
]
+
b
y
)
y^{
\qquad
在学习非常复杂的函数时,将多层RNN堆在一起形成更深层次的RNN会更有帮助。DRNN的架构示意图如下图所示:
\qquad
如上图所示,若要计算
a
[
2
]
<
3
>
a^{[2]<3>}
a[2]<3>,即第2层,在第3个时间步下的值,需要如下计算:
a
[
2
]
<
3
>
=
g
(
w
a
[
2
]
[
a
[
2
]
<
2
>
,
a
[
1
]
<
3
>
]
+
b
a
[
2
]
)
a^{[2]<3>}=g(w_{a}^{[2]}[a^{[2]<2>},a^{[1]<3>}]+b_a^{[2]})
a[2]<3>=g(wa[2][a[2]<2>,a[1]<3>]+ba[2])
\qquad
通常情况下,RNN的深度不会超过3层,因为RNN有横向的时间维度;但是在超过3层之后,可以继续添加没有横向时间维度连接的更深层次的神经元,经历更深层次的神经网络之后在输出预测值
y
<
t
>
y^{
\qquad
在建立语料库vocabulary之后,最简单的方法是使用one-hot方式来表示某个词汇,但是one-hot表示方式不能只能表示出其在语料库中的位置,不能体现出词汇之间的相互关系,所示使用更多的特征来表示某个词汇,如下图所示:
\qquad
若已经知道man对应的单词是woman,需要预测king对应的单词是什么,任务可以用公式表示为:
F
i
n
d
a
w
o
r
d
w
:
a
r
g
m
a
x
w
s
i
m
(
e
w
,
e
k
i
n
g
−
e
m
a
n
+
e
w
o
m
a
n
)
Find\ a\ word\ w : arg\ \underset{w}{max}\ sim(e_w, e_{king}-e_{man}+e_{woman})
Find a word w:arg wmax sim(ew,eking−eman+ewoman)
\qquad
最常用的相似度函数为余弦相似度函数,
s
i
m
(
u
,
v
)
=
u
T
v
∣
∣
u
∣
∣
2
∣
∣
v
∣
∣
2
sim(u,v)=\frac{u^Tv}{||u||_2\ \ ||v||_2}
sim(u,v)=∣∣u∣∣2 ∣∣v∣∣2uTv 其中
u
,
v
u,v
u,v表示通过word embedding 得出的向量。
\qquad
使用词汇嵌入之后的嵌入矩阵如下所示:
\qquad
上图展示了特征为300个,vocabulary库中词汇量为10000的词汇嵌入矩阵。
\qquad
用来训练word embedding的skip-gram模型的构建过程如下所示:
\qquad
这是一种监督训练的方式,已知训练集中的输入输出,首先取出输入序列中的某个单次,获取其在word Embedding中的值
e
c
e_c
ec,之后通过softmax层得到这个输入的预测值
y
^
\widehat{y}
y
,需要训练的参数包括word embedding中的参数和softmax计算式中的参数
θ
t
\theta_t
θt。训练模型使用的损失函数为交叉熵误差:
L
(
y
^
,
y
)
=
−
∑
i
=
1
10000
(
y
i
l
o
g
(
y
^
i
)
)
L(\widehat{y},y)=-\sum_{i=1}^{10000}(y_ilog(\widehat{y}_i))
L(y
,y)=−∑i=110000(yilog(y
i))
\qquad
使用上述Word 2 Vec模型最大的缺陷在于softmax函数的计算速度上,因为softmax函数的分母时所有语义库中单词参数计算的累和。所以考虑使用改进的学习方法。 首先构建训练数据,构建方法如下所示:
\qquad
从输入序列中随机选取一个单词,orange,之后选取orange的临近单词(左右10个单词之间),选定juice,将这条记录的target值置为1;之后后续的训练数据的context的单词均为orange,word为从vocabulary库中随机选取的单词,之后这些记录的target值置为0。
\qquad
首先定义
x
i
j
x_{ij}
xij表示
i
i
i在
j
j
j的上下文中出现的次数,即表示
i
,
j
i,j
i,j同时出现的概率。GloVe模型如下所示:
\qquad
情感分类问题通常缺少大量的训练数据,而word embedding可以有效地克服这个缺陷。使用RNN和word embedding做情感分类的模型如下所示:
\qquad
word可以用来去除性别,种族,性取向的偏差。
\qquad
语言翻译中的序列到序列模型如下图所示:
\qquad
图片描述中的序列到序列的模型如下图所示:
\qquad
机器翻译可以看作是一个条件语言建模问题,条件是输入的句子经过编码之后的编码值;在选择输出的句子时,不是随机选择一个生成的句子输出而是选择输出句子中所有输出词汇的联合概率最大的句子进行输出:
\qquad
在进行机器翻译时,我们想要的不是一个随机的输出,而是一种最优输出,但是由于可能的输出空间很大,造成很难输出最优的翻译序列,所以使用束搜索的定向搜索方式来提高输出的质量,即优化上述8.1中的条件概率式。
\qquad
beam search的思想是,在每一个事件步,不是只保存最优的词汇选择,而是保持beam width e.g.(3个)个最优的词汇,最优的衡量标准是当前和之前选择词汇在输出序列编码条件下的联合概率。
\qquad
第三步的束搜索的过程示意如下所示:
\qquad
若束搜索的宽度beam width被设置为1,则beam search即为贪婪搜索。
\qquad
长度归一化,使用束搜索来优化下式的时候
a
r
g
m
a
x
y
∏
t
=
1
T
y
P
(
y
<
t
>
∣
x
,
y
<
1
>
,
y
<
2
>
,
.
.
.
,
y
<
t
−
1
>
)
=
P
(
y
<
1
>
∣
x
)
P
(
y
<
2
>
∣
x
,
y
<
1
>
)
.
.
.
P
(
y
<
T
y
>
∣
x
,
y
<
1
>
,
y
<
2
>
,
.
.
.
,
y
<
T
y
−
1
>
)
arg\ \underset {y}{max} \prod_{t=1}^{T_y}P(y^{
\qquad 使用束搜索的另一大比较棘手的问题是怎样选择合适beam width,当这个width选择过大时,可以得到更好的解,但是通常要耗费更长的时间;当width选择过小时,得到解的质量通常更差,但是通常求解效率更高。通常的做法是首先选取比较小的width,如width=3,之后慢慢增大到10,100,之后根据求解的时间和效果选定出合适的width。试验表明,当width非常大时,如扩大到1000,可以获得的收益增加量会逐渐减小,效益边缘递减效应。
8.4 beam search的误差分析
\qquad
下图是进行误差分析的方法,基本思想是将一个正确的翻译放到输出结果序列中,之后计算某个词汇正确翻译的概率和使用机器翻译的词汇的概率,将二者进行对比,若正确翻译词汇选择的概率更大,说明RNN网络问题不大,应该适当增加beam width;反之若机器翻译词汇概率更大,则说明束搜索选择出了合适的词汇,但是这个词汇不是最合适的,说明RNN网络出现问题,应该采用其他方式改进RNN。
\qquad
注意力模型在基本RNN模型的基础之上添加了注意力机制,令
α
<
t
,
t
′
>
\alpha^{
\qquad
注意力数值的计算方式如下式所示:
α
<
t
,
t
′
>
=
e
<
t
,
t
′
>
∑
t
′
=
1
T
x
e
<
t
,
t
′
>
\alpha^{
\qquad
自注意力机制下,需要对输入序列的每一个单次都计算基于注意力的向量表示
:
A
(
q
,
K
,
V
)
=
∑
i
(
e
x
p
(
q
∗
k
<
i
>
)
∑
j
e
x
p
(
1
∗
k
<
j
>
)
v
<
i
>
)
A(q,K,V)=\sum_i(\frac{exp(q*k^{})}{\sum_jexp(1*k^{
\qquad
其中,向量表示形式中的
d
k
\sqrt{d_k}
dk
表示点积缩放,用来防止数值爆炸问题。
\qquad
多头注意力机制本质上就是将自注意力机制重复了多遍,之后将每一遍的结果进行串联,最后乘以一个群众系数
w
o
w_o
wo之后得到,多头注意力机制的计算过程如下图所示:
\qquad
Transformer模型的架构如下所示:
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)