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
4c79cd5d
Commit
4c79cd5d
authored
Jan 05, 2021
by
xiaotong
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
wording (sec 14)
parent
b11d2f3e
隐藏空白字符变更
内嵌
并排
正在显示
2 个修改的文件
包含
18 行增加
和
18 行删除
+18
-18
Chapter14/Figures/figure-different-softmax.tex
+1
-1
Chapter14/chapter14.tex
+17
-17
没有找到文件。
Chapter14/Figures/figure-different-softmax.tex
查看文件 @
4c79cd5d
...
@@ -57,7 +57,7 @@
...
@@ -57,7 +57,7 @@
\node
[font=
\small
] (label2) at ([yshift=0.6cm]out2.north)
{
Softmax
}
;
\node
[font=
\small
] (label2) at ([yshift=0.6cm]out2.north)
{
Softmax
}
;
\node
[anchor=west,layer,fill=orange!15!white] (net3) at ([xshift=2cm]net2.east)
{}
;
\node
[anchor=west,layer,fill=orange!15!white] (net3) at ([xshift=2cm]net2.east)
{}
;
\node
[anchor=north,font=
\scriptsize
] (input3) at ([yshift=-0.5cm]net3.south)
{
源语
}
;
\node
[anchor=north,font=
\scriptsize
] (input3) at ([yshift=-0.5cm]net3.south)
{
源语
言
}
;
\node
[anchor=south,layer,align=center,font=
\scriptsize
,fill=yellow!10!white] (out3) at ([yshift=0.9cm]net3.north)
{
候选
\\
列表
}
;
\node
[anchor=south,layer,align=center,font=
\scriptsize
,fill=yellow!10!white] (out3) at ([yshift=0.9cm]net3.north)
{
候选
\\
列表
}
;
\draw
[->,line width=1pt] (input3) to (net3);
\draw
[->,line width=1pt] (input3) to (net3);
...
...
Chapter14/chapter14.tex
查看文件 @
4c79cd5d
...
@@ -267,7 +267,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
...
@@ -267,7 +267,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\section
{
轻量模型
}
\label
{
sec:14-3
}
\section
{
轻量模型
}
\label
{
sec:14-3
}
\parinterval
翻译速度和翻译精度之间的平衡是机器翻译系统研发中的常见问题。即使是以提升翻译品质为目标的任务(如用BLEU进行评价),也不得不考虑翻译速度的影响。比如,在很多任务中会
使用反向翻译构造伪数据,涉及对大规模单语数据的翻译;无监督机器翻译中也会频繁地使用神经机器翻译系统构造训练数据。如果翻译速度过慢会增大实验的周期。从应用的角度看,在很多场景下翻译速度甚至比翻译品质更重要。比如,在线翻译和一些小设备上的机器翻译系统都需要保证相对低的翻译时延,以满足用户体验的最基本要求。虽然,我们希望能有一套又好又快的翻译系统,但是现实的情况是:往往需要通过牺牲一些翻译品质来换取翻译速度的提升。下面就列举一些常用的神经机器翻译轻量模型和加速方法。这些方法通常是应用在解码器,因为相比编码器,神经机器翻译的
解码器是推断过程中最耗时的部分。
\parinterval
翻译速度和翻译精度之间的平衡是机器翻译系统研发中的常见问题。即使是以提升翻译品质为目标的任务(如用BLEU进行评价),也不得不考虑翻译速度的影响。比如,在很多任务中会
构造伪数据,涉及对大规模单语数据的翻译;无监督机器翻译中也会频繁地使用神经机器翻译系统构造训练数据。如果翻译速度过慢会增大实验的周期。从应用的角度看,在很多场景下翻译速度甚至比翻译品质更重要。比如,在线翻译和一些小设备上的机器翻译系统都需要保证相对低的翻译时延,以满足用户体验的最基本要求。虽然,我们希望能有一套又好又快的翻译系统,但是现实的情况是:往往需要通过牺牲一些翻译品质来换取翻译速度的提升。下面就列举一些常用的神经机器翻译轻量模型和加速方法。这些方法通常是应用在神经机器翻译的解码器,因为相比编码器,
解码器是推断过程中最耗时的部分。
%----------------------------------------------------------------------------------------
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
% NEW SUBSUB-SECTION
...
@@ -275,9 +275,9 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
...
@@ -275,9 +275,9 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\subsection
{
输出层的词汇选择
}
\subsection
{
输出层的词汇选择
}
\parinterval
神经机器翻译需要对输入和输出的单词进行分布式表示
,比如,每一个单词都用一个512 维向量进行表示。但是,由于真实的词表通常很大,因此计算并保存这些单词的向量表示会消耗较多的计算和存储资源。特别是对于基于Softmax 的输出层,使用大词表往往会占用较多的系统运算时间。虽然可以通过BPE 和限制词汇表规模的方法降低输出层计算的负担
\upcite
{
DBLP:conf/acl/SennrichHB16a
}
,但是为了获得可接受的翻译品质,词汇表也不能过小,因此输出层的计算仍然十分耗时
。
\parinterval
神经机器翻译需要对输入和输出的单词进行分布式表示
。但是,由于真实的词表通常很大,因此计算并保存这些单词的向量表示会消耗较多的计算和存储资源。特别是对于基于Softmax 的输出层,大词表的计算十分耗时。虽然可以通过BPE 和限制词汇表规模的方法降低输出层计算的负担
\upcite
{
DBLP:conf/acl/SennrichHB16a
}
,但是为了获得可接受的翻译品质,词汇表也不能过小,因此输出层的计算代价仍然很高
。
\parinterval
通过改变输出层的
网络结构,可以一定程度上缓解这个问题
\upcite
{
DBLP:conf/acl/JeanCMB15
}
。一种比较简单的方法是对可能输出的单词进行筛选,简称词汇选择。这里,可以利用类似于统计机器翻译的翻译表,获得每个源语言单词最可能的译文。在翻译过程中,利用注意力机制找到每个目标语言位置对应的源语言位置,之后获得这些源语言单词最可能的翻译候选。之后,Softmax 只需要在这个有限的翻译候选单词集合上进行计算,大大降低了输出层的计算量。尤其对于CPU 上的系统,这个方法往往会带来明显的速度提升,同时保证翻译品质
。图
\ref
{
fig:14-4
}
给出了词汇选择方法的示意图。
\parinterval
通过改变输出层的
结构,可以一定程度上缓解这个问题
\upcite
{
DBLP:conf/acl/JeanCMB15
}
。一种比较简单的方法是对可能输出的单词进行筛选,即词汇选择。这里,可以利用类似于统计机器翻译的翻译表,获得每个源语言单词最可能的译文。在翻译过程中,利用注意力机制找到每个目标语言位置对应的源语言位置,之后获得这些源语言单词最可能的翻译候选。之后,Softmax 只需要在这个有限的翻译候选单词集合上进行计算,大大降低了输出层的计算量。尤其对于CPU 上的系统,这个方法往往会带来明显的速度提升
。图
\ref
{
fig:14-4
}
给出了词汇选择方法的示意图。
%----------------------------------------------
%----------------------------------------------
\begin{figure}
[htp]
\begin{figure}
[htp]
...
@@ -296,7 +296,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
...
@@ -296,7 +296,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\subsection
{
消除冗余计算
}
\subsection
{
消除冗余计算
}
\parinterval
消除不必要的计算是加速机器翻译系统的另一种方法。比如,在统计机器翻译时代,假设重组就是一种典型的避免冗余计算的手段(见
\chapterseven
)。对于神经机器翻译中的Transformer 模型,消除冗余计算的一种简单有效的方法是对解码器的注意力结果进行缓存。
在生成每个译文时,Transformer 模型会对当前位置之前的所有位置进行自注意力操作,但是这些计算里只有和当前位置相关的计算是“新” 的,前面位置之间的注意力结果已经在之前的解码步骤里计算过,因此可以对其进行缓存。
\parinterval
消除不必要的计算是加速机器翻译系统的另一种方法。比如,在统计机器翻译时代,假设重组就是一种典型的避免冗余计算的手段(见
{
\chapterseven
}
)。对于神经机器翻译中,消除冗余计算的一种简单有效的方法是对解码器的注意力结果进行缓存。以Transformer为例,
在生成每个译文时,Transformer 模型会对当前位置之前的所有位置进行自注意力操作,但是这些计算里只有和当前位置相关的计算是“新” 的,前面位置之间的注意力结果已经在之前的解码步骤里计算过,因此可以对其进行缓存。
\parinterval
此外,由于Transformer 模型较为复杂,还存在很多冗余。比如,Transformer 的每一层会包含自注意力机制、层正则化、残差连接、前馈神经网络等多种不同的结构。同时,不同结构之间还会包含一些线性变换。多层Transformer模型会更加复杂。但是,这些层可能在做相似的事情,甚至有些计算根本就是重复的。图
\ref
{
fig:14-5
}
中展示了解码器自注意力和编码-解码注意力中不同层的注意力权重的相似性,这里的相似性利用Jensen-Shannon散度进行度量
\upcite
{
61115
}
。可以看到,自注意力中,2-6层之间的注意力权重的分布非常相似。编码-解码注意力也有类似的现象,临近的层之间有非常相似的注意力权重。这个现象说明:在多层神经网络中有些计算是冗余的,因此很自然的想法是消除这些冗余使得机器翻译变得更“轻”。
\parinterval
此外,由于Transformer 模型较为复杂,还存在很多冗余。比如,Transformer 的每一层会包含自注意力机制、层正则化、残差连接、前馈神经网络等多种不同的结构。同时,不同结构之间还会包含一些线性变换。多层Transformer模型会更加复杂。但是,这些层可能在做相似的事情,甚至有些计算根本就是重复的。图
\ref
{
fig:14-5
}
中展示了解码器自注意力和编码-解码注意力中不同层的注意力权重的相似性,这里的相似性利用Jensen-Shannon散度进行度量
\upcite
{
61115
}
。可以看到,自注意力中,2-6层之间的注意力权重的分布非常相似。编码-解码注意力也有类似的现象,临近的层之间有非常相似的注意力权重。这个现象说明:在多层神经网络中有些计算是冗余的,因此很自然的想法是消除这些冗余使得机器翻译变得更“轻”。
...
@@ -331,13 +331,13 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
...
@@ -331,13 +331,13 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\parinterval
在推断时,神经机器翻译的解码器是最耗时的,因为每个目标语言位置需要单独输出单词的分布,同时在搜索过程中每一个翻译假设都要被扩展成多个翻译假设,进一步增加了计算量。因此,另一种思路是使用更加轻量的解码器加快翻译假设的生成速度
\upcite
{
Hinton2015Distilling,Munim2019SequencelevelKD
}
。
\parinterval
在推断时,神经机器翻译的解码器是最耗时的,因为每个目标语言位置需要单独输出单词的分布,同时在搜索过程中每一个翻译假设都要被扩展成多个翻译假设,进一步增加了计算量。因此,另一种思路是使用更加轻量的解码器加快翻译假设的生成速度
\upcite
{
Hinton2015Distilling,Munim2019SequencelevelKD
}
。
\parinterval
比较简单的做法是把解码器的网络变得更“浅”、更“窄”。所谓浅网络是指使用更少的层构建神经网络,比如,使用3 层,甚至1 层网络的Transformer 解码器。所谓窄网络是指将网络中某些层中神经元的数量减少。不过,直接训练这样的小模型会带来翻译品质的下降。这时会考虑使用知识蒸馏
(也称作知识精炼)等技术来提升小模型的品质
。
\parinterval
比较简单的做法是把解码器的网络变得更“浅”、更“窄”。所谓浅网络是指使用更少的层构建神经网络,比如,使用3 层,甚至1 层网络的Transformer 解码器。所谓窄网络是指将网络中某些层中神经元的数量减少。不过,直接训练这样的小模型会带来翻译品质的下降。这时会考虑使用知识蒸馏
等技术来提升小模型的品质(见
{
\chapterthirteen
}
)
。
\parinterval
另一种思路是化简Transformer 解码器的神经网络。比如,可以使用平均注意力机制代替原始Transformer 中的自注意力机制
\upcite
{
DBLP:journals/corr/abs-1805-00631
}
,也可以使用运算更轻的卷积操作代替注意力模块
\upcite
{
Wu2019PayLA
}
。前面提到的基于共享注意力机制的模型也是一种典型的轻量模型
\upcite
{
Xiao2019SharingAW
}
。这些方法本质上也是对注意力模型结构的优化,这类思想在近几年也受到了很多关注
\upcite
{
Kitaev2020ReformerTE,Katharopoulos2020TransformersAR,DBLP:journals/corr/abs-2006-04768
}
。
\parinterval
另一种思路是化简Transformer 解码器的神经网络。比如,可以使用平均注意力机制代替原始Transformer 中的自注意力机制
\upcite
{
DBLP:journals/corr/abs-1805-00631
}
,也可以使用运算更轻的卷积操作代替注意力模块
\upcite
{
Wu2019PayLA
}
。前面提到的基于共享注意力机制的模型也是一种典型的轻量模型
\upcite
{
Xiao2019SharingAW
}
。这些方法本质上也是对注意力模型结构的优化,这类思想在近几年也受到了很多关注
\upcite
{
Kitaev2020ReformerTE,Katharopoulos2020TransformersAR,DBLP:journals/corr/abs-2006-04768
}
,在
{
\chapterfifteen
}
也会有进一步讨论
。
\parinterval
此外,使用异构神经网络也是一种平衡精度和速度的有效方法。在很多研究中发现,基于Transformer 的编码器对翻译品质的影响更大,而解码器的作用会小一些。因此,一种想法是使用速度更快的解码器结构,比如,用基于循环神经网络的解码器代替Transformer模型中基于注意力机制的解码器
\upcite
{
Chen2018TheBO
}
。这样,既能发挥Transformer 在编码上的优势,同时也能利用循环神经网络在解码器速度上的优势。使用类似的思想,也可以用卷积神经网络等结构进行解码器的设计。
\parinterval
此外,使用异构神经网络也是一种平衡精度和速度的有效方法。在很多研究中发现,基于Transformer 的编码器对翻译品质的影响更大,而解码器的作用会小一些。因此,一种想法是使用速度更快的解码器结构,比如,用基于循环神经网络的解码器代替Transformer模型中基于注意力机制的解码器
\upcite
{
Chen2018TheBO
}
。这样,既能发挥Transformer 在编码上的优势,同时也能利用循环神经网络在解码器速度上的优势。使用类似的思想,也可以用卷积神经网络等结构进行解码器的设计。
\parinterval
针对轻量级Transformer模型的设计也包括层级的结构剪枝,这类方法试图通过跳过某些操作或者某些层来降低计算量。典型的相关工作是样本自适应
网络结构,如 FastBERT
\upcite
{
Liu2020FastBERTAS
}
、Depth Adaptive Transformer
\upcite
{
Elbayad2020DepthAdaptiveT
}
等,与传统的Transformer的解码过程不同,这类
网络结构在推断时不需要计算全部的解码层,而是根据输入自动选择模型的部分层进行计算,达到加速和减少参数量的目的。
\parinterval
针对轻量级Transformer模型的设计也包括层级的结构剪枝,这类方法试图通过跳过某些操作或者某些层来降低计算量。典型的相关工作是样本自适应
神经网络结构,如 FastBERT
\upcite
{
Liu2020FastBERTAS
}
、Depth Adaptive Transformer
\upcite
{
Elbayad2020DepthAdaptiveT
}
等,与传统的Transformer的解码过程不同,这类神经
网络结构在推断时不需要计算全部的解码层,而是根据输入自动选择模型的部分层进行计算,达到加速和减少参数量的目的。
%----------------------------------------------------------------------------------------
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
% NEW SUBSUB-SECTION
...
@@ -353,7 +353,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
...
@@ -353,7 +353,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\vspace
{
0.5em
}
\vspace
{
0.5em
}
\item
批次生成策略。对于源语言文本预先给定的情况,通常是按句子长度组织每个批次,即:把长度相似的句子放到一个批次里。这样做的好处是可以尽可能保证一个批次中的内容是“满” 的,否则如果句长差异过大会造成批次中有很多位置用占位符填充,产生无用计算。对于实时翻译的情况,批次的组织较为复杂。由于有翻译时延的限制,可能无法等到有足够多的句子就要进行翻译。常见的做法是,设置一个等待的时间,在同一个时间段中的句子可以放到一个批次中(或者几个批次中)。对于高并发的情况,也可以考虑使用不同的
{
\small\sffamily\bfseries
{
桶
}}
\index
{
桶
}
(Bucket
\index
{
Bucket
}
)保存不同长度范围的句子,之后将同一个桶中的句子进行批量推断。这个问题在
{
\chaptereighteen
}
中还会做进一步讨论。
\item
批次生成策略。对于源语言文本预先给定的情况,通常是按句子长度组织每个批次,即:把长度相似的句子放到一个批次里。这样做的好处是可以尽可能保证一个批次中的内容是“满” 的,否则如果句长差异过大会造成批次中有很多位置用占位符填充,产生无用计算。对于实时翻译的情况,批次的组织较为复杂。由于有翻译时延的限制,可能无法等到有足够多的句子就要进行翻译。常见的做法是,设置一个等待的时间,在同一个时间段中的句子可以放到一个批次中(或者几个批次中)。对于高并发的情况,也可以考虑使用不同的
{
\small\sffamily\bfseries
{
桶
}}
\index
{
桶
}
(Bucket
\index
{
Bucket
}
)保存不同长度范围的句子,之后将同一个桶中的句子进行批量推断。这个问题在
{
\chaptereighteen
}
中还会做进一步讨论。
\vspace
{
0.5em
}
\vspace
{
0.5em
}
\item
批次大小的选择。一个批次中的句子数量越多,GPU 设备的利用率越高,系统吞吐越大。但是,一个批次中所有句子翻译结束后才能拿到翻译结果,因此批次中有些句子即使已经翻译结束也要等待其它没有完成的句子。也就是说,从单个句子来看,批次越大翻译的延时越长,这也导致在翻译实时性要求较高的场景中,不能使用过大的批次。而且,大批次对GPU 显存的消耗更大,因此也需要根据具体任务合理选择批次大小。为了说明这些问题,图
\ref
{
fig:14-7
}
展示了不同批次大小下的
吞吐、
时延和显存消耗。
\item
批次大小的选择。一个批次中的句子数量越多,GPU 设备的利用率越高,系统吞吐越大。但是,一个批次中所有句子翻译结束后才能拿到翻译结果,因此批次中有些句子即使已经翻译结束也要等待其它没有完成的句子。也就是说,从单个句子来看,批次越大翻译的延时越长,这也导致在翻译实时性要求较高的场景中,不能使用过大的批次。而且,大批次对GPU 显存的消耗更大,因此也需要根据具体任务合理选择批次大小。为了说明这些问题,图
\ref
{
fig:14-7
}
展示了不同批次大小下的时延和显存消耗。
\vspace
{
0.5em
}
\vspace
{
0.5em
}
\end{itemize}
\end{itemize}
...
@@ -361,7 +361,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
...
@@ -361,7 +361,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\begin{figure}
[htp]
\begin{figure}
[htp]
\centering
\centering
\input
{
./Chapter14/Figures/figure-batch-time-mem
}
\input
{
./Chapter14/Figures/figure-batch-time-mem
}
\caption
{
Transformer系统在不同批次大小下的吞吐、
延时和显存消耗
}
\caption
{
神经机器翻译系统在不同批次大小下的
延时和显存消耗
}
\label
{
fig:14-7
}
\label
{
fig:14-7
}
\end{figure}
\end{figure}
%----------------------------------------------
%----------------------------------------------
...
@@ -378,7 +378,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
...
@@ -378,7 +378,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\vspace
{
0.5em
}
\vspace
{
0.5em
}
\item
半精度浮点运算。半精度浮点运算是随着近几年GPU 技术发展而逐渐流行的一种运算方式。简单来说,半精度的表示要比单精度需要更少的存储单元,所表示的浮点数范围也相应的变小。不过,实践中已经证明神经机器翻译中的许多运算用半精度计算就可以满足对精度的要求。因此,直接使用半精度运算可以大大加速系统的训练和推断进程,同时对翻译品质的影响很小。不过,需要注意的是,在分布式训练的时候,由于参数服务器需要对多个计算节点上的梯度进行累加,因此保存参数时仍然会使用单精度浮点以保证多次累加之后不会造成过大的精度损失。
\item
半精度浮点运算。半精度浮点运算是随着近几年GPU 技术发展而逐渐流行的一种运算方式。简单来说,半精度的表示要比单精度需要更少的存储单元,所表示的浮点数范围也相应的变小。不过,实践中已经证明神经机器翻译中的许多运算用半精度计算就可以满足对精度的要求。因此,直接使用半精度运算可以大大加速系统的训练和推断进程,同时对翻译品质的影响很小。不过,需要注意的是,在分布式训练的时候,由于参数服务器需要对多个计算节点上的梯度进行累加,因此保存参数时仍然会使用单精度浮点以保证多次累加之后不会造成过大的精度损失。
\vspace
{
0.5em
}
\vspace
{
0.5em
}
\item
整型运算。整型运算是一种比浮点运算“轻” 很多的运算。无论是芯片占用面积、能耗还是处理单次运算的时钟周期数,整型运算相比浮点运算都有着明显的优势。
因此,使用整型运算也是很有潜力的加速手段。
不过,整数的表示和浮点数有着很大的不同。一个基本的问题是,整数是不连续的,因此无法准确的刻画浮点数中很小的小数。对于这个问题,一种解决方法是利用“量化+ 反量化+ 缩放” 的策略让整型运算达到近似浮点运算的效果
\upcite
{
DBLP:journals/corr/abs-1906-00532,DBLP:conf/cvpr/JacobKCZTHAK18,DBLP:journals/corr/abs-1910-10485
}
。所谓“量化” 就是把一个浮点数离散化为一个整数,“反量化” 是这个过程的逆过程。由于浮点数可能超出整数的范围,因此会引入一个缩放因子。在量化前将浮点数缩放到整数可以表示的范围,反量化前再缩放回原始浮点数的表示范围。这种方法在理论上可以带来很好的加速效果。不过由于量化和反量化的操作本身也有时间消耗,而且在不同处理器上的表现差异较大。因此不同的实现方式带来的加速效果并不相同,需要通过实验测算。
\item
整型运算。整型运算是一种比浮点运算“轻” 很多的运算。无论是芯片占用面积、能耗还是处理单次运算的时钟周期数,整型运算相比浮点运算都有着明显的优势。不过,整数的表示和浮点数有着很大的不同。一个基本的问题是,整数是不连续的,因此无法准确的刻画浮点数中很小的小数。对于这个问题,一种解决方法是利用“量化+ 反量化+ 缩放” 的策略让整型运算达到近似浮点运算的效果
\upcite
{
DBLP:journals/corr/abs-1906-00532,DBLP:conf/cvpr/JacobKCZTHAK18,DBLP:journals/corr/abs-1910-10485
}
。所谓“量化” 就是把一个浮点数离散化为一个整数,“反量化” 是这个过程的逆过程。由于浮点数可能超出整数的范围,因此会引入一个缩放因子。在量化前将浮点数缩放到整数可以表示的范围,反量化前再缩放回原始浮点数的表示范围。这种方法在理论上可以带来很好的加速效果。不过由于量化和反量化的操作本身也有时间消耗,而且在不同处理器上的表现差异较大。因此不同的实现方式带来的加速效果并不相同,需要通过实验测算。
\vspace
{
0.5em
}
\vspace
{
0.5em
}
\item
低精度整型运算。使用更低精度的整型运算是进一步加速的手段之一。比如使用16 位整数、8 位整数,甚至4 位整数在理论上都会带来速度的提升,如表
\ref
{
tab:14-3
}
所示。不过,并不是所有处理器都支持低精度整型的运算。开发这样的系统,一般需要硬件和特殊低精度整型计算库的支持。而且相关计算大多是在CPU 上实现,应用会受到一定的限制。
\item
低精度整型运算。使用更低精度的整型运算是进一步加速的手段之一。比如使用16 位整数、8 位整数,甚至4 位整数在理论上都会带来速度的提升,如表
\ref
{
tab:14-3
}
所示。不过,并不是所有处理器都支持低精度整型的运算。开发这样的系统,一般需要硬件和特殊低精度整型计算库的支持。而且相关计算大多是在CPU 上实现,应用会受到一定的限制。
\vspace
{
0.5em
}
\vspace
{
0.5em
}
...
@@ -397,7 +397,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
...
@@ -397,7 +397,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\footnotetext
{
表中比较了几种通用数据类型的乘法运算速度,不同硬件和架构上不同类型的数据的计算速度略有不同。总体来看整型数据类型和浮点型数据相比具有显著的计算速度优势,INT4相比于FP32数据类型的计算最高能达到8倍的速度提升。
}
\footnotetext
{
表中比较了几种通用数据类型的乘法运算速度,不同硬件和架构上不同类型的数据的计算速度略有不同。总体来看整型数据类型和浮点型数据相比具有显著的计算速度优势,INT4相比于FP32数据类型的计算最高能达到8倍的速度提升。
}
%--------------------------------------
%--------------------------------------
\parinterval
实际上,低精度
表示
的另一个好处是可以减少模型存储的体积。比如,如果要把机器翻译模型作为软件的一部分打包存储,这时可以考虑用低精度的方式保存模型参数,使用时再恢复成原始精度的参数。值得注意的是,参数的离散化表示(比如整型表示)的一个极端例子是
{
\small\sffamily\bfseries
{
二值网络
}}
\index
{
二值网络
}
(Binarized Neural Networks)
\index
{
Binarized Neural Networks
}
\upcite
{
DBLP:conf/nips/HubaraCSEB16
}
,即只用−1和+1 表示神经网络的每个参数
\footnote
{
也存在使用0或1表示神经网络参数的二值网络。
}
。二值化可以被看作是一种极端的量化手段。不过,这类方法还没有在机器翻译中得到大规模验证。
\parinterval
实际上,低精度
运算
的另一个好处是可以减少模型存储的体积。比如,如果要把机器翻译模型作为软件的一部分打包存储,这时可以考虑用低精度的方式保存模型参数,使用时再恢复成原始精度的参数。值得注意的是,参数的离散化表示(比如整型表示)的一个极端例子是
{
\small\sffamily\bfseries
{
二值网络
}}
\index
{
二值网络
}
(Binarized Neural Networks)
\index
{
Binarized Neural Networks
}
\upcite
{
DBLP:conf/nips/HubaraCSEB16
}
,即只用−1和+1 表示神经网络的每个参数
\footnote
{
也存在使用0或1表示神经网络参数的二值网络。
}
。二值化可以被看作是一种极端的量化手段。不过,这类方法还没有在机器翻译中得到大规模验证。
%----------------------------------------------------------------------------------------
%----------------------------------------------------------------------------------------
% NEW SECTION
% NEW SECTION
...
@@ -405,15 +405,15 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
...
@@ -405,15 +405,15 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\section
{
非自回归翻译
}
\section
{
非自回归翻译
}
\parinterval
目前大多数神经机器翻译模型都使用
了编码器-解码器框架,编码器的输出会被送入到解码器,解码器自左向右逐词生成译文,也就是,第
$
j
$
个目标语言单词的生成依赖于先前生成的
$
j
-
1
$
个词。这种翻译方式也被称作
{
\small\sffamily\bfseries
{
自回归解码
}}
\index
{
自回归解码
}
(Autoregressive Decoding)
\index
{
Autoregressive Decoding
}
。虽然以Transformer为代表的模型使得训练过程高度并行化,加快了训练速度。但由于推断过程自回归的特性,模型无法同时生成译文中的所有单词,这导致模型的推断过程非常缓慢,这对于神经机器翻译的实际应用是个很大的挑战。因此,如何设计一个在训练和推断阶段都能够并行化的模型是目前研究的热点之一。
\parinterval
目前大多数神经机器翻译模型都使用
自左向右逐词生成译文的策略,也就是,第
$
j
$
个目标语言单词的生成依赖于先前生成的
$
j
-
1
$
个词。这种翻译方式也被称作
{
\small\sffamily\bfseries
{
自回归解码
}}
\index
{
自回归解码
}
(Autoregressive Decoding)
\index
{
Autoregressive Decoding
}
。虽然以Transformer为代表的模型使得训练过程高度并行化,加快了训练速度。但由于推断过程自回归的特性,模型无法同时生成译文中的所有单词,这导致模型的推断过程非常缓慢,这对于神经机器翻译的实际应用是个很大的挑战。因此,如何设计一个在训练和推断阶段都能够并行化的模型是目前研究的热点之一。
%----------------------------------------------------------------------------------------
%----------------------------------------------------------------------------------------
% NEW SUBSUB-SECTION
% NEW SUBSUB-SECTION
%----------------------------------------------------------------------------------------
%----------------------------------------------------------------------------------------
\subsection
{
自回归
VS
非自回归
}
\subsection
{
自回归
vs
非自回归
}
\parinterval
目前主流的神经机器翻译的推断是一种
{
\small\sffamily\bfseries
{
自回归翻译
}}
\index
{
自回归翻译
}
(Autoregressive Translation)
\index
{
Autoregressive Translation
}
过程。所谓自回归是一种描述时间序列生成的方式。对于目标序列
$
\seq
{
y
}
=
\{
y
_
1
,
\dots
,y
_
n
\}
$
,自回归模型假设
$
j
$
时刻状态
$
y
_
j
$
的生成依赖于之前的状态
$
\{
y
_
1
,
\dots
,y
_{
j
-
1
}
\}
$
,而且
$
y
_
j
$
与
$
\{
y
_
1
,
\dots
,y
_{
j
-
1
}
\}
$
构成线性关系,那么生成
$
y
_
j
$
就是自回归的序列生成过程。神经机器翻译借用了这个概念,但是并不要求使用线性模型,
\ref
{
sec:14-2-1
}
节提到的自左向右翻译模型和自右向左翻译模型都属于自回归翻译模型。自回归模型在
在机器翻译等任务上也取得了较好的性能,特别是配合束搜索也能够有效地寻找近似最优译文。但是,由于解码器的每个步骤必须顺序地而不是并行地运行,自回归翻译模型会阻碍不同译文单词生成的并行化。特别是在GPU 上,翻译的自回归性会大大降低计算的并行度,导致推断过程的效率比较低下
,设备利用率低。
\parinterval
目前主流的神经机器翻译的推断是一种
{
\small\sffamily\bfseries
{
自回归翻译
}}
\index
{
自回归翻译
}
(Autoregressive Translation)
\index
{
Autoregressive Translation
}
过程。所谓自回归是一种描述时间序列生成的方式。对于目标序列
$
\seq
{
y
}
=
\{
y
_
1
,
\dots
,y
_
n
\}
$
,自回归模型假设
$
j
$
时刻状态
$
y
_
j
$
的生成依赖于之前的状态
$
\{
y
_
1
,
\dots
,y
_{
j
-
1
}
\}
$
,而且
$
y
_
j
$
与
$
\{
y
_
1
,
\dots
,y
_{
j
-
1
}
\}
$
构成线性关系,那么生成
$
y
_
j
$
就是自回归的序列生成过程。神经机器翻译借用了这个概念,但是并不要求使用线性模型,
\ref
{
sec:14-2-1
}
节提到的自左向右翻译模型和自右向左翻译模型都属于自回归翻译模型。自回归模型在
机器翻译任务上也有很好的表现,特别是配合束搜索也能够有效地寻找近似最优译文。但是,由于解码器的每个步骤必须顺序地而不是并行地运行,自回归翻译模型会阻碍不同译文单词生成的并行化。特别是在GPU 上,翻译的自回归性会大大降低计算的并行度
,设备利用率低。
\parinterval
对于这个问题,研究人员也考虑移除翻译的自回归性,进行
{
\small\sffamily\bfseries
{
非自回归翻译
}}
\index
{
非自回归翻译
}
(Non-Autoregressive Translation,NAT)
\index
{
Non-Autoregressive Translation
}
\upcite
{
Gu2017NonAutoregressiveNM
}
。一个简单的非自回归翻译模型将问题建模为公式
\eqref
{
eq:14-9
}
:
\parinterval
对于这个问题,研究人员也考虑移除翻译的自回归性,进行
{
\small\sffamily\bfseries
{
非自回归翻译
}}
\index
{
非自回归翻译
}
(Non-Autoregressive Translation,NAT)
\index
{
Non-Autoregressive Translation
}
\upcite
{
Gu2017NonAutoregressiveNM
}
。一个简单的非自回归翻译模型将问题建模为公式
\eqref
{
eq:14-9
}
:
...
@@ -422,7 +422,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
...
@@ -422,7 +422,7 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\label
{
eq:14-9
}
\label
{
eq:14-9
}
\end{eqnarray}
\end{eqnarray}
\
noindent
其中,位置
$
j
$
上的输出
$
y
_
j
$
只依赖于输入句子
$
\seq
{
x
}$
,与其它位置上的输出无关。于是,所有位置上
${
y
_
j
}$
都可以并行生成,大大提高了GPU 等并行运算设备的利用率
。理想情况下,这种方式一般可以带来几倍甚至十几倍的速度提升。
\
parinterval
对比公式
\eqref
{
eq:14-1
}
可以看出,公式
\eqref
{
eq:14-9
}
中位置
$
j
$
上的输出
$
y
_
j
$
只依赖于输入句子
$
\seq
{
x
}$
,与其它位置上的输出无关。于是,所有位置上
${
y
_
j
}$
都可以并行生成
。理想情况下,这种方式一般可以带来几倍甚至十几倍的速度提升。
%----------------------------------------------------------------------------------------
%----------------------------------------------------------------------------------------
% NEW SUB-SECTION
% NEW SUB-SECTION
...
@@ -430,9 +430,9 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
...
@@ -430,9 +430,9 @@ b &=& \omega_{\textrm{high}}\cdot |\seq{x}| \label{eq:14-4}
\subsection
{
非自回归翻译模型的结构
}
\subsection
{
非自回归翻译模型的结构
}
\parinterval
在介绍非自回归模型的具体结构之前,先来看看如何实现一个简单的非自回归翻译模型。这里用标准的Transformer来举例。首先为了一次性生成所有的词,需要丢弃解码器对未来信息屏蔽的矩阵,从而去掉模型的自回归性。此外,还要考虑生成译文的长度。自回归模型每步的输入是上一步解码出的结果,当预测到终止符<eos>时序列的生成就自动停止了,然而非自回归模型却没有这样的特性,因此还需要一个长度预测器来预测出其长度,之后再用这个长度得到每个位置的表示,进而完成整个序列的生成。
\parinterval
在介绍非自回归模型的具体结构之前,先来看看如何实现一个简单的非自回归翻译模型。这里用标准的Transformer来举例。首先为了一次性生成所有的词,需要丢弃解码器对未来信息屏蔽的矩阵,从而去掉模型的自回归性。此外,还要考虑生成译文的长度。自回归模型每步的输入是上一步解码出的结果,当预测到终止符<eos>时
,
序列的生成就自动停止了,然而非自回归模型却没有这样的特性,因此还需要一个长度预测器来预测出其长度,之后再用这个长度得到每个位置的表示,进而完成整个序列的生成。
\parinterval
图
\ref
{
fig:14-12
}
就是一个最简单的非自回归翻译模型,它的推断过程可以一次性解码出完整的译文。但是这样得到的模型所翻译出的句子质量很低。比如,在IWSLT英德等数据上的BLEU值只有个位数,而现在最好的自回归模型已经能够达到30左右的BLEU值。这是因为每个位置词的分布
$
\funp
{
P
}
(
y
_
j
)
$
只依赖于源语言句子
$
\seq
{
x
}$
,使得
$
\funp
{
P
}
(
y
_
j
)
$
的
预测不准确。
\parinterval
图
\ref
{
fig:14-12
}
对比了自回归翻译模型和简单的非自回归翻译模型。可以看到这种自回归翻译模型可以一次性生成完整的译文,但质量很低。比如,在IWSLT 英德等数据上的BLEU[
\%
] 值只有个位数,而现在最好的自回归模型已经能够达到30左右的BLEU得分。这是因为每个位置词的预测只依赖于源语言句子
$
\seq
{
x
}$
,使得
预测不准确。
%----------------------------------------------------------------------
%----------------------------------------------------------------------
\begin{figure}
[htp]
\begin{figure}
[htp]
...
...
编写
预览
Markdown
格式
0%
重试
或
添加新文件
添加附件
取消
您添加了
0
人
到此讨论。请谨慎行事。
请先完成此评论的编辑!
取消
请
注册
或者
登录
后发表评论