搜档网
当前位置:搜档网 › 干货:深度学习word2vec笔记之应用篇

干货:深度学习word2vec笔记之应用篇

深度学习word2vec笔记之应用篇

2014年8月17日Deep Learning, nlpword2vecsmallroof

声明:

1)该博文是Google专家以及多位博主所无私奉献的论文资料整理的。具体引用的资料请看参考文献。具体的版本声明也参考原文献

2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应,更有些部分本来就是直接从其他博客复制过来的。如果某部分不小心侵犯了大家的利益,还望海涵,并联系老衲删除或修改,直到相关人士满意为止。

3)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢。

4)阅读本文需要机器学习、概率统计算法等等基础(如果没有也没关系了,没有就看看,当做跟同学们吹牛的本钱),基础篇url:

https://www.sodocs.net/doc/af9703847.html,/mytestmy/article/details/26961315。

5)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。请直接回帖,本人来想办法处理。

6)本人手上有word版的和pdf版的,有必要的话可以上传到csdn供各位下载。

好不容易学了一个深度学习的算法,大家是否比较爽了?但是回头想想,学这个是为了什么?吹牛皮吗?写论文吗?参加竞赛拿奖吗?

不管哪个原因,都显得有点校园思维了。

站在企业的层面,这样的方式显然是不符合要求的,如果只是学会了,公式推通了,但是没有在工作中应用上,那会被老大认为这是没有产出的。没有产出就相当于没有干活,没有干活的话就……呃……不说了。

下面就给大家弄些例子,说说在互联网广告这一块的应用吧。

一.对广告主的辅助

1.1基本概念

互联网广告的广告主其实往往有他们的困惑,他们不知道自己的目标人群在哪里。所谓目标人群,就是广告主想向他们投广告的那帮人。就像互联网广告的一个大牛的一句名言——我知道互联网广告有一半是浪费的,问题是我不知道是哪一半。

这个困惑就给媒体带来一个义务——要帮助广告主定向他们的目标人群。

对于普通的广告主来说,比如说一个化妆品广告的广告主,它的目标人群很明显就是年轻的女性。注意关键词―年轻‖和―女性‖,这是决定媒体这边能否赚到钱的

关键词。要知道对于媒体来说,广告主是它们的客户,满足客户的要求,客户就给它们钱,不满足客户的要求,就没有人为媒体买单;没有人为媒体买单,媒体就没有钱养它们的员工和机器,也弄不来新闻和互联网的其他内容,那样媒体公司就垮了……

那么在媒体这边,需要做的的工作就很明确了——满足它们的客户(也就是广告主)的需求。怎么满足呢?这工作说容易也容易,说简单也简单,就是把喜欢这个广告主的广告的人找出来,然后帮这个广告主把他们的广告投放给这些人,让这些人看到这个广告主的广告。

这个工作带来的问题就真多了,媒体又不是什么神人,比如说一个新闻网站,浏览这个网站的每天有100万人,这个新闻网站的员工不可能一个个去访问他们

的用户(浏览这个网站的人),整天问他们你喜不喜欢化妆品啊,喜不喜欢体育啊之类的问题。

那怎么办呢?媒体的员工只好猜了,但是哪怕是猜都很费劲,想想都头疼,一百万人啊,一个个猜也得吃力不讨好啊。这时候计算机的作用就来了,用计算机猜

嘛,而且不一定需要全部瞎猜的,因为用户如果注册了的话,还有一些用户的个人信息可以参考的。一般的网站注册的时候都要求提供年龄性别之类的个人信息,有时候要要求写一些个人的兴趣什么的标签。这个时候这些数据就用上大用处了。

网站可以把注册用户的个人信息保存下来,然后提供广告主选择。如上面的那个化妆品的广告主,它就可以跟媒体提它的要求——我要向年轻的女性投放广告。媒体这个时候就可以提供一些条件给这个广告主选择,如媒体说我有很多用户,18到80岁的都有,然后男性女性用户都有。广告主就可以根据这些条件选择自己的目标用户,如选择了18到30岁的女性用户作为目标人群。选中了目标人

群后,广告主和媒体就可以谈价钱了,谈好了价钱广告主就下单,然后媒体就帮广告主投广告,然后媒体的钱就赚到了。

1.2兴趣挖掘的必要性

上面多次提到的―目标人群‖,就是广告主最关心的事情。客户最关心的事情自然也是媒体最关心的事情。所以媒体会尽力帮助它们的客户去定向它们的目标人群。

