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
e9cc30e9
Commit
e9cc30e9
authored
Dec 26, 2020
by
zengxin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
12 编辑反馈
parent
e23ea973
隐藏空白字符变更
内嵌
并排
正在显示
1 个修改的文件
包含
9 行增加
和
9 行删除
+9
-9
Chapter12/chapter12.tex
+9
-9
没有找到文件。
Chapter12/chapter12.tex
查看文件 @
e9cc30e9
...
...
@@ -102,7 +102,7 @@
\parinterval
首先再来回顾一下
{
\chapterten
}
介绍的循环神经网络,虽然它很强大,但是也存在一些弊端。其中比较突出的问题是,循环神经网络每个循环单元都有向前依赖性,也就是当前时间步的处理依赖前一时间步处理的结果。这个性质可以使序列的“历史”信息不断被传递,但是也造成模型运行效率的下降。特别是对于自然语言处理任务,序列往往较长,无论是传统的RNN结构,还是更为复杂的LSTM结构,都需要很多次循环单元的处理才能够捕捉到单词之间的长距离依赖。由于需要多个循环单元的处理,距离较远的两个单词之间的信息传递变得很复杂。
\parinterval
针对这些问题,研究人员提出了一种全新的模型
$
\ \dash\
$
Transformer
\index
{
Transformer
}
\upcite
{
vaswani2017attention
}
。与循环神经网络等传统模型不同,Transformer模型仅仅使用自注意力机制和标准的前馈神经网络,完全不依赖任何循环单元或者卷积操作。自注意力机制的优点在于可以直接对序列中任意两个单元之间的关系进行建模,这使得长距离依赖等问题可以更好地被求解。此外,自注意力机制非常适合在GPU 上进行并行化,因此模型训练的速度更快。表
\ref
{
tab:12-1
}
对比了RNN、CNN和Transformer
层类型的
复杂度
\footnote
{
顺序操作数指模型处理一个序列所需要的操作数,由于Transformer和CNN都可以并行计算,所以是1;路径长度指序列中任意两个单词在网络中的距离。
}
。
\parinterval
针对这些问题,研究人员提出了一种全新的模型
$
\ \dash\
$
Transformer
\index
{
Transformer
}
\upcite
{
vaswani2017attention
}
。与循环神经网络等传统模型不同,Transformer模型仅仅使用自注意力机制和标准的前馈神经网络,完全不依赖任何循环单元或者卷积操作。自注意力机制的优点在于可以直接对序列中任意两个单元之间的关系进行建模,这使得长距离依赖等问题可以更好地被求解。此外,自注意力机制非常适合在GPU 上进行并行化,因此模型训练的速度更快。表
\ref
{
tab:12-1
}
对比了RNN、CNN和Transformer
的层类型
复杂度
\footnote
{
顺序操作数指模型处理一个序列所需要的操作数,由于Transformer和CNN都可以并行计算,所以是1;路径长度指序列中任意两个单词在网络中的距离。
}
。
%----------------------------------------------
\begin{table}
[htp]
...
...
@@ -271,7 +271,7 @@
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------
\subsection
{
点乘注意力
}
\subsection
{
点乘注意力
机制
}
\parinterval
在
\ref
{
sec:12.1
}
节中已经介绍,自注意力机制中至关重要的是获取相关性系数,也就是在融合不同位置的表示向量时各位置的权重。Transformer模型采用了一种基于点乘的方法来计算相关性系数。这种方法也称为
{
\small\bfnew
{
缩放的点乘注意力
}}
\index
{
缩放的点乘注意力
}
(Scaled Dot-product Attention)
\index
{
Scaled Dot-product Attention
}
机制。它的运算并行度高,同时并不消耗太多的存储空间。
...
...
@@ -279,7 +279,7 @@
\parinterval
在自注意力机制中,
$
\mathbi
{
Q
}$
、
$
\mathbi
{
K
}$
、
$
\mathbi
{
V
}$
都是相同的,对应着源语言或目标语言序列的表示。而在编码-解码注意力机制中,由于要对双语之间的信息进行建模,因此,将目标语言每个位置的表示视为编码-解码注意力机制的
$
\mathbi
{
Q
}$
,源语言句子的表示视为
$
\mathbi
{
K
}$
和
$
\mathbi
{
V
}$
。
\parinterval
在得到
$
\mathbi
{
Q
}$
,
$
\mathbi
{
K
}$
和
$
\mathbi
{
V
}$
后,便可以进行注意力
机制
的运算,这个过程可以被形式化为公式
\eqref
{
eq:12-9
}
:
\parinterval
在得到
$
\mathbi
{
Q
}$
,
$
\mathbi
{
K
}$
和
$
\mathbi
{
V
}$
后,便可以进行注意力的运算,这个过程可以被形式化为公式
\eqref
{
eq:12-9
}
:
\begin{eqnarray}
\textrm
{
Attention
}
(
\mathbi
{
Q
}
,
\mathbi
{
K
}
,
\mathbi
{
V
}
)
&
=
&
\textrm
{
Softmax
}
(
\frac
{
\mathbi
{
Q
}
\mathbi
{
K
}^{
\textrm
{
T
}}}
{
\sqrt
{
d
_
k
}}
+
\mathbi
{
Mask
}
)
\mathbi
{
V
}
...
...
@@ -302,7 +302,7 @@
\end{figure}
%----------------------------------------------
\parinterval
下面举个简单的例子介绍点乘注意力的具体计算过程。如图
\ref
{
fig:12-11
}
所示,用黄色、蓝色和橙色的矩阵分别表示
$
\mathbi
{
Q
}$
、
$
\mathbi
{
K
}$
和
$
\mathbi
{
V
}$
。
$
\mathbi
{
Q
}$
、
$
\mathbi
{
K
}$
和
$
\mathbi
{
V
}$
中的每一个小格都对应一个单词在模型中的表示(即一个向量)。首先,通过点乘、放缩、掩码等操作得到相关性矩阵,即粉色部分。其次,将得到的中间结果矩阵(粉色)的每一行使用Softmax激活函数进行归一化操作,得到最终的权重矩阵,也就是图中的红色矩阵。红色矩阵中的每一行都对应一个注意力分布。最后,按行对
$
\mathbi
{
V
}$
进行加权求和,便得到了每个单词通过点乘注意力
机制
计算得到的表示。这里面,主要的计算消耗是两次矩阵乘法,即
$
\mathbi
{
Q
}$
与
$
\mathbi
{
K
}^{
\textrm
{
T
}}$
的乘法、相关性矩阵和
$
\mathbi
{
V
}$
的乘法。这两个操作都可以在GPU上高效地完成,因此可以一次性计算出序列中所有单词之间的注意力权重,并完成所有位置表示的加权求和过程,这样大大提高了模型计算的并行度。
\parinterval
下面举个简单的例子介绍点乘注意力的具体计算过程。如图
\ref
{
fig:12-11
}
所示,用黄色、蓝色和橙色的矩阵分别表示
$
\mathbi
{
Q
}$
、
$
\mathbi
{
K
}$
和
$
\mathbi
{
V
}$
。
$
\mathbi
{
Q
}$
、
$
\mathbi
{
K
}$
和
$
\mathbi
{
V
}$
中的每一个小格都对应一个单词在模型中的表示(即一个向量)。首先,通过点乘、放缩、掩码等操作得到相关性矩阵,即粉色部分。其次,将得到的中间结果矩阵(粉色)的每一行使用Softmax激活函数进行归一化操作,得到最终的权重矩阵,也就是图中的红色矩阵。红色矩阵中的每一行都对应一个注意力分布。最后,按行对
$
\mathbi
{
V
}$
进行加权求和,便得到了每个单词通过点乘注意力计算得到的表示。这里面,主要的计算消耗是两次矩阵乘法,即
$
\mathbi
{
Q
}$
与
$
\mathbi
{
K
}^{
\textrm
{
T
}}$
的乘法、相关性矩阵和
$
\mathbi
{
V
}$
的乘法。这两个操作都可以在GPU上高效地完成,因此可以一次性计算出序列中所有单词之间的注意力权重,并完成所有位置表示的加权求和过程,这样大大提高了模型计算的并行度。
%----------------------------------------------
\begin{figure}
[htp]
...
...
@@ -317,9 +317,9 @@
% NEW SUB-SECTION
%----------------------------------------------------------------------------------------
\subsection
{
多头注意力
}
\subsection
{
多头注意力
机制
}
\parinterval
Transformer中使用的另一项重要技术是
{
\small\sffamily\bfseries
{
多头注意力
}}
\index
{
多头注意力
}
(Multi-head Attention)
\index
{
Multi-head Attention
}
。“多头”可以理解成将原来的
$
\mathbi
{
Q
}$
、
$
\mathbi
{
K
}$
、
$
\mathbi
{
V
}$
按照隐层维度平均切分成多份。假设切分
$
h
$
份,那么最终会得到
$
\mathbi
{
Q
}
=
\{
\mathbi
{
Q
}_
1
,
\mathbi
{
Q
}_
2
,...,
\mathbi
{
Q
}_
h
\}
$
,
$
\mathbi
{
K
}
=
\{
\mathbi
{
K
}_
1
,
\mathbi
{
K
}_
2
,...,
\mathbi
{
K
}_
h
\}
$
,
$
\mathbi
{
V
}
=
\{
\mathbi
{
V
}_
1
,
\mathbi
{
V
}_
2
,...,
\mathbi
{
V
}_
h
\}
$
。多头注意力机制
就是用每一个切分得到的
$
\mathbi
{
Q
}$
,
$
\mathbi
{
K
}$
,
$
\mathbi
{
V
}$
独立的进行注意力计算,即第
$
i
$
个头的注意力计算结果
$
\mathbi
{
head
}_
i
=
\textrm
{
Attention
}
(
\mathbi
{
Q
}_
i,
\mathbi
{
K
}_
i,
\mathbi
{
V
}_
i
)
$
。
\parinterval
Transformer中使用的另一项重要技术是
{
\small\sffamily\bfseries
{
多头注意力
机制
}}
\index
{
多头注意力机制
}
(Multi-head Attention)
\index
{
Multi-head Attention
}
。“多头”可以理解成将原来的
$
\mathbi
{
Q
}$
、
$
\mathbi
{
K
}$
、
$
\mathbi
{
V
}$
按照隐层维度平均切分成多份。假设切分
$
h
$
份,那么最终会得到
$
\mathbi
{
Q
}
=
\{
\mathbi
{
Q
}_
1
,
\mathbi
{
Q
}_
2
,...,
\mathbi
{
Q
}_
h
\}
$
,
$
\mathbi
{
K
}
=
\{
\mathbi
{
K
}_
1
,
\mathbi
{
K
}_
2
,...,
\mathbi
{
K
}_
h
\}
$
,
$
\mathbi
{
V
}
=
\{
\mathbi
{
V
}_
1
,
\mathbi
{
V
}_
2
,...,
\mathbi
{
V
}_
h
\}
$
。多头注意力
就是用每一个切分得到的
$
\mathbi
{
Q
}$
,
$
\mathbi
{
K
}$
,
$
\mathbi
{
V
}$
独立的进行注意力计算,即第
$
i
$
个头的注意力计算结果
$
\mathbi
{
head
}_
i
=
\textrm
{
Attention
}
(
\mathbi
{
Q
}_
i,
\mathbi
{
K
}_
i,
\mathbi
{
V
}_
i
)
$
。
\parinterval
下面根据图
\ref
{
fig:12-12
}
详细介绍多头注意力的计算过程:
...
...
@@ -342,14 +342,14 @@
\end{figure}
%----------------------------------------------
\parinterval
多头机制可以被形式化描述为公式
\eqref
{
eq:12-10
}
和
\eqref
{
eq:12-11
}
:
\parinterval
多头
注意力
机制可以被形式化描述为公式
\eqref
{
eq:12-10
}
和
\eqref
{
eq:12-11
}
:
\begin{eqnarray}
\textrm
{
MultiHead
}
(
\mathbi
{
Q
}
,
\mathbi
{
K
}
,
\mathbi
{
V
}
)
&
=
&
\textrm
{
Concat
}
(
\mathbi
{
head
}_
1, ... ,
\mathbi
{
head
}_
h )
\mathbi
{
W
}^{
\,
o
}
\label
{
eq:12-10
}
\\
\mathbi
{
head
}_
i
&
=
&
\textrm
{
Attention
}
(
\mathbi
{
Q
}
\mathbi
{
W
}_
i
^{
\,
Q
}
,
\mathbi
{
K
}
\mathbi
{
W
}_
i
^{
\,
K
}
,
\mathbi
{
V
}
\mathbi
{
W
}_
i
^{
\,
V
}
)
\label
{
eq:12-11
}
\end{eqnarray}
\parinterval
多头机制的好处是允许模型在不同的表示子空间里学习。在很多实验中发现,不同表示空间的头捕获的信息是不同的,比如,在使用Transformer处理自然语言时,有的头可以捕捉句法信息,有的头可以捕捉词法信息。
\parinterval
多头
注意力
机制的好处是允许模型在不同的表示子空间里学习。在很多实验中发现,不同表示空间的头捕获的信息是不同的,比如,在使用Transformer处理自然语言时,有的头可以捕捉句法信息,有的头可以捕捉词法信息。
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
...
...
@@ -589,7 +589,7 @@ Transformer Deep(48层) & 30.2 & 43.1 & 194$\times 10^
\begin{itemize}
\vspace
{
0.5em
}
\item
近两年,有研究已经发现注意力机制可以捕捉一些语言现象
\upcite
{
DBLP:journals/corr/abs-1905-09418
}
,比如,在Transformer 的多头注意力中,不同头往往会捕捉到不同的信息,比如,有些头对低频词更加敏感,有些头更适合词意消歧,甚至有些头可以捕捉句法信息。此外,由于注意力机制增加了模型的复杂性,而且随着网络层数的增多,神经机器翻译中也存在大量的冗余,因此研发轻量的注意力模型也是具有实践意义的方向
\upcite
{
Xiao2019SharingAW,DBLP:journals/corr/abs-1805-00631,Lin2020WeightDT,DBLP:conf/iclr/WuLLLH20,Kitaev2020ReformerTE,DBLP:journals/corr/abs-2005-00743,dai-etal-2019-transformer,DBLP:journals/corr/abs-2004-05150,DBLP:conf/iclr/RaePJHL20
}
。
\item
近两年,有研究已经发现注意力机制可以捕捉一些语言现象
\upcite
{
DBLP:journals/corr/abs-1905-09418
}
,比如,在Transformer 的多头注意力
机制
中,不同头往往会捕捉到不同的信息,比如,有些头对低频词更加敏感,有些头更适合词意消歧,甚至有些头可以捕捉句法信息。此外,由于注意力机制增加了模型的复杂性,而且随着网络层数的增多,神经机器翻译中也存在大量的冗余,因此研发轻量的注意力模型也是具有实践意义的方向
\upcite
{
Xiao2019SharingAW,DBLP:journals/corr/abs-1805-00631,Lin2020WeightDT,DBLP:conf/iclr/WuLLLH20,Kitaev2020ReformerTE,DBLP:journals/corr/abs-2005-00743,dai-etal-2019-transformer,DBLP:journals/corr/abs-2004-05150,DBLP:conf/iclr/RaePJHL20
}
。
\vspace
{
0.5em
}
\item
神经机器翻译依赖成本较高的GPU设备,因此对模型的裁剪和加速也是很多系统研发人员所感兴趣的方向。比如,从工程上,可以考虑减少运算强度,比如使用低精度浮点数
\upcite
{
Ott2018ScalingNM
}
或者整数
\upcite
{
DBLP:journals/corr/abs-1906-00532,Lin2020TowardsF8
}
进行计算,或者引入缓存机制来加速模型的推断
\upcite
{
Vaswani2018Tensor2TensorFN
}
;也可以通过对模型参数矩阵的剪枝来减小整个模型的体积
\upcite
{
DBLP:journals/corr/SeeLM16
}
;另一种方法是知识蒸馏
\upcite
{
Hinton2015Distilling,kim-rush-2016-sequence
}
。 利用大模型训练小模型,这样往往可以得到比单独训练小模型更好的效果
\upcite
{
DBLP:journals/corr/ChenLCL17
}
。
\vspace
{
0.5em
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论