2017-05-13

关于word2vec的一点想法

考虑word to vector的intuition.

给定两个词,如果存在某种意义的相似性的话.
那么,这两个词对应的vector representation就具有某种意义上的近似.

tensorflow里给的example实现对这个近似的定义是cosin值.
直觉上来说,就是给定两个向量在某些维度的方向指向上有着某种趋同性.

从embedding的角度来说,假设对一组词有着某种未知的词性/词义等的归类方式的话.
这种cosin趋向性实际上就是指向的这个embedding的某些维度了.

考虑如果用L2 distance来定义similarity.
那么它表示的则是这些词对应的点具有一些cluster性质.
而这些性质有什么含义,则是相对拟合过程所用的loss function的意义有关的.

因为从结果上来说,它对应的是embedding的各个维度之间都要求只有细微的差别.

如果出来的结果对应的vector不是一个稀疏表示的话,可能并不能收敛地很好.
或者说结果有意义.

所以,从这个侧面上来说,可能logistics regression比较合适.
变成类似多label的classification,从而达到类似一个binary encode的vector形式.
对应的1/0则表示相应embedding的dimension是否具有对应特征的一种标识.

这样的话,对于结果的一种可能直觉上的解释就是类似某种词性划分.
因为在这种情况下,对于不同的词可能会对于到同一个vector形式.
或者在某些维度具有重合性.

于是反观cosin形式.

cosin形式除了维度指向之外,还有另外一个信息就是长度.

直觉上来说,类似长度但维度指向不同的vector,实际上是处在一个hypersphere上面的.

也就是说,理论上,如果构造合适的loss function的话,是可以让最终的vector包含更多的信息的.
比如cosin similarity作为词性,长度作为词义或者对应的使用场景等.

实际上来说,这个vector对应的就是个2-D的离散feature组合了.

然后考虑loss的构造.

tensorflow的example实现使用nce loss,noise contrastive estimation.
大致就是在minimize原本的cosin的时候,加入一个negative sample项,做类似adversarial的目的.

因为如果没有这个negative的话,一个可能的最终解就是所有vector具有同样的值.

所以某种程度上来说,是一个既要overfit,又不要overfit的过程.

直觉上来说,就是把一些vector move together的时候,separate the other.

大致看了下tensorflow nce的negative sample应该用的是log uniform distribution.
按照这个概率选取一些作为penalty.

所以,理论上来说,这个adversarial项如果选取的不够好的话,结果可能也就不会很理想.

比如training set里都是些垂直领域的词,从人的角度来说都具有类型的词性词义等.
但可能adversarial的选取大概率的是这些相近的词类.
那么结果自然是一直被penalty,loss收敛不下去结果不理想不stationary.

而tensorflow的恰恰好是高词频的会更容易被作为adversarial.
所以适合的是topic/context比较多样化的场景.
这样才可能比较好地被"cluster".

还有一点就是tensforflow里word pair/skip gram model的生成方式.
predicative pair是通过一个skip window控制的.
也就是选定一个词,然后随机地从前后一定范围内选取一个词作为predicate.

这样的话,考虑长句松散语意和短句紧凑语意风格的training set的话,结果应该也是有很大不同的.

如果行文风格比较短小精悍的话,可能词组配对频率分布会比较平坦.
这样的话按照原有的loss来做的话,结果可能就不太好了.

考虑如果是强行生成所有组合.

那么这些组合实际上暗含的信息就是任意两个词之间co-occurrence的概率.

在最终的vector space里,cluster的vector之间就是彼此具有类似的context的属性.

因为两两之间在共同出现的频率差不多,也就一定程度上地说明在文本的使用场景具有某种长度的相似性.

当然,可能最终还是相当程度地会收到adversarial的选取方式的影响.

有可能避免negative这种不确定因素么?

如果对一个batch的同一个feeding sample多做几次gradient decent的话.
直觉上就是让当场的sample更靠近一下.
期望的是通过这种reinforce变相地离其他sample更远一些.
然后如果是确实高频出现的话,同样的reinforce会及时地回调.

形式上来说,就类似于做了一个基于频率的倍数放大而已.

并不一定有什么用.

考虑下entropy.
对于给定的training set来说p(x)是确定的.
对于定义
entropy = p(x) * log(1/p(x))
对于词x,以及对应的相似词y有
entropy = p(x,y) * log(1/tanh(similarly(x,y)))

通过minimize这个entropy的话,会是什么结果呢?
形式上来说,它可能等价于
entropy = W(p) * similarly(x,y)
一个跟固有概率/频率相关的相似度.

那么对于低频的pair来说,w->0,GD的过程可能改动不大.
但对于高频的pair,GD的过程就可能会做相对幅度的变动.

也就是直觉上的对于低频pair不做改动,而仅仅对高频部分做调整.

当然,实际怎么样就是另外一回事了.






聊聊卡布里尼

最近看了部片叫卡布里尼,算是可能这段时间来比较有意思的一部电影. 故事也不算复杂,就是一个意大利修女去美国传教,建立慈善性质医院的故事. 某种程度上来说,也很一般的西方普世价值主旋律. 但是如果换一套叙事手法,比如共产国际的社会主义革命建立无产阶级广厦千万间的角度来看的话,也不是...