一般所谓的定向也不是媒体亲自有一个人来跟广告主谈的,是媒体建立好一个页面,这个页面上有一些选项,比如年龄,性别,地域什么的,都是条件。广告主在上面把自己的目标人群符合的条件输入,然后下单购买向这些人投放广告的机会。

媒体为了更好地赚钱,肯定是愿意把这个页面上的条件做得更加丰富一点,让更多的广告主觉得这个网站的用户里面有它们的目标人群,从而让更多的广告主愿意过来下单。

广告主的定向其实有粗细之分的,有些广告主粗放点,它们有钱,选的定向条件比较宽,就说女性的用户,全部都投放;有些就定向得比较窄,比如说,北京的20到25岁的女性,并且要喜欢羽毛球的用户。对于定向宽的广告主好处理,问题就是这些定向窄的广告主,它们还希望知道用户的兴趣所在,这就麻烦了。

为啥麻烦呢?一个用户的兴趣鬼才知道呢。就算当面问,人家也不乐意回答,何况就凭借一点点东西瞎猜。但是为了赚钱,瞎猜也得上的了,工业界为了赚这个钱,诞生了整整一个行业——数据挖掘,甚至在学术界还有一个更加生猛的名字——机器学习。学术界的那个名字和解释都是相当大气的:让机器学会像人一样思考。工业界就务实一点,只是对数据内容本身做一个挖掘,获取到啥呢?一般

就是用户的兴趣啊,爱好啊什么的。这些东西供谁使用呢?暂时看来只有广告主愿意为这些掏钱,其他的就有些媒体做来让自己推荐的内容不至于让用户那么反感而已。

上面有个名词―数据‖,没错了,这个词是互联网广告业,甚至是数据挖掘行业的核心的东西。所谓数据,这里简单点说就可以认为是用户的年龄、性别、地域等用户的基本属性;复杂点说可以说是用户兴趣、爱好,浏览记录等;更高级的有用户的交易数据(当然这个高级的数据很少媒体能搞得到)等。

解释完―数据‖这个词,结合一下广告这个场景,就可以得到活在媒体公司里面的互联网广告行业数据挖掘工程师的工作是什么了。他们的工作就是:根据用户自身的基本属性和用户流量的网页记录以及内容,想方设法让计算机猜出用户的兴趣爱好。用户的兴趣爱好―挖掘‖出来后,就可以作为定向条件放到上面说的那个网页上面供广告主选择了。这事情整好了,广告投了有人点击,公司的钱就赚到了;没整好,广告没人点击,广告主不乐意下单了,公司就赚不到钱……怎么着?炒这些工程师的鱿鱼去。

上面可以看到了,辅助广告主定位它们的目标人群是很重要的。

经过一番的探索,word2vec在互联网广告上面也是可以辅助广告主定向他们的目标人群的,下面就讲讲这个算法在互联网广告的应用吧。

1.3利用word2vec给广告主推荐用户

为了用上word2vec,把场景转换到一个新闻媒体如A公司。

在A公司的多个页面中,电商公司B有他们的一个主页,专门介绍他们公司一些产品促销,抢购和发布会什么的。

公司A目前有很多用户的浏览数据,如用户u浏览了公司A的页面a1,a2,a3等。

把这些数据处理一下,整合成word2vec能处理的数据,如下

U1 a1,a2,a3……

U2 a2,a3,a5,……

U3 a1,a3,a6,……

其中u1,u2,u3表示不同的用户,后面的一串表示这些用户的浏览记录,如U1 a1,a2,a3表示用户u1先浏览了页面a1,再浏览a2,然后浏览了a3,……

这些数据还不符合word2vec的输入数据格式,把第一列去掉,变成下面的样子

a1,a2,a3……

a2,a3,a5,……

a1,a3,a6,……

这些数据就可以作为word2vec的输入数据了。

就把这些数据作为word2vec的训练数据,词向量维度为3,进行训练,完成后得到下面的输出

A1 (0.3,-0.5,0.1)

A2 (0.1,0.4,0.2)

A3 (-0.3,0.7,0.8)

……

An (0.7,-0.1,0.3)

就得到了每个页面的向量。

