Skip to content
项目
群组
代码片段
帮助
当前项目
正在载入...
登录 / 注册
切换导航面板
M
mtbookv2
概览
Overview
Details
Activity
Cycle Analytics
版本库
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
问题
0
Issues
0
列表
Board
标记
里程碑
合并请求
0
Merge Requests
0
CI / CD
CI / CD
流水线
作业
日程表
图表
维基
Wiki
代码片段
Snippets
成员
Collapse sidebar
Close sidebar
活动
图像
聊天
创建新问题
作业
提交
Issue Boards
Open sidebar
NiuTrans
mtbookv2
Commits
38faae4e
Commit
38faae4e
authored
Nov 24, 2020
by
曹润柘
Browse files
Options
Browse Files
Download
Plain Diff
合并分支 'master' 到 'caorunzhe'
Master 查看合并请求
!457
parents
6f1f5524
d3302311
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
31 行增加
和
24 行删除
+31
-24
Chapter11/chapter11.tex
+31
-24
没有找到文件。
Chapter11/chapter11.tex
查看文件 @
38faae4e
...
...
@@ -227,7 +227,7 @@
\item
{
\small\bfnew
{
残差连接
}}
\index
{
残差连接
}
(Residual Connection)
\index
{
Residual Connection
}
:对于源语言端和目标语言端的卷积层网络之间,都存在一个从输入到输出的额外连接,即跨层连接
\upcite
{
DBLP:journals/corr/HeZRS15
}
。该连接方式确保每个隐层输出都能包含输入序列中的更多信息,同时能够有效促进深层网络的信息传递效率(该部分在图
\ref
{
fig:11-12
}
中没有显示,具体结构详见
\ref
{
sec:11.2.3
}
节)。
\item
{
\small\bfnew
{
多跳注意力机制
}}
\index
{
多跳注意力机制
}
(Multi-step Attention
)
\index
{
Multi-ste
p Attention
}
:蓝色框内部展示了基于多跳结构的注意力机制模块
\upcite
{
Sukhbaatar2015EndToEndMN
}
。ConvS2S模型同样使用注意力机制来捕捉两个序列之间不同位置的对应。区别于之前的做法,多跳注意力在解码端每一个层都会执行注意力操作。下面将以此模型为例对基于卷积神经网络的机器翻译模型进行介绍。
\item
{
\small\bfnew
{
多跳注意力机制
}}
\index
{
多跳注意力机制
}
(Multi-step Attention
/Multi-hop Attention)
\index
{
Multi-step Attention
}
\index
{
Multi-ho
p Attention
}
:蓝色框内部展示了基于多跳结构的注意力机制模块
\upcite
{
Sukhbaatar2015EndToEndMN
}
。ConvS2S模型同样使用注意力机制来捕捉两个序列之间不同位置的对应。区别于之前的做法,多跳注意力在解码端每一个层都会执行注意力操作。下面将以此模型为例对基于卷积神经网络的机器翻译模型进行介绍。
\end{itemize}
%----------------------------------------------
...
...
@@ -338,7 +338,7 @@
\label
{
eq:11-3
}
\end{eqnarray}
\noindent
其中,
$
\mathbi
{
h
}^
l
$
表示
$
l
$
层网络的输入向量,
${
F
}
(
\mathbi
{
h
}^
l
)
$
是
$
l
$
层神经网络的运算。如果
$
l
=
2
$
,那么公式
\eqref
{
eq:11-3
}
可以解释为:第3层的输入
$
\mathbi
{
h
}^
3
$
等于第2层的输出
${
F
}
(
\mathbi
{
h
}^
2
)
$
加上第2层的输入
$
\mathbi
{
h
}^
2
$
。
\noindent
其中,
$
\mathbi
{
h
}^
l
$
表示
$
l
$
层
神经
网络的输入向量,
${
F
}
(
\mathbi
{
h
}^
l
)
$
是
$
l
$
层神经网络的运算。如果
$
l
=
2
$
,那么公式
\eqref
{
eq:11-3
}
可以解释为:第3层的输入
$
\mathbi
{
h
}^
3
$
等于第2层的输出
${
F
}
(
\mathbi
{
h
}^
2
)
$
加上第2层的输入
$
\mathbi
{
h
}^
2
$
。
\parinterval
在ConvS2S中残差连接主要应用于门控卷积神经网络和多跳自注意力机制中,比如在多层的门控卷积神经网络中,在每一层的输入和输出之间增加残差连接,具体的数学描述如下:
\begin{eqnarray}
...
...
@@ -354,40 +354,43 @@
\subsection
{
多跳注意力机制
}
\parinterval
ConvS2S模型也采用了注意力机制来获取每个目标语位置相应的源语言上下文信息。其仍然沿用传统的点乘注意力机制,其中图
\ref
{
fig:11-16
}
蓝色框代表了多跳自注意力机制在模型中的位置。
\parinterval
ConvS2S模型也采用了注意力机制来获取每个目标语位置相应的源语言上下文信息。其仍然沿用传统的点乘注意力机制
(
{
\color
{
red
}
参考文献!
}
)
,其中图
\ref
{
fig:11-16
}
蓝色框代表了多跳自注意力机制在模型中的位置。
%----------------------------------------------
% 图16.
\begin{figure}
[htp]
\centering
\input
{
./Chapter11/Figures/figure-fairseq-3
}
\caption
{
多跳自注意力机制在模型中的位置(蓝色背景框部分)
}
\caption
{
多跳自注意力机制在
ConvS2S
模型中的位置(蓝色背景框部分)
}
\label
{
fig:11-16
}
\end{figure}
%----------------------------------------------
\parinterval
注意力机制早在基于循环神经网络的翻译模型中被广泛使用
\upcite
{
bahdanau2014neural
}
,用于避免循环神经网络将源语言序列压缩成一个固定维度的向量表示带来的信息损失。另一方面,注意力同样能够帮助解码端区分源语言中不同位置词对当前解码词的贡献权重,其具体的计算过程如下:
\parinterval
在基于循环神经网络的翻译模型中,注意力机制已经被广泛使用
\upcite
{
bahdanau2014neural
}
,并用于避免循环神经网络将源语言序列压缩成一个固定维度的向量表示带来的信息损失。另一方面,注意力同样能够帮助解码端区分源语言中不同位置对当前目标语言位置的贡献度,其具体的计算过程如下:
\begin{eqnarray}
\mathbi
{
C
}_
j
&
=
&
\sum
_
i
\alpha
_{
i,j
}
\mathbi
{
h
}_
i
\\
\alpha
_{
i,j
}
&
=
&
\frac
{
\textrm
{
exp
}
(
\funp
{
a
}
(
\mathbi
{
s
}_{
j-1
}
,
\mathbi
{
h
}_
i))
}{
\sum
_{
i'
}
\textrm
{
exp
}
(
\funp
{
a
}
(
\mathbi
{
s
}_{
j-1
}
,
\mathbi
{
h
}_{
i'
}
))
}
\label
{
eq:11-5
}
\end{eqnarray}
\noindent
其中
$
\mathbi
{
h
}_
i
$
表示源语端第
$
i
$
个位置的隐层状态,
$
\mathbi
{
s
}_
j
$
表示目标端第
$
j
$
个位置的隐层状态。给定
$
\mathbi
{
s
}_
j
$
和
$
\mathbi
{
h
}_
i
$
,注意力机制通过函数
$
\funp
{
a
}
(
\cdot
)
$
计算目标语言表示
$
\mathbi
{
s
}_
j
$
与源语言表示
$
\mathbi
{
h
}_
i
$
之间的注意力权重
$
\alpha
_{
i,j
}$
,通过加权平均得到当前目标端位置所需的上下文表示
$
\mathbi
{
C
}_
j
$
。其中
$
\funp
{
a
}
(
\cdot
)
$
的具体计算方式在
{
\chapterten
}
已经详细讨论。
\noindent
其中,
$
\mathbi
{
h
}_
i
$
表示源语端第
$
i
$
个位置的隐层状态,即编码器在第
$
i
$
个位置的输出。
$
\mathbi
{
s
}_
j
$
表示目标端第
$
j
$
个位置的隐层状态。给定
$
\mathbi
{
s
}_
j
$
和
$
\mathbi
{
h
}_
i
$
,注意力机制通过函数
$
\funp
{
a
}
(
\cdot
)
$
计算目标语言表示
$
\mathbi
{
s
}_
j
$
与源语言表示
$
\mathbi
{
h
}_
i
$
之间的注意力权重
$
\alpha
_{
i,j
}$
,通过加权平均得到当前目标端位置所需的上下文表示
$
\mathbi
{
C
}_
j
$
。其中
$
\funp
{
a
}
(
\cdot
)
$
的具体计算方式在
{
\chapterten
}
已经详细讨论。
\parinterval
在ConvS2S模型中,解码端的每一层中都引入了注意力机制,同时通过残差连接的方式将结果作用于上层网络的计算,因此称之为多跳注意力。 ConvS2S模型选取向量乘的方式作为
$
\funp
{
a
}
(
\cdot
)
$
函数具体的数学描述为:
\parinterval
对比基于循环神经网络的机器翻译模型(GNMT)仅在解码端的最底层采用注意力机制,在ConvS2S模型中,解码端的每一层中都分别引入了注意力机制,同时通过残差连接的方式将结果作用于上层网络的计算,因此称之为多跳注意力。 ConvS2S模型选取向量乘的方式作为
$
\funp
{
a
}
(
\cdot
)
$
函数具体的数学描述为:
\begin{eqnarray}
\alpha
_{
ij
}^
l =
\frac
{
\textrm
{
exp
}
(
\mathbi
{
d
}_{
j
}^
l,
\mathbi
{
h
}_
i)
}{
\sum
_{
t=1
}^
m
\textrm
{
exp
}
(
\mathbi
{
d
}_{
j
}^
l,
\mathbi
{
h
}_{
i
}
)
}
\alpha
_{
ij
}^
l =
\frac
{
\textrm
{
exp
}
(
\mathbi
{
d
}_{
j
}^
l,
\mathbi
{
h
}_
i)
}{
\sum
_{
i
^{
'
}
=1
}^
m
\textrm
{
exp
}
(
\mathbi
{
d
}_{
j
}^
l,
\mathbi
{
h
}_{
i
^{
'
}
}
)
}
\label
{
eq:11-6-1
}
\end{eqnarray}
\parinterval
其中
$
\alpha
_{
ij
}^
l
$
代表第
$
l
$
层中源语言第
$
i
$
个位置与目标语言第
$
j
$
个位置之间的注意力权重。从公式中可以看到,在这里并没有选取目标语言段的隐层状态
$
\mathbi
{
s
}_{
j
}$
直接与源语言端的隐层状态
$
\mathbi
{
h
}_
i
$
进行向量乘,而是先通过线性变化,之后与目标语言端的词嵌入
$
\mathbi
{
g
}_
j
$
进行累加得到表示
$
\mathbi
{
d
}_{
j
}^
l
$
,具体的数学描述如下:
\noindent
其中,
$
\mathbi
{
d
}_{
j
}^
l
$
表示了第
$
l
$
层的解码端第
$
j
$
个位置的输出状态,
$
\alpha
_{
ij
}^
l
$
代表第
$
l
$
层中源语言第
$
i
$
个位置与目标语言第
$
j
$
个位置之间的注意力权重。需要注意的是,这里
$
\mathbi
{
d
}_{
j
}^
l
$
并不是解码器隐藏层输出的状态
$
\mathbi
{
s
}_{
j
}^{
l
}
$
。而是先将
$
\mathbi
{
s
}_{
j
}^{
l
}$
进行线性变换,之后与目标语言端的词嵌入
$
\mathbi
{
g
}_
j
$
进行累加得到
$
\mathbi
{
d
}_{
j
}^
l
$
,数学描述如下:
\begin{eqnarray}
\mathbi
{
d
}_{
j
}^
l =
\mathbi
{
W
}_{
d
}^{
l
}
\mathbi
{
s
}_{
j
}^{
l
}
+
\mathbi
{
b
}_{
d
}^{
l
}
+
\mathbi
{
g
}_
j
\label
{
eq:11-6-2
}
\end{eqnarray}
\noindent
其中
$
\mathbi
{
d
}_{
j
}^
l
$
表示了第
$
l
$
层的解码端输出状态,
$
\mathbi
{
W
}_{
d
}^{
l
}$
和
$
\mathbi
{
b
}_{
d
}^{
l
}$
是模型的可学习的参数,同时解码端每一层都使用独立的矩阵参数。此外,第
$
l
$
层的上下文表示
$
\mathbi
{
C
}_
j
^
l
$
由第
$
l
$
层编码端输出
$
\mathbi
{
h
}_
i
$
与源语言的词嵌入表示
$
\mathbi
{
e
}_
i
$
的累加结果与计算得到的注意力权重
$
\alpha
_{
ij
}^
l
$
的加权平均结果,具体的
数学描述如下:
\noindent
其中
,
$
\mathbi
{
W
}_{
d
}^{
l
}$
和
$
\mathbi
{
b
}_{
d
}^{
l
}$
是模型参数,同时解码端每一层都使用独立的矩阵参数。此外,第
$
l
$
层的上下文表示向量
$
\mathbi
{
C
}_
j
^
l
$
由如下步骤计算得到:将第
$
l
$
层编码端输出
$
\mathbi
{
h
}_
i
$
与源语言的词嵌入表示
$
\mathbi
{
e
}_
i
$
进行累加,之后将累加的结果用注意力权重
$
\alpha
_{
ij
}^
l
$
加权平均,
数学描述如下:
\begin{eqnarray}
\mathbi
{
C
}_
j
^
l =
\sum
_
i
\alpha
_{
ij
}^
l (
\mathbi
{
h
}_
i +
\mathbi
{
e
}_
i)
\label
{
eq:11-7
}
...
...
@@ -395,13 +398,13 @@
\noindent
通过结合底层的词嵌入表示,模型可以考虑到每个输入元素独立的信息,更好的帮助模型捕获源语言与目标语言之间的联系。
\parinterval
当得到上下文向量
$
\mathbi
{
C
}_
j
^
l
$
后,将其与
$
\mathbi
{
s
}_
j
^
l
$
相加后送入下一层计算,这种机制也被称为多跳机制
,具体的数学描述如下
:
\parinterval
当得到上下文向量
$
\mathbi
{
C
}_
j
^
l
$
后,将其与
$
\mathbi
{
s
}_
j
^
l
$
相加后送入下一层计算,这种机制也被称为多跳机制
。这个过程可以被描述为
:
\begin{eqnarray}
\mathbi
{
s
}_
j
^{
l+1
}
=
\mathbi
{
C
}_
j
^
l +
\mathbi
{
s
}_
j
^
l
\label
{
eq:11-8
}
\end{eqnarray}
\parinterval
与循环网络中的注意力机制相比,该机制能够帮助模型甄别已经考虑了哪些先前的输入。 也就是说,多跳
的
注意力机制会考虑模型之前更关注哪些单词,并且之后层中执行多次注意力的“跳跃”。
\parinterval
与循环网络中的注意力机制相比,该机制能够帮助模型甄别已经考虑了哪些先前的输入。 也就是说,多跳注意力机制会考虑模型之前更关注哪些单词,并且之后层中执行多次注意力的“跳跃”。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
...
...
@@ -409,35 +412,39 @@
\subsection
{
训练与推断
}
\parinterval
与基于循环神经网络的翻译模型一致,ConvS2S
在经过计算之后得到目标端当前位置在整个词表上的概率分布,用此表示这个位置出现不同单词的可能性,并以交叉熵函数作为损失函数来衡量模型预测分布与标准分布之间的差异。采用基于梯度的方法,通过前向与反向的计算得到所有参数的梯度信息,并对网络中的参数进行更新
。
\parinterval
与基于循环神经网络的翻译模型一致,ConvS2S
模型会计算每个目标语言位置上不同单词的概率,并以交叉熵作为损失函数来衡量模型预测分布与标准分布之间的差异。同时,采用基于梯度的方法对网络中的参数进行更新(见
{
\chapternine
}
)
。
\parinterval
ConvS2S
同样有针对性的
应用了很多工程方面的调整,主要包括:
\parinterval
ConvS2S
模型
应用了很多工程方面的调整,主要包括:
\begin{itemize}
\item
ConvS2S使用了
{
\small\bfnew
{
Nesterov加速梯度下降法
}}
\index
{
Nesterov加速梯度下降法
}
(Nesterov Accelerated Gradient,NAG)
\index
{
Nesterov Accelerated Gradient,NAG
}
,动量累计的系数设置为0.99,当梯度范数超过0.1时重新进行规范化
\upcite
{
Sutskever2013OnTI
}
;
\vspace
{
0.5em
}
\item
ConvS2S模型使用了
{
\small\bfnew
{
Nesterov加速梯度下降法
}}
\index
{
Nesterov加速梯度下降法
}
(Nesterov Accelerated Gradient,NAG)
\index
{
Nesterov Accelerated Gradient,NAG
}
,动量累计的系数设置为0.99,当梯度范数超过0.1时重新进行规范化
\upcite
{
Sutskever2013OnTI
}
;
\vspace
{
0.5em
}
\item
ConvS2S模型中设置学习率为0.25,每当模型在校验集上的困惑度不再下降时,便在每轮的训练后将学习率降低一个数量级,直至学习率小于一定的阈值(如0.0004)。
\vspace
{
0.5em
}
\item
ConvS2S中设置学习率为0.25,每当模型在校验集上的困惑度不再下降时,便在每轮的训练后将学习率降低一个数量级,直至学习率小于一定的阈值(如0.0004)。
\end{itemize}
\parinterval
Nesterov加速梯度下降法和
{
\chapternine
}
介绍的Momentum梯度下降法类似,都使用了历史梯度信息,首先回忆一下Momentum梯度下降法,公式如下:
\begin{eqnarray}
\textrm
{
Momentum:
}
\mathbi
{
v
}_
t =
\beta
\mathbi
{
v
}_{
t-1
}
+ (1-
\beta
)
\frac
{
\partial
J(
\mathbi
{
w
}
)
}{
\partial
\mathbi
{
w
}_
t
}
\\
\textrm
{
参数更新:
}
\mathbi
{
w
}_{
t+1
}
=
\mathbi
{
w
}
-
\alpha
\mathbi
{
v
}_
t
\ \ \ \ \ \ \ \ \ \ \ \
\label
{
eq:11-9
}
\mathbi
{
w
}_{
t+1
}
&
=
&
\mathbi
{
w
}_
t -
\alpha
\mathbi
{
v
}_
t
\label
{
eq:11-9-update
}
\\
\mathbi
{
v
}_
t
&
=
&
\beta
\mathbi
{
v
}_{
t-1
}
+ (1-
\beta
)
\frac
{
\partial
J(
\mathbi
{
w
}_
t)
}{
\partial
\mathbi
{
w
}_
t
}
\label
{
eq:11-9-momentum
}
\end{eqnarray}
\noindent
其中
$
\mathbi
{
w
}_
t
$
表示第
$
t
$
步更新时的模型参数;
$
J
(
\mathbi
{
w
}
)
$
表示损失函数均值期望的估计;
$
\frac
{
\partial
J
(
\mathbi
{
w
}
)
}{
\partial
\mathbi
{
w
}_
t
}$
将指向
$
J
(
\mathbi
{
w
}
)
$
在
$
\mathbi
{
w
}$
处变化最大的方向,即梯度方向;
$
\alpha
$
为学习率。
$
\mathbi
{
v
}_
t
$
则
为损失函数在前
$
t
-
1
$
步更新中累积的梯度动量,利用超参数
$
\beta
$
控制累积的范围。
\noindent
其中
,
$
\mathbi
{
w
}_
t
$
表示第
$
t
$
步更新时的模型参数;
$
J
(
\mathbi
{
w
}
)
$
表示损失函数均值期望的估计;
$
\frac
{
\partial
J
(
\mathbi
{
w
}
)
}{
\partial
\mathbi
{
w
}_
t
}$
将指向
$
J
(
\mathbi
{
w
}
)
$
在
$
\mathbi
{
w
}$
处变化最大的方向,即梯度方向;
$
\alpha
$
为学习率;
$
\mathbi
{
v
}_
t
$
为损失函数在前
$
t
-
1
$
步更新中累积的梯度动量,利用超参数
$
\beta
$
控制累积的范围。
\parinterval
而在Nesterov加速梯度下降法中,使用的梯度不是来自于当前参数位置,而是按照之前梯度方向更新一小步的位置,以便于更好的“预测未来”,提前调整更新速率,因此,其动量的更新方式为:
\begin{eqnarray}
\
textrm
{
Nesterov:
}
\mathbi
{
v
}_
t =
\beta
\mathbi
{
v
}_{
t-1
}
+ (1-
\beta
)
\frac
{
\partial
J(
\mathbi
{
w
}
)
}{
\partial
(
\mathbi
{
w
}_{
t
}
-
\alpha
\beta
\mathbi
{
v
}_{
t-1
}
)
}
\
mathbi
{
v
}_
t
&
=
&
\beta
\mathbi
{
v
}_{
t-1
}
+ (1-
\beta
)
\frac
{
\partial
J(
\mathbi
{
w
}_
t
)
}{
\partial
(
\mathbi
{
w
}_{
t
}
-
\alpha
\beta
\mathbi
{
v
}_{
t-1
}
)
}
\label
{
eq:11-10
}
\end{eqnarray}
\parinterval
在数学本质上,Nesterov加速梯度下降法其实是利用了二阶导数的信息,因此可以做到“向前看”,加速收敛过程
\upcite
{
Bengio2013AdvancesIO
}
。为了模型的稳定训练。ConvS2S
也采用了一些网络正则化和参数初始化的策略,使得模型在前向计算和反向计算过程中方差尽可能保持一致。
\parinterval
Nesterov加速梯度下降法其实是利用了二阶导数的信息,因此可以做到“向前看”,加速收敛过程
\upcite
{
Bengio2013AdvancesIO
}
。为了模型的稳定训练。ConvS2S模型
也采用了一些网络正则化和参数初始化的策略,使得模型在前向计算和反向计算过程中方差尽可能保持一致。
\parinterval
此外,ConvS2S
为了进一步提升模型的训练效率及性能,还使用了小批量训练,即每次从样本中选择出一小部分数据进行训练。同时,ConvS2S模型中也使用了Dropout方法
\upcite
{
JMLR:v15:srivastava14a
}
。除了在词嵌入层和解码器输出层应用Dropout外,ConvS2S
还对卷积块的输入层应用了Dropout。
\parinterval
此外,ConvS2S
模型为了进一步提升训练效率及性能,还使用了小批量训练,即每次从样本中选择出一小部分数据进行训练。同时,ConvS2S模型中也使用了Dropout方法
\upcite
{
JMLR:v15:srivastava14a
}
。除了在词嵌入层和解码器输出层应用Dropout外,ConvS2S模型
还对卷积块的输入层应用了Dropout。
\parinterval
ConvS2S
的推断过程与第十章中描述的推断过程一样。其基本思想是:依靠源语言句子和前面已经生成的译文单词来预测下一个译文单词。这个过程也可以结合贪婪搜索或者束搜索等解码策略
\upcite
{
Sennrich2016ImprovingNM
}
。
\parinterval
ConvS2S
模型的推断过程与第十章中描述的推断过程一样。其基本思想是:依靠源语言句子和前面已经生成的译文单词来预测下一个译文单词。这个过程也可以结合贪婪搜索或者束搜索等解码策略(见
{
\chapterten
}
)
。
%----------------------------------------------------------------------------------------
% NEW SECTION
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论