静态词向量的局限
Word2Vec、GloVe 和 fastText 都为每个词学一个固定向量。同一个词无论在什么句子里都使用同一个表示,因此无法区分多义词:
- “bank”在“river bank”中是河岸,在“financial bank”中是银行;
- “苹果”在“吃苹果”和“苹果发布会”中指代不同事物。
ELMo(Embeddings from Language Models)的做法是:先在大规模无标注语料上预训练一个双向语言模型,再把每个词在具体句子中的各层隐藏状态组合起来,作为该词的表示。词向量不再是查表结果,而是上下文和网络层数的函数。
TIP以ELMo为代表的动态词向量模型是预训练语言模型的早期尝试:::
字符级表示
ELMo 的输入不是词表索引,而是词的字符序列。对词 的字符序列 ,先查字符向量嵌入:
其中:
- :词 的 字符向量 表示
- : 字符库大小
- :字符向量 嵌入维度
- :字符的 one-hot 编码;
- :字符嵌入矩阵。
例子词 的字符向量表示
词 的字符卷积特征图
词 的字符级表示
拿到了词的 字符向量 表示后,得到其 词级 表示的步骤如下:
- 用多个不同宽度的 1D 卷积核提取不同长度的字符 n-gram 特征;
- 对每个特征图做最大池化;
- 拼接池化结果,得到词 的字符级表示 。
字符级编码的好处是:即使某个词不在词表中,只要字符组合见过,仍能构造出有意义的表示,从而缓解 OOV 问题。
Highway 网络
字符 CNN 的输出经过 Highway 网络:
门控 在“直接保留输入”和“经过投影变换”之间做插值,类似残差连接,缓解深层网络的梯度问题。 同时把字符级表示投影到目标维度。此时得到的 仍是上下文无关的。
双向语言模型
把句子 的词向量序列送入 层双向 LSTM。前向和后向是两个独立的 LSTM,各自优化自己的语言模型目标,不共享参数,只在每个位置的输出端拼接。
前向语言模型建模序列概率:
训练目标是最大化对数似然,等价于最小化:
后向语言模型反过来,用右侧上下文预测当前词:
总损失为两者之和:
注意前向和后向是分别训练的:
- 前向:只看左侧上下文;
- 后向:只看右侧上下文。
二者没有在同一个概率模型里联合归一化。它们提供的是两个方向的互补表示,而不是一个真正的双向联合似然。
多层表示与加权组合
对第 个词, 层 biLSTM 给出 个表示:
- :字符 CNN 得到的上下文无关表示;
- :第 层前向与后向隐藏状态的拼接,。
不同层编码的信息不同:低层更偏向词形和句法,高层更偏向语义和语境。ELMo 不强制只用最后一层,而是让下游任务学习各层的权重:
其中:
- :经 softmax 归一化的层权重;
- :可学习的缩放标量。
下游任务可以把 ELMo 表示与原始词向量拼接:
使用方式与意义
ELMo 采用“预训练 + 特征提取”的范式:预训练好的双向语言模型参数冻结,ELMo 表示作为额外特征输入下游模型。这与后来 BERT 的“预训练 + 微调”不同——BERT 会把整个预训练模型放到下游任务中继续训练。
ELMo 的意义在于:
- 证明了大规模无标注语料上的语言模型预训练能学到通用语言知识;
- 词表示从静态查表变成随上下文变化的动态表示;
- 多层加权组合的思路影响了后续模型对中间层的利用。
局限也很明显:biLSTM 训练和推理都是串行的,长距离依赖仍受循环结构限制;前向和后向独立训练,无法在每一层同时利用完整上下文。这些限制促使后续模型转向 Transformer 和 BERT 的掩码语言模型。