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
ce90cf25
Commit
ce90cf25
authored
Nov 08, 2020
by
xiaotong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
minor updates (sec 12)
parent
f70ec103
显示空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
10 行增加
和
10 行删除
+10
-10
Chapter12/Figures/figure-different-regularization-methods.tex
+2
-2
Chapter12/chapter12.tex
+8
-8
没有找到文件。
Chapter12/Figures/figure-different-regularization-methods.tex
查看文件 @
ce90cf25
...
...
@@ -6,10 +6,10 @@
\tikzstyle
{
lnode
}
= [minimum height=1.5em,minimum width=3em,inner sep=3pt,rounded corners=1.5pt,draw,fill=orange!20];
\tikzstyle
{
standard
}
= [rounded corners=3pt]
\node
[lnode,anchor=west] (l1) at (0,0)
{
\scriptsize
{
子层
$
n
$
}}
;
\node
[lnode,anchor=west] (l1) at (0,0)
{
\scriptsize
{
子层
}}
;
\node
[lnode,anchor=west] (l2) at ([xshift=3em]l1.east)
{
\scriptsize
{
层正则化
}}
;
\node
[lnode,anchor=west] (l3) at ([xshift=4em]l2.east)
{
\scriptsize
{
层正则化
}}
;
\node
[lnode,anchor=west] (l4) at ([xshift=1.5em]l3.east)
{
\scriptsize
{
子层
$
n
$
}}
;
\node
[lnode,anchor=west] (l4) at ([xshift=1.5em]l3.east)
{
\scriptsize
{
子层
}}
;
\node
[anchor=west] (plus1) at ([xshift=0.9em]l1.east)
{
\scriptsize
{$
\mathbf
{
\oplus
}$}}
;
\node
[anchor=west] (plus2) at ([xshift=0.9em]l4.east)
{
\scriptsize
{$
\mathbf
{
\oplus
}$}}
;
...
...
Chapter12/chapter12.tex
查看文件 @
ce90cf25
...
...
@@ -118,7 +118,7 @@
\end{table}
%----------------------------------------------
\parinterval
Transformer在被提出之后,很快就席卷了整个自然语言处理领域。实际上,Transformer也可以当作一种表示模型,因此也被大量地使用在自然语言处理的其他领域,甚至图像处理和语音处理中也能看到它的影子。比如,目前非常流行的BERT等预训练模型就是基于Transformer
\upcite
{
NIPS2017
_
7181
}
。表
\ref
{
tab:12-12
}
展示了Transformer在WMT英德和英法机器翻译任务上的性能。它能用更少的计算量(FLOPS)达到比其他模型更好的翻译品质
\footnote
{
FLOPS = floating-point operations per second,即每秒浮点运算次数。它是度量计算机运算规模的常用单位
}
。
\parinterval
Transformer在被提出之后,很快就席卷了整个自然语言处理领域。实际上,Transformer也可以当作一种表示模型,因此也被大量地使用在自然语言处理的其他领域,甚至图像处理和语音处理中也能看到它的影子。比如,目前非常流行的BERT等预训练模型就是基于Transformer。表
\ref
{
tab:12-12
}
展示了Transformer在WMT英德和英法机器翻译任务上的性能。它能用更少的计算量(FLOPS)达到比其他模型更好的翻译品质
\footnote
{
FLOPS = floating-point operations per second,即每秒浮点运算次数。它是度量计算机运算规模的常用单位
}
。
%----------------------------------------------
\begin{table}
[htp]
...
...
@@ -285,7 +285,7 @@
\label
{
eq:12-47
}
\end{eqnarray}
\noindent
首先,通过对
$
\vectorn
{
\emph
{
Q
}}$
和
$
\vectorn
{
\emph
{
K
}}$
的转置进行
点乘
操作,计算得到一个维度大小为
$
L
\times
L
$
的相关性矩阵,即
$
\vectorn
{
\emph
{
Q
}}
\vectorn
{
\emph
{
K
}}^{
T
}$
,它表示一个序列上任意两个位置的相关性。再通过系数1/
$
\sqrt
{
d
_
k
}$
进行放缩操作,放缩可以减少相关性矩阵的方差,具体体现在运算过程中实数矩阵中的数值不会过大,有利于模型训练。
\noindent
首先,通过对
$
\vectorn
{
\emph
{
Q
}}$
和
$
\vectorn
{
\emph
{
K
}}$
的转置进行
矩阵乘法
操作,计算得到一个维度大小为
$
L
\times
L
$
的相关性矩阵,即
$
\vectorn
{
\emph
{
Q
}}
\vectorn
{
\emph
{
K
}}^{
T
}$
,它表示一个序列上任意两个位置的相关性。再通过系数1/
$
\sqrt
{
d
_
k
}$
进行放缩操作,放缩可以减少相关性矩阵的方差,具体体现在运算过程中实数矩阵中的数值不会过大,有利于模型训练。
\parinterval
在此基础上,通过对相关性矩阵累加一个掩码矩阵
$
\vectorn
{
\emph
{
Mask
}}$
,来屏蔽掉矩阵中的无用信息。比如,在编码端,如果需要对多个句子同时处理,由于这些句子长度不同意,需要对句子的补齐。再比如,在解码端,训练的时候需要屏蔽掉当前目标语位置右侧的单词,因此这些单词在推断的时候是看不到的。
...
...
@@ -318,7 +318,7 @@
\subsection
{
多头注意力
}
\parinterval
Transformer中使用的另一项重要技术是
{
\small\sffamily\bfseries
{
多头注意力
}}
\index
{
多头注意力
}
(Multi-head Attention)
\index
{
Multi-head Attention
}
。“多头”可以理解成将原来的
$
\vectorn
{
\emph
{
Q
}}$
、
$
\vectorn
{
\emph
{
K
}}$
、
$
\vectorn
{
\emph
{
V
}}$
按照隐层维度平均切分成多份。假设切分
$
h
$
份,那么最终会得到
$
\vectorn
{
\emph
{
Q
}}
=
\{
\vectorn
{
\emph
{
q
}}_
1
,
\vectorn
{
\emph
{
q
}}_
2
,...,
\vectorn
{
\emph
{
q
}}_
h
\}
$
,
$
\vectorn
{
\emph
{
K
}}
=
\{
\vectorn
{
\emph
{
k
}}_
1
,
\vectorn
{
\emph
{
k
}}_
2
,...,
\vectorn
{
\emph
{
k
}}_
h
\}
$
,
$
\vectorn
{
\emph
{
V
}}
=
\{
\vectorn
{
\emph
{
v
}}_
1
,
\vectorn
{
\emph
{
v
}}_
2
,...,
\vectorn
{
\emph
{
v
}}_
h
\}
$
。多头注意力机制就是用每一个切分得到的
$
\vectorn
{
\emph
{
q
}}$
,
$
\vectorn
{
\emph
{
k
}}$
,
$
\vectorn
{
\emph
{
v
}}$
独立的进行注意力计算
。
即第
$
i
$
个头的注意力计算结果
$
\vectorn
{
\emph
{
head
}}_
i
=
\textrm
{
Attention
}
(
\vectorn
{
\emph
{
q
}}_
i,
\vectorn
{
\emph
{
k
}}_
i,
\vectorn
{
\emph
{
v
}}_
i
)
$
。
\parinterval
Transformer中使用的另一项重要技术是
{
\small\sffamily\bfseries
{
多头注意力
}}
\index
{
多头注意力
}
(Multi-head Attention)
\index
{
Multi-head Attention
}
。“多头”可以理解成将原来的
$
\vectorn
{
\emph
{
Q
}}$
、
$
\vectorn
{
\emph
{
K
}}$
、
$
\vectorn
{
\emph
{
V
}}$
按照隐层维度平均切分成多份。假设切分
$
h
$
份,那么最终会得到
$
\vectorn
{
\emph
{
Q
}}
=
\{
\vectorn
{
\emph
{
q
}}_
1
,
\vectorn
{
\emph
{
q
}}_
2
,...,
\vectorn
{
\emph
{
q
}}_
h
\}
$
,
$
\vectorn
{
\emph
{
K
}}
=
\{
\vectorn
{
\emph
{
k
}}_
1
,
\vectorn
{
\emph
{
k
}}_
2
,...,
\vectorn
{
\emph
{
k
}}_
h
\}
$
,
$
\vectorn
{
\emph
{
V
}}
=
\{
\vectorn
{
\emph
{
v
}}_
1
,
\vectorn
{
\emph
{
v
}}_
2
,...,
\vectorn
{
\emph
{
v
}}_
h
\}
$
。多头注意力机制就是用每一个切分得到的
$
\vectorn
{
\emph
{
q
}}$
,
$
\vectorn
{
\emph
{
k
}}$
,
$
\vectorn
{
\emph
{
v
}}$
独立的进行注意力计算
,
即第
$
i
$
个头的注意力计算结果
$
\vectorn
{
\emph
{
head
}}_
i
=
\textrm
{
Attention
}
(
\vectorn
{
\emph
{
q
}}_
i,
\vectorn
{
\emph
{
k
}}_
i,
\vectorn
{
\emph
{
v
}}_
i
)
$
。
\parinterval
下面根据图
\ref
{
fig:12-48
}
详细介绍多头注意力的计算过程:
...
...
@@ -356,7 +356,7 @@
\subsection
{
掩码操作
}
\parinterval
在公式
\eqref
{
eq:12-47
}
中提到了
掩码(Mask),它的目的是对向量中某些值进行掩盖,避免无关位置的数值对运算造成影响。Transformer中的掩码主要应用在注意力机制中的相关性系数计算,具体方式是在相关性系数矩阵上累加一个掩码矩阵。该矩阵在需要掩码的位置的值为负无穷
$
-
$
inf(具体实现时是一个非常小的数,比如
$
-
$
1e-9),其余位置为0,这样在进行了Softmax
归一化操作之后,被掩码掉的位置计算得到的权重便近似为0,也就是说对无用信息分配的权重为0,从而避免了其对结果产生影响。Transformer包含两种掩码:
\parinterval
在公式
\eqref
{
eq:12-47
}
中提到了
{
\small\bfnew
{
掩码
}}
\index
{
掩码
}
(Mask
\index
{
Mask
}
),它的目的是对向量中某些值进行掩盖,避免无关位置的数值对运算造成影响。Transformer中的掩码主要应用在注意力机制中的相关性系数计算,具体方式是在相关性系数矩阵上累加一个掩码矩阵。该矩阵在需要掩码的位置的值为负无穷
$
-
$
inf(具体实现时是一个非常小的数,比如
$
-
$
1e-9),其余位置为0,这样在进行了Softmax
归一化操作之后,被掩码掉的位置计算得到的权重便近似为0,也就是说对无用信息分配的权重为0,从而避免了其对结果产生影响。Transformer包含两种掩码:
\begin{itemize}
\vspace
{
0.5em
}
...
...
@@ -492,7 +492,7 @@ lrate = d_{model}^{-0.5} \cdot \textrm{min} (step^{-0.5} , step \cdot warmup\_st
\end{eqnarray}
\vspace
{
0.5em
}
其中,
$
step
$
表示更新的次数(或步数)。通常设置网络更新的前4000步为预热阶段即
$
warmup
\_
steps
=
4000
$
。Transformer的学习率曲线如图
\ref
{
fig:12-54
}
所示。在训练初期,学习率从一个较小的初始值逐渐增大(线性增长),当到达一定的步数,学习率再逐渐减小。这样做可以减缓在训练初期的不稳定现象,同时在模型达到相对稳定之后,通过逐渐减小的学习率让模型进行更细致的调整。这种学习率的调整方法是Transformer
的
一个很大的工程贡献。
其中,
$
step
$
表示更新的次数(或步数)。通常设置网络更新的前4000步为预热阶段即
$
warmup
\_
steps
=
4000
$
。Transformer的学习率曲线如图
\ref
{
fig:12-54
}
所示。在训练初期,学习率从一个较小的初始值逐渐增大(线性增长),当到达一定的步数,学习率再逐渐减小。这样做可以减缓在训练初期的不稳定现象,同时在模型达到相对稳定之后,通过逐渐减小的学习率让模型进行更细致的调整。这种学习率的调整方法是Transformer
系统
一个很大的工程贡献。
\vspace
{
0.5em
}
\end{itemize}
...
...
@@ -509,7 +509,7 @@ lrate = d_{model}^{-0.5} \cdot \textrm{min} (step^{-0.5} , step \cdot warmup\_st
\begin{itemize}
\vspace
{
0.5em
}
\item
{
\small\bfnew
{
小批量训练
}}
\index
{
小批量训练
}
(Mini-batch Training)
\index
{
Mini-batch Training
}
:每次使用一定数量的样本进行训练,即每次从样本中选择一小部分数据进行训练。这种方法的收敛较快,同时易于提高设备的利用率。批次大小通常设置为2048
/
4096(token数即每个批次中的单词个数)。每一个批次中的句子并不是随机选择的,模型通常会根据句子长度进行排序,选取长度相近的句子组成一个批次。这样做可以减少padding数量,提高训练效率,如图
\ref
{
fig:12-55
}
。
\item
{
\small\bfnew
{
小批量训练
}}
\index
{
小批量训练
}
(Mini-batch Training)
\index
{
Mini-batch Training
}
:每次使用一定数量的样本进行训练,即每次从样本中选择一小部分数据进行训练。这种方法的收敛较快,同时易于提高设备的利用率。批次大小通常设置为2048
或
4096(token数即每个批次中的单词个数)。每一个批次中的句子并不是随机选择的,模型通常会根据句子长度进行排序,选取长度相近的句子组成一个批次。这样做可以减少padding数量,提高训练效率,如图
\ref
{
fig:12-55
}
。
%----------------------------------------------
\begin{figure}
[htp]
...
...
@@ -563,7 +563,7 @@ Transformer Deep(48层) & 30.2 & 43.1 & 194$\times 10^
\parinterval
Transformer解码器生成译文词序列的过程和其它神经机器翻译系统类似,都是从左往右生成,且下一个单词的预测依赖已经生成的单词。其具体推断过程如图
\ref
{
fig:12-56
}
所示,其中
$
\mathbi
{
C
}_
i
$
是编码-解码注意力的结果,解码器首先根据“<eos>”和
$
\mathbi
{
C
}_
1
$
生成第一个单词“how”,然后根据“how”和
$
\mathbi
{
C
}_
2
$
生成第二个单词“are”,以此类推,当解码器生成“<eos>”时结束推断。
\parinterval
但是,Transformer在推断阶段无法对所有位置进行并行化操作,因为对于每一个目标语单词都需要对前面所有单词进行注意力操作,因此它推断速度非常慢。可以采用的加速手段有:
低精度
\upcite
{
DBLP:journals/corr/CourbariauxB16
}
、Cache(缓存需要重复计算的变量)
\upcite
{
DBLP:journals/corr/abs-1805-00631
}
、共享注意力网络等
\upcite
{
Xiao2019SharingAW
}
。关于Transformer模型的推断加速方法将会在
{
\chapterfourteen
}
进一步深入讨论。
\parinterval
但是,Transformer在推断阶段无法对所有位置进行并行化操作,因为对于每一个目标语单词都需要对前面所有单词进行注意力操作,因此它推断速度非常慢。可以采用的加速手段有:
Cache(缓存需要重复计算的变量)
\upcite
{
Vaswani2018Tensor2TensorFN
}
、低精度计算
\upcite
{
DBLP:journals/corr/CourbariauxB16
}
、共享注意力网络等
\upcite
{
Xiao2019SharingAW
}
。关于Transformer模型的推断加速方法将会在
{
\chapterfourteen
}
进一步深入讨论。
%----------------------------------------------
\begin{figure}
[htp]
...
...
@@ -589,7 +589,7 @@ Transformer Deep(48层) & 30.2 & 43.1 & 194$\times 10^
\vspace
{
0.5em
}
\item
近两年,有研究已经发现注意力机制可以捕捉一些语言现象
\upcite
{
DBLP:journals/corr/abs-1905-09418
}
,比如,在Transformer 的多头注意力中,不同头往往会捕捉到不同的信息,比如,有些头对低频词更加敏感,有些头更适合词意消歧,甚至有些头可以捕捉句法信息。此外,由于注意力机制增加了模型的复杂性,而且随着网络层数的增多,神经机器翻译中也存在大量的冗余,因此研发轻量的注意力模型也是具有实践意义的方向
\upcite
{
Xiao2019SharingAW,DBLP:journals/corr/abs-1805-00631,Lin2020WeightDT
}
。
\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
}
。
\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
}
\item
自注意力网络作为Transformer模型中重要组成部分,近年来受到研究人员的广泛关注,尝试设计更高效地操作来替代它。比如,利用动态卷积网络来替换编码端与解码端的自注意力网络,在保证推断效率的同时取得了和Transformer相当甚至略好的翻译性能
\upcite
{
Wu2019PayLA
}
;为了加速Transformer处理较长输入文本的效率,利用局部敏感哈希替换自注意力机制的Reformer模型也吸引了广泛的关注
\upcite
{
Kitaev2020ReformerTE
}
。此外,在自注意力网络引入额外的编码信息能够进一步提高模型的表示能力。比如,引入固定窗口大小的相对位置编码信息
\upcite
{
Shaw2018SelfAttentionWR,dai-etal-2019-transformer
}
,或利用动态系统的思想从数据中学习特定的位置编码表示,具有更好的泛化能力
\upcite
{
Liu2020LearningTE
}
。通过对Transformer模型中各层输出进行可视化分析,研究人员发现Transformer自底向上各层网络依次聚焦于词级-语法级-语义级的表示
\upcite
{
Jawahar2019WhatDB,li2020shallow
}
,因此在底层的自注意力网络中引入局部编码信息有助于模型对局部特征的抽象
\upcite
{
Yang2018ModelingLF,DBLP:journals/corr/abs-1904-03107
}
。
\vspace
{
0.5em
}
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论