ELMo 简介
ELMo(Embeddings from Language Models)是 2018 年 3 月由华盛顿大学提出的一种预训练语言模型,相关论文为《Deep Contextualized Word Representations》。
传统词向量如 Word2Vec 和 GloVe 都是静态的,无法区分多义词。例如 "apple" 在不同语境下可能指水果或公司,但固定向量难以表达这种差异。ELMo 通过训练上下文相关的预训练模型,在 6 个 NLP 任务上均取得了性能提升。
ELMo 架构
宏观上看,ELMo 分为三个主要模块:底层的 Embedding 模块、中间的双层双向 LSTM 模块以及上层的词向量表征模块。
总体架构

Embedding 模块
最底层采用 CNN 对字符级进行编码,生成静态的词嵌入向量作为网络输入。
双层 LSTM 模块
这是核心部分,包含左侧的前向 LSTM 和右侧的反向 LSTM。
对于左半部分,给定 N 个 tokens (t1, t2, ..., tN),语言模型利用前 k-1 个位置的 token 序列计算第 k 个 token 出现的概率,构成前向双层 LSTM。

右半部分同理,利用后 N-k 个位置的 token 序列计算第 k 个 token 的概率,构成后向双层 LSTM。

训练目标函数旨在最大化以下公式:

词向量表征模块
每个 token 通过 L 层双向 LSTM 可计算出 2L+1 个表示向量,包括:
- 底层 CNN 编码结果。
- 前向 LSTM 每层输出(共 L 个)。
- 后向 LSTM 每层输出(共 L 个)。
为了将多个向量融合为一个最终向量,通常引入权重参数进行加权求和:

原始论文中,底层 CNN 形成 512 维列向量,中间双层 LSTM 每层输入输出均为 512 维。因双向编码,每层输出维度为 1024,融合后向量维度同样为 1024。值得注意的是,不同任务中系数取值差异较大,如在 SQuAD 中设置为 0.01 效果优于 1。


