480 Chapter 14. 神经机器翻译模型推断 肖桐 朱靖波
14.3 轻量模型
翻译速度和翻译精度之间的平衡是机器翻译系统研发中的常见问题。即使是
提升译品目标任务(如 BLEU 进行评价),也得不虑翻度的
响。比如,在很多任务中会构造伪数据,该过程涉及对大规模单语数据的翻译;无监
督机器翻译中也会频繁地使用神经机器翻译系统构造训练数据。在这些情况下,
果翻译速度过慢会增大实验的周期。从应用的角度看,在很多场景下翻译速度甚
比翻译品质更重要。比如,在线翻译和一些小设备上的机器翻译系统都需要保证
对低的翻译时延,以满足用户体验的最基本要求。虽然,我们希望能有一套又好
快的翻译系统,但是现实的情况是:往往需要通过牺牲一些翻译品质来换取翻译
度的提升。下面就列举一些常用的神经机器翻译轻量模型和加速方法。这些方法
常应用在神经机器翻译的解码器上,因为相比编码器,解码器是推断过程中最耗
的部分。
14.3.1 输出层的词汇选择
神经机器翻译需要对输入和输出的单词进行分布式表示。但是,由于真实的词表
通常很大,因此计算并保存这些单词的向量表示会消耗较多的计算和存储资源。
别是对于基于 Softmax 的输出层,大词表的计算十分耗时。虽然可以通过 BPE 和限
制词汇表规模的方法降低输出层计算的负担
[89]
但是为了获得可接受的翻译品质,
汇表也不能过小,因此输出层的计算代价仍然很高。
通过改变输出层的结构,可以一定程度上缓解这个问题
[468]
。一种比较简单的方
法是对可能输出的单词进行筛选,即词汇选择。这里,可以利用类似于统计机器
译的翻译表,获得每个源语言单词最可能的译文。在翻译过程中,利用注意力机
找到每个目标语言位置对应的源语言位置,之后获得这些源语言单词最可能的翻
候选。之后,只需要在这个有限的翻译候选单词集合上进行 Softmax 计算,此方法大
大降低了输出层的计算量。尤其对于 CPU 上的系统,这个方法往往会带来明显的速
度提升。图14.3对比了标准 Softmax 与词汇选择方法中的 Softmax
···
Softmax
···
×× ×× ×
Softmax
源语言
候选
列表
(a) 标准方法
(b) 词汇选择
14.3 标准 Softmax vs 基于词汇选择的 Softmax
14.3 轻量模型 481
实际上,词汇选择也是一种典型的处理大词表的方法(见第十三章)这种方法
最大的优点在于,它可以与其它方法结合,比如与 BPE 等方法结合。本质上,这种
方法与传统基于统计的机器翻译中的短语表剪枝有类似之处
[330, 331, 332]
当翻译候选过
多的时候,可以根据翻译候选对候选集进行剪枝。这种技术已经在统计机器翻译
统中得到成功应用。
14.3.2 消除冗余计算
消除不必要的计算是加速机器翻译系的另一种方法。比如,在统计机器翻
时代,一种余计(见章)。在
译中,消除冗余计算的一种简单有效的方法是对解码器的注意力结果进行缓存。
Transformer 为例,在生成每个译文时,Transformer 模型会对当前位置之前的所有位
置进行自注意力操作,但是这些计算里只有和当前位置相关的计算是“新”的,前面
位置之间的注意力结果已经在之前的解码步骤里计算过,因此可以对其进行缓存。
此外,由于 Transformer 模型较为复杂,还存在很多冗余。比如,Transformer
每一层会包含自注意力机制、层正则化、残差连接、前馈神经网络等多种不同的
构,不同结构之间还会包含一些线性变换。多层 Transformer 模型会更加复杂。但是,
这些情,甚重复的。14.4
器自注意力和编码-解码注意力中不同层的注意力权重的相似性,这里的相似性利用
Jensen-Shannon 散度进行度量
[722]
可以看到,自注意力中,2-6 层之间的注意力权重
的分布非常相似。编码-解码注意力也有类似的现象,临近的层之间有非常相似的注
意力权重。这个现象说明:在多层神经网络中有些计算是冗余的,因此很自然的
法是消除这些冗余使得机器翻译变得更“轻”
1 2 3 4 5 6
1
2
3
4
5
6
(a) 自注意力
1 2 3 4 5 6
1
2
3
4
5
6
(b) 编码-解码注意力
14.4 自注意力和编码-解码注意力中不同层之间注意力权重的相似性(深色表示相似)
一种消除冗余计算的方法是将不同层的注意力权重进行共享,这样顶层的注
力权重可以复用底层的注意力权重
[540]
在编码-解码注意力中,由于注意力机制中输
入的 Value 是一样的
3
,甚至可以直复用前一注意力计的结果。图14.5
3
Transformer 解码器,编码-解码注意力输入的 Value 是编码器的输出,因此是相同的(见第十二
章)
482 Chapter 14. 神经机器翻译模型推断 肖桐 朱靖波
了不同方法的对比,其中 S 表示注意力权重,A 表示注意力模型的输出。可以看到,
使用共享的思想,可以大大减少冗余的计算。
注意力
···
Q
n
K
n
V
n
S
n
=S(Q
n
·K
n
)
A
n
=S
n
·V
注意力
···
Q
n
K
n
V
n
S
n
=S
m
A
n
=S
n
·V
注意力
···
Q
n
K
n
V
n
S
n
A
n
=A
m
注意力
···
Q
m
K
m
V
m
S
m
=S(Q
m
·K
m
)
A
m
=S
m
·V
注意力
···
Q
m
K
m
V
m
S
m
=S(Q
m
·K
m
)
A
m
=S
m
·V
注意力
···
Q
m
K
m
V
m
S
m
=S(Q
m
·K
m
)
A
m
=S
m
·V
Layer n = m+i
Layer m
···
···
···
Layer n = m+i
Layer m
···
···
···
Layer n = m+i
Layer m
···
···
···
(a) 标准的多层自注意力 (b) 共享自注意力 (c) 共享编码-解码注意力
14.5 标准的多层自注意力、共享自注意力、共享编码-解码注意力方法的对比
[540]
另一种方法是对不同层的参数进行共享。这种方法虽然不能带来直接的提速,
是可以大大减小模型的体积。比如,可以重复使用同一层的参数完成多层的计算。
端情况下,六层网络可以只使用一层网络的参
[723]
。不过,在深层模型中(层数 >
20浅层部分的差异往往较大,而深层(远离输入)之间的相似度会更高。这时可
以考虑对深层的部分进行更多的共享。
减少冗余计算也代表了一种剪枝的思想。本质上,这类方法利用了模型参数
稀疏性假设
[724, 725]
一部分参数对模型整体的行为影响不大,因此可以直接被抛弃掉。
这类方法也被使用在神经机器翻译模型的不同部分。比如,对于 Transformer 模型,
有研究发现多头注意力中的有些头是有冗余的
[726]
,因此可以直接对其进行剪枝
[541]
14.3.3 轻量解码器及小模型
在推断时,神经机器翻译的解码器是最时的,因为每个目标语言位置需要
独输出单词的分布,同时在搜索过程中每一个翻译假设都要被扩展成多个翻译假设,
进一步增加了计算量。因此,提高推断速度的一种思路是使用更加轻量的解码器
快翻译假设的生成速度
[549, 727]
比较简单的做法是把解码器的网络变得更“浅”、更“窄”。所谓浅网络是指使
用更少的构建神经络,比如,使用 3 层,甚至 1 网络 Transformer 器。
14.3 轻量模型 483
所谓窄网络是指将网络中某些层中神经元的数量减少。不过,直接训练这样的小
型会造成翻译品质下降。这时会考虑使用知识蒸馏等技术来提升小模型的品质(见
第十三章)
化简 Transformer 解码器的神经网络也可以提高推断速度。比如,可以使用平均
注意力机制代替原始 Transformer 模型中的自注意力机制
[542]
也可以使用运算更轻的
卷积操作代替注意力模块
[509]
。前面提到的基于共享注意力机制的模型也是一种典
的轻量模型
[540]
。这些方法本质上也是对注意力模型结构的优化,这类思想在近几年
也受到了很多关注
[545, 728, 729]
,在第十五章也会有进一步讨论。
此外,使用异构神经网络也是一种平衡度和速度的有效方法。在很多研究
发现,基于 Transformer 的编码器对翻译品质的影响更大,而解码器的作用会小一些。
因此,一种想法是使用速度更快的解码器结构,比如,用基于循环神经网络的解码器
代替 Transformer 模型基于注意机制解码
[460]
。这样,既发挥 Transformer
在编码上的优势,同时也能利用循环神经网络在解码器速度上的优势。使用类似
思想,也可以用卷积神经网络等结构进行解码器的设计。
针对轻量级 Transformer 模型的设计也包括层级的结构剪枝,这类方法试图通过
跳过某些操作或者某些层来降低计算量。典型的相关工作是样本自适应神经网络
构,如 FastBERT
[730]
Depth Adaptive Transformer
[731]
等,与传统的 Transformer 的解
码过程不同,这类神经网络结构在推断时不需要计算全部的解码层,而是根据输
自动选择模型的部分层进行计算,达到加速和减少参数量的目的。
14.3.4 批量推断
下,使 GPU 使提。
是对于机器翻译这样的复杂任务,GPU 的并行运算能力会带来明显的速度提升。为
GPU 力,译,Batch
Inference)。
在第十章已经介绍了神经机器翻译中批量处理的基本概念,其实现并不困难,
过有两方面问题需要注意:
批次生成策。对于源语言本预先给的情况,通是按句子长度织每
批次,即:把长度相似的句子放到一个批次里。这样做的好处是可以尽可能保
证一个批次中的内容是“满”的,否则如果句长差异过大会造成批次中有很多
位置用占位符填充,产生无用计算。对于实时翻译的情况,批次的组织较为复
杂。在机器翻译系统的实际应用中,由于有翻译时延的限制,可能待翻译句子
未积次数译。常是,置一间,
在同一个时间段中的句子可以放到一个批次中(或者几个批次中)。对于高并
发的情况,也可以考虑使用不同的Bucket)保存不同长度范围的句子,之
后将同一个桶中的句子进行批量推断。这个问题在第十八章中还会做进一步讨
论。
484 Chapter 14. 神经机器翻译模型推断 肖桐 朱靖波
批次大小的选择。一个批次中的句子数量越多,GPU 设备的利用率越高,系统
吞吐越大。但是,一个批次中所有句子翻译结束后才能拿到翻译结果,因此批
次中有些句子即使已经翻译结束也要等待其它没有完成的句子。也就是说,
单个句子来看,批次越大翻译的延时越长,这也导致在翻译实时性要求较高的
场景中,不能使用过大的批次。而且,大批次对 GPU 显存的消耗更大,因此也
需要根据具体任务合理选择批次大小。为了说明这些问题,图14.6展示了不同
批次大小下的时延和显存消耗。
句子:
批次 1
批次 1
Transformer 模型处理
批次 2
t
1
t
1
t
2
m
1
m
2
14.6 神经机器翻译系统在不同批次大小下的延时和显存消耗
14.3.5 低精度运算
降低运算强度也是计算密集型任务的加速手段之一。标准的神经机器翻译系
大多基于单精度浮点运算。从计算机的硬件发展看,单精度浮点运算还是很“重”的。
当计算能容忍一些精度损失的时候,可以考虑使用以下方法降低运算精度来达到
速的目的。
半精度浮点运算。半精度浮点运算是随着近几年 GPU 技术发展而逐渐流行的一
种运算方式。简单来说,半精度的表示要比单精度需要更少的存储单元,所表
示的浮点数范围也相应的变小。不过,实践中已经证明神经机器翻译中的许多
运算用半精度计算就可以满足对精度的要求。因此,直接使用半精度运算可以
大大加速系统的训练和推断进程,同时对翻译品质的影响很小。不过,需要注
意的是,在分布式训练时,由于参数服务器需要对多个计算节点上的梯度进行
累加,因此保存参数时仍然会使用单精度浮点以保证多次累加之后不会造成过
大的精度损失。
14.3 轻量模型 485
整型运算整型运算是一种比浮点运算“轻”很多的运算。无论是芯片占用面
积、能耗还是处理单次运算的时钟周期数,相比浮点运算,整型运算都有着明
显的优势。不过,整数的表示和浮点数有着很大的不同。一个基本问题是,
数是不连续的,因此无法准确地刻画浮点数中很小的小数。对于这个问题,
种解决方法是利用“量化 + 反量化 + 缩放”的策略让整型运算达到与浮点运算
近似的效果
[547, 732, 733]
所谓“量化”就是把一个浮点数离散化为一个整数,“反
量化”是这个过程的逆过程。由于浮点数可能超出整数的范围,因此会引入一
个缩放因子:在量化前将浮点数缩放到整数可以表示的范围,反量化前再缩放
回原始浮点数的表示范围。这种方法在理论上可以带来很好的加速效果。不过
由于量化和反量化的操作本身也有时间消耗,而且在不同处理器上的表现差异
较大。因此不同实现方式带来的加速效果并不相同,需要通过实验测算。
低精度整型运算使用更低精度的整型运算是进一步加速的手段之一。比如使用
16 位整数、8 位整数,甚至 4 位整数在理论上都会带来速度的提升,如表14.2
示。不过,并不是所有处理器都支持低精度整型的运算。开发这样的系统,
般需要硬件和特殊低精整型计算库的支持。且相关计算大多是 CPU
实现,应用会受到一定的限制。
14.2 不同计算精度的运算速度对比
4
指标 FP32 INT32 INT16 INT8 INT4
速度 1× 34× 4× 46× 8×
实际上,低精度运算的另个好处是可以减少模型储的体积。比如,如果
把机器翻译模型作为软件的一部分打包存储,这时可以考虑用低精度的方式保存
型参数,使用时再恢复成原始精度的参数。值得注意的是,参数的离散化表示(比如
整型表示)的一个极端例子是二值神经网络Binarized Neural Networks
[734]
即只用
−1 +1 表示神经网络的每个参数
5
。二值化可以被看作是一种极端的量化手段。不
过,这类方法还没有在机器翻译中得到大规模验证。
4
表中比较了几种通用数据类型的乘法运算速度,不同硬件和架构上不同类型的数据的计算速度略
有不同。总体来看整型数据和浮点型数据相比具有显著的计算速度优势,INT4 相比于 FP32 数据类
的计算最高能达到 8 倍的速度提升。
5
也存在使用 0 1 表示神经网络参数的二值神经网络。