3、上下文感知的Embedding:ELMo模型原理、动态词向量的概念、ELMo与静态词向量的对比
好,咱们进入第三章。前面聊了Word2Vec和GloVe,它们都是静态词向量——一个词只有一个固定的向量,不管它出现在什么句子里。这在实际项目中会出大问题。
我记得第一次做情感分析时,模型把“苹果很好吃”和“苹果手机不错”里的“苹果”当成同一个意思。结果呢?模型在“苹果”这个词上完全学偏了。这就是静态词向量的硬伤——它无法处理一词多义。
ELMo的出现,就是为了解决这个问题。它让词向量根据上下文动态变化。说白了,同一个词在不同句子里,向量是不一样的。
3.1 动态词向量的概念
先搞清楚什么是“动态”。
静态词向量:每个词对应一个固定的向量,查表即得。比如“bank”永远是一个向量,不管它是“河岸”还是“银行”。
动态词向量:词的向量由它所在的整个句子决定。同一个词,上下文变了,向量就变。
核心区别一句话:
- 静态:词 → 向量(固定映射)
- 动态:词 + 上下文 → 向量(实时计算)
你想想看,这其实更符合人类理解语言的方式。我们读“他存了一笔钱到银行”时,绝不会把“银行”理解成“河岸”。模型也应该这样。
3.2 ELMo模型原理
ELMo的全称是Embeddings from Language Models。它用双向LSTM来建模上下文。我直接画个图,你一看就明白。
ELMo的核心思路分三步:
- 字符级CNN编码:先把每个词拆成字符,用CNN提取子词特征。这能处理OOV(未登录词)问题。
- 双向LSTM建模:前向LSTM从左到右读句子,后向LSTM从右到左读。每个位置得到两个隐状态。
- 多层表示融合:把各层LSTM的隐状态加权组合,得到最终的动态词向量。
我个人的习惯:在项目中用ELMo时,我会把所有层的输出都保留,而不是只用最后一层。因为不同层捕捉了不同粒度的信息——底层偏向语法,高层偏向语义。加权融合往往效果更好。
3.3 ELMo的训练方式
ELMo的预训练目标很简单——语言模型。前向LSTM预测下一个词,后向LSTM预测上一个词。两个方向独立训练,最后拼起来。
具体来说:
- 前向:给定 w₁, w₂, ..., wₖ₋₁,预测 wₖ
- 后向:给定 wₖ₊₁, wₖ₊₂, ..., wₙ,预测 wₖ
- 联合目标:最大化两个方向的对数似然之和
训练完成后,每个词在每个位置都有 L层 × 2个方向 的隐状态。ELMo的最终向量是这些状态的加权和:
ELMo_k = γ · Σ(s_j · h_k_j)
其中 γ 是缩放系数,s_j 是第j层的权重(可学习),h_k_j 是第k个词在第j层的隐状态。
我曾经踩过的坑:刚开始用ELMo时,我直接把所有层的输出平均了。结果在下游任务上效果一般。后来改成让任务自己学权重,F1直接涨了2个点。记住:不同任务对不同层的信息敏感度不一样,让模型自己选才是正道。
3.4 ELMo与静态词向量的对比
咱们直接上表格,一目了然。
| 对比维度 | 静态词向量(Word2Vec/GloVe) | 动态词向量(ELMo) |
|---|---|---|
| 一词多义 | 不支持,一个词一个向量 | 支持,上下文决定向量 |
| OOV处理 | 差,未登录词只能给<UNK> | 好,字符级CNN可处理任意词 |
| 计算方式 | 查表,O(1) 时间 | 实时计算,需要跑LSTM |
| 训练数据 | 无监督,仅需文本 | 无监督,仅需文本 |
| 迁移方式 | 直接查表,冻结使用 | 作为特征输入,可微调 |
| 推理速度 | 极快 | 较慢(需编码整个句子) |
| 典型场景 | 大规模检索、快速baseline | 精度优先的NLP任务 |
从表格能看出,ELMo的优势很明显——上下文感知。但代价是计算开销大。我在项目中做过对比:
- 用Word2Vec做文本分类,单条推理0.5ms
- 用ELMo做同样的任务,单条推理15ms
差了30倍。所以选型时要权衡:你的场景更看重速度还是精度?
3.5 实际项目中的选型建议
我个人总结了几条经验:
什么时候用ELMo?
- 任务对一词多义敏感(如命名实体识别、关系抽取)
- 有大量OOV(如医疗、法律领域术语)
- 精度要求高,推理速度不是瓶颈
什么时候用静态词向量?
- 需要实时响应(如在线搜索、聊天机器人)
- 资源受限(如移动端、边缘设备)
- 任务本身对上下文不敏感(如简单的文本匹配)
嗯,这里要注意一点:ELMo虽然强,但它不是万能的。我记得有一次做情感分析,用ELMo反而比Word2Vec差。后来分析发现,情感分析更依赖关键词本身,而不是上下文。静态词向量对关键词的表示更稳定。
所以选型没有银弹。你得先理解任务本质,再选合适的工具。
3.6 小结
这一章我们聊了:
- 动态词向量:词向量随上下文变化,解决一词多义
- ELMo原理:双向LSTM + 字符CNN + 多层融合
- 与静态词向量的对比:精度高但速度慢,各有适用场景
ELMo是上下文感知Embedding的开山之作。虽然现在BERT、等模型更流行,但ELMo的思想——用语言模型生成动态表示——影响了后续几乎所有预训练模型。理解ELMo,你就抓住了NLP预训练时代的起点。