转载自 word2vec模型cbow与skip-gram的比较html
cbow和skip-gram都是在word2vec中用于将文本进行向量表示的实现方法,具体的算法实现细节能够去看word2vec的原理介绍文章。咱们这里大致讲下二者的区别,尤为注意在使用当中的不一样特色。算法
在cbow方法中,是用周围词预测中心词,从而利用中心词的预测结果状况,使用GradientDesent方法,不断的去调整周围词的向量。当训练完成以后,每一个词都会做为中心词,把周围词的词向量进行了调整,这样也就得到了整个文本里面全部词的词向量。学习
要注意的是, cbow的对周围词的调整是统一的:求出的gradient的值会一样的做用到每一个周围词的词向量当中去。 spa
能够看到,cbow预测行为的次数跟整个文本的词数几乎是相等的(每次预测行为才会进行一次backpropgation, 而每每这也是最耗时的部分),复杂度大概是O(V);htm
能够看出,skip-gram进行预测的次数是要多于cbow的:由于每一个词在做为中心词时,都要使用周围词进行预测一次。这样至关于比cbow的方法多进行了K次(假设K为窗口大小),所以时间的复杂度为O(KV),训练时间要比cbow要长。blog
可是在skip-gram当中,每一个词都要收到周围的词的影响,每一个词在做为中心词的时候,都要进行K次的预测、调整。所以, 当数据量较少,或者词为生僻词出现次数较少时, 这种屡次的调整会使得词向量相对的更加准确。由于尽管cbow从另一个角度来讲,某个词也是会受到屡次周围词的影响(屡次将其包含在内的窗口移动),进行词向量的跳帧,可是他的调整是跟周围的词一块儿调整的,grad的值会平均分到该词上, 至关于该生僻词没有收到专门的训练,它只是沾了周围词的光而已。ip
所以,从更通俗的角度来讲:get
cbow是 1个老师 VS K个学生,K个学生(周围词)都会从老师(中心词)那里学习知识,可是老师(中心词)是一视同仁的,教给你们的同样的知识。至于你学到了多少,还要看下一轮(假如还在窗口内),或者之后的某一轮,你还有机会加入老师的课堂当中(再次出现做为周围词),跟着你们一块儿学习,而后进步一点。所以相对skip-gram,你的业务能力确定没有人家强,可是对于整个训练营(训练过程)来讲,这样确定效率高,速度更快。io
因此,这二者的取舍,要看你本身的需求是什么了。class