Lite Transformer模型架构全解析:内核尺寸调度3-7-15-31与编码器解码器设计
【免费下载链接】lite-transformer[ICLR 2020] Lite Transformer with Long-Short Range Attention项目地址: https://gitcode.com/gh_mirrors/li/lite-transformer
Lite Transformer(LSRA,Long-Short Range Attention,长短期范围注意力)是 MIT Han Lab 提出、发表于 ICLR 2020 的高效 Transformer 变体。它在保留标准 Transformer 翻译精度的前提下,把自注意力拆分为"全局注意力 + 局部卷积"多分支结构,并按 3-7-15-31 的调度逐层放大卷积内核尺寸,从而在相同 BLEU 分数下实现约 2.5 倍的速度提升。本文带你完整读懂它的编码器解码器设计与内核调度机制。
为什么要"长短程"注意力:冗余从哪里来
标准 Transformer 的自注意力对每个词都要扫描整句,但研究表明:靠近对角线(即局部相邻位置)的注意力权重其实是高度冗余的,真正有信息量的长程关系只占少数。LSRA 的思路很直接——让注意力只负责"长程",让卷积负责"短程":
- 全局提取器(Global Extractor):标准多头注意力,捕捉远离对角线的长距离依赖
- 局部提取器(Local Extractor):轻量卷积(Conv + FC + GLU),以极低成本建模局部语境
下面这张官方总览图(左:Lite Transformer 单块结构;中:传统注意力的冗余对角线权重;右:LSRA 专门化于长程关系的稀疏权重)直观展示了这一设计:
多分支自注意力:把嵌入维度"对半切"
Lite Transformer 的核心实现是transformer_multibranch_v2模型,主文件在 fairseq/models/transformer_multibranch_v2.py。每一层的自注意力由MultiBranch模块(fairseq/modules/multibranch.py)组装,工作方式:
- 将总嵌入维度(如 496)按分支切分,每个分支只操作自己的切片,各分支维度之和必须等于总维度
- 各分支并行前向,输出在最后一维上**拼接(concat)**回完整维度
分支类型通过配置字符串类型:内核:维度:头数声明,例如官方 WMT 配置:
encoder-branch-type: [attn:1:248:4, dynamic:default:248:4] decoder-branch-type: [attn:1:248:4, dynamic:default:248:4]📌 解读:496 维被切成两个 248 维分支,一半走标准多头注意力(4 头),另一半走动态卷积(default表示内核尺寸取本层的调度值)。三种可选分支:
| 分支类型 | 说明 | 源码 |
|---|---|---|
attn | 标准多头自注意力,负责长程建模 | fairseq/modules/multihead_attention.py |
dynamic | 动态卷积,权重随输入动态生成,支持 GLU 门控 | fairseq/modules/dynamic_convolution.py |
lightweight | 轻量静态卷积,每个头共享一组(num_heads, 1, K)的可学习权重 | fairseq/modules/lightweight_convolution.py |
这种分工的回报非常直接——在 WMT'14 En-Fr 翻译任务上,Lite Transformer 达到相同甚至更优 BLEU 所需的乘加运算量仅约为 Transformer 的 1/2.5,语言模型任务(WIKITEXT-103)上 perplexity 同样以更少的计算量胜出:
内核尺寸调度 3-7-15-31:每层怎么选卷积窗口
这是本架构最巧妙的设计之一。编码器/解码器默认有 6 层,每层的卷积内核尺寸按列表调度:
[3, 7, 15, 31, 31, 31]在 fairseq/models/transformer_multibranch_v2.py 中,--encoder-kernel-size-list与--decoder-kernel-size-list定义了该列表;分支配置里写default时,get_layer会取kernel_size_list[index]作为该层卷积的窗口大小。
| 层 | 1 | 2 | 3 | 4 | 5 | 6 |
|---|---|---|---|---|---|---|
| 内核尺寸 | 3 | 7 | 15 | 31 | 31 | 31 |
⚡ 调度逻辑:
- 前 3 层近似倍增(3→7→15):感受野随深度呈对数增长,浅层看近邻、深层看更远,与 Transformer 逐层抽象的规律吻合
- 后段钳制在 31:窗口继续翻倍会带来过度平滑和训练不稳定,31 是精度与效率的经验平衡点
- 编码器用对称填充(左、右各
K//2),解码器用因果填充(padding_l = K-1),保证自回归推理时不泄露未来信息 - 解码器在增量推理时通过
incremental_state缓存卷积窗口,避免每步重复卷积
该列表还支持"单值复制 / 超长截断"的写法,并强制校验列表长度与层数一致(见base_architecture)。
编码器解码器结构与关键超参
整体仍是标准编码器-解码器(Encoder-Decoder)结构:6 层编码器 + 6 层解码器,每层内部为LayerNorm → 多分支自注意力 → 残差 → FFN → 残差 → LayerNorm,解码器额外保留标准 Transformer 的编码器-解码器注意力(它不参与多分支拆分,仍为全局注意力)。
以官方 WMT 配置 configs/wmt14.en-fr/attention/multibranch_v2/embed496.yml 为例:
| 参数 | 取值 | 说明 |
|---|---|---|
| embed-dim | 496 | 嵌入维度,按 248+248 切给两个分支 |
| ffn-embed-dim | 496 | FFN 与嵌入同宽,进一步压参数 |
| encoder/decoder-layers | 6 | 编解码层数(base_architecture默认值) |
| attention-heads | 4 | 每个分支 4 个头 |
| kernel-size-list | [3,7,15,31,31,31] | 逐层内核调度 |
| share-all-embeddings | True | 编码器/解码器/输出共享词表嵌入 |
不同任务有不同预设:IWSLT'14 的轻量版用 160 维嵌入 +lightweight分支(见 configs/iwslt14.de-en/attention/multibranch_v2/embed160.yml),WMT'16 En-De 则提供 200/408/496 三档规模(configs/wmt16.en-de/attention/multibranch_v2/)。
实测效率:训练成本与模型压缩
在 IWSLT 德英翻译任务上,与 Transformer 和 AutoML 搜索出的 Evolved Transformer 相比,Lite Transformer 的 GPU 时数、CO₂ 排放和云成本几乎降到同一量级,BLEU 反而最高——相对 AutoML 方案的训练开销可缩减约 20000 倍:
架构本身更小的 FLOPs 还叠加了部署侧的红利:176MB 的 Transformer 压缩为 69MB 的 Lite Transformer 后,再经 8-bit 量化 + 剪枝可压到 9.7MB(18.2 倍),BLEU 仅从 39.9 微降到 39.5:
快速上手:训练与评测 Lite Transformer
git clone https://gitcode.com/gh_mirrors/li/lite-transformer cd lite-transformer pip install --editable . # 构建 GPU 卷积内核(lightconv 与 dynamicconv) cd fairseq/modules/lightconv_layer && python cuda_function_gen.py && python setup.py install && cd ../../.. cd fairseq/modules/dynamicconv_layer && python cuda_function_gen.py && python setup.py install && cd ../../..数据准备与评测只需一行:
bash configs/wmt14.en-fr/prepare.sh # 准备数据 configs/wmt14.en-fr/test.sh embed496/ 0 test # 评测 checkpoint训练入口为 train.py,示例:
python train.py data/binary/wmt14_en_fr --configs configs/wmt14.en-fr/attention/multibranch_v2/embed496.yml其余常用入口:preprocess.py(分词/词表)、generate.py(推理生成)、validate.py(验证集检查),多分支相关算子均位于 fairseq/modules/ 目录下。
总结
Lite Transformer 用三个设计回答了"Transformer 如何又快又好":
- 多分支分工:注意力管长程、卷积管短程,消除冗余计算
- 3-7-15-31 内核调度:感受野随深度对数扩张,浅快深稳
- 编码器解码器轻量化:FFN 与嵌入同宽、嵌入共享、496 维双 248 分支切分
这套 LSRA 思想至今仍是"用局部卷积替代全局注意力"类高效架构的经典参照。如果你想深入源码,建议从 fairseq/models/transformer_multibranch_v2.py 的get_layer与 fairseq/modules/multibranch.py 的MultiBranch.forward两处读起。
【免费下载链接】lite-transformer[ICLR 2020] Lite Transformer with Long-Short Range Attention项目地址: https://gitcode.com/gh_mirrors/li/lite-transformer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考