ELMo(Embeddings from Language Models)是 2018 年由 AllenNLP 团队提出的上下文相关词向量模型,它在当时显著提升了多个自然语言处理任务的表现,为后来的 BERT 和 GPT 等预训练模型奠定了重要基础。
一、ELMo 是什么?
ELMo 是一种基于语言模型(Language Model)的词向量表示方式,它的最大特点是:
同一个词在不同语境中可以有不同的表示。
传统词向量(如 Word2Vec、GloVe)是静态的:
-
“bank” 无论出现在金融语境还是河岸语境中,其词向量都一样。
而 ELMo 是上下文相关的词向量:
-
“bank” 在句子 “He went to the bank to deposit money” 和 “The boat floated to the river bank” 中会有不同的表示。
二、ELMo 的模型结构
ELMo 架构基于双向语言模型(BiLM),即结合:
-
前向语言模型(从左到右)
-
后向语言模型(从右到左)
模型核心组件:
-
字符卷积层(CNN over char):输入的词是由字符组成,解决 OOV 问题;
-
双向 LSTM:捕捉上下文语义;
-
向量融合(task-specific combination):将不同层的 LSTM 输出进行加权求和,得到最终词向量。
三、ELMo 的词向量生成方式
ELMo 并不是单一的词向量,而是一个任务敏感的加权和:
-
:第 j 层的第 k个 token 的隐藏状态
-
:softmax 得到的权重(可学习)
-
:整体缩放参数(可学习)
✅ 不同任务中,ELMo 会自动学习如何加权不同的层表示
四、ELMo 如何使用?
使用方式:作为词向量特征加入下游模型中,例如 BiLSTM + ELMo + Softmax。
在 NLP 任务中,一般流程如下:
输入文本 → 分词 → ELMo 向量(上下文相关) → 输入分类器或序列标注模型
官方提供了 Python 接口,可快速加载预训练模型。
五、ELMo 与传统词向量的对比
特性 | Word2Vec / GloVe | ELMo |
---|---|---|
向量类型 | 静态 | 上下文相关动态表示 |
上下文建模 | 无 | 双向 LSTM 建模 |
OOV 问题 | 严重 | 基于字符,OOV 稀少 |
模型参数 | 训练后固定 | 可用于下游微调 |
效果(NER、QA等) | 较低 | 提升数十个百分点 |
六、典型任务中的效果提升
ELMo 发布时在多个任务上提升显著:
任务 | 提升值 |
---|---|
NER(命名实体识别) | +5.6 |
SRL(语义角色标注) | +4.8 |
QA(问答) | +4.2 |
文本蕴含(SNLI) | +2.9 |
七、代码示例(使用 AllenNLP)
from allennlp.commands.elmo import ElmoEmbedder
elmo = ElmoEmbedder()
tokens = ["The", "cat", "sat", "on", "the", "mat"]
vectors = elmo.embed_sentence(tokens)
# vectors 是 shape: (3层, 句长, 1024)
# 可取平均或指定层向量作为词表示
import numpy as np
word_vecs = np.mean(vectors, axis=0) # (句长, 1024)
八、ELMo 的局限与影响
局限:
-
基于 BiLSTM,训练速度慢,扩展性不如 Transformer;
-
不能预训练 Decoder,只是词表示工具;
-
只能通过特征融合(Feature-based),不如 fine-tuning 灵活。
影响:
-
为 BERT 开创了上下文相关词向量的潮流;
-
首次将预训练语言模型与下游任务结合变得系统化;
-
引发了 NLP 领域对“预训练 + 微调”范式的热潮。
九、总结
属性 | ELMo 模型解释 |
---|---|
模型结构 | 双向语言模型(BiLSTM + char-CNN) |
表达方式 | 每个词根据上下文获得不同的向量 |
应用方式 | 作为词向量输入给下游模型(不可微调参数) |
优势 | 上下文感知、无 OOV、支持多层加权组合 |
不足 | 模型较重,训练慢,不支持端到端 fine-tune |