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
2047b152
Commit
2047b152
authored
Nov 27, 2020
by
zengxin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
12
parent
56efe5f5
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
7 行增加
和
7 行删除
+7
-7
Chapter12/Figures/figure-decode-of-transformer.tex
+1
-1
Chapter12/chapter12.tex
+6
-6
没有找到文件。
Chapter12/Figures/figure-decode-of-transformer.tex
查看文件 @
2047b152
...
...
@@ -73,7 +73,7 @@
%\node [anchor=west,inner sep=2pt] (o5) at ([xshift=0.3em]o4.east) {\tiny{...}};
}
{
\node
[anchor=north,inner sep=2pt] (wt1) at ([yshift=-0.6em]t1.south)
{
\tiny
{$
\langle
$
e
os
$
\rangle
$}}
;
\node
[anchor=north,inner sep=2pt] (wt1) at ([yshift=-0.6em]t1.south)
{
\tiny
{$
\langle
$
s
os
$
\rangle
$}}
;
}
{
\node
[anchor=north,inner sep=2pt] (wt2) at ([yshift=-0.6em]t2.south)
{
\tiny
{
How
}}
;
...
...
Chapter12/chapter12.tex
查看文件 @
2047b152
...
...
@@ -153,7 +153,7 @@
\end{figure}
%----------------------------------------------
\parinterval
图
\ref
{
fig:12-39
}
展示了Transformer的结构。
解
码器由若干层组成(绿色虚线框就代表一层)。每一层(Layer)的输入都是一个向量序列,输出是同样大小的向量序列,而Transformer层的作用是对输入进行进一步的抽象,得到新的表示结果。不过这里的层并不是指单一的神经网络结构,它里面由若干不同的模块组成,包括:
\parinterval
图
\ref
{
fig:12-39
}
展示了Transformer的结构。
编
码器由若干层组成(绿色虚线框就代表一层)。每一层(Layer)的输入都是一个向量序列,输出是同样大小的向量序列,而Transformer层的作用是对输入进行进一步的抽象,得到新的表示结果。不过这里的层并不是指单一的神经网络结构,它里面由若干不同的模块组成,包括:
\begin{itemize}
\vspace
{
0.5em
}
...
...
@@ -182,7 +182,7 @@
\parinterval
此外,编码端和解码端都有输入的词序列。编码端的词序列输入是为了对其进行表示,进而解码端能从编码端访问到源语言句子的全部信息。解码端的词序列输入是为了进行目标语的生成,本质上它和语言模型是一样的,在得到前
$
n
-
1
$
个单词的情况下输出第
$
n
$
个单词。除了输入词序列的词嵌入,Transformer中也引入了位置嵌入,以表示每个位置信息。原因是,自注意力机制没有显性地对位置进行表示,因此也无法考虑词序。在输入中引入位置信息可以让自注意力机制间接地感受到每个词的位置,进而保证对序列表示的合理性。最终,整个模型的输出由一个Softmax层完成,它和循环神经网络中的输出层是完全一样的。
\parinterval
在进行更详细的介绍前,先利用图
\ref
{
fig:12-39
}
简单了解一下Transformer模型是如何进行翻译的。首先,Transformer将源语言句子“我/很/好”的词嵌入融合位置编码后作为输入。然后,编码器对输入的源语句子进行逐层抽象,得到包含丰富的上下文信息的源语表示并传递给解码器。解码器的每一层,使用自注意力子层对输入解码端的表示进行加工,之后再使用编码-解码注意力子层融合源语句子的表示信息。就这样逐词生成目标语译文单词序列。解码器
的每个位置的输入是当前单词(比如,“I”),而这个位置
输出是下一个单词(比如,“am”),这个设计和标准的神经语言模型是完全一样的。
\parinterval
在进行更详细的介绍前,先利用图
\ref
{
fig:12-39
}
简单了解一下Transformer模型是如何进行翻译的。首先,Transformer将源语言句子“我/很/好”的词嵌入融合位置编码后作为输入。然后,编码器对输入的源语句子进行逐层抽象,得到包含丰富的上下文信息的源语表示并传递给解码器。解码器的每一层,使用自注意力子层对输入解码端的表示进行加工,之后再使用编码-解码注意力子层融合源语句子的表示信息。就这样逐词生成目标语译文单词序列。解码器
每个位置的输入是当前单词(比如,“I”),而这个位置的
输出是下一个单词(比如,“am”),这个设计和标准的神经语言模型是完全一样的。
\parinterval
当然,这里可能还有很多疑惑,比如,什么是位置编码?Transformer的自注意力机制具体是怎么进行计算的,其结构是怎样的?层归一化又是什么?等等。下面就一一展开介绍。
...
...
@@ -287,7 +287,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-45
}
展示了点乘注意力计算的全过程。
...
...
@@ -296,7 +296,7 @@
\begin{figure}
[htp]
\centering
\input
{
./Chapter12/Figures/figure-point-product-attention-model
}
\caption
{
点乘注意力
力
模型
}
\caption
{
点乘注意力模型
}
\label
{
fig:12-45
}
\end{figure}
%----------------------------------------------
...
...
@@ -328,7 +328,7 @@
\vspace
{
0.5em
}
\item
其次,对每个头分别执行点乘注意力操作,并得到每个头的注意力操作的输出
$
\mathbi
{
head
}_
i
$
;
\vspace
{
0.5em
}
\item
最后,将
$
h
$
个头的注意力输出在最后一维
$
d
_
v
$
进行拼接(Concat)重新得到维度为
$
h
\times
d
_
v
$
的输出,并通过对其
左
乘一个权重矩阵
$
\mathbi
{
W
}^{
\,
o
}$
进行线性变换,从而对多头计算得到的信息进行融合,且将多头注意力输出的维度映射为模型的隐层大小(即
$
d
_{
model
}$
),这里参数矩阵
$
\mathbi
{
W
}^{
\,
o
}
\in
\mathbb
{
R
}^{
h d
_
v
\times
d
_{
model
}}$
。
\item
最后,将
$
h
$
个头的注意力输出在最后一维
$
d
_
v
$
进行拼接(Concat)重新得到维度为
$
h
\times
d
_
v
$
的输出,并通过对其
右
乘一个权重矩阵
$
\mathbi
{
W
}^{
\,
o
}$
进行线性变换,从而对多头计算得到的信息进行融合,且将多头注意力输出的维度映射为模型的隐层大小(即
$
d
_{
model
}$
),这里参数矩阵
$
\mathbi
{
W
}^{
\,
o
}
\in
\mathbb
{
R
}^{
h d
_
v
\times
d
_{
model
}}$
。
\vspace
{
0.5em
}
\end{itemize}
...
...
@@ -562,7 +562,7 @@ Transformer Deep(48层) & 30.2 & 43.1 & 194$\times 10^
\section
{
推断
}
\parinterval
Transformer解码器生成译文词序列的过程和其它神经机器翻译系统类似,都是从左往右生成,且下一个单词的预测依赖已经生成的单词。其具体推断过程如图
\ref
{
fig:12-56
}
所示,其中
$
\mathbi
{
C
}_
i
$
是编码-解码注意力的结果,解码器首先根据“<
e
os>”和
$
\mathbi
{
C
}_
1
$
生成第一个单词“how”,然后根据“how”和
$
\mathbi
{
C
}_
2
$
生成第二个单词“are”,以此类推,当解码器生成“<eos>”时结束推断。
\parinterval
Transformer解码器生成译文词序列的过程和其它神经机器翻译系统类似,都是从左往右生成,且下一个单词的预测依赖已经生成的单词。其具体推断过程如图
\ref
{
fig:12-56
}
所示,其中
$
\mathbi
{
C
}_
i
$
是编码-解码注意力的结果,解码器首先根据“<
s
os>”和
$
\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
}
进一步深入讨论。
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论