这些向量有啥意义呢?其实单个向量的意义不大,只是用这些向量可以计算一个东西——距离,这个距离是页面之间的距离,如页面a1和a2可以用欧式距离或者cos距离计算公式来计算一个距离,这个距离是有意义的,表示的是两个网页在用户浏览的过程中的相似程度(也可以认为是这两个页面的距离越近,被同一个人浏览的概率越大)。注意这个距离的绝对值本身也是没有意义的,但是这个距离的相对大小是有意义的,意思就是说,假设页面a1跟a2、a3、a4的距离分别是0.3、0.4、0.5,这0.3、0.4、0.5没啥意义,但是相对来说,页面a2与a1的相似程度就要比a3和a4要大。

那么这里就有玄机了,如果页面a1是电商公司B的主页,页面a2、a3、a4与a1的距离在所有页面里面是最小的,其他都比这三个距离要大,那么就可以认为同一个用户u浏览a1的同时,浏览a2、a3、a4的概率也比较大,那么反过来,一个用户经常浏览a2、a3、a4,那么浏览a1的概率是不是也比较大呢?从实验看来可以这么认为的。同时还可以得到一个推论,就是用户可能会喜欢

a1这个页面对应的广告主的广告。

这个在实验中实际上也出现过的。这里模拟一个例子吧,如a1是匹克体育用品公司在媒体公司A上的官网,a2是湖人队比赛数据页,a3是热火队的灌水讨论区,a4是小牛队的球员讨论区。这个结果看起来是相当激动人心的。

根据这样的一个结果,就可以在广告主下单的那个页面上增加一个条件——经常浏览的相似页面推荐,功能就是——在广告主过来选条件的时候,可以选择那些经常浏览跟自己主页相似的页面的用户。举个例子就是,当匹克体育用品公司来下单的时候,页面上给它推荐了几个经常浏览页面的粉丝:湖人队比赛数据页,热火队的灌水讨论区,小牛队的球员讨论区。意思是说,目标人群中包括了经常浏览这三个页面的人。

这个功能上线后是获得过很多广告主的好评的。

这样word2vec这个算法在这里就有了第一种用途。

二.对ctr预估模型的帮助

根据另一篇博文《互联网广告综述之点击率系统》,里面需要计算的用户对某广告的ctr。在实际操作的时候,这个事情也是困难重重的,其中有一个冷启动问题很难解决。冷启动问题就是一个广告是新上线的,之前没有任何的历史投放数据,这样的广告由于数据不足,点击率模型经常不怎么凑效。

但是这个问题可以使用同类型广告点击率来缓解,意思就是拿一个同行的广告的各种特征作为这个广告的特征,对这个新广告的点击率进行预估。

同行往往太粗糙,那么怎么办呢?可以就利用跟这个广告主比较相似的广告的点击率来预估一下这个广告的点击率。

上面说过,可以得到每个页面的词向量。这里的方法比较简单,如在媒体公司A 上面有1000个广告主,它们的主页分别是a1、a2、……、a1000。

根据上面的方法,得到了这1000个词向量,然后运行kmean或者其他聚类算法,把这1000个广告主聚成100个簇,然后每个簇里面的广告主看成是一个。

这里可以模拟一个例子,聚类完成后,某个簇c里面包含了几个广告主的主页,分别是京东商城,天猫,唯品会,当当,聚美优品,1号店,蘑菇街,卓越,亚马逊,淘宝这10个,这10个的目标人群看起来基本是一致的。

这里的看成是一个簇是有意义的,比如说第一个簇c1,c1这个簇里面的所有历史投放数据和实时数据可以做特征,来预估这个流量对这个簇的ctr。得到这个ctr后,就很有用了,如果某广告投放数据比较充分,就直接预估这个广告的ctr;如果某广告的历史投放数据很少,就用这个广告主所在的簇的ctr来代替这个广告,认为对簇的ctr就是这个广告的ctr,这样能让一个新广告也能得到相对靠谱的预估ctr,保证不至于乱投一番。

三.一些总结

如何应用好一个算法,确实是很多算法工程师的一个重大课题。

数据挖掘算法工程师经常要面对的一个难题就是:这个算法怎么用到我们的数据上面来?有不少同学会认为是:我到了公司,就发明一个很牛逼的算法,把公司的原来的问题解决掉,然后大大增加了效果,获得了领导的好评。这个天真烂漫的想法就不评价了,免得被说打击人。互联网企业里面的真实情况是算法工程师面对那一团乱遭的数据,得想尽办法去把数据整合成能用的格式。

拿上面的(1.3)中的例子,那个把数据组合成a1,a2,a3……这样一行行的,然后进入word2vec去进行训练是最难想到的而且是最核心的东西,虽然明着说是word2vec这个算法厉害,实际上面是―把数据整合成合适的方式交给word2vec 进行训练‖这个想法重要,因为尝试了很多想法,做了很多实验才能想到这样的一招的。

