以 Word2Vec 和 GloVe 为代表的词表示模型通过训练为每个单词训练出固定大小的词向量,这在以往的 NLP 任务中都取得了不错的效果,但是他们都存在两个问题:
- 没法处理复杂的单词用法,即语法问题;
- 没办法结合语境给出正确词向量,即一词多义;
为了解决这个问题,作者提出了一个新的深层语境词表示模型——ELMo。
区别于传统模型生成的固定单词映射表的形式(为每个单词生成一个固定的词向量),ELMo使用了预训练的语言模型(Language Model),模型会扫面句子结构,并更新内部状态,从而为句子中的每个单词都生成一个基于当前的句子的词向量(Embedding)。这也是就是 ELMo 取名的由来:Embeddings from Language Models。
此外,ELMo 采用字符级的多层 BI-LM 模型作为语言模型,高层的网络能够捕获基于语境的词特征(例如主题情感),而底层的 LSTM 可以学到语法层次的信息(例如词性句法),前者可以处理一词多义,后者可以被用作词性标注,作者通过线性组合多层 LSTM 的内部状态来丰富单词的表示。
2. ELMoELMo 是一种称为 Bi-LM 的特殊类型的语言模型,它是两个方向上的 LM 的组合,如下图所示:
ELMo 利用正向和反向扫描句子计算单词的词向量,并通过级联的方式产生一个中间向量(下面会给出具体的级联方式)。通过这种方式得到的词向量它可以了解到当前句子的结构和该单词的使用方式。
值得注意是,ELMo 使用的 Bi-LM 与 Bi-LSTM 不同,虽然长得相似,但是 Bi-LM 是两个 LM 模型的串联,一个向前,一个向后;而 Bi-LSTM 不仅仅是两个 LSTM 串联,Bi-LSTM 模型中来自两个方向的内部状态在被送到下层时进行级联(注意下图的 out 部分,在 out 中进行级联),而在 Bi-LM 中,两个方向的内部状态仅从两个独立训练的 LM 中进行级联。
2.1 Bi-LM
设一个序列有 N 个 token (这里说 token 是为了兼容字符和单词,EMLo 使用的是字符级别的 Embedding)
对于一个前向语言模型来说,是基于先前的序列来预测当前 token:
而对于一个后向语言模型来说,是基于后面的序列来预测当前 token:
可以用 和 分别表示前向和后向语言模型。
ELMo 用的是多层双向的 LSTM,所以我们联合前向模型和后向模型给出对数似然估计:
其中, 表示 token 的向量, 表示 Softmax 层对的参数, 和 表示前向和后向的 LSTM 的参数。
我们刚说 ELMo 通过级联的方式给出中间向量(这边要注意两个地方:一个是级联,一个是中间向量),现在给出符号定义:
对每一个 token 来说,一个 L 层的 ELMo 的 2L + 1 个表征:
其中, 表示输入层, 。(之所以是 2L + 1 是因为把输入层加了进来)
对于下游任务来说,ELMo 会将所有的表征加权合并为一个中间向量:
其中, 是 Softmax 的结果,用作权重; 是常量参数,允许模型缩放整个 ELMo 向量,考虑到各个 Bi-LSTM 层分布不同,某些情况下对网络的 Layer Normalization 会有帮助。
2.2 Supervised NLP task
我们来看下 ELMo 在有监督学习中应用,这里假设 ELMo 模型已经完成预训练。
对于给定的一个监督学习 NLP 任务,我们只需为每个句子中的单词记录下 ELMo 各层的词表征,然后用端到端的任务来学习这些表示的线性组合(学习向量的权重)。
对于大多数 NLP 任务而言,靠近输入端的结构所含信息基本一致(例如词法句法,想象下 CV 浅层网络的可视化都是一些线条),所以这就允许我们直接把训练好的 ELMo 加到现有的 NLP 的监督任务模型中(因为底层结构相似,所以直接用 ELMo 提取上下文的浅层信息也可以)。通常来说,会使用预训练的 Word Embedding(或者是字符级别的 Embedding)来为每个位置生成一个上下文无关的词表示 ,然后拼接 EMLo 后会生成一个上下文相关的词表示(即,通过 ELMo 提取单词及周围的上下文信息,然后拼接原本的单词向量)。
为了将 ELMo 加到监督学习的模型中,我们有两种拼接方式:
- 固定 BiLM 的权重,并用 拼接 ELMo 的向量 ,使用拼接后的向量 传递给下游任务;
- 或者利用模型的隐藏输出层,比如 RNN 的 来和 拼接 。
最后,对 ELMo 适当加入一些 Dropout,或者在某些情况下在损失函数中加入 ,都有可能带来效果提升。
2.3 Pre-trained
预训练的架构采用类似下图 c 的架构,下图来自《Exploring the Limits of Language Modeling》。
简单解释下这张图,a 是普通的基于 LSTM 的语言模型,b 是用字符级别的 CNN 来代替原本的输入和 Softmax 层,c 是用 LSTM 层代替 CNN Softmax 层并预测下一个单词。(这里的 CNN Softmax 层区别于 Word2Vec 中的 Softmax,并不是直接预测词汇表,而是计算 的 Logistic 值,其中 h 为单词上下文向量,)
作者在论文中指出:ELMo 使用 CNN-BIG-LSTM 的架构进行预训练(这里的 BIG 只是想说多很多 LSTM),并且为了平衡 LM 的复杂度、模型大小和下游任务的计算需求,同时保持纯粹基于字符的输入表示,ELMo 只使用了两层的 LSTM 层,每层 4096 个隐藏单元和 512 维的词向量大小,以及跨一层的残差连接。
而在提取静态字符时,使用两层具有 2048 个卷积过滤器的 highway layer 和一个含有 512 个隐藏单元的 linear projection layer。
这里的 highway layer 由《Training Very Deep Networks》论文中给出,可以简单理解为该网络层只处理一部分输入,而另外一部分直接通过。所以相比于传统的网络,HighwayNet 可以有更深的网络,而试验结果也表明其更容易训练。
相比其他模型只提供一层 Representation 而言,作者提供了三层 Representations:单词原始的 Embedding,第一层双向 LSTM 中对应单词位置的 Embedding (包含句法信息)和第二层双向 LSTM 中对应单词位置的 Embedding(包含语义信息)。
下面这张图看的可能更清楚一点。
在训练了 10 个 epochs 后,前向和后向的平均困惑度(perplexities)分别是 39.7,而 CNN-BIG-LSTM 的困惑度为 30.0。总体看前向和后向困惑度相当,后向稍微低一些。
困惑度(perplexities):如果每个时间步都根据语言模型计算的概率分布随机挑词,那么平均情况下,挑多少个词才能挑到正确的那个。
显然,困惑度越小越好。
”
完成预训练后可以得到训练好的 Bi-LM 模型和单词的 Embedding 向量。对于下游任务来说可以对 Bi-LM 进行微调,也可以直接使用。
3. Experience简单看下实验,下图显示了不同任务下,ELMo 相对 baseline 的提升程度:
正则化系数的影响:
模型训练效率:
4. Conclusion总结:ELMo 采用预训练的方式得到原始 Embedding 向量和双层 Bi-LSTM 模型,同时 ELMo 会为每个单词提供三个 Embedding 向量并学习具体任务下线性组合后的中间向量,与原始向量拼接后即可为下游任务提供基于语境的 Word Embedding。
第一次看 ELMo 时的想法是:为什么要用 LSTM 而不用类似 Transformer 的结构?毕竟 Transformer 在发表于 2017 年,早于 ELMo;
其次,ELMo 采用的并不是真正的双向 LSTM,而是两个独立的 LSTM 分别训练,并且只是在 Loss Function 中通过简单相加进行约束,只能一定程度上学习到单词两边句子的特征。
当然,虽然这会在 BERT 一文中给出解答。
这里有一个好玩的 Tip,ELMO 是芝麻街里的人物,而 BERT 也是芝麻街里的人物。
标题:ELMO wants to play! 是 ELMO 的口头禅。
5. Reference- 《Deep contextualized word representations》
- 《Exploring the Limits of Language Modeling》
- 《Training Very Deep Networks》
- 《A Review of Deep Contextualized Word Representations (Peters+, 2018)》
- 《The Illustrated BERT, ELMo, and co. (How NLP Cracked Transfer Learning)》
- 《NAACL2018 一种新的embedding方法--原理与实验 Deep contextualized word representations (ELMo)》
- 《Improving a Sentiment Analyzer using ELMo — Word Embeddings on Steroids》