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
19481952
Commit
19481952
authored
Dec 14, 2020
by
zengxin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
统一
parent
136d36d4
隐藏空白字符变更
内嵌
并排
正在显示
3 个修改的文件
包含
18 行增加
和
18 行删除
+18
-18
Chapter10/chapter10.tex
+2
-2
Chapter11/chapter11.tex
+6
-6
Chapter12/chapter12.tex
+10
-10
没有找到文件。
Chapter10/chapter10.tex
查看文件 @
19481952
...
...
@@ -698,9 +698,9 @@ $\funp{P}({y_j | \mathbi{s}_{j-1} ,y_{j-1},\mathbi{C}})$由Softmax实现,Softm
\end{figure}
%----------------------------------------------
\parinterval
显然,以上问题的根本原因在于所使用的表示模型还比较“弱”。因此需要一个更强大的表示模型,在生成目标语言单词时能够有选择地获取源语言句子中更有用的部分。更准确的说,对于要生成的目标语单词,相关性更高的源语言片段应该在源语言句子的表示中体现出来,而不是将所有的源语言单词一视同仁。在神经机器翻译中引入注意力机制正是为了达到这个目的
\upcite
{
bahdanau2014neural,DBLP:journals/corr/LuongPM15
}
。实际上,除了机器翻译,注意力机制也被成功地应用于图像处理、语音识别、自然语言处理等其他任务。也正是注意力机制的引入,使得包括机器翻译在内很多自然语言处理系统得到了飞跃发展。
\parinterval
显然,以上问题的根本原因在于所使用的表示模型还比较“弱”。因此需要一个更强大的表示模型,在生成目标语言单词时能够有选择地获取源语言句子中更有用的部分。更准确的说,对于要生成的目标语
言
单词,相关性更高的源语言片段应该在源语言句子的表示中体现出来,而不是将所有的源语言单词一视同仁。在神经机器翻译中引入注意力机制正是为了达到这个目的
\upcite
{
bahdanau2014neural,DBLP:journals/corr/LuongPM15
}
。实际上,除了机器翻译,注意力机制也被成功地应用于图像处理、语音识别、自然语言处理等其他任务。也正是注意力机制的引入,使得包括机器翻译在内很多自然语言处理系统得到了飞跃发展。
\parinterval
神经机器翻译中的注意力机制并不复杂。对于每个目标语言单词
$
y
_
j
$
,系统生成一个源语言表示向量
$
\mathbi
{
C
}_
j
$
与之对应,
$
\mathbi
{
C
}_
j
$
会包含生成
$
y
_
j
$
所需的源语言的信息,或者说
$
\mathbi
{
C
}_
j
$
是一种包含目标语言单词与源语言单词对应关系的源语言表示。相比用一个静态的表示
$
\mathbi
{
C
}$
,注意机制使用的是动态的表示
$
\mathbi
{
C
}_
j
$
。
$
\mathbi
{
C
}_
j
$
也被称作对于目标语言位置
$
j
$
的
{
\small\bfnew
{
上下文向量
}}
\index
{
上下文向量
}
(Context Vector
\index
{
Context Vector
}
)。图
\ref
{
fig:10-18
}
对比了未引入注意力机制和引入了注意力机制的编码器- 解码器结构。可以看出,在注意力模型中,对于每一个目标单词的生成,都会额外引入一个单独的上下文向量参与运算。
\parinterval
神经机器翻译中的注意力机制并不复杂。对于每个目标语言单词
$
y
_
j
$
,系统生成一个源语言表示向量
$
\mathbi
{
C
}_
j
$
与之对应,
$
\mathbi
{
C
}_
j
$
会包含生成
$
y
_
j
$
所需的源语言的信息,或者说
$
\mathbi
{
C
}_
j
$
是一种包含目标语言单词与源语言单词对应关系的源语言表示。相比用一个静态的表示
$
\mathbi
{
C
}$
,注意机制使用的是动态的表示
$
\mathbi
{
C
}_
j
$
。
$
\mathbi
{
C
}_
j
$
也被称作对于目标语言位置
$
j
$
的
{
\small\bfnew
{
上下文向量
}}
\index
{
上下文向量
}
(Context Vector
\index
{
Context Vector
}
)。图
\ref
{
fig:10-18
}
对比了未引入注意力机制和引入了注意力机制的编码器- 解码器结构。可以看出,在注意力模型中,对于每一个目标
语言
单词的生成,都会额外引入一个单独的上下文向量参与运算。
%----------------------------------------------
\begin{figure}
[htp]
...
...
Chapter11/chapter11.tex
查看文件 @
19481952
...
...
@@ -233,14 +233,14 @@
\section
{
基于卷积神经网络的翻译建模
}
\parinterval
正如之前所讲,卷积神经网络可以用于序列建模,同时具有并行性高和易于学习的特点,一个很自然的想法就是将其用作神经机器翻译模型中的特征提取器。因此,在神经机器翻译被提出之初,研究人员就已经开始利用卷积神经网络对句子进行特征提取。比较经典的模型是使用卷积神经网络作为源语言句子的编码器,使用循环神经网络作为目标语译文生成的解码器
\upcite
{
kalchbrenner-blunsom-2013-recurrent,Gehring2017ACE
}
。之后也有研究人员提出完全基于卷积神经网络的翻译模型(ConvS2S)
\upcite
{
DBLP:journals/corr/GehringAGYD17
}
,或者针对卷积层进行改进,提出效率更高、性能更好的模型
\upcite
{
Kaiser2018DepthwiseSC,Wu2019PayLA
}
。本节将基于ConvS2S模型,阐述如何使用卷积神经网络搭建端到端神经机器翻译模型。
\parinterval
正如之前所讲,卷积神经网络可以用于序列建模,同时具有并行性高和易于学习的特点,一个很自然的想法就是将其用作神经机器翻译模型中的特征提取器。因此,在神经机器翻译被提出之初,研究人员就已经开始利用卷积神经网络对句子进行特征提取。比较经典的模型是使用卷积神经网络作为源语言句子的编码器,使用循环神经网络作为目标语
言
译文生成的解码器
\upcite
{
kalchbrenner-blunsom-2013-recurrent,Gehring2017ACE
}
。之后也有研究人员提出完全基于卷积神经网络的翻译模型(ConvS2S)
\upcite
{
DBLP:journals/corr/GehringAGYD17
}
,或者针对卷积层进行改进,提出效率更高、性能更好的模型
\upcite
{
Kaiser2018DepthwiseSC,Wu2019PayLA
}
。本节将基于ConvS2S模型,阐述如何使用卷积神经网络搭建端到端神经机器翻译模型。
\parinterval
ConvS2S模型是一种高并行的序列到序列的神经计算模型。该模型利用卷积神经网络分别对源语言端与目标语言端的序列进行特征提取,并使用注意力机制来捕获两个序列之间映射关系。相比于基于多层循环神经网络的GNMT模型
\upcite
{
Wu2016GooglesNM
}
,其主要优势在于每一层的网络计算是完全并行化的,避免了循环神经网络中计算顺序对时序的依赖。同时,利用多层卷积神经网络的层级结构可以有效地捕捉序列不同位置之间的依赖。即使是远距离依赖,也可以通过若干层卷积单元进行有效的捕捉,而且其信息传递的路径相比循环神经网络更短。除此之外,模型同时使用门控线性单元、残差网络和位置编码等技术来进一步提升模型性能,达到了和GNMT模型相媲美的翻译性能,同时大大缩短了训练时间。
\parinterval
图
\ref
{
fig:11-12
}
为ConvS2S模型的结构示意图,其内部由若干不同的模块组成,包括:
\begin{itemize}
\item
{
\small\bfnew
{
位置编码
}}
\index
{
位置编码
}
(Position Embedding)
\index
{
Position Embedding
}
:图中绿色背景框表示源语端词嵌入部分。相比于基于循环神经网络的翻译模型中的词嵌入,该模型还引入了位置编码,帮助模型获得词位置信息。位置编码具体实现在图
\ref
{
fig:11-12
}
中没有显示,详见
\ref
{
sec:11.2.1
}
节。
\item
{
\small\bfnew
{
位置编码
}}
\index
{
位置编码
}
(Position Embedding)
\index
{
Position Embedding
}
:图中绿色背景框表示源语
言
端词嵌入部分。相比于基于循环神经网络的翻译模型中的词嵌入,该模型还引入了位置编码,帮助模型获得词位置信息。位置编码具体实现在图
\ref
{
fig:11-12
}
中没有显示,详见
\ref
{
sec:11.2.1
}
节。
\item
{
\small\bfnew
{
卷积层
}}
与
{
\small\bfnew
{
门控线性单元
}}
(Gated Linear Units, GLU
\index
{
Gated Linear Units, GLU
}
):黄色背景框是卷积模块,这里使用门控线性单元作为非线性函数,之前的研究工作
\upcite
{
Dauphin2017LanguageMW
}
表明这种非线性函数更适合于序列建模任务。图中为了简化,只展示了一层卷积,但在实际中为了更好地捕获句子信息,通常使用多层卷积的叠加。
...
...
@@ -278,7 +278,7 @@
\parinterval
单层卷积神经网络的感受野受限于卷积核的大小,因此只能捕捉序列中局部的上下文信息,不能很好地进行长序列建模。为了捕捉更长的上下文信息,最简单的做法就是堆叠多个卷积层。相比于循环神经网络的链式结构,对相同的上下文跨度,多层卷积神经网络的层级结构可以通过更少的非线性计算对其进行建模,缓解了长距离建模中的梯度消失问题。因此,卷积神经网络相对更容易进行训练。
\parinterval
在ConvS2S模型中,编码端和解码端分别使用堆叠的门控卷积神经网络对源语
和目标语
序列进行建模,在传统卷积神经网络的基础上引入了门控线性单元
\upcite
{
Dauphin2017LanguageMW
}
,通过门控机制对卷积输出进行控制,它在模型中的位置如图
\ref
{
fig:11-13
}
黄色方框所示:
\parinterval
在ConvS2S模型中,编码端和解码端分别使用堆叠的门控卷积神经网络对源语
言和目标语言
序列进行建模,在传统卷积神经网络的基础上引入了门控线性单元
\upcite
{
Dauphin2017LanguageMW
}
,通过门控机制对卷积输出进行控制,它在模型中的位置如图
\ref
{
fig:11-13
}
黄色方框所示:
%----------------------------------------------
% 图13.
...
...
@@ -360,7 +360,7 @@
\subsection
{
多跳注意力机制
}
\parinterval
ConvS2S模型也采用了注意力机制来获取每个目标语位置相应的源语言上下文信息。其仍然沿用传统的点乘注意力机制
\upcite
{
DBLP:journals/corr/LuongPM15
}
,其中图
\ref
{
fig:11-16
}
蓝色框代表了多跳自注意力机制在模型中的位置。
\parinterval
ConvS2S模型也采用了注意力机制来获取每个目标语
言
位置相应的源语言上下文信息。其仍然沿用传统的点乘注意力机制
\upcite
{
DBLP:journals/corr/LuongPM15
}
,其中图
\ref
{
fig:11-16
}
蓝色框代表了多跳自注意力机制在模型中的位置。
%----------------------------------------------
% 图16.
...
...
@@ -379,7 +379,7 @@
\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-9
}
\end{eqnarray}
\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
}
已经详细讨论。
\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选用了点乘注意力,并且通过类似残差连接的方式将注意力操作的输入与输出同时作用于下一层计算,称为多跳注意力。其具体计算方式如公式
\eqref
{
eq:11-10
}
所示:
\begin{eqnarray}
...
...
@@ -387,7 +387,7 @@
\label
{
eq:11-10
}
\end{eqnarray}
\noindent
不同于公式
\eqref
{
eq:11-9
}
中使用的目标语
端隐层表示
$
\mathbi
{
s
}_{
j
-
1
}$
,公式
\eqref
{
eq:11-10
}
中的
$
\mathbi
{
d
}_{
j
}^
l
$
同时结合了
$
\mathbi
{
s
}_{
j
}$
的卷积计算结果和目标语
端的词嵌入
$
\mathbi
{
g
}_
j
$
,其具体计算如公式
\eqref
{
eq:11-11
}
和
\eqref
{
eq:11-12
}
所示:
\noindent
不同于公式
\eqref
{
eq:11-9
}
中使用的目标语
言端隐层表示
$
\mathbi
{
s
}_{
j
-
1
}$
,公式
\eqref
{
eq:11-10
}
中的
$
\mathbi
{
d
}_{
j
}^
l
$
同时结合了
$
\mathbi
{
s
}_{
j
}$
的卷积计算结果和目标语言
端的词嵌入
$
\mathbi
{
g
}_
j
$
,其具体计算如公式
\eqref
{
eq:11-11
}
和
\eqref
{
eq:11-12
}
所示:
\begin{eqnarray}
\mathbi
{
d
}_{
j
}^
l
&
=
&
\mathbi
{
W
}_{
d
}^{
l
}
\mathbi
{
z
}_{
j
}^{
l
}
+
\mathbi
{
b
}_{
d
}^{
l
}
+
\mathbi
{
g
}_
j
\label
{
eq:11-11
}
\\
\mathbi
{
z
}_
j
^
l
&
=
&
\textrm
{
Conv
}
(
\mathbi
{
s
}_
j
^
l)
\label
{
eq:11-12
}
...
...
Chapter12/chapter12.tex
查看文件 @
19481952
...
...
@@ -56,13 +56,13 @@
\end{figure}
%----------------------------------------------
\parinterval
自注意力机制也可以被看作是一个序列表示模型。比如,对于每个目标位置
$
j
$
,都生成一个与之对应的源语句子表示,它的形式如公式
\eqref
{
eq:12-1
}
所示:
\parinterval
自注意力机制也可以被看作是一个序列表示模型。比如,对于每个目标位置
$
j
$
,都生成一个与之对应的源语
言
句子表示,它的形式如公式
\eqref
{
eq:12-1
}
所示:
\begin{eqnarray}
\mathbi
{
C
}_
j
&
=
&
\sum
_
i
\alpha
_{
i,j
}
\mathbi
{
h
}_
i
\label
{
eq:12-1
}
\end{eqnarray}
\noindent
其中,
$
\mathbi
{
h
}_
i
$
为源语
句子每个位置的表示结果,
$
\alpha
_{
i,j
}$
是目标位置
$
j
$
对
$
\mathbi
{
h
}_
i
$
的注意力权重。以源语
句子为例,自注意力机制将序列中每个位置的表示
$
\mathbi
{
h
}_
i
$
看作
$
\mathrm
{
query
}$
(查询),并且将所有位置的表示看作
$
\mathrm
{
key
}$
(键)和
$
\mathrm
{
value
}$
(值)。自注意力模型通过计算当前位置与所有位置的匹配程度,也就是在注意力机制中提到的注意力权重,来对各个位置的
$
\mathrm
{
value
}$
进行加权求和。得到的结果可以被看作是在这个句子中当前位置的抽象表示。这个过程,可以叠加多次,形成多层注意力模型,对输入序列中各个位置进行更深层的表示。
\noindent
其中,
$
\mathbi
{
h
}_
i
$
为源语
言句子每个位置的表示结果,
$
\alpha
_{
i,j
}$
是目标位置
$
j
$
对
$
\mathbi
{
h
}_
i
$
的注意力权重。以源语言
句子为例,自注意力机制将序列中每个位置的表示
$
\mathbi
{
h
}_
i
$
看作
$
\mathrm
{
query
}$
(查询),并且将所有位置的表示看作
$
\mathrm
{
key
}$
(键)和
$
\mathrm
{
value
}$
(值)。自注意力模型通过计算当前位置与所有位置的匹配程度,也就是在注意力机制中提到的注意力权重,来对各个位置的
$
\mathrm
{
value
}$
进行加权求和。得到的结果可以被看作是在这个句子中当前位置的抽象表示。这个过程,可以叠加多次,形成多层注意力模型,对输入序列中各个位置进行更深层的表示。
%----------------------------------------------
\begin{figure}
[htp]
...
...
@@ -170,7 +170,7 @@
\parinterval
以上操作就构成了Transformer的一层,各个模块执行的顺序可以简单描述为:Self-Attention
$
\to
$
Residual Connection
$
\to
$
Layer Normalization
$
\to
$
Feed Forward Network
$
\to
$
Residual Connection
$
\to
$
Layer Normalization。编码器可以包含多个这样的层,比如,可以构建一个六层编码器,每层都执行上面的操作。最上层的结果作为整个编码的结果,会被传入解码器。
\parinterval
解码器的结构与编码器十分类似。它也是由若干层组成,每一层包含编码器中的所有结构,即:自注意力子层、前馈神经网络子层、残差连接和层标准化模块。此外,为了捕捉源语言的信息,解码器又引入了一个额外的
{
\small\sffamily\bfseries
{
编码-解码注意力子层
}}
\index
{
编码-解码注意力子层
}
(Encoder-Decoder Attention Sub-layer)
\index
{
Encoder-Decoder Attention Sub-layer
}
。这个新的子层,可以帮助模型使用源语言句子的表示信息生成目标语不同位置的表示。编码-解码注意力子层仍然基于自注意力机制,因此它和自注意力子层的结构是相同的,只是
$
\mathrm
{
query
}$
、
$
\mathrm
{
key
}$
、
$
\mathrm
{
value
}$
的定义不同。比如,在解码端,自注意力子层的
$
\mathrm
{
query
}$
、
$
\mathrm
{
key
}$
、
$
\mathrm
{
value
}$
是相同的,它们都等于解码端每个位置的表示。而在编码-解码注意力子层中,
$
\mathrm
{
query
}$
是解码端每个位置的表示,此时
$
\mathrm
{
key
}$
和
$
\mathrm
{
value
}$
是相同的,等于编码端每个位置的表示。图
\ref
{
fig:12-5
}
给出了这两种不同注意力子层输入的区别。
\parinterval
解码器的结构与编码器十分类似。它也是由若干层组成,每一层包含编码器中的所有结构,即:自注意力子层、前馈神经网络子层、残差连接和层标准化模块。此外,为了捕捉源语言的信息,解码器又引入了一个额外的
{
\small\sffamily\bfseries
{
编码-解码注意力子层
}}
\index
{
编码-解码注意力子层
}
(Encoder-Decoder Attention Sub-layer)
\index
{
Encoder-Decoder Attention Sub-layer
}
。这个新的子层,可以帮助模型使用源语言句子的表示信息生成目标语
言
不同位置的表示。编码-解码注意力子层仍然基于自注意力机制,因此它和自注意力子层的结构是相同的,只是
$
\mathrm
{
query
}$
、
$
\mathrm
{
key
}$
、
$
\mathrm
{
value
}$
的定义不同。比如,在解码端,自注意力子层的
$
\mathrm
{
query
}$
、
$
\mathrm
{
key
}$
、
$
\mathrm
{
value
}$
是相同的,它们都等于解码端每个位置的表示。而在编码-解码注意力子层中,
$
\mathrm
{
query
}$
是解码端每个位置的表示,此时
$
\mathrm
{
key
}$
和
$
\mathrm
{
value
}$
是相同的,等于编码端每个位置的表示。图
\ref
{
fig:12-5
}
给出了这两种不同注意力子层输入的区别。
%----------------------------------------------
\begin{figure}
[htp]
...
...
@@ -181,9 +181,9 @@
\end{figure}
%----------------------------------------------
\parinterval
此外,编码端和解码端都有输入的词序列。编码端的词序列输入是为了对其进行表示,进而解码端能从编码端访问到源语言句子的全部信息。解码端的词序列输入是为了进行目标语的生成,本质上它和语言模型是一样的,在得到前
$
n
-
1
$
个单词的情况下输出第
$
n
$
个单词。除了输入词序列的词嵌入,Transformer中也引入了位置嵌入,以表示每个位置信息。原因是,自注意力机制没有显性地对位置进行表示,因此也无法考虑词序。在输入中引入位置信息可以让自注意力机制间接地感受到每个词的位置,进而保证对序列表示的合理性。最终,整个模型的输出由一个Softmax层完成,它和循环神经网络中的输出层是完全一样的。
\parinterval
此外,编码端和解码端都有输入的词序列。编码端的词序列输入是为了对其进行表示,进而解码端能从编码端访问到源语言句子的全部信息。解码端的词序列输入是为了进行目标语
言
的生成,本质上它和语言模型是一样的,在得到前
$
n
-
1
$
个单词的情况下输出第
$
n
$
个单词。除了输入词序列的词嵌入,Transformer中也引入了位置嵌入,以表示每个位置信息。原因是,自注意力机制没有显性地对位置进行表示,因此也无法考虑词序。在输入中引入位置信息可以让自注意力机制间接地感受到每个词的位置,进而保证对序列表示的合理性。最终,整个模型的输出由一个Softmax层完成,它和循环神经网络中的输出层是完全一样的。
\parinterval
在进行更详细的介绍前,先利用图
\ref
{
fig:12-4
}
简单了解一下Transformer模型是如何进行翻译的。首先,Transformer将源语言句子“我/很/好”的词嵌入融合位置编码后作为输入。然后,编码器对输入的源语
句子进行逐层抽象,得到包含丰富的上下文信息的源语表示并传递给解码器。解码器的每一层,使用自注意力子层对输入解码端的表示进行加工,之后再使用编码-解码注意力子层融合源语句子的表示信息。就这样逐词生成目标语
译文单词序列。解码器每个位置的输入是当前单词(比如,“I”),而这个位置的输出是下一个单词(比如,“am”),这个设计和标准的神经语言模型是完全一样的。
\parinterval
在进行更详细的介绍前,先利用图
\ref
{
fig:12-4
}
简单了解一下Transformer模型是如何进行翻译的。首先,Transformer将源语言句子“我/很/好”的词嵌入融合位置编码后作为输入。然后,编码器对输入的源语
言句子进行逐层抽象,得到包含丰富的上下文信息的源语言表示并传递给解码器。解码器的每一层,使用自注意力子层对输入解码端的表示进行加工,之后再使用编码-解码注意力子层融合源语言句子的表示信息。就这样逐词生成目标语言
译文单词序列。解码器每个位置的输入是当前单词(比如,“I”),而这个位置的输出是下一个单词(比如,“am”),这个设计和标准的神经语言模型是完全一样的。
\parinterval
当然,这里可能还有很多疑惑,比如,什么是位置编码?Transformer的自注意力机制具体是怎么进行计算的,其结构是怎样的?层标准化又是什么?等等。下面就一一展开介绍。
...
...
@@ -277,7 +277,7 @@
\parinterval
具体来看,在注意力机制的计算过程中,包含三个重要的参数,分别是query,
\\
key和value。在下面的描述中,分别用
$
\mathbi
{
Q
}$
,
$
\mathbi
{
K
}$
,
$
\mathbi
{
V
}$
对它们进行表示,其中
$
\mathbi
{
Q
}$
和
$
\mathbi
{
K
}$
的维度为
$
L
\times
d
_
k
$
,
$
\mathbi
{
V
}$
的维度为
$
L
\times
d
_
v
$
。这里,
$
L
$
为序列的长度,
$
d
_
k
$
和
$
d
_
v
$
分别表示每个key和value的大小,通常设置为
$
d
_
k
=
d
_
v
=
d
_{
\textrm
{
model
}}$
。
\parinterval
在自注意力机制中,
$
\mathbi
{
Q
}$
、
$
\mathbi
{
K
}$
、
$
\mathbi
{
V
}$
都是相同的,对应着源语言或目标语言序列的表示。而在编码-解码注意力机制中,由于要对双语之间的信息进行建模,因此,将目标语每个位置的表示视为编码-解码注意力机制的
$
\mathbi
{
Q
}$
,源语言句子的表示视为
$
\mathbi
{
K
}$
和
$
\mathbi
{
V
}$
。
\parinterval
在自注意力机制中,
$
\mathbi
{
Q
}$
、
$
\mathbi
{
K
}$
、
$
\mathbi
{
V
}$
都是相同的,对应着源语言或目标语言序列的表示。而在编码-解码注意力机制中,由于要对双语之间的信息进行建模,因此,将目标语
言
每个位置的表示视为编码-解码注意力机制的
$
\mathbi
{
Q
}$
,源语言句子的表示视为
$
\mathbi
{
K
}$
和
$
\mathbi
{
V
}$
。
\parinterval
在得到
$
\mathbi
{
Q
}$
,
$
\mathbi
{
K
}$
和
$
\mathbi
{
V
}$
后,便可以进行注意力机制的运算,这个过程可以被形式化为公式
\eqref
{
eq:12-9
}
:
\begin{eqnarray}
...
...
@@ -288,7 +288,7 @@
\noindent
首先,通过对
$
\mathbi
{
Q
}$
和
$
\mathbi
{
K
}$
的转置进行矩阵乘法操作,计算得到一个维度大小为
$
L
\times
L
$
的相关性矩阵,即
$
\mathbi
{
Q
}
\mathbi
{
K
}^{
\textrm
{
T
}}$
,它表示一个序列上任意两个位置的相关性。再通过系数1/
$
\sqrt
{
d
_
k
}$
进行放缩操作,放缩可以减少相关性矩阵的方差,具体体现在运算过程中实数矩阵中的数值不会过大,有利于模型训练。
\parinterval
在此基础上,通过对相关性矩阵累加一个掩码矩阵
$
\mathbi
{
Mask
}$
,来屏蔽掉矩阵中的无用信息。比如,在编码端,如果需要对多个句子同时处理,由于这些句子长度不统一,需要对句子补齐。再比如,在解码端,训练的时候需要屏蔽掉当前目标语位置右侧的单词,因此这些单词在推断的时候是看不到的。
\parinterval
在此基础上,通过对相关性矩阵累加一个掩码矩阵
$
\mathbi
{
Mask
}$
,来屏蔽掉矩阵中的无用信息。比如,在编码端,如果需要对多个句子同时处理,由于这些句子长度不统一,需要对句子补齐。再比如,在解码端,训练的时候需要屏蔽掉当前目标语
言
位置右侧的单词,因此这些单词在推断的时候是看不到的。
\parinterval
随后,使用Softmax函数对相关性矩阵在行的维度上进行归一化操作,这可以理解为对第
$
i
$
行进行归一化,结果对应了
$
\mathbi
{
V
}$
中不同位置上向量的注意力权重。对于
$
\mathrm
{
value
}$
的加权求和,可以直接用相关性系数和
$
\mathbi
{
V
}$
进行矩阵乘法得到,即
$
\textrm
{
Softmax
}
(
\frac
{
\mathbi
{
Q
}
\mathbi
{
K
}^{
\textrm
{
T
}}}
{
\sqrt
{
d
_
k
}}
+
\mathbi
{
Mask
}
)
$
和
$
\mathbi
{
V
}$
进行矩阵乘。最终得到自注意力的输出,它和输入的
$
\mathbi
{
V
}$
的大小是一模一样的。图
\ref
{
fig:12-10
}
展示了点乘注意力计算的全过程。
...
...
@@ -363,7 +363,7 @@
\vspace
{
0.5em
}
\item
{
\small\bfnew
{
句长补全掩码
}}
\index
{
句长补全掩码
}
(Padding Mask
\index
{
Padding Mask
}
)。在批量处理多个样本时(训练或解码),由于要对源语言和目标语言的输入进行批次化处理,而每个批次内序列的长度不一样,为了方便对批次内序列进行矩阵表示,需要进行对齐操作,即在较短的序列后面填充0来占位(padding操作)。而这些填充的位置没有意义,不参与注意力机制的计算,因此,需要进行掩码 操作,屏蔽其影响。
\vspace
{
0.5em
}
\item
{
\small\bfnew
{
未来信息掩码
}}
\index
{
未来信息掩码
}
(Future Mask
\index
{
Future Mask
}
)。对于解码器来说,由于在预测的时候是自左向右进行的,即第
$
t
$
时刻解码器的输出只能依赖于
$
t
$
时刻之前的输出。且为了保证训练解码一致,避免在训练过程中观测到目标语端每个位置未来的信息,因此需要对未来信息进行屏蔽。具体的做法是:构造一个上三角值全为-inf的Mask矩阵,也就是说,在解码端计算中,在当前位置,通过未来信息掩码把序列之后的信息屏蔽掉了,避免了
$
t
$
时刻之后的位置对当前的计算产生影响。图
\ref
{
fig:12-13
}
给出了一个具体的实例。
\item
{
\small\bfnew
{
未来信息掩码
}}
\index
{
未来信息掩码
}
(Future Mask
\index
{
Future Mask
}
)。对于解码器来说,由于在预测的时候是自左向右进行的,即第
$
t
$
时刻解码器的输出只能依赖于
$
t
$
时刻之前的输出。且为了保证训练解码一致,避免在训练过程中观测到目标语
言
端每个位置未来的信息,因此需要对未来信息进行屏蔽。具体的做法是:构造一个上三角值全为-inf的Mask矩阵,也就是说,在解码端计算中,在当前位置,通过未来信息掩码把序列之后的信息屏蔽掉了,避免了
$
t
$
时刻之后的位置对当前的计算产生影响。图
\ref
{
fig:12-13
}
给出了一个具体的实例。
%----------------------------------------------
% 图3.10
...
...
@@ -471,7 +471,7 @@
\section
{
训练
}
\parinterval
与前面介绍的神经机器翻译模型的训练一样,Transformer的训练流程为:首先对模型进行初始化,然后在编码器输入包含结束符的源语言单词序列。前面已经介绍过,解码端每个位置单词的预测都要依赖已经生成的序列。在解码端输入包含起始符号的目标语
序列,通过起始符号预测目标语的第一个单词,用真实的目标语的第一个单词去预测第二个单词,以此类推,然后用真实的目标语
序列和预测的结果比较,计算它的损失。Transformer使用了交叉熵损失函数,损失越小说明模型的预测越接近真实输出。然后利用反向传播来调整模型中的参数。由于Transformer 将任意时刻输入信息之间的距离拉近为1,摒弃了RNN中每一个时刻的计算都要基于前一时刻的计算这种具有时序性的训练方式,因此Transformer中训练的不同位置可以并行化训练,大大提高了训练效率。
\parinterval
与前面介绍的神经机器翻译模型的训练一样,Transformer的训练流程为:首先对模型进行初始化,然后在编码器输入包含结束符的源语言单词序列。前面已经介绍过,解码端每个位置单词的预测都要依赖已经生成的序列。在解码端输入包含起始符号的目标语
言序列,通过起始符号预测目标语言的第一个单词,用真实的目标语言的第一个单词去预测第二个单词,以此类推,然后用真实的目标语言
序列和预测的结果比较,计算它的损失。Transformer使用了交叉熵损失函数,损失越小说明模型的预测越接近真实输出。然后利用反向传播来调整模型中的参数。由于Transformer 将任意时刻输入信息之间的距离拉近为1,摒弃了RNN中每一个时刻的计算都要基于前一时刻的计算这种具有时序性的训练方式,因此Transformer中训练的不同位置可以并行化训练,大大提高了训练效率。
%----------------------------------------------
%\begin{figure}[htp]
...
...
@@ -565,7 +565,7 @@ Transformer Deep(48层) & 30.2 & 43.1 & 194$\times 10^
\parinterval
Transformer解码器生成译文词序列的过程和其它神经机器翻译系统类似,都是从左往右生成,且下一个单词的预测依赖已经生成的单词。其具体推断过程如图
\ref
{
fig:12-19
}
所示,其中
$
\mathbi
{
C
}_
i
$
是编码-解码注意力的结果,解码器首先根据“<sos>”和
$
\mathbi
{
C
}_
1
$
生成第一个单词“how”,然后根据“how”和
$
\mathbi
{
C
}_
2
$
生成第二个单词“are”,以此类推,当解码器生成“<eos>”时结束推断。
\parinterval
但是,Transformer在推断阶段无法对所有位置进行并行化操作,因为对于每一个目标语单词都需要对前面所有单词进行注意力操作,因此它推断速度非常慢。可以采用的加速手段有:Cache(缓存需要重复计算的变量)
\upcite
{
Vaswani2018Tensor2TensorFN
}
、低精度计算
\upcite
{
DBLP:journals/corr/CourbariauxB16,Lin2020TowardsF8
}
、共享注意力网络等
\upcite
{
Xiao2019SharingAW
}
。关于Transformer模型的推断加速方法将会在
{
\chapterfourteen
}
进一步深入讨论。
\parinterval
但是,Transformer在推断阶段无法对所有位置进行并行化操作,因为对于每一个目标语
言
单词都需要对前面所有单词进行注意力操作,因此它推断速度非常慢。可以采用的加速手段有:Cache(缓存需要重复计算的变量)
\upcite
{
Vaswani2018Tensor2TensorFN
}
、低精度计算
\upcite
{
DBLP:journals/corr/CourbariauxB16,Lin2020TowardsF8
}
、共享注意力网络等
\upcite
{
Xiao2019SharingAW
}
。关于Transformer模型的推断加速方法将会在
{
\chapterfourteen
}
进一步深入讨论。
%----------------------------------------------
\begin{figure}
[htp]
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论