还有数据的整合其实也费了很多功夫的,比如说媒体有些用户是一些机器的账号,人家乱搞的,要想办法排除掉的,而―想办法排除‖这么简单一句话,真正要做的工作真是多多的有。

哪怕结果都训练出来了,怎么解释这个结果是好的?这个问题也是得想了一段时间的,后来是实验发现了利用词向量的距离来评价相似性这个东西最靠谱,然后才用上的。

一个数据挖掘的过程其实不简单,这个博客也没办法一一体现做的过程里面的那些各种折腾,各种不顺畅。

数据挖掘工程师经常要面对的另一个难题就是:明明理论上推得杠杠的,算法性能也是杠杠的,但是对于互联网广告的效果,怎么就那么不咸不淡的呢?

这个问题真没有什么统一的答案,这种现象多了去了。经常遇到的原因有:数据本身处理的方式不对和算法不合适。

所谓数据本身处理的方式,可以参看博文《互联网广告综述之点击率特征工程》,里面说的那些方法不是从哪本书上面看到的,是经过比较长时间实践,然后各种折腾,各种特征取舍,各种胡思乱想,各种坑踩出来的。可能志在学术的人看起来都简单,实际上课本那些东西,学生们吹起牛皮来不眨眼的那些东西,一跟真实应用场景结合起来就各种坑要踩的了。

拿上面的(二)中的例子来看。方法简单得不得了,但是可以想象一下,word2vec 牛逼啊,kmeans牛逼啊,第一次聚类出来的结果也不过如此。后来又加入了每个广告主的行业和地域作为特征,而且这个加特征,就是直接把行业和地域处理一下,连接到广告主的词向量后面的。如a1的词向量是(0.3,-0.5,0.1),然后假

设只有两个行业,体育和化妆品,处理成二值特征,占据第4和5两个index,第4个特征为1,第5个特征为0表示体育类广告主,反过来,第4个特征为0,第5个特征为1表示化妆品;再对地域的下标做了一下处理,成为二值特征,

比如说占据了6到10这5个位置(假设第6个位置为1,其余7到10为0表

示北京;第7个位置为1,其余为0表示广东,以此类推)。

经过了上面的处理,再用kmeans进行聚类,从聚类后一个个簇去看,结果看起来才顺眼了很多。上面的行业和地域特征的加入,也是用了比较多的经验的,不是凭空乱整出来的一个吹牛皮的东西,当然谁有更好的方法,也可以提出来试试看。另外还希望大家注意关键字―一个个簇去看‖,这个工作真是费时费力,比较辛苦的。

以上举了一些例子,也把互联网广告的数据挖掘算法工程师的一些工作中的成功和不成功的地方都说出来了,基本上算是实话实说,希望对大家有点帮助吧。有过类似经历的人能看懂,没啥兴趣的就呵呵吧。

致谢

多位同事提供的建议与指导。

多位google研究员有关word2vec的资料。

本文转载自:mytestmy的专栏

Leave a comment

深度学习word2vec笔记之算法篇

2014年8月17日Deep Learning, nlpword2vecsmallroof

声明:

1)该博文是Google专家以及多位博主所无私奉献的论文资料整理的。具体引用的资料请看参考文献。具体的版本声明也参考原文献

2)本文仅供学术交流,非商用。所以每一部分具体的参考资料并没有详细对应,更有些部分本来就是直接从其他博客复制过来的。如果某部分不小心侵犯了大家的利益,还望海涵,并联系老衲删除或修改,直到相关人士满意为止。

3)本人才疏学浅,整理总结的时候难免出错,还望各位前辈不吝指正,谢谢。

4)阅读本文需要机器学习、概率统计算法等等基础(如果没有也没关系了,没有就看看,当做跟同学们吹牛的本钱),基础篇url:

https://www.sodocs.net/doc/af9703847.html,/mytestmy/article/details/26961315。

5)此属于第一版本,若有错误,还需继续修正与增删。还望大家多多指点。请直接回帖,本人来想办法处理。

6)本人手上有word版的和pdf版的,有必要的话可以上传到csdn供各位下载

前言

在看word2vec的资料的时候,经常会被叫去看那几篇论文,而那几篇论文也没有系统地说明word2vec的具体原理和算法,所以老衲就斗胆整理了一个笔记,希望能帮助各位尽快理解word2vec的基本原理,避免浪费时间。

