跳转到内容

DeBERTa — 把"内容"和"位置"拆成两路独立看的 BERT

是什么

DeBERTa(Decoding-enhanced BERT with disentangled attention)是 BERT 家族里把”词本身是什么”和”词在第几位”拆开两条路分别处理的改良版。日常类比:之前的 BERT 像让你只看一张拼好的拼图判断每块是不是该在那里;DeBERTa 让你同时看两张表——一张写”这块画的是什么内容”,一张写”它该放在第几行第几列”。

它做了三件事:

  1. 解耦注意力(Disentangled Attention)——content 和 position 各自一套向量,不再一开始就加在一起
  2. 增强解码器(Enhanced Mask Decoder)——在最后预测被遮词的那一两层,重新注入”绝对位置”信息
  3. SiFT——微调时在归一化的词向量上加一点对抗扰动,让模型对小变化更稳

结果:1.5B 参数版本在 SuperGLUE 上首次让单个模型超过人类基线(89.9 vs 89.8)。这是编码器路线的天花板时刻。

为什么重要

不理解 DeBERTa,下面这些事都没法解释:

  • 为什么 2021 年之后 NLU 榜单的”卷王”模型几乎清一色是 DeBERTa-v3 而不是 BERT/RoBERTa
  • 为什么后来很多检索、re-ranker、分类器选 backbone 时默认 deberta-v3-base
  • 为什么”相对位置编码”被认为比”绝对位置编码”更好——但又不能完全丢掉绝对位置
  • 为什么 SuperGLUE 在 2021 年初就接近饱和、社区开始转向更难的 benchmark

核心要点

1. 解耦注意力:把一次加法拆成三次乘法

BERT 的做法:token_embedding + position_embedding → 一个向量进 attention。content 和 position 从一开始就搅在一起,模型只能整体学。

DeBERTa 的做法:每个词保留两个向量 H(内容)和 P(相对位置)。计算 query 对 key 的注意力分数时拆成三项相加:

A_ij = H_i·H_j (内容 → 内容)
+ H_i·P_{i→j} (内容 → 相对位置)
+ P_{j→i}·H_j (相对位置 → 内容)

第四项 P·P(位置→位置)被故意省掉——作者认为两个位置之间已经在前两项里被刻画过,再加这项是冗余。

为什么这样有用?类比:你在判断”今天去的那家店在哪”时,“店是什么”(内容)和”店在第几条街”(位置)是两个独立维度的信息,混在一起反而损失精度。

2. 增强解码器:把”绝对位置”在最后一刻塞回去

只用相对位置有个问题:句首和句尾长得一样。比如”A new store opened beside the new mall”——两个 new 之间的相对距离能被刻画,但”哪个 new 离句首近”丢了。这在 MLM 预测时会出错。

DeBERTa 的办法:在 softmax 前的最后一两层 transformer block,把 absolute position embedding 再加一次进去(叫 EMD,Enhanced Mask Decoder)。这样底层用相对位置学语法/局部依赖,顶层用绝对位置定锚。

3. SiFT:对抗训练的”归一化版”

虚拟对抗训练(VAT)的思想是:在词向量上加一个最坏方向的扰动,让模型在扰动下也能预测对。但词向量长度差异大,扰动幅度不好统一。SiFT 先把词向量归一化再加扰动,让所有词扰动幅度一致。微调阶段 +0.3~0.5 个点。

4. 拆出来的三项分别学到什么

作者做了消融分析(论文 Table 6):

  • 去掉”内容→相对位置”项 → MNLI 掉 0.7 点(这一项最关键,编码”语义对句法位置的偏好”)
  • 去掉”相对位置→内容”项 → MNLI 掉 0.4 点
  • 去掉 EMD(绝对位置不再注入) → SQuAD v2 掉 1.2 点

这三项不是平均贡献——content×position 那项才是核心。

实践案例

案例 1:超过人类的那个数字到底什么意思

SuperGLUE 是 2019 年 NYU + Google 出的一个比 GLUE 更难的语言理解 benchmark,包含 BoolQ / CB / COPA / WiC 等 8 个任务。人类基线 89.8——找标注员答题取平均的成绩。

DeBERTa 1.5B 单模型 89.9,ensemble 90.3。这是 transformer 编码器在通用语言理解上第一次平均成绩压过人。注意是”平均”——单个任务上人类还是更强,只是综合分扳回来了。

