传统的词向量模型,例如 Word2Vec 和 Glove 学习得到的词向量是固定不变的,即一个单词只有一种词向量,显然不适合用于多义词。而 ELMo 算法使用了深度双向语言模型 (biLM),只训练语言模型,而单词的词向量是在输入句子实时获得的,因此词向量与上下文信息密切相关,可以较好地区分歧义。
1. 静态词向量算法
在之前的文章中介绍了词嵌入算法 Word2Vec 和 Glove。与传统的 one-hot 编码、共现向量相比,词嵌入算法得到的词向量维度更低、也可以比较好地支持一些下游的任务,例如文档分类,问答系统等。
但是这两种算法都是静态词向量算法,在数据集上训练好一个语言模型之后,每一个词的词向量就固定下来了。后续使用词向量时,无论输入的句子是什么,词向量都是一样的,例如:
"我喜欢吃小米"中的"小米"指一种食物"小米手机挺好用"中的"小米"指手机品牌给定上面两个句子,在 Word2Vec 和 Glove 中去得到"小米"的词向量都是一样的,不能根据上下文给出更准确的词向量。
而 ELMo是一种动态词向量算法,在大型的语料库里训练一个 biLSTM (双向LSTM模型)。下游任务需要获取单词词向量的时候,将整个句子输入 biLSTM,利用 biLSTM 的输出作为单词的词向量,包含了上下文信息。可以理解成,biLSTM 是一个函数,函数的输入是一个句子,输出是句子中单词的词向量。
2. 双向语言模型
首先介绍什么是双向语言模型,以及如何通过 biLSTM 得到单词的词向量,对 LSTM 不熟悉的童鞋可以参考前一篇文章