word2vec问题(不涉及原理细节)

word2vec问题(不涉及原理细节)

目的:不是不是要把 f 训练得多么完美,而是只关心模型训练完后的副产物——模型参数(这里特指神经网络的权重),并将这些参数,作为输入 x 的某种向量化的表示,这个向量便叫做——词向量。

精髓:隐藏层向量表示单词。当模型训练完后,最后得到的其实是神经网络的权重。比如现在输入一个 x 的 one-hot encoder: [1,0,0,…,0],对应着某个单词,则在输入层到隐含层的权重里,只有对应 1 这个位置的权重被激活,这些权重的个数,跟隐含层节点数是一致的,从而这些权重组成一个向量 vx 来表示x,而因为每个词语的 one-hot encoder 里面 1 的位置是不同的,所以,这个向量 vx 就可以用来唯一表示 x。

1 两大模型(未涉及细节)

(1) CBOW

根据上下文预测中心词概率。即用 context(w) 预测 w,最大化概率 p(w|context(w))

(2) skip-gram

根据中心词预测周围词概率。即用 w 预测 context(w),最大化概率 p(context(w)|w)

2 两大训练技巧:用于加速训练,本质上是优化softmax

为啥要用训练技巧呢? Word2vec 本质上是一个多分类问题, 输出节点数是 V 个,对应 V 个词语,实际中词语的个数非常非常多,会给计算造成很大困难,所以用技巧加速训练。

前向计算时,为了计算条件概率,我们引入Softmax来归一化,softmax计算瓶颈在于分母——每次需要全部的词向量做内积,复杂度是O(V),V是词典大小——而词典中的词的数目在 10^5 的量级。
后向计算时,softmax 每次会对所有参数更新。

(1) hierarchical softmax

是 softmax 的一种近似形式,本质是把 N 分类问题变成 log(N)次二分类。

把每个词都放到哈夫曼树的叶节点上,那么复杂度就可以降为O(logV),即树的高度,因为只需要预测从根节点到相应叶节点的路径即可。

(2) negative sampling

是从其他方法借鉴而来,本质是预测总体类别的一个子集。

每次只从词典里选一些word作为当前词w的负样本,而不是以所有的字典里的其他词作为负样本。仔细想来,softmax 其实是把所有的非目标单词当做 负样本了。

常见问题(部分摘录自博客

问题 1:介绍一下 word2vec

(1) 两个模型是 CBOW 和 Skip-gram,两个加快训练的技巧是 HS(Hierarchical Softmax )和负采样。

(2) 假设一个训练样本是由核心词 w 和其上下文 context(w) 组成,CBOW 就是用 context(w) 去预测 w;而 Skip-gram 则反过来,是用 w 去预测 context(w) 里的所有词。

(3) HS 是试图用词频建立一棵哈夫曼树,那么经常出现的词路径会比较短。树的叶子节点表示词,共词典大小多个,而非叶子结点是模型的参数,比词典个数少一个。要预测的词,转化成预测从根节点到该词所在叶子节点的路径,是多个二分类问题。// 不太明白??

(4 ) 对于负采样,则是把原来的 Softmax 多分类问题,直接转化成一个正例和多个负例的二分类问题。让正例预测 1,负例预测 0,这样子更新局部的参数。

问题 2:对比 Skip-gram 和 CBOW

(1) 训练速度上 CBOW 应该会更快一点。

因为每次会更新 context(w) 的词向量,而 Skip-gram 只更新核心词的词向量。

两者的预测时间复杂度分别是 O(V),O(KV)

(2) Skip-gram 对低频词效果比 CBOW好。

因为是尝试用当前词去预测上下文,当前词是低频词还是高频词没有区别。但是 CBOW 相当于是完形填空,会选择最常见或者说概率最大的词来补全,因此不太会选择低频词。(想想老师学生的那个例子)

Skip-gram 在大一点的数据集可以提取更多的信息。总体比 CBOW 要好一些。

问题 3:对比 HS 和 负采样

(1) 优化目标:

① HS让每个非叶子节点去预测要选择的路径(每个节点是个二分类问题),目标函数是最大化路径上的二分类概率。

p(w|\text{context}(w)) = \prod_{j=2}^{l(w)} p(d_j^w|\mathbf{x}_w, \theta_{j-1}^w)

p(d_j^w|\mathbf{x}_w, \theta_{j-1}^w) = [\sigma(\mathbf{x}_w^\top\theta_{j-1}^w)]^{1-d_j^w} \cdot [1 - \sigma(\mathbf{x}_w^\top\theta_{j-1}^w)]^{d_j^w}

② 负采样是最大化正样例概率同时最小化负样例概率。

g(w) = \sigma(\mathbf{x}_w^\top\theta^w)\prod_{u \in NEG(w)}[1 - \sigma(\mathbf{x}_w^\top \theta^u)]

(2)负采样更快一些,特别是词表很大的时候。与HS相比,负采样不再使用霍夫曼树,而是使用随机负采样,能大幅度提高性能。

问题 4:负采样为什么要用词频来做采样概率?

因为这样可以让频率高的词先学习,然后带动其他词的学习。

问题 5:为什么训练完有两套词向量,为什么一般只用前一套?

(1) 对于 Hierarchical Softmax 来说,哈夫曼树中的参数是不能拿来做词向量的,因为没办法和词典里的词对应

(2) 负采样中的参数其实可以考虑做词向量,因为中间是和前一套词向量做内积,应该也是有意义的。但是考虑负样本采样是根据词频来的,可能有些词会采不到,也就学的不好

问题 6:对比字向量和词向量

(1) 字向量其实可以解决一些问题,比如未登陆词,还有做一些任务的时候还可以避免分词带来的误差。

(2) 词向量它的语义空间更大,更加丰富,语料足够的情况下,词向量是能够学到更多的语义的。

问题 7:为什么负采样/分层softmax能加快训练

(1) 负采样 1在优化参数的时候,只更新涉及到的向量参数;2 放弃用softmax而是用sigmoid,原来的方法中softmax需要遍历所有单词的概率得分。

(2) 分层softmax:上面的 Softmax 每次和全部的词向量做内积,复杂度是 O(V),V 是词典大小。如果考虑把每个词都放到哈夫曼树的叶节点上,用sigmoid做二分类,那么复杂度就可以降为 O(logV),即树的高度,因为只需要预测从根节点到相应叶节点的路径即可。

问题8:word2vec的缺点

(1) 忽略了词序

问题9:hs为什么用霍夫曼树而不用其他二叉树?

这是因为Huffman树对于高频词会赋予更短的编码,使得高频词离根节点距离更近,从而使得训练速度加快。

问题10:为什么用的是线性激活函数?

word2vec不是为了做语言模型,它不需要预测得更准。

编辑于 2018-08-15