案例 2:HuggingFace 怎么用

from transformers import AutoTokenizer, AutoModel
tok = AutoTokenizer.from_pretrained("microsoft/deberta-v3-base")
model = AutoModel.from_pretrained("microsoft/deberta-v3-base")
out = model(**tok("DeBERTa decouples content and position.", return_tensors="pt"))
# out.last_hidden_state: [1, seq_len, 768]

用法和 BERT 完全一样——这是它落地快的关键。后续的 v3 版本把 MLM 换成 ELECTRA-style 的 RTD(Replaced Token Detection),效率又提了一截。

案例 3:什么时候用 DeBERTa 而不是 LLM

2026 年的 LLM 已经很强,但做这几件事时 DeBERTa 还是更划算:

  • 句子分类 / NLI / 情感分析——700M 的 deberta-v3-large 部署成本远低于 7B LLM,准确率还更高
  • 检索 re-ranker——cross-encoder 打分排序,速度敏感
  • 分类型 RAG 的过滤器——判断”这段是不是答案”,binary 输出

LLM 强在生成和指令理解;编码器强在判别和稠密表示。两边各有地盘。

踩过的坑

  1. 相对位置矩阵很费显存——bucket 数和 max_seq_len 一起决定 P 矩阵大小。长文本任务上调 max_relative_positions 时显存会爆
  2. EMD 不是即插即用——只在最后两层启用 EMD 是经过消融的;如果你想塞到所有层,反而会掉点
  3. DeBERTa-v1 / v2 / v3 不兼容——tokenizer 和位置 bucket 都改过;HuggingFace 上 checkpoint 名要对应正确的模型类
  4. fine-tune 时 SiFT 默认关着——它在 trainer 配置里要单独开,并且会让训练慢 1.5 倍左右;只在最后冲分时用

适用 vs 不适用场景

适用

  • 中等长度(≤512 token)的语言理解任务——分类 / NLI / QA / 序列标注
  • 需要稠密向量做下游检索 / 聚类的场景
  • 资源受限但要求精度的部署(v3-base 只有 86M 参数,比 7B LLM 便宜两个数量级)

不适用

  • 长上下文(>2k token)——相对位置 bucket 设计不如后来的 RoPE 优雅
  • 生成任务——它是 encoder-only,要生成得接 decoder 或换架构
  • 需要 in-context learning / 指令跟随——这是 decoder-only LLM 的地盘

历史小故事(可跳过)

  • 2018 年:BERT 出,证明”双向 transformer + MLM 预训练”是 NLU 的正确路线
  • 2019 年:RoBERTa 把 BERT 的训练做扎实——更多数据、更长训练、丢掉 NSP,全面提分。但架构没动
  • 2020 年 6 月:DeBERTa v1 上 arXiv,第一次证明”动架构(解耦注意力)“也能再提一截
  • 2021 年 1 月 6 日:DeBERTa 1.5B 单模型 SuperGLUE 89.9,编码器路线的高光时刻
  • 2021 年底:DeBERTa-v3 用 ELECTRA-style 替换 MLM,参数量更小但分更高
  • 2022 年起:ChatGPT 出,社区注意力转向 decoder-only 大模型;编码器路线进入”打磨基座 + 服务下游”阶段

DeBERTa 是编码器路线最后的高峰之一——之后大家都在卷生成。

学到什么

  1. 拆开看比合起来看更精确——把混在一起的两种信息(content / position)解耦,往往能找到更干净的优化方向
  2. 相对位置 + 绝对位置不是二选一——底层用相对、顶层补绝对,是个值得记住的组合拳
  3. 架构小改也能赢扎实训练——RoBERTa 证明”训练做透”很强,DeBERTa 证明”再动一下架构”还能再赢;两条路并不互斥
  4. benchmark 一旦被超过就该退役——SuperGLUE 在 2021 年初被超人,三年后基本没人用,社区转向 BIG-bench / MMLU / HELM

延伸阅读

关联

  • bert —— 改的就是 BERT 的注意力和位置编码
  • attention —— 解耦注意力是对原始 attention 公式的拆解重组
  • transformer —— 同一架构家族,只动了 attention 内部
  • roberta —— 同时期的另一条路:训练做透不动架构

反向链接

  • attention —— Attention Is All You Need
  • bert —— BERT — 双向 Transformer 预训练