为了解决一词多义的问题,同时表达单词使用的语法和语义以及在上下文语境中的变化。词向量是一个深层双向语言模型(biLM)的内部状态的学习函数,它是在一个大型文本语料库上预先训练的,这些表示可以很容易地添加到现有的模型中。
ELMO的思想是:先用语言模型学习单词的Word Embedding,此时没有区分多义词,但是在实际使用Word Embedding时,单词已经具备特定的上下文了,这时可以根据上下文单词的语义去调整单词的Word Embedding表示,这样经过调整后的Word Embedding更能表达在这个上下文中的具体含义。因此ELMO实际上是根据当前上下文对Word Embedding进行动态调整的一种思路。
word2vec是局部语料库训练的,其特征提取是基于滑窗的,而glove的滑窗是为了构建共生矩阵,是基于全局语料的,需要事先统计共现概率;因此,word2vec可以进行在线学习,glove需要统计固定语料信息。
word2vec是无监督学习,同样不需要人工标注;glove通常认为是无监督学习,但实际上glove还是有label的,即共现次数 l o g ( X i j ) log(X_{ij}) log(Xij)。
word2vec的损失函数实质上是带权重的交叉熵,权重固定;glove的损失函数是最小平方损失函数,权重可以做映射变换。
glove可以看作是更换了目标函数和权重函数的全局word2vec。
ELMO相对于word2vec、glove等,捕捉了上下文语境信息而不仅仅是字词的单独信息。word2vec中,单词在不同语境下向量表示完全一致,而ELMo针对这一点做了优化。
ELMo用到了双向语言模型,给定N个tokens ( t 1 , t 2 , ⋯   , t n ) (t_1,t_2,\cdots,t_n) (t1,t2,⋯,tn),语言模型通过给定前面的k-1个位置的token序列计算第k个token出现的概率:
p ( t 1 , t 2 , … , t N ) = ∏ k = 1 N p ( t k ∣ t 1 , t 2 , … , t k − 1 ) p\left(t_{1}, t_{2}, \ldots, t_{N}\right)=\prod_{k=1}^{N} p\left(t_{k} | t_{1}, t_{2}, \ldots, t_{k-1}\right) p(t1,t2,…,tN)=k=1∏Np(tk∣t1,t2,…,tk−1)
后向的计算方法与前向相似:
p ( t 1 , t 2 , … , t N ) = ∏ k = 1 N p ( t k ∣ t k + 1 , t k + 2 , … , t N ) p\left(t_{1}, t_{2}, \ldots, t_{N}\right)=\prod_{k=1}^{N} p\left(t_{k} | t_{k+1}, t_{k+2}, \ldots, t_{N}\right) p(t1,t2,…,tN)=k=1∏Np(tk∣tk+1,tk+2,…,tN)
biLM训练过程中目标函数最大化:
∑ k = 1 N ( log p ( t k ∣ t 1 , … , t k − 1 ; Θ x , Θ ⃗ L S T M , Θ s ) + log p ( t k ∣ t k + 1 , … , t N ; Θ x , Θ ← L S T M , Θ s ) ) \sum_{k=1}^{N}\left(\log p\left(t_{k} | t_{1}, \ldots, t_{k-1} ; \Theta_{x}, \vec{\Theta}_{L S T M}, \Theta_{s}\right)+\log p\left(t_{k} | t_{k+1}, \ldots, t_{N} ; \Theta_{x}, \stackrel{\leftarrow}{\Theta}_{L S T M}, \Theta_{s}\right)\right) k=1∑N(logp(tk∣t1,…,tk−1;Θx,ΘLSTM,Θs)+logp(tk∣tk+1,…,tN;Θx,Θ←LSTM,Θs))
ELMo对于每个token t k t_k tk,通过一个L层的biLM计算出2L+1个表示:
R k = { x k L M , h → k , j L M , h k , j L M ← ∣ j = 1 , … , L } = { h k , j L M ∣ j = 0 , … , L } R_{k}=\left\{x_{k}^{L M}, \overrightarrow{h}_{k, j}^{L M}, \overleftarrow{h_{k, j}^{LM}} | j=1, \ldots, L\right\}=\left\{h_{k, j}^{L M} | j=0, \ldots, L\right\} Rk={xkLM,hk,jLM,hk,jLM∣j=1,…,L}={hk,jLM∣j=0,…,L}
其中 h k , 0 L M h_{k, 0}^{L M} hk,0LM是对token进行直接编码的结果(这里是字符通过CNN编码), h k , j L M = [ h → k , j L M ; h ← k , j L M ] h_{k, j}^{L M}=\left[\overrightarrow{h}_{k, j}^{L M}; \overleftarrow{h}_{k,j}^{LM}\right] hk,jLM=[hk,jLM;hk,jLM]是每个biLSTM层输出的结果,在实验中还发现不同层的biLM输出的token表示对于不同任务效果不同。
ELMo采用典型的两阶段过程,第一个阶段是利用语言模型进行预训练,第二个阶段是在做下游任务时,从预训练网络中提取对应单词的网络各层的Word Embedding作为新特征补充到下游任务中。