当然如果已经了解了,就随便看看得了。

一.CBOW加层次的网络结构与使用说明

Word2vec总共有两种类型,每种类型有两个策略,总共4种。这里先说最常用的一种。这种的网络结构如下图。

其中第一层,也就是最上面的那一层可以称为输入层。输入的是若干个词的词向量(词向量的意思就是把一个词表示成一个向量的形式表达,后面会介绍)。中间那个层可以成为隐层,是输入的若干个词向量的累加和,注意是向量的累加和,

结果是一个向量。

第三层是方框里面的那个二叉树,可以称之为输出层,隐层的那个节点要跟输出层的那个二叉树的所有非叶节点链接的,线太多画不过来了。第三层的这个二叉树是一个霍夫曼树,每个非叶节点也是一个向量,但是这个向量不代表某个词,代表某一类别的词;每个叶子节点代表一个词向量,为了简单只用一个w表示,没有下标。另外要注意的是,输入的几个词向量其实跟这个霍夫曼树中的某几个叶子节点是一样的,当然输入的那几个词跟它们最终输出的到的那个词未必是同一个词,而且基本不会是同一个词,只是这几个词跟输出的那个词往往有语义上的关系。

还有要注意的是,这个霍夫曼树的所有叶子节点就代表了语料库里面的所有词,而且是每个叶子节点对应一个词,不重复。

这个网络结构的功能是为了完成一个的事情——判断一句话是否是自然语言。怎么判断呢?使用的是概率,就是计算一下这句话的―一列词的组合‖的概率的连乘(联合概率)是多少,如果比较低,那么就可以认为不是一句自然语言,如果概率高,就是一句正常的话。这个其实也是语言模型的目标。前面说的―一列词的

组合‖其实包括了一个词跟它的上下文的联合起来的概率,一种普通的情况就是

每一个词跟它前面所有的词的组合的概率的连乘,这个后面介绍。

对于上面的那个网络结构来说,网络训练完成后,假如给定一句话s,这句话由词w1,w2,w3,…,wT组成,就可以利用计算这句话是自然语言的概率了,计算的公式是下面的公式

其中的Context表示的是该词的上下文,也就是这个词的前面和后面各若干个词,这个―若干‖(后面简称c)一般是随机的,也就是一般会从1到5之间的一个随

机数;每个代表的意义是前后的c个词分别是那几个的情况下,出现该词的概率。举个例子就是:―大家喜欢吃好吃的苹果‖这句话总共6个词,假设对―吃‖

这个词来说c随机抽到2,则―吃‖这个词的context是―大家‖、―喜欢‖、―好吃‖和―的‖,总共四个词,这四个词的顺序可以乱,这是word2vec的一个特点。

计算的时候都要用到上面的那个网络,具体计算的方法用例子说明,假设就是计算―吃‖这个词的在―大家‖、―喜欢‖、―好吃‖和―的‖这四个词作为上下文的条件

概率,又假设―吃‖这个词在霍夫曼树中是的最右边那一个叶子节点,那么从根节点到到达它就有两个非叶节点,根节点对应的词向量命名为A,根节点的右孩子节点对应的词向量命名为B,另外再假设―大家‖、―喜欢‖、―好吃‖和―的‖这四个词的词向量的和为C,则

其中,是sigmoid公式。

要注意的是,如果―吃‖这个词在非叶节点B的左孩子节点(假设称为E)的右边的那个叶子节点,也就是在图中右边的三个叶子的中间那个,则有

上面的那句话的每个词都计算后连乘起来得到联合概率,这个概率如果大于某个阈值,就认为是正常的话;否则就认为不是自然语言,要排除掉。

对于这个神经网络的描述索然无味,因为主角也不是这个概率,这个神经网络最重要的是输出层的那个霍夫曼树的叶子节点上的那些向量,那些向量被称为词向量,词向量就是另外一篇博文里面介绍的,是个好东西。

怎么得到这些词向量更加是一个重要的过程,也是word2vec这整个算法最重要的东西,后面会认真介绍。

二.优化目标与解问题

2.1从霍夫曼树到条件概率的计算

前面已经提过语言模型的目标就是判断一句话是否是正常的,至于怎么判断则需要计算很多条件概率如,然后还要把这些条件概率连乘起来得到联合概率。

