作者:杨夕
【注:手机阅读可能图片打不开!!!】
- 介绍:word2vec是一个把词语转化为对应向量的形式。word2vec中建模并不是最终的目的,其目的是获取建模的参数,这个过程称为fake task。
- 双剑客
- CBOW vs Skip-gram
- CBOW 可以理解为 一个老师教多个学生;(高等教育)
- Skip-gram 可以理解为 一个学生被多个老师教;(补习班)
- 那问题来了?
- 最后 哪个学生 成绩 会更好?
HS用哈夫曼树,把预测one-hot编码改成预测一组01编码,进行层次分类。
- 输入输出:
- 输入:权值为(w1,w2,...wn)的n个节点
- 输出:对应的霍夫曼树
- 步骤:
- 将(w1,w2,...wn)看做是有n棵树的森林,每个树仅有一个节点。
- 在森林中选择根节点权值最小的两棵树进行合并,得到一个新的树,这两颗树分布作为新树的左右子树。新树的根节点权重为左右子树的根节点权重之和。
- 将之前的根节点权值最小的两棵树从森林删除,并把新树加入森林。
- 重复步骤2)和3)直到森林里只有一棵树为止。
- 举例说明: 下面我们用一个具体的例子来说明霍夫曼树建立的过程,我们有(a,b,c,d,e,f)共6个节点,节点的权值分布是(20,4,8,6,16,3)。
首先是最小的b和f合并,得到的新树根节点权重是7.此时森林里5棵树,根节点权重分别是20,8,6,16,7。此时根节点权重最小的6,7合并,得到新子树,依次类推,最终得到下面的霍夫曼树。
一般得到霍夫曼树后我们会对叶子节点进行霍夫曼编码,由于权重高的叶子节点越靠近根节点,而权重低的叶子节点会远离根节点,这样我们的高权重节点编码值较短,而低权重值编码值较长。这保证的树的带权路径最短,也符合我们的信息论,即我们希望越常用的词拥有更短的编码。如何编码呢?一般对于一个霍夫曼树的节点(根节点除外),可以约定左子树编码为0,右子树编码为1.如上图,则可以得到c的编码是00。
在word2vec中,约定编码方式和上面的例子相反,即约定左子树编码为1,右子树编码为0,同时约定左子树的权重不小于右子树的权重。
- 由于是二叉树,之前计算量为V,现在变成了log2V;
- 由于使用霍夫曼树是高频的词靠近树根,这样高频词需要更少的时间会被找到,这符合我们的贪心优化思想。
- 动机:使用霍夫曼树来代替传统的神经网络,可以提高模型训练的效率。但是如果我们的训练样本里的中心词w是一个很生僻的词,那么就得在霍夫曼树中辛苦的向下走很久了;
- 介绍:一种概率采样的方式,可以根据词频进行随机抽样,倾向于选择词频较大的负样本;
- 优点:
- 用来提高训练速度并且改善所得到词向量的质量的一种方法;
- 不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。
因为使用softmax时,分母需要将中心词与语料库总所有词做点乘,代价太大:
所以负采样方法将softmax函数换成sigmoid函数。
选取K个负样本,即窗口之外的样本,计算中心词与负样本的点乘,最小化该结果。计算中心词与窗口内单词的点乘,最大化该结果,目标函数为:
NS是一种概率采样的方式,可以根据词频进行随机抽样,我们倾向于选择词频比较大的负样本,比如“的”,这种词语其实是对我们的目标单词没有很大贡献的。
Word2vec则在词频基础上取了0.75次幂,减小词频之间差异过大所带来的影响,使得词频比较小的负样本也有机会被采到。
极大化正样本出现的概率,同时极小化负样本出现的概率,以sigmoid来代替softmax,相当于进行二分类,判断这个样本到底是不是正样本。
- NNLM:是神经网络语言模型,使用前 n - 1 个单词预测第 n 个单词;
- word2vec :使用第 n - 1 个单词预测第 n 个单词的神经网络模型。但是 word2vec 更专注于它的中间产物词向量,所以在计算上做了大量的优化。优化如下:
- 对输入的词向量直接按列求和,再按列求平均。这样的话,输入的多个词向量就变成了一个词向量。
- 采用分层的 softmax(hierarchical softmax),实质上是一棵哈夫曼树。
- 采用负采样,从所有的单词中采样出指定数量的单词,而不需要使用全部的单词
- word2vec 是稠密的向量,而 tf-idf 则是稀疏的向量;
- word2vec 的向量维度一般远比 tf-idf 的向量维度小得多,故而在计算时更快;
- word2vec 的向量可以表达语义信息,但是 tf-idf 的向量不可以;
- word2vec 可以通过计算余弦相似度来得出两个向量的相似度,但是 tf-idf 不可以;
- window设置:
- 比较大,会提取更多的topic信息
- 设置比较小的话会更加关注于词本身。
- 默认参数是5,但是在有些任务中window为2效果最好,比如某些英语语料的短文本任务(并非越大越好)
词向量维度代表了词语的特征,特征越多能够更准确的将词与词区分,就好像一个人特征越多越容易与他人区分开来。但是在实际应用中维度太多训练出来的模型会越大,虽然维度越多能够更好区分,但是词与词之间的关系也就会被淡化,这与我们训练词向量的目的是相反的,我们训练词向量是希望能够通过统计来找出词与词之间的联系,维度太高了会淡化词之间的关系,但是维度太低了又不能将词区分,所以词向量的维度选择依赖于你的实际应用场景,这样才能继续后面的工作。一般说来200-400维是比较常见的。