python⽣成词向量_词向量是如何⽣成的
终于开了的坑了(` д ´),这次聊聊词向量是怎样⽣成的。现在有很多现成的模型,cbow,skip-gram,glove等,在python不同的库⾥⾯就可以调⽤(⽐如fasttext,genism等)。当然啦,这种百度搜索就能到怎么import,怎么调参的内容我在这就不多叙述了。这次主要在数学层⾯上⽤实例讲讲词向量到底是怎么⽣成的。
遇到这个问题的时候,⽹上有个很经典的 《的数学原理》上⾯⼀⽂解释得很详细,但⼩⽩⼊门会看得很蒙逼,不知道初始向量值是怎么来的,全局来调⽤是怎样运⾏的。所以我就希望写⼀篇⽂章,举⼀些例⼦,去阐述这个词向量到底是怎样产⽣的。
《word2vec的数学原理》传送门 ( ·ˍ·) word2vec数学原理
这次我们主要以基于hierarchical softmax的cbow模型讲讲。这个模型有输⼊层,映射层,输出层(这些层具体怎么操作后⾯)⾸先我们有⼀些分好词的语料库。⼀般泛泛⽽谈的话,这两者区别在于cbow是⼀个词预测周围的词,skip-gram是周围的词去预测中⼼词。
下⾯我们列简单的⼏句话看怎么产⽣。
⽇本的/新垣结⾐/演技/好
潘晓婷照片演员/新垣结⾐/演技/在线
初始化
在这个模型中,我们得设定好,我们⽣成的向量是⼏维的,窗⼝取多⼤。
溺水急救方法解释:
维数:就是指词向量的维数,⼀般不能低于32维,毕竟如果语料库⼤,需要涵盖的信息多
窗⼝:就是取某个词的前后n个作为这个词的⽂本。⽐如我取n=1,词=‘新垣结⾐’,那么前后有的词就是 ‘⽇本的’ ‘演技’ ‘演员’‘演技’这4个词。
⾸先,对于cbow,其⽬标函数都是似然对数函数:
建⽴霍夫曼树
⾸先统计词频
这个霍夫曼树在输出层,后⾯会⽤到。我们回到输⼊层和映射层。
现在我们⼀个6个词,组成词库。窗⼝长度选1,此时词库中每个词依次进⼊模型。
输⼊层
确定是哪⼏个词作为输⼊。⽐如第⼀个词‘⽇本的’,那么进⼊模型的就是‘⽇本的’前后1个词,由于‘⽇本的’前⾯没有词,所以只有后⾯的‘新垣结⾐’进⼊模型。同理,如果轮到‘新垣结⾐’这个词时,进⼊模型的就是该词前后的‘⽇本的’‘演技’,这两个词就是content我们接下来以第⼆个‘新垣结⾐’这个中⼼词作为例⼦讲述下⾯的模型。
映射层
石榴花开慢慢红
将content中的词向量加和
迅雷升级对于初始化向量,⽹上有两种说法,⼀种是one-hot的形式(形如(1,0,0,0),每个词在固定位置显⽰1,1万个词就是1万维度),另⼀种是按照预设的维度随机⽣成。在Mikolov的论⽂就是以one-hot的形式,在映射层中乘以权重矩阵(这个矩阵也是随机初始化)降维成我们预设的维度。在google开源的word2vec中,看回源码可以发现其实是根据预设的维度随机⽣成初始化向量。假设我们预设的维度是2,初始化向量为:⽇本的(1,0),演技(0,1),所以映射层输出为(1,0)+(0,1)=(1,1)
郑家榆三级输出层
所以其实我们要求的是:P(新垣结⾐|content(新垣结⾐)),词向量是附带产⽣的东西(当然啦,现在很
多⼈都是拿来产⽣词向量),这个P就是说基于这个content的情况下,出现‘新垣结⾐’这个词的概率。
⽽对于cbow模型,其⽬标函数是:
看回霍夫曼树,看到其路径为,每个节点都有ɵ作为结点向量,映射层产⽣的向量w和结点向量想乘作⽤于sigmoid函数,就是这个结点拐向这边的概率。
万圣节几号假设我们定义向左为0,向右为1.即0为负类,1为正类。
此时,其实每个节点中,路径每次转左或者转右,其实都是进⾏⼀种判断,这⾥⽤的判断函数是sigmoid函数,形式如下:
X是映射层的输出函数,
为节点对应的向量(随机初始化),最后算出来即为拐向这边的概率。
当然啦,如果拐向另外⼀边,概率就是
看回霍夫曼树
显然,中⼼词是‘新垣结⾐’的话,从顶端往下⾛的路径是 右-左 对应 0-1.所以每个节点的概率为
c为‘新垣结⾐’
到了这⾥,其实我们不知道的是
,⽽X是向量随机化得到的,所以算已知。接下来就是求
的过程。
说了那么久,那么多功夫其实都是为了⽬标函数,这是我们终于和⽬标函数取得联系了。
将上⾯的公式代回进最初列出的⽬标函数公式
我们要对上述⽬标函数⽤梯度求解,看回⽬标函数,是代表中⼼词出现的概率,⽽参数应该是使这个概率最⼤,所以我们⽤梯度上升法求极⼤值。
学习完后,我们就要考虑怎么更新词向量了。
同理X和
其实在⽬标函数中位置相同,所以可以互换⽽得出X的梯度
所以按照cbow的理论,我们可以这样更新词向量
但我们发现,窗⼝中每个词增减的幅度是⼀样的,那怎么区别呢?答案就是不同的词进模型,窗⼝的词(附近的词)就会不⼀样,最后更新得也不⼀样。
假设初始时我们都是(0,0),每次都增加(1,1)(当然实际得到的结果肯定复杂很多)
我们看看结果
横坐标的词代表当这个进⼊模型后,各词的词向量变化情况,纵坐标代表每个词的词向量
.所以词向量就是这样产⽣的啦o(*≧▽≦)ツ
>>>####我是可爱的分割线\("▔□▔)/\("▔□▔)/\("▔□▔)/>>>>#
对于skip-gram做法类似,但有⼏个区别
⽬标函数
所以此时进⼊映射层的只有w中⼼词本⾝,这⾥有别于cbow模型。
计算次数
cbow中,每个中⼼词,只⽤在霍夫曼树中⼼词对应的路径就可以了,但在skip-gram模型,遍历每个词w时,需要对w词周围的词都遍历⼀次霍夫曼树,显然计算量会增⼤,所以⼀般数据量⼩的时候很多⼈都推荐⽤skip-gram模型。
>>>>####彩蛋ヾ (o ° ω ° O )>>>>>>
最近在看《legal high》 ,好喜欢新垣结⾐跟堺雅⼈这对组合啊,所以拿gakki做例⼦了(。-`ω´-)
附上⼏张剧照~