这样就带来了问题了——怎么去计算,有很多办法的,后面的章节会介绍。这里的word2vec的计算这个条件概率的方法是利用神经网络的能量函数,因为在能量模型中,能量函数的功能是把神经网络的状态转化为概率表示,这在另外一篇博文RBM里面有提到,具体要看hinton的论文来了解了。能量模型有个特别大的好处,就是能拟合所有的指数族的分布。那么,如果认为这些条件概率是符合某个指数族的分布的话,是可以用能量模型去拟合的。总之word2vec就认

为这个条件概率可以用能量模型来表示了。

既然是能量模型,那么就需要能量函数,word2vec定义了一个非常简单的能量函数

E(A,C)=-(A?C)

其中A可以认为是某个词的词向量,C是这个词的上下文的词向量的和(向量

的和),基本上就可以认为C代表Context;中间的点号表示两个向量的内积。然后根据能量模型(这个模型假设了温度一直是1,所以能量函数没有分母了),就可以表示出词A的在上下文词向量C下的概率来了

(2.1.2)

其中V表示语料库里面的的词的个数,这个定义的意思是在上下文C出现的情况下,中间这个词是A的概率,为了计算这个概率,肯定得把语料库里面所有的词的能量都算一次,然后再根据词A的能量,那个比值就是出现A的概率。这种计算概率的方式倒是能量模型里面特有的,这个定义在论文《Hierarchical Probabilistic Neural Network Language Model》里面,这里拿来改了个形式。这个概率其实并不好统计,为了算一个词的的概率,得算上这种上下文的情况下所有词的能量,然后还计算指数值再加和。

这时候科学家们的作用又体现了,假如把语料库的所有词分成两类,分别称为G 类和H类,每类一半,其中词A属于G类,那么下面的式子就可以成立了

p(A│C)=p(A|G,C)p(G|C) (2.1.3)

这个式子的的含义算明确的了,词A在上下文C的条件下出现的概率,与后面的这个概率相等——在上下文C的条件下出现了G类词,同时在上下文为C,并且应该出现的词是G类词的条件下,词A出现的概率。

列出这么一个式子在论文《Hierarchical Probabilistic Neural Network Language Model》里面也有个证明的,看原始的情况

P(Y=y│X=x)=P(Y=y|D=d(y),X)P(D=d(y)|X=x)

其中d是一个映射函数,把Y里面的元素映射到词的类别D里面的元素。还有个证明

式子(2.1.3)说明了一个问题,计算一个词A在上下文C的情况下出现的概率,可以先对语料库中的词分成两簇,然后能节省计算。现在来展示一下怎么节省计算,假设G,H这两类的簇就用G和H表示(G和H也是一个词向量,意思就是G表示了其中一簇的词,H表示了另外一簇的词,G和H只是一个代表,也不是什么簇中心的说法。其实如果情况极端点,只有两个词,看下面的式子就完全没问题了。在多个词的情况下,就可以认为词被分成了两团,G和H个表示一团的词,计算概率什么的都以一整团为单位),那么式子(2.3)中的p(G|C)可以用下面的式子计算

也就是说,可以不用关系那个是簇中心,只要利用一个F=H-G的类词向量的一个向量就可以计算P(G|C)了,所以这一步是很节省时间的。再看另外一步

由于在G内的词数量只有V/2个,也就是说计算分母的时候只要计算V/2个词的能量就可以了。这已经省了一半的计算量了,可惜科学家们是贪得无厌的,所以还要继续省,怎么来呢?把G类词再分成两个簇GG,GH,A在GH里面,然后

p(A│G,C)=p(A|GH,G,C)p(GH|G,C)

同样有

同样可以把GG-GH用一个类词向量表达,这时候

p(A│C)=p(A|GH,G,C)p(GH|G,C)p(G|C)

继续下去假设继续分到GHG簇的时候只剩两个词了,再分两簇为GHGG和GHGH,其中的簇GHGG就只有一个词A,那么p(A│C)可以用下面的式子算p(A│C)=p(A│GHGG,GHG,GH,G,C)p(GHGG|GHG,GH,G,C)p(GHG|GH,G,C)p (GH|G,C)p(G|C)

其中p(A|GHGG,GHG,GH,G)是1,因为只有一个单词,代到公式(2.2)就可以得到,那么就有

p(A│C)=p(GHGG|GHG,GH,G,C)p(GHG|GH,G,C)p(GH|G,C)p(G|C)

也就是

假设再令FFF=GHH-GHG,FF=GG-GH,F=H-G,那么p(A|C)只要算这三个词与上下文C的能量函数了,确实比原来的要节省很多计算的。

