word2vec
概述
之前使用one-hot编码来表示词向量,比如猫为(1,0,0),狗为(0,1,0),这种稀疏编码,维度大,词与词之间是孤立的,无法表示词与词之间的语义信息!
word2vec就是为了解决这个问题,下图就是表示形式,我们从图中可以看到man和woman的两个词矩阵相似度更高,这种表示方法能捕捉到词与词之间的关联信息。
一个词向量是一个一维向量,将所有单词的向量按照行堆叠起来就被称为embedding矩阵,像下面一样
训练得到embedding矩阵
如何为每一个单词都生成一个这样的向量呢,下面来慢慢介绍:
下面的模型,先看看整体情况,不考虑细节。先仅仅看一下模型的输入输出。输入一个单词,输出当前句子的下一个单词,也就是通过前面的单词预测下一个单词。
比如下面图中的句子,输入Thou和shalt,输出就是not(下面所有图中的绿色部分为输入,红色为输出),然后慢慢滑动这个紫色的窗口,就可以得到大量的数据样本(例如下一个窗口是shalt和not,输出make)
或者我们也可以通过两边的单词来预测中间的单词,即从上下文这个角度这样可以让预测更加准确
回到训练模型,我们刚开始不知道这个embedding矩阵,就先随机给一个,然后输入不同的单词时,在embedding矩阵中查找对应的向量,输入到模型中进行训练,迭代使之与输出值一致。最后就可以得到embedding矩阵,为其他领域所应用。
但是实际上,word2vec并不是上面这样训练
因为从计算的角度来看,第三步更新迭代是非常昂贵的——尤其是知道我们将为数据集中的每个训练样本执行一次(很容易达到数千万次)。我们需要做些什么来提高性能。
我们可以把输入输出改一下,我们一开始是not来预测thou
现在我们把not和thou同时作为输入,如果他们两个词相邻,那么我们就输出1,如果两个词不相邻就输出0,这样就不用像之前那样更新很大的参数矩阵,这样做效率更高
参考博客:https://jalammar.github.io/illustrated-word2vec/