word2vec -- 负采样 -- skip-gram

我以前写过一篇关于word2vec的文章,说实话,写的一坨,我决定以后写博客认认真真的去写。
我的博客来自于网上各位前辈的资料的整理,这位这位和这位翻译的让我对word2vec有了深入的理解。word2vec有两种模型,一个是skip-gram,一个是cbow。这两个模型应该是在一起讲的。cbow是输入词向量求平均,二skip-gram输入只有一个,不要求平均。首先说一点,cbow和skip-gram的目标函数,下图是cbow的,skip-gram反过来而已


词向量基础

词向量很早以前就有了。最早的词向量成为one-hot representation,它使用的词向量维度大小为整个词汇表的大小,对于词汇表中每个具体的词,对应位置置为1,其余位置为0。例如,我们得到一个为2000大小的词汇表,“dog”的词序为3,那么它的词向量表示为(0,0,1,0,...,0)。是不是感觉这样很蠢,只是将改词所在的位置表示出来,而其余位置都没有啥意义,占用存储空间。如果上千万大小的词汇表,一个词就需要上千万的位置,将会导致维度灾难。
于是,人们搞出一个Distributed representation,它的思路是通过训练,将每个词都映射到一个较短的词向量上,所有的词向量就构成了向量空间,进而可以用统计学的方法研究词和词之间的关系。比如谷歌用google news训练的词向量,维度为300,一般维度自己指定。



上图仅仅展示了一个词汇表中词向量的一部分,可以看出“Man”这个词和“Woman”这个词在“Gender”所占的比重还是很大的,在其他属性占的比重小。当然实际上,我们并不能对词向量的每一个维度做很好的解释。
使用t-SNE算法对词向量进行非线性降维,可得到下面映射结果:



可以看到同一类的词,基本上聚集在了一起。例如,给定对应关系“man”对“woman”,要求机器类比出“King”对应的词汇,可发现词向量存在数学关系“Man - Woman = King - Queen”

第一部分

模型

在word2vec模型中,主要有Skip-Gram和CBOW两种模型。CBOW是给定上下文,来预测input word,而Skip-Gram是给定input word来预测上下文。


我暂时文章没怎么看懂,就看懂了最后一篇翻译的,所以暂时只写skip-gram。
Skip-Gram实际上分为了两个部分,第一部分为建立模型,第二部分为通过模型获取嵌入词向量。word2vec的整个建模过程实际上与自编码器(auto-encoder)相似,即先基于训练数据构建一个神经网络,当这个模型训练号以后,我们并不会用这个训练好的模型处理新的任务,我们需要的是这个模型通过训练所学到的参数,如隐层的权值矩阵-----这些权重在word2vec中实际上就是我们试图学习的“word vectors(词向量)”。基于训练数据建模的过程,我们给它取一个名字叫“Fake Task”,意味着建模不是最终目的。

上面提到的这种方法实际上会在无监督特征学习(unsupervised feature learning)中见到,最常见的是自编码器(auto-enconder):通过在隐层将输入进行编码压缩,继而在输出层将数据解码回复到初始状态,训练完成后,我们将会去掉输出层,只保留隐层。(ps:让我想起了生成对抗网络)

The Fake Task

“fake task”就是构建网络,但只要训练数据得到的隐层。它的完整过程如下:
假如我们有一个句子“The fox jumps over the lazy dog”。

  • 首先我们选取句子中的一个词作为输入词(实际训练过程中,是依次将句子中的每个词作为输入词构建训练对的),例如选取“fox”作为input word;
  • 有了input word后,我们再定义一个叫skip_window的参数,它代表我们从当前input word的一侧选取词的数量。如果设置skip_window = 2,那么我们最终获得窗口中的词(包括input word在内)就是['The', 'fox', 'jumps', 'over']。那么整个窗口大小span = 2\times2 = 4。另外一个参数叫num_skips,它代表我们选取多少个不同的词作为我们的output word,当skip_window = 2,num_skips = 2时,我们将会得到两组(input wordoutput word)形式的训练数据,即('fox', 'jumps'),('fox', 'the')
  • 神经网络基于这些训练数据将会输出一个概率分布,这个概率代表着我们词典中的每个词是output word的可能性。例如,上面我们得到两组数据。我们先用一组数据('fox', 'jumps')来训练神经网络,那么模型通过前面学习这个训练样本,会告诉我们词汇表中其他单词的概率大小和“jumps”的概率大小。