对于上面的霍夫曼树来说假设G表示向右,H表示向左,那么A就是从右边开始数的第二个叶子节点,就是图中右边的三个W的中间那个。那么F,FF,FFF 就是这个叶子节点路径上的三个非叶节点。

但是一个词总是会一会向左,一会向右的,也就是在根节点那里,一会是p(G|C)那么F=H-G,一会又是p(H|C)那么F=G-H,如果F在每个节点都是唯一一个值,就可以直接用一次词向量表示这个非叶节点了。这下难不倒科学家的,令F一直是等于H-G,那么一直有

并且有p(G|C)=1-p(H|C)。

这样每个非叶节点就可以用唯一一个词向量表示了。

看到这里,总该明白为啥p(A|C)要这么算了吧。再换种情况,上面的概率

这个概率的计算方法是不是也是同样的道理?

总结下来,可以用下面的公式计算了

其中C表示上下文的词向量累加后的向量,qk表示从根节点下来到叶子节点的路径上的那些非叶节点,dk就是编码了,也可以说是分类,因为在霍夫曼树的每个非叶节点都只有两个孩子节点,那可以认为当wi在这个节点的左子树的叶子节点上时dk=0,否则dk=1。这样的话每个词都可以用一组霍夫曼编码来表示,就有了上面的那个式子中间的那个dk,整个p(w│Context)就可以用霍夫曼树上的若干个非叶节点和词w的霍夫曼编码来计算了。

看到这务必想明白,因为开始要讨论怎么训练了。

2.2目标函数

假设语料库是有S个句子组成的一个句子序列(顺序不重要),整个语料库有V 个词,似然函数就会构建成下面的样子

(2.2.1)

其中T_j表示第j个句子的词个数,极大似然要对整个语料库去做的。对数似然就会是下面的样子

(2.2.2)

如果前面有个1/V,对数似然还有些人称为交叉熵,这个具体也不了解,就不介绍了;不用1/V的话,就是正常的极大似然的样子。

有意向的同学可以扩展到有文档的样子,这里就不介绍了。

但是对于word2vec来说,上面的似然函数得改改,变成下面的样子

其中的Cij表示上下文相加的那个词向量。对数似然就是下面的

这里就不要1/V了。

这个看起来应该比较熟悉了,很像二分类的概率输出的逻辑回归——logistic regression模型。没错了,word2vec就是这么考虑的,把在霍夫曼树向左的情况,也就是dk=0的情况认为是正类,向右就认为是负类(这里的正负类只表示两种类别之一)。这样每当出现了一个上下文C和一个词在左子树的情况,就认为得到了一个正类样本,否则就是一个负类样本,每个样本的属于正类的概率

都可以用上面的参数算出来,就是,如果是向右的话,就用计算其概率。注意每个词可以产生多个样本,因为从霍夫曼树的根节点开始,每个叶子节点都产生一个样本,这个样本的label(也就是属于正类或者负类标志)可以用霍夫曼编码来产生,前面说过了,向左的霍夫曼编码dk=0,所以很自然地可以用1-dk 表示每个样本label。

在这里,霍夫曼编码也变成了一个重要的东西了。

这样就好多了,问题到这也该清楚了,上面那个l(θ)就是对数似然,然后负对数似然f=-l(θ)就是需要最小化的目标函数了。

2.3解法

解法选用的是SGD,博文《在线学习算法FTRL》中说过SGD算法的一些情况。具体说来就是对每一个样本都进行迭代,但是每个样本只影响其相关的参数,跟它无关的参数不影响。对于上面来说,第j个样本的第ij个词的负对数似然是

第j个样本的第ij个词的在遇到第kij个非叶节点时的负对数似然是

计算的梯度,注意参数包括和,其中的梯度是用来计算的时候用到。另外需要注意的是logσ(x)的梯度是1-σ(x),log(1-σ(x))的梯度是-σ(x),

上面的Fq和Fc只是简写,有了梯度就可以对每个参数进行迭代了

同时,每个词的词向量也可以进行迭代了

注意第二个迭代的wI是代表所有的输入词的,也就是假如输入了4个词,这四个词都要根据这个方式进行迭代。第二个迭代式确实不好理解,因为这里的意思所有非叶节点上的对上下文的梯度全部加和就得到了这个词的上下文的梯度,看起来这个就是BP神经网络的误差反向传播。

