word2vec思路很简单,我觉得网上很多介绍都弄得太复杂、太细节化了,下面说说我的看法。
1. 数学模型
word2vec说白了就是一个映射:
word→Fvec(1)\tag1
word \stackrel{F} \to vec
word→Fvec(1)
那么word、vec、F 如何定义呢?
- word 采用 one-hot 编码,如果一种语言有 m 个单词的词汇量,这个就是一个 m 维向量。感觉这个向量是不是块头很大?如何提升效率不是本文要解决的问题,我们还是把原理先弄明白吧。
- vec 是普通的向量,不妨假设是 n 维向量。
- F 就是神经网络模型。
2. 模型的训练方法
神经网络模型(2) 无法实现标注其训练数据,如果知道如何标注,这个问题就不用研究了。因此,我们得探讨一个间接的方法来训练这个模型。
2.1 确定训练数据的形式
我们不妨利用一批实际文本做训练样本,这样做的好处是不需要人为标注。
我们假设一个 word 的意义取决于句子中该 word 所在句子中前后顺序排列的其他单词。如果两个 word 在大量的文献中,他们在句子中所处的前后位置关系很接近,我们认为这两个 word 的意义是相近的。
2.2 从训练数据中生成数据 word 和标签 label
从训练数据,提取 word 很容易,主要问题聚焦在标签 label 如何生成。
对于一个 word,我们可以用它所在句子中的其他单词作为其标签。作为简化方案,选择 word 所在句子前后若干个单词,比如前后各取 3 个单词,组成一个词袋,来做其标签。这样的话,word 的标签 label 也是一个 m 维向量。
当然了,同一个 word 在不同的句子中,就会有不同的标签。这个没啥关系,通过大量的训练,我们总会得到 word 到 label 的分量的一个概率分布。意义相近的 word,其语境的概率分布也会相近。
2.3 训练模型
把数学模型(1) 扩展一下:
word→Fvec→Glabel(2)\tag2
word \stackrel{F} \to vec \stackrel{G} \to label
word→Fvec→Glabel(2)
这样一来,经过大量语料训练之后,模型(2)就完成了。当然,也就顺便得到了模型(1)。目前我们一般不会直接用自己的语料训练词向量,而是使用别人在超大量语料库上训好的词向量,直接用这些现成的词向量进行下游任务。除了word2vec之外,比较常用的还有GloVe。至于ELMo和BERT,它的原理就跟w2v完全不同了,这个需要单独学习。