模型的输出概率代表着我们的词典中每个词有多大可能跟input word同时出现。例如,我们向神经网络模型中输入一个单词“Soviet”,那么最终模型的输出概率中,像“Union”,“Russia”这些相关词的概率远远高于“dog”,“love”这些非相关词的概率。
我们将通过给神经网络输入文本中成对的单词来训练它完成上面所说的概率计算。下面的图给出了一个完整的例子。我们选定句子“The quick brown fox jumps over lazy dog”,设定窗口大小为2(skip_window = 2)。下图中,蓝色代表input_word,方框内代表位于窗口内的单词。

模型细节

首先,神经网络只能接受数值输入,所以我们必须将单词进行one-hot编码,上面我们介绍的词向量发挥作用了。假设我们在训练数据中只能取出10000个不重复的单词作为词汇表,那么我们对每个单词编码都是1 \times10000的向量。在上面的例子中,如果“** The dog barked at the mailman**”,按照简单的情况,每个单词在词汇表的位置为1,2,3,4,5,6,那么这6个单词将会被编码成 6\times1000维度的向量,为了表示方便,我只写出前2个
\begin{bmatrix} {1}&{0}&{\cdots}&{0}\\ {0}&{1}&{\cdots}&{0}\\ {\vdots}&{\vdots}&{\ddots}&{\vdots}\\ {0}&{0}&{\cdots}&{0}\\ \end{bmatrix}
模型的输入是10000为的向量,那么输出也是10000维(词汇表的大小)向量,它包含了10000个概率,每一个概率代表着当前词是输入样本中output word的概率大小。如下图,神经网络架构:


隐层不使用任何激活函数,但是输出层用来softmax

第二部分

上面结尾我们说输出层用softmax,但是要知道,如果真的用softmax来算,计算量大的惊人。所以可以用这三个方法来减少计算量:

  • 将常见的单词组合(word pairs)或者词组作为单个“words”来使用。
  • 对高频词进行抽样来减少训练样本的个数
  • 最后最重要的一点,就是“nagative sampling”方法,这样每个训练样本只会更新一小部分模型权重,从而降低计算负担。

其他的我不想讲,原作者博客中有,我想讲讲nagative sampling(负采样)。不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一部分的权重,这样就好降低梯度下降过程中的计算量。
当我们用训练样本(input word:"fox", output word:"quick")来训练我们的神经网络时,“fox”和“quick”都是经过one-hot编码的。如果我们的vocabulary大小为10000时,在输出层,我们希望“quick”单词那个位置输出1,其余都是0。这些其余我们期望输出0的位置所对应的单词我们成为“negative” word。
当使用负采样时,我们将随机选择一小部分的negative words(比如选5个negative words)来更新对应的权重。我们也会对我们的positive word进行权重更新(上面的例子指的是"quick")。

  • 在论文中,作者指出指出对于小规模数据集,选择5-20个negative words会比较好,对于大规模数据集可以仅选择2-5个negative words。

回忆一下我们的隐层-输出层拥有300 x 10000的权重矩阵。如果使用了负采样的方法我们仅仅去更新我们的positive word-“quick”的和我们选择的其他5个negative words的结点对应的权重,共计6个输出神经元,相当于每次只更新300 \times 6 = 1800个权重。对于3百万的权重来说,相当于只计算了0.06%的权重,这样计算效率就大幅度提高。
写到这里,其实还有很多东西没说明白。但这个主题说大了,我暂时先搁置着,等研究透了再来修改增加。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,992评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,212评论 3 388
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,535评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,197评论 1 287
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,310评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,383评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,409评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,191评论 0 269
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,621评论 1 306
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,910评论 2 328
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,084评论 1 342
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,763评论 4 337
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,403评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,083评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,318评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,946评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,967评论 2 351

推荐阅读更多精彩内容

  • 最近新接触文本分类问题,对于我来数第一个问题就是Word Embedding这个词到底是什么意思,因此也就开始学习...
    小松qxs阅读 24,848评论 2 27
  • 转载自:玛卡瑞纳_a63b这篇文章主要是对介绍Word2Vec中的Skip-Gram模型的两篇英文文档的翻译、理解...
    guisir_zgm阅读 2,246评论 0 2
  • 前面的文章主要从理论的角度介绍了自然语言人机对话系统所可能涉及到的多个领域的经典模型和基础知识。这篇文章,甚至之后...
    我偏笑_NSNirvana阅读 13,896评论 2 64
  • 什么是Word2Vec和Embeddings? Word2Vec是从大量文本语料中以无监督的方式学习语义知识的一种...
    lwyaoshen阅读 1,014评论 2 0
  • 今天早晨七点半才醒,看着熟睡的女儿我不敢动,我怕我一动就吵醒她,她早晨才睡个好觉,到了八点多她醒了,我给他穿衣服起...
    亢鸿伟阅读 96评论 0 0