论文《Hierarchical Probabilistic Neural Network Language Model》和《Three New Graphical Models for Statistical Language Modelling》中看起来也是这么样的解释,人家都是Context的几个词首尾连接得到的一个向量,对这个长向量有一个梯度,或者一个超大的V*m矩阵(m是词向量的维度),对这个矩阵每个元素有一个梯度,这些梯度自然也包括了输入词的梯度。

如果有人发现了这个做法的解释请告知。

2.4代码中的trick

如前文,c表示左右各取多少个词,代码中c是一个从0到window-1的一个数,是对每个词都随机生成的,二这个window就是用户自己输入的一个变量,默认

值是5。代码实际实现的时候是换了一种方法首先生成一个0到window-1的一个数b,然后训练的词(假设是第i个词)的窗口是从第i-window+b个词开始到第i-window+b个词结束。要注意的是每个词的c都不一样的,都是随机生成的。如果有人看过代码,就会发现,其中的q_(k_ij )在代码中用矩阵syn1表示,C_(i_j )在代码中用neu1表示。叶子节点里面的每个词向量在代码中用syn0表示,利用下标移动去读取。

核心代码如下,其中的vocab[word].code[d]就表示d_(k_ij ),其他就是迭代过程,代码是写得相当简洁啊。

代码中的419行就是计算Cij,425-428行就是计算f,也就是σ(q_(k_ij )?C_(i_j ) )的值,432行就是累积Cij的误差,434就是更新q_(k_ij)^(n+1)。

注意上面,对每个输入词都进行了更新,更新的幅度就是432行中误差累计的结果。

三.CBOW加抽样的网络结构与使用说明

3.1网络结构与使用说明

网络结构如下

如(二)中,中间的那个隐层是把上下文累加起来的一个词向量,然后有一个矩阵R,是在训练过程中用到的临时矩阵,这个矩阵连接隐层与所有输出节点,但是这个矩阵在使用这个网络的时候不怎么用得到,这里也是没弄清楚的一个地方。每个输出节点代表一个词向量。

同样如(二)中的例子,计算这么一个概率,这里的计算方法就简单多了,就是随机从语料库里面抽取c个词,这里假设c=3,抽中了D,E,

F这三个词,又假设―吃‖这个词的词向量是A,那么就计算―吃‖这个词的概率就

用下面的公式

同样如(二)中,那句话的每个词都计算后连乘起来得到联合概率,这个概率如果大于某个阈值,就认为是正常的话;否则就认为不是自然语言,要排除掉。这里只是说明这个网络是怎么样的例子,真正重要的始终是那些词向量。

四.CBOW加抽样的优化目标与解问题4.1抽样方法的意义与目标函数

为啥要抽样呢?目的跟(二)中的霍夫曼树其实是一样的,都是为了节省计算量,这个计算量就是式(2.1.2)中计算p(A|C)的概率,因为这个概率实在不好算。论

文《Distributed Representations of Words and Phrases and their

Compositionality》中提到有一个叫NCE的方法可以来代替上面的那个hierarchical softmax方法(就是使用霍夫曼树的方法),但是由于word2vec只关心怎么学到高质量的词向量,所以就用了一种简单的NCE方法,称为NEG,

方法的本质就是在第j个句子的第ij个词wij处使用下面的式子代替。

其中E下面的那个下标的意思是wk是符合某个分布的,在这里p_V (w)表示词频的分布。

这个式子的第二项是求K个期望,这K个期望中的每一个期望,都是在该上下文的情况下不出现这个词的期望。这里出现一个特别大的偷懒,就是认为这个期望只要抽取一个样本就能计算出来,当然,如果说遍历完整个语料库,其实还可以认为是抽取了多次实验的,因为每次抽取词的时候,是按照词频的分布来抽样的,如果抽样的次数足够多,在总体的结果上,这里计算的期望还是接近这个期望的真实值的,这个可以参考博文中RBM中计算梯度的时候的那个蒙特卡洛抽样来理解。

在这里,从代码上体现来看,就只用一个样本来估算这个期望的,所有式子被简化成了下面的形式

用这个式子取代(2.2.2)中的,就能得到CBOW加抽样的目标函数(去掉1/V 的),这个目标函数也是极其像logistic regression的目标函数,其中wij是正类样本,wk是负类样本。

为了统一表示,正类样本设置一个label为1,负类样本设置label为0,每个样本的负对数似然都变成下面的方式

4.2CBOW加抽样方法的解法

解法还是用SGD,所以对一个词wij来说,这个词本身是一个正类样本,同时对这个词,还随机抽取了k个负类样本,那么每个词在训练的时候都有k+1个样

相关主题