ELMo — 让词向量随上下文变化
是什么
ELMo(Embeddings from Language Models)是 2018 年 AI2 / 华盛顿大学团队提出的一种让每个词的向量随句子变化的词表示方法。日常类比:以前的词向量像一本印好的字典——“苹果”这个词不管在哪里,查到的都是同一页;ELMo 像一个随手记的便签本,同一个词在不同句子里得到不同的向量。
最经典的对比:
句子 A:我去河边散步,看着 bank 上的花句子 B:我去 bank 取了 200 块钱word2vec 里 bank 永远是同一个向量;ELMo 里句子 A 的 bank 偏向”岸”,句子 B 的 bank 偏向”银行”。
ELMo 的做法是:训练一个深层双向 LSTM 语言模型(biLM),用模型每一层的内部状态加权拼成那个词在当前句子里的向量。
为什么重要
不理解 ELMo,下面这些事都讲不通:
- 为什么 2018 年之前所有 NLP 任务都要”自己训一个模型从头开始”,2019 年之后都变成”预训练 + 微调”——ELMo 是这个范式转变的第一脚
- 为什么 BERT 能横扫 11 项任务——ELMo 已经证明”用语言模型当通用特征提取器”这条路走得通
- 为什么 word2vec / GloVe 这些”静态词向量”逐渐退出舞台
- 为什么”层”这个概念在大模型里这么重要——ELMo 第一次实证发现不同层捕获不同信息
核心要点
ELMo 的设计可以拆成 三块:
-
双向语言模型:训一个前向 LSTM(看前文猜下一个词)+ 一个后向 LSTM(看后文猜前一个词),各 2 层、每层 4096 维。语料是 1B Word Benchmark(10 亿词的英文新闻)。
-
每层都参与最终表示:传统做法只用最后一层;ELMo 用所有层的加权和。每个词在每层有一个表示
h_k,最终向量 =γ · Σ s_k · h_k,其中s_k是 softmax 归一化的层权重,γ是缩放系数,两者都跟随下游任务一起训。 -
冻结 + 拼接:训完 biLM 后,整个 LSTM 不再更新。下游任务里把 ELMo 向量拼到原来的输入层(或中间层),原本的任务模型几乎不动,只多学一组层权重。
关键发现:底层 LSTM 偏句法(适合 POS 标注、句法分析),顶层 LSTM 偏语义(适合词义消歧、问答)。这是”层 = 不同抽象级别”的最早实证之一。
补充一个细节:ELMo 不是直接把整个词当输入,而是先用字符级 CNN 把字符序列卷积成词向量。这样对未登录词(OOV)也鲁棒——AntidisestablishmentariaNism 这种生造词也能拿到向量。后来 BERT 改用 WordPiece 分词,思路类似但实现不同。
实践案例
案例 1:在 SQuAD 问答任务上加 ELMo
原本的基线模型(BiDAF)在 SQuAD 上 F1 = 81.0。只把输入词向量从 GloVe 换成 GloVe + ELMo 拼接,其他一动不动,F1 = 85.6(+4.7)。这是 2018 年初最强的单模型成绩。
类比:原来你做菜用的盐是普通盐,换成”会根据菜的咸淡自动调味的智能盐”,菜立刻好吃一档——锅没换、火候没改。
案例 2:层权重学到了什么
研究者在 SRL(语义角色标注,“谁对谁做了什么”)任务上训完后,看 s_k 的值:
任务:SRL 层 1 权重: 0.31 层 2 权重: 0.52任务:词义消歧 层 1 权重: 0.18 层 2 权重: 0.72任务:POS 标注 层 1 权重: 0.61 层 2 权重: 0.27POS 这种”低层语法”任务自动学到把更多权重给低层 LSTM;词义消歧这种”高层语义”任务自动学到把权重给高层。模型自己分配,不需要人指定。
案例 3:ELMo 之后两年内被 BERT 超过
ELMo 2018 年 2 月发表,10 个月后 BERT(2018 年 10 月)出现,把 SQuAD F1 从 85.6 推到 91.8。BERT 用 Transformer 替换 LSTM,用”masked LM”做真正的双向训练。ELMo 的 biLM 其实是两个独立的单向 LM 拼起来——前向看不到后向。BERT 修了这个洞。
案例 4:六个任务的统一提升
ELMo 论文最有说服力的地方是同一套 biLM 接到六个完全不同的任务都涨点:
| 任务 | 评测 | 之前 SOTA | 加 ELMo | 提升 |
|---|---|---|---|---|
| 问答(SQuAD) | F1 | 81.0 | 85.6 | +4.7 |
| 文本蕴含(SNLI) | Acc | 88.6 | 88.7 | +0.7 |
| 语义角色(SRL) | F1 | 81.7 | 84.6 | +3.2 |
| 共指消解(Coref) | F1 | 67.2 | 70.4 | +3.2 |
| 命名实体(NER) | F1 | 91.93 | 92.22 | +2.06 |
| 情感分类(SST-5) | Acc | 51.4 | 54.7 | +3.3 |
这种”一套预训练特征通吃多任务”的现象,是后来”基础模型”(foundation model)概念的雏形。
踩过的坑
-
biLM ≠ 真双向:ELMo 的”双向”是两个独立 LSTM 各自训完拼起来。前向 LM 在预测某个词时只能看左边,后向 LM 只能看右边。BERT 的 MLM(mask 掉一个词,让模型同时看左右猜出来)才是真双向。
-
冻结 biLM 是双刃剑:好处是省训练资源、可缓存特征;坏处是 biLM 没法针对下游任务调整。BERT/GPT 的”全部解冻微调”后来证明效果更好。
-
LSTM 难扩大:LSTM 序列计算无法并行,ELMo 已经是 2 层 4096 维的极限。Transformer 来了之后才有 12 层、24 层、上百层的预训练模型。
-
部署成本:用 ELMo 时下游模型要带着冻结的 biLM 一起跑前向。一个句子要先过 biLM 拿到上下文向量,再喂给任务模型,推理变慢。
-
层权重的解释要小心:层权重是任务训练时学出来的,不能直接说”层 2 = 语义层”。它反映的是”对当前任务有用的信号比例”,不是层的固有属性。后来探针(probing)研究专门做了更精细的分析。
适用 vs 不适用场景
适用:
- 需要词义消歧的任务(同一个词在不同语境意思不同)
- 数据量有限的下游任务——预训练 biLM 可迁移
- 部署对模型大小敏感、用不起 BERT 全量的场景(biLM 比 BERT 小)
- 教学场景——ELMo 结构清晰,适合理解”上下文化词向量”和”层加权”两个概念
不适用:
- 需要句子级深度理解的任务——直接用 BERT/RoBERTa 全量微调更强
- 多语言场景——ELMo 原版只有英文,没像 mBERT 那样做多语言
- 长文档(超过 1000 词)——LSTM 长程依赖弱,Transformer 更适合
- 生成任务——biLM 不是真的语言模型,无法直接采样生成
- 资源受限的边缘设备——biLM 仍是亿级参数,蒸馏后才能部署
历史小故事(可跳过)
- 2013 年:Mikolov 提出 word2vec,每个词一个向量,开启分布式词表示时代。
- 2014 年:Pennington 提出 GloVe,把全局共现统计和 word2vec 思路结合。这两者都是”静态词向量”代表。
- 2017 年:CoVe(McCann)首次用机器翻译模型的内部表示当上下文向量,证明”上下文化词向量”可行,但需要平行语料。
- 2018 年 2 月:Peters 等人发表 ELMo,关键贡献是用纯单语语料训出更好的上下文向量,且加权多层。NAACL 2018 最佳论文。
- 2018 年 6 月:Radford 发表 GPT-1,用 Transformer 替 LSTM。
- 2018 年 10 月:Devlin 发表 BERT,把 ELMo 的”双向”做成真正的双向。8 个月内 ELMo 从 SOTA 变成历史。
- 2020 年之后:T5、GPT-3 把这条路推到极致,ELMo 成为教科书章节。
ELMo 作者 Peters 后来加入 AI2 继续做语言模型方向,团队后来开源了 AllenNLP——一个面向研究的 NLP 框架,曾是学术界主流之一。
学到什么
- 上下文敏感是必然方向——一个词在不同句子里就该不同向量,静态词向量是过渡产物
- 预训练 + 接入下游 这条范式从 ELMo 起被广泛验证,BERT/GPT 是这条路的极致
- 不同层捕获不同抽象——这个洞见在所有大模型里反复出现,今天可解释性研究还在挖
- 方法被超越不等于价值消失——ELMo 不是 SOTA 了,但它”语言模型 = 通用特征”的核心信念是 BERT 的 DNA
- 冻结特征 vs 全量微调 之争从 ELMo 开始:ELMo 选冻结、BERT 选微调、后来 LoRA 又选”小幅微调”。每条路的权衡不同,今天仍在演化
- best paper 不一定是最终方案——ELMo 拿了 NAACL 2018 best paper,但半年内被 BERT 超过。学术影响和方法寿命可以分开看
延伸阅读
- 论文:arxiv.org/abs/1802.05365(15 页,可读)
- 解读:Jay Alammar — The Illustrated BERT, ELMo(图解,强烈推荐)
- 代码:allennlp/elmo
- word2vec —— ELMo 的前辈,静态词向量代表
- bert —— ELMo 的接班人,把”双向”做对