word2vec
1. 万物可嵌入:
embeddings本质反映了一种状态转移的概率,所以任何离散、会同时出现的模式都可以用嵌入后预测的方法解决。
2. 为什么不使用one-hot?
不能表示词之间的关系,空间太大
3. 训练方法
skip-gram cbow,普通使用skip-gram,
diff使用所有预测的one-hot和训练求diff,loss使用softmax函数
4. 加速训练的方法
negative sampling
1. skip-gram的费用函数:
(1)在目标函数方面,希望给定语料corpus中的每一个词,希望预测得到它窗口中的词的可能性是最大的,根据最大似然理论,目标函数就是
最大化目标函数的反面是最小化loss函数,将相乘取log后再取负,就得到了费用函数是:
那么我们的目标就是选取和调整theta,使得取得最小值
(2)的计算
代表c为中心词(center)时词向量--从输入层到隐藏层的词向量
代表o为周围词(outsider)时词的词向量--从隐藏层到输出层的词向量
那么为:
(3) 梯度计算
这个梯度很难计算
反过来看这个问题,如果是cbow模型,除了最大可能性的那一个,我们其实根本不关心其他的可能性是多大,即对于
中,我们其实并不关心b,c,d是什么,把最大可能性的那一个拿出来,其他的看做是不可能的,那么问题退化成为一个二分类问题,求得二分类的参数。
文章1论证了这个退化了的问题和原问题是同解的问题。目标函数转换为单纯的二分问题,目标函数变为:
这个目标函数存在一个问题,如果我们设定θ使得每一对(w,c)的p(D=1|w,c;θ)=1,那这个目标函数就无意义了。而只要设置θ对所有vc和vw,使得vc=vw且vc⋅vw=K,而K是一个足够大的数字,则这种情况很容易出现(在Goldberg[1]的实验中当K≈40时,概率就为1了)。因为为了避免所有向量都是相同的值,可以去掉某些(w,c)的组合,即可以随机选择(w,c)对中的一部分作为负例。也就是让正例的可能性大,但是又是适当的大,所以添上了负例。目标函数被改成:
这个函数在求解的导数的时候就变得容易求解了。而对于vc,vw的更新,也仅限于正例的参数和负例的参数,不会更新海量的所有词库的参数了。