ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

DynamicConv动态卷积深度解析:Lite Transformer的GLU门控与核权重生成机制

DynamicConv动态卷积深度解析:Lite Transformer的GLU门控与核权重生成机制 DynamicConv动态卷积深度解析Lite Transformer的GLU门控与核权重生成机制【免费下载链接】lite-transformer[ICLR 2020] Lite Transformer with Long-Short Range Attention项目地址: https://gitcode.com/gh_mirrors/li/lite-transformerLite TransformerICLR 2020是微软与 MIT 提出的轻量化 Transformer 翻译模型其核心创新之一是DynamicConv动态卷积用输入表示实时生成卷积核再叠加GLU 门控精炼特征从而实现比标准注意力更高效的长-短程注意力LSRA。本文带你读懂它核权重从哪来、怎么用、门控怎么开的完整机制。什么是 DynamicConv卷积核会自己长出来普通卷积以及 Lite Transformer 中并行的 LightweightConv的核是固定参数对所有位置一视同仁。DynamicConv 的思路不同卷积核不再存储而是由一个小型线性层weight_linear根据当前位置的输入表示动态预测序列中每个位置、每个卷积头都有自己的核实现哪里该看哪里的自适应局部聚合核大小 K 远小于序列长度计算量远低于 O(T²) 的自注意力却保留了局部上下文的建模能力。这正是 Lite Transformer 的LSRA长-短程注意力设计中的短程分支一个注意力头负责长程依赖一个动态卷积核负责局部信息两者互补见上方架构图中 Conv 局部提取器分支。核权重生成机制一次线性变换印出所有卷积核核心代码在 fairseq/modules/dynamic_convolution.py关键就三步1️⃣ 输入表示 → 核参数构造函数中的关键一行self.weight_linear Linear(query_size, num_heads * kernel_size)给定输入x形状 T×B×Cweight_linear(x)对每个时间步输出num_heads × kernel_size个数值reshape 成(T×B×H, K)—— 相当于一次性为每个位置 × 每个头印出一枚长度为 K 的小卷积核。若开启in_proj模式同一次线性变换还会顺带输出卷积输入本身省一次计算。2️⃣ 多头切分C 维共享给 H 个头核在通道维上切分每个头只作用于C/H个通道代码中的R C // H核形状(H, 1, K)。这使得不同头关注不同通道子空间的局部模式类似多头注意力的视角分工。3️⃣ 核的软化与正则weight_softmax对核内 K 个权重做 softmax保证核是凸组合输出稳定weight_dropoutDropConnect以一定概率随机丢弃核权重配置中默认 0.08见 configs/wmt14.en-fr/attention/multibranch_v2/embed496.yml防止模型过度依赖某几个位置renorm_padding因果模式下先屏蔽 padding 位置再做 softmax类似注意力的 mask。两种卷积执行路径unfold 展开 vs 带状矩阵生成核之后卷积以两种方式执行dynamic_convolution.py 中_forward_unfolded/_forward_expanded路径原理适用场景unfold 展开用unfold1dfairseq/modules/unfold.py把输入切成滑动窗口再与核做批量内积长序列T512省显存推理逐词解码时必须走此路带状矩阵用as_strided技巧把每个核零填充成对角带状矩阵直接矩阵乘短序列速度更快一个容易忽略的细节编码器用对称 paddingkernel_size // 2解码器用因果 paddingpadding_l kernel_size - 1确保第 t 个词只能看到 ≤t 的位置。解码器代码见 fairseq/models/transformer_multibranch_v2.py 中decoder的get_layer。GPU 加速版位于 fairseq/modules/dynamicconv_layer/用 CUDA 核函数重写前向/反向dynamicconvFunction训练时自动启用未编译则无缝回退到纯 PyTorch 实现——这对理解为什么装不上 CUDA 模块也能跑很关键。GLU 门控给卷积装一个信息闸门配置中常见的encoder-glu: 1/decoder-glu: 1控制的正是 GLU 门控默认开启见 transformer_multibranch_v2.py 第 988-989 行。当with_linearTrue且gluTrue时DynamicConv 会额外包裹两个线性层self.linear1 Linear(input_size, input_size * 2) # 通道翻倍 self.act nn.GLU() # 门控激活 self.linear2 Linear(input_size, input_size) # 投影回去前向流程为linear1 → GLU → 动态卷积 → linear2linear1把特征翻倍分成内容与门两半GLUGated Linear Unit一半经 sigmoid 当开关逐通道决定另一半保留多少——相当于让网络自己学会这个位置的哪个通道值得进入卷积卷积后再由linear2投影回原维度。这套门控进、卷积过、线性回的结构让卷积分支不再是简单的平滑器而是具备特征选择能力的子网络——这也是论文中 GLU 带来 BLEU 稳定提升的原因。在 Lite Transformer 中如何组合长短程双分支每层自注意力被拆成多分支fairseq/modules/multibranch.py 的MultiBranch以 embed496 模型为例encoder-branch-type: [attn:1:248:4, dynamic:default:248:4]含义496 维嵌入被切半248 维走 4 头标准注意力长程248 维走 4 头 DynamicConv短程输出拼接。核大小则按层递增默认列表为[3, 7, 15, 31, 31, 31]——浅层看 3 词、深层看 31 词核随深度放大让感受野逐层扩展这是 LSRA 中短程覆盖范围的巧妙安排。如上图所示同等 BLEU 下 Lite Transformer 的乘法计算量仅为原始 Transformer 的约 1/2.5语言建模任务上 PPL 计算量减半——动态卷积 GLU 的贡献功不可没。速查关键文件与参数一览你想看什么去哪里纯 PyTorch 动态卷积实现fairseq/modules/dynamic_convolution.pyCUDA 加速卷积核fairseq/modules/dynamicconv_layer/滑动窗口 unfold 工具fairseq/modules/unfold.py多分支attndynamic拼装fairseq/modules/multibranch.py核大小/GLU 分支配置configs/wmt14.en-fr/attention/multibranch_v2/embed496.yml常用训练参数--encoder-glu、--decoder-glu、--weight-dropout、encoder-kernel-size-listtransformer_multibranch_v2.py一句话总结DynamicConv 用weight_linear把卷积核从固定参数变成了输入相关的函数用 unfold/带状矩阵两条路径高效执行再借 GLU 门控学会选择性卷积它与标准注意力按通道分兵共同构成 Lite Transformer 长-短程注意力的精华。【免费下载链接】lite-transformer[ICLR 2020] Lite Transformer with Long-Short Range Attention项目地址: https://gitcode.com/gh_mirrors/li/lite-transformer创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表