背景
Word2vec是一种时下很流行的词向量训练工具,但是Word2vec有几个弊端:
1.word2vec是一个静态模型,词向量一旦训练好,就无法进行更新。如果想用词向量表示同一个词的不同含义,word2vec是无法做到的。比如这段话:“天气不错! 小天你说是吗?”,这句话有两个天字,每一个天都表示不同的意思,如果用word2vec去训练的话,最终只会得到一个词向量。所以word2vec对于多义词的表示是不太友好的。
2.Word2vec在训练的时候是选择滑动窗口根据上下文几个词预测中心词(假设为CBOW),不是基于整个句子的学习,学习范围不够大,因此表征能力有所欠缺
3.Word2vec训练是直接将随机初始化的词向量求和放入全连接层求损失更新。网络层数不够深,不能处理词的复杂特征(比如句法和语义等)
而ELMO能完美解决word2vec的上述缺陷,所以ELMO在BERT没出来之前被成为时下最先进的词向量训练模型
ELMO(Em-beddings from Language Models)
结构图如下所示:
ELMO是基于语言模型的,它有两个过程:
1.它首先在一个大文本语料库上预训练一个BiLM(即双向lstm语言模型)
2.做下游任务时,从预训练网络中提取对应单词的网络各层的 Word Embedding 作为新特征补充到下游任务中。
细节点说的话,首先我们预训练一个双向lstm语言模型,这个模型会训练好词的wordembedding,和两层lstm的隐藏层的embedding,一共三层embedding,然后我们加载预训练好的参数,用我们下游任务的语料库(去除标签后,使用每个词的wordembedding)重新输入至预训练好的模型中进行微调(这种做法可以看作是一种domain transfer),怎么微调呢,就是相当于再添加我们的数据进行训练。微调完成后,得到新的wordembedding,和两层lstm隐藏层的embedding,再根据下文提供的词向量计算公式将这三层embedding加权求和(权值可以随意给,因为可在下游任务中进行学习),作为我们下游任务的词向量。
BILM(双向lstm语言模型)
假设有一段N个tokens的序列t1,t2,…,tN
其前向表示为:
反向表示为:
前向利用上文来预测该词,反向利用下文来预测该词。那么对数似然函数表示如下:
最后一层接个softmax求概率,和标签值对比就能求损失更新参数了。
对于每一个token,一个L层的lstm总共要计算2L+1个向量(因为双向lstm,每个lstm都有个隐含状态h,所以为2L,1是初始化的向量)
这里Xk,指的是第k个位置的初始词向量,h指的是隐藏状态的向量表示。词向量的公式为:
其中sj和γ是可训练参数,si指的是每一隐层所占的softmax后的权重,γ允许具体的task模型去放缩 ELMo 的大小,有助于梯度求解优化进程(具体可查看论文),是可通过训练进行学习的。如果对词性、句法等信息有明显需求的任务,网络会在低的隐层设置比较大的权重,如果对词义消歧等有明显需求的任务,网络会在高的隐层设置到比较大的权重。
ELMo的 特点:
ELMo 的输入是字母而不是单词。然后利用字符卷积再输入lstm中。因此,他们可以利用子字词单元来计算有意义的表示,即使对于词典外的词(如 FastText这个词)也是如此
ELMo 是 biLMs几层激活的串联。语言模型的不同层对单词上的不同类型的信息进行编码(如在双向LSTM神经网络中,词性标注在较低层编码好,而词义消歧义用上层编码更好)。连接所有层可以自由组合各种文字表示,以提高下游任务的性能。