解决什么问题
- 在word2vec和Glove中,一个词对应一个词向量(vector),无法解决一词多义问题。
- 在ELMo中,预训练好的模型不再只是向量对应关系,而是一个训练好的模型。使用时,将一句话或一段话输入模型,模型会根据上下文来推断每个词对应的词向量。这样做之后明显的好处之一就是对于多义词,可以结合前后语境对多义词进行理解。比如appele,可以根据前后文语境理解为公司或水果。
ELMo原理
ELMO的本质思想是:事先用语言模型学好一个单词的Word Embedding,此时多义词无法区分,不过这没关系。(双向LSTM)
在实际使用Word Embedding的时候,单词已经具备了特定的上下文了,这个时候我可以根据上下文单词的语义去调整单词的Word Embedding表示,这样经过调整后的Word Embedding更能表达在这个上下文中的具体含义,自然也就解决了多义词的问题了。
所以ELMO本身是个根据当前上下文对Word Embedding动态调整的思路。
语言模型
token(符号):包括单词和标点
这里的(t1,t2,...,tN)是一系列的tokens
前向LSTM语言模型
p(t1,t2,t3,...tN)=i=1∏Np(tk∣t1,t2,...,tk−1)=p(t1)⋅p(t2∣t1)⋅p(t3∣t2,t1)...p(tN∣t1,t2,t3,...,tN−1)
通过前面的k-1个单词,预测单词tk出现的概率
反向LSTM语言模型
p(t1,t2,t3,...tN)=i=1∏Np(tk∣tk+1,tk+2,...,tk+N)
通过后面的k-1个单词,预测单词tk出现的概率
目标函数
通过 前后
取这两个方向语言模型的最大似然
k=1∑N(logp(tk∣t1,t2,...,tk−1)+logp(tk∣tk+1,tk+2,...,tN))
模型结构
ELMoktask=E(Rk;Θtask)=γtaskj=0∑Lsjtaskhk,jLM(1)
注意颜色
ELMo通过下图的方式将hidden states(的初始的嵌入)组合起来,提炼出具有语境意义的词嵌入方式(全连接后加权求和)
- 1 . concatenate hidden layers 连接隐层
- 2 .multiply each vector by a weight based on the task, ∑j=0Lsjtaskhk,jLM,权重 sjtask
- 3 .sum the (now weighted) vectors
ELMo pretrained embedding可以在AllenNLP的repo下找到
AllenNLP
AllenNLP
顺便说一下AllenNLP有个非常不错的关于NLP的教程
AllenNLP教程
论文
Rk={xkLM,hk,j→LM,hk,j←LM∣j=1,....,L}={hk,jLM∣j=0,...,L}
xk:输入的单词编码
L:共L层的BiLSTM
j:第j层的BiLSTM
k:表示tk第k个token
LM:LSTM
输出
ELMoktask=E(Rk;Θtask)=γtaskj=0∑Lsjtaskhk,jLM(1)
预训练学到了什么
语言模型就是简单的两层BiLSTM语言模型,现在的重点是如何学习输出表达式中的参数sjtask以及γtask
- the sj represent softmax-normalized weights on the hidden representations from the language model and γ
represents a task-specific scaling factor.
- sjtask softmax-normalized weights,标准化权重
- γtask scalar parameter,是缩放系数,允许任务模型去缩放整个ELMo向量
如何使用
产生pre-trained biLM模型。模型由两层bi-LSTM组成,之间用residual connection连接起来。
在任务语料上(注意是语料,忽略label)fine tuning上一步得到的biLM模型。可以把这一步看为biLM的domain transfer。
利用ELMo的word embedding来对任务进行训练。通常的做法是把它们作为输入加到已有的模型中,一般能够明显的提高原模型的表现。