论文链接:https://arxiv.org/abs/1802.05365
代码链接:https://github.com/allenai/allennlp
论文来源:NAACL 2018
导读
参考来源:https://mp.weixin.qq.com/s/myYKfOvN9LvMmSRUJudmpA
参考来源:https://zhuanlan.zhihu.com/p/37915351
今天学习的是 AllenNLP 和华盛顿大学 2018 年的论文《Deep contextualized word representations》,是 NAACL 2018 best paper。
这篇论文提出的 ELMo 模型是 2013 年以来 Embedding 领域非常精彩的转折点,并在 2018 年及以后的很长一段时间里掀起了迁移学习在 NLP 领域的风潮。
ELMo 是一种基于语境的深度词表示模型(Word Representation Model),它可以捕获单词的复杂特征(词性句法),也可以解决同一个单词在不同语境下的不同表示(语义)。
1、引言
以 Word2Vec 和 GloVe 为代表的词表示模型通过训练为每个单词训练出固定大小的词向量,这在以往的 NLP 任务中都取得了不错的效果,但是他们都存在两个问题:
- 没法处理复杂的单词用法,即语法问题;
- 没办法结合语境给出正确词向量,即一词多义;
为了解决这个问题,作者提出了一个新的深层语境词表示模型——ELMo。
之前的做法的缺点是对于每一个单词都有唯一的一个embedding表示, 而对于多义词显然这种做法不符合直觉, 而单词的意思又和上下文相关, ELMo的做法是我们只预训练language model, 而word embedding是通过输入的句子实时输出的, 这样单词的意思就是上下文相关的了, 这样就很大程度上缓解了歧义的发生.
区别于传统模型生成的固定单词映射表的形式(为每个单词生成一个固定的词向量),ELMo使用了预训练的语言模型(Language Model),模型会扫描句子结构,并更新内部状态,从而为句子中的每个单词都生成一个基于当前的句子的词向量(Embedding)。这也是就是 ELMo 取名的由来:Embeddings from Language Models。
此外,ELMo 采用字符级的多层 BI-LM 模型作为语言模型,高层的网络能够捕获基于语境的词特征(例如主题情感),而底层的 LSTM 可以学到语法层次的信息(例如词性句法),前者可以处理一词多义,后者可以被用作词性标注,作者通过线性组合多层 LSTM 的内部状态来丰富单词的表示。
2、ELMo模型
ELMo 是一种称为 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 ( t 1 , t 2 , ⋯ , t N ) (t_1,t_2,\cdots,t_N) (t1,t2,⋯,tN)(这里说 token 是为了兼容字符和单词,EMLo 使用的是字符级别的 Embedding)
对于一个前向语言模型来说,是基于先前的序列来预测当前 token: p ( t 1 , t 2 , ⋯ , t N ) = ∏ k = 1 N p ( t k ∣ t 1 , t 2 , ⋯ , t k − 1 ) p(t_1,t_2,\cdots,t_N)=\prod_{k=1}^{N}p(t_k|t_1,t_2,\cdots,t_{k-1}) p(t1,t2,⋯,tN)=k=1∏Np(tk∣t1,t2,⋯,tk−1)而对于一个后向语言模型来说,是基于后面的序列来预测当前 token: p ( t 1 , t 2 , ⋯ , t N ) = ∏ k = 1 N p ( t k ∣ t k + 1 , t k + 2 , ⋯ , t N ) p(t_1,t_2,\cdots,t_N)=\prod_{k=1}^{N}p(t_k|t_{k+1},t_{k+2},\cdots,t_N) p(t1,t2,⋯,tN)=k=1∏Np(tk∣tk+1,tk+2,⋯,tN)可以用 h k , j → \overrightarrow{h_{k,j}} hk,j和 h k , j ← \overleftarrow{h_{k,j}}