关于word2vec的一些疑问记录

初看刘建平老师的word2vec原理时,有几个疑问:

​1, 基于Hierarchical Softmax的word2vec计算过程,一会儿在说更新θ 一会儿在说更新词向量。现在使用word2vec 目标肯定是要得到最后的词向量。这个θ和词向量有何关联?
2, 给定Xw 能有一条唯一的路径,我们要得到的词向量与这个路径有啥关系?
​3, 评论中有人说 "词向量是CBOW或是Skip-Gram模型基础中的副产品", 但词向量就是目标,为何说是副产品呢?
​​4, 通过连乘 来优化Xw的路径的得到方式 有点简单粗暴?
5, 对所有词向量求和并取平均 这个能代表什么?
​以上即使看了跑了源码仍然不太确认。

​以下纯属个人理解,很可能有误,欢迎指正。
​先说几个曾经阻碍我理解的小疑问:
词​向量的大小维度 比如m*n 是人为设置并初始化的,并在学习过程中更新。我曾经想过,如果设置的m小于样本中的单词个数怎么玩?现在想应该是不会存在这样的情况。
​词汇表是指词向量的总体个数。m个词的整体;词(voca)指的是指词汇表中的某一个,不是指输入样本中的单词(word)。
​输入层是词向量,并不是传统意义上的样本。输出层还是词向量,训练更新后的词向量。


​想叹好多口气,因为花了好多时间才琢磨出来。。还琢磨错过,再推翻。。虽然看了张俊林老师的预处理发展史,但仍没快速联系到一起。
​word2vec是2013年出来的。我们现在直接来学这个,可能不记得13年前的事,13年前做word2vec时当时的状态。
​13年前人们想用神经网络训练预测 输入一句话的前面几个单词,后面紧跟的单词应该是哪个 ----很多很多年前 人们想要得到的目标是 神经网络语言模型。NNLW是其中一种实现,主要做了预测(后面接什么单词)的事,顺便得到的词向量。word2vec也是其中一种实现,但是word2vec可能出现的时间相对较晚,其主要目标就是为了得到词向量,预测这件事反而变得不重要,因为拿着词向量embedding 可以喂入后面的更强大的各种深度学习模型。所以问题3,"词向量是CBOW或是Skip-Gram的副产品" 可能是针对13年以前人们的目标是神经网络语言模型来说的。但是针对13年出来的word2vecs本身来说,对于不了解过去历史 直接学习word2vec的人来说,有点偏。

源码中训练完后的模型保存,只保存了Xw词向量,并没有保存θ。 如果把θ保存下来, 应该是可以做预测的。当然效果肯定一般。


1:"Xw是当前内部节点的词向量,而θ则是我们需要从训练样本求出的逻辑回归的模型参数。"
​每个样本训练时需要更新的Xi词向量 是通过Xw前后c个词找到的。训练更新Xi词向量时,更新的量,与θ和词向量两者都有关。
​先看 预测(后面接什么单词)时与这个θ有关,还与词向量本身有关。因为找到softmax值最大的w, 是通过霍夫曼树去找的,而走左节点和右节点的依据是判断P(−),P(+)谁的概率值大,而某一个P(−),P(+)的概率的算与这个θ和词向量相关 具体为:

 

P(+) = \sigma(x_w^T\theta) = \frac{1}{1+e^{-x_w^T\theta}}

而从根节点到Xw的路径的概率 为p连乘:

\prod_{j=2}^{l_w}P(d_j^w|x_w, \theta_{j-1}^w) = \prod_{j=2}^{l_w} [\sigma(x_w^T\theta_{j-1}^w)] ^{1-d_j^w}[1-\sigma(x_w^T\theta_{j-1}^w)]^{d_j^w}

​为找到softmax值最大的w,就要让上面这个连乘似然达到最大。
所以​学习的过程确实是在同时更新θ和词向量。
虽然我们今天使用word2vec的主要目的是 最后的词向量,但其优化目标 (上述最大化似然函数) 是建模为 预测接下来的词的最大概率的。

在Hierarchical Softmax中,词对应的θ不是唯一的。在每个叶子节点为Xw的路径的中间节点都会存在。在Negative Sampling中每个词对应一个θ。

 

​2:词向量与路径的关系:词向量会部分决定路径是怎样(还有θ一起决定)。

一般通用的霍夫曼树建起来后, 叶子节点只要按照常用规定左子树为0 右子树为1,叶子节点的编码立即就能确定。
但在word2vec中,霍夫曼树建起来后, 叶子节点的编码要通过计算P(−),P(+)的概率才能确定。

 

​4:其实觉得最初妨碍我 将从霍夫曼树通过θ找到叶子节点Xw联系 在一起的问题(当时还很疑惑为啥要这样去更新Xi) 是觉得 通过连乘 来优化Xw的路径的得到方式 有点简单粗暴。很有可能前向计算时会算错了。评论中有人提出了类似的疑问。只要有一个节点的概率低于50%。就会走完全不同的路,剩下的优化也变得没有任何意义。我感觉这个出错的几率还挺大的。一般我们会用较小的数去初始化 所以刚开始的概率就可能偏小, 刚开始就有较大概率出错,导致后面的都出错。前面的出错,则后面的优化可能优化不到点子上。不过最近再看又觉得:更新过程是 for j = 2 to lw,那么开始的节点会优先更新。所以可能刚好先优化最迫切的部分。而且估计现在用word2vec去做预测的场景很少,影响不大。

5:对于输入层到隐藏层的映射 对于skip-gram来说结果就是Xw。但对CBOW来说,取所有词向量求和取平均。这个代表什么呢?这个能代表中间词的词向量?不准确吧!
​后来想到的可能是:这个虽然不能准确代表中间词的词向量,但对于CBOW来说 Xw的作用是用来更新Xi词向量和θ的  其实不是很精确,但用于迭代更新应该没问题,至少大方向不错。这么看来貌似skip-gram训练效果会更好?因为每一步的更新的量更精确,而不是一个大概的均值。

​另外有一些重点笔记:
​无论CBOW还是Skip-Gram, 做梯度优化的时候,更新的都是这2c个词汇的词向量 同时还有哈夫曼树的参数。特别的是 对于skip-gram来说,还是更新了2c词汇的词向量,不只是中间这一个的词向量哦
​在CBOW中,更新Xi的词向量的来源是 2c个窗口词 词向量的均值 只有一个。
​在skip-gram中,更新Xi的词向量的来源是 分别是各个词向量,一共2c个。可以看到在skip-gram算法里面更新时会多一层循环。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值