机器学习算法(十三):word2vec

本文深入探讨词嵌入技术,特别是Word2Vec模型的原理与实践,包括CBOW与Skip-gram两种核心算法,以及Hierarchical Softmax和Negative Sampling等优化技巧。文章还介绍了如何使用gensim库进行Word2Vec模型训练。

目录

1 单词表达 

1.1 Word embedding

1.2 独热(One hot representation)

1.2.1 独热编码介绍

1.2.2 优缺点分析

1.3 Dristributed representation

1.4 共现矩阵 (Cocurrence matrix)

3 word2vec

3.1 word2vec介绍

3.2 CBOW模型

3.2.1 Simple CBOW Model

 3.2.2 CBOW Multi-Word Context Model

 3.2.3 训练连续词袋模型

3.3 Skip-gram 模型

3.3.1 Skip-gram 模型介绍

3.3.2 训练跳字模型

3.4 使用gensim进行训练

3.5 tricks1:hierarchical softmax (CBOW)

3.5.1 Huffman Tree(哈夫曼树)

3.5.2 预备知识

3.5.3 word2vec的hierarchical softmax结构

3.5.4 目标函数

3.5.5 参数更新

3.5.5 伪代码

3.6 tricks1:hierarchical softmax (Skip-gram)

3.6.1 Skip-gram模型网络结构

3.6.2 Skip-gram的目标函数

3.6.3 参数更新

3.6.4 伪代码

3.7 tricks2:negative sampling (CBOW)

3.8 tricks2:negative sampling (Skip-gram)

3.9 关于Word2Vec若干问题的思考

3.10 python实现(gensim)


1 单词表达 

1.1 Word embedding

        Embedding是数学领域的有名词,是指某个对象 X 被嵌入到另外一个对象 Y 中,映射 f : X → Y ,例如有理数嵌入实数。

        Word embedding 是NLP中一组语言模型(language modeling)和特征学习技术(feature learning techniques)的总称,这些技术会把词汇表中的单词或者短语(words or phrases)映射成由实数构成的向量上。 

        Word embedding就是要从数据中自动学习 输入空间到Distributed representation空间的映射f 。

        最简单的一种Word Embedding方法,就是基于词袋(BOW)One-Hot表示,还有另外一个方法:共现矩阵 (Cocurrence matrix)。

1.2 独热(One hot representation)

1.2.1 独热编码介绍

        独热编码即 One-Hot 编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。举个例子,假设我们有四个样本(行),每个样本有三个特征(列),如图:

        我们的feature_1有两种可能的取值,比如是男/女,这里男用1表示,女用2表示。feature_2 和feature_3各有4种取值(状态)。one-hot编码就是保证每个样本中的单个特征只有1位处于状态1,其他的都是0。上述状态用one-hot编码如下图所示:

考虑一下三个特征:

  • ["male", "female"]
  • ["from Europe", "from US", "from Asia"]
  • ["uses Firefox", "uses Chrome", "uses Safari", "uses Internet Explorer"]

将它换成独热编码后,应该是:

  • feature1=[01,10]
  • feature2=[001,010,100]
  • feature3=[0001,0010,0100,1000]

1.2.2 优缺点分析

  • 优点:一是解决了分类器不好处理离散数据的问题,二是在一定程度上也起到了扩充特征的作用。
  • 缺点:在文本特征表示上有些缺点就非常突出了。首先,它是一个词袋模型,不考虑词与词之间的顺序(文本中词的顺序信息也是很重要的);其次,它假设词与词相互独立(在大多数情况下,词与词是相互影响的);最后,它得到的特征是离散稀疏的。

        为什么得到的特征是离散稀疏的?

       上面举例比较简单,但现实情况可能不太一样。比如如果将世界所有城市名称作为语料库的话,那这个向量会过于稀疏,并且会造成维度灾难。

  • 杭州 [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0]
  • 上海 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]
  • 宁波 [0,0,0,1,0,0,0,0,0,……,0,0,0,0,0,0,0]
  • 北京 [0,0,0,0,0,0,0,0,0,……,1,0,0,0,0,0,0]

        在语料库中,杭州、上海、宁波、北京各对应一个向量,向量中只有一个值为1,其余都为0。

        能不能把词向量的维度变小呢?

        Dristributed representation(词向量)可以解决One hot representation的问题。

1.3 Dristributed representation(词向量)

        然而每个单词彼此无关这个特点明显不符合我们的现实情况。我们知道大量的单词都是有关。

  • 语义:girl和woman虽然用在不同年龄上,但指的都是女性。
  • 复数:word和words仅仅是复数和单数的差别。
  • 时态:buy和bought表达的都是“买”,但发生的时间不同。

        所以用one hot representation的编码方式,上面的特性都没有被考虑到。

        我们更希望用诸如“语义”,“复数”,“时态”等维度去描述一个单词。每一个维度不再是0或1,而是连续的实数,表示不同的程度。

        Dristributed representation可以解决One hot representation的问题,它的思路是通过训练,将每个词都映射到一个较短的词向量上来。所有的这些词向量就构成了向量空间,进而可以用普通的统计学的方法来研究词与词之间的关系。这个较短的词向量维度是多大呢?这个一般需要我们在训练时自己来指定。

        比如下图我们将词汇表里的词用"Royalty","Masculinity", "Femininity"和"Age"4个维度来表示,King这个词对应的词向量可能是(0.99,0.99,0.05,0.7)。当然在实际情况中,我们并不能对词向量的每个维度做一个很好的解释。

        我们将king这个词从一个可能非常稀疏的向量所在的空间,映射到现在这个四维向量所在的空间,必须满足以下性质:

(1)这个映射是单射(单射:任给x1和x2属于X,若x1≠x2,则f(x1)≠f(x2),称f为单射);
(2)映射之后的向量不会丢失之前的那种向量所含的信息。

        这个过程称为word embedding(词嵌入),即将高维词向量嵌入到一个低维空间。如图

        经过我们一系列的降维神操作,有了用Dristributed representation表示的较短的词向量,我们就可以较容易的分析词之间的关系了,比如我们将词的维度降维到2维,有一个有趣的研究表明,用下图的词向量表示我们的词时,我们可以发现:

        出现这种现象的原因是,我们得到最后的词向量的训练过程中引入了词的上下文。

        You shall know a word by the company it keeps.

        举个例子:

        你想到得到"learning"的词向量,但训练过程中,你同时考虑了它左右的上下文,那么就可以使"learning"带有语义信息了。通过这种操作,我们可以得到近义词,甚至cat和它的复数cats的向量极其相近。

1.4 共现矩阵 (Cocurrence matrix)

         一个非常重要的思想是,我们认为某个词的意思跟它临近的单词是紧密相关的。这时我们可以设定一个窗口(大小一般是5~10),如下窗口大小是2,那么在这个窗口内,与rests 共同出现的单词就有life、he、in、peace。然后我们就利用这种共现关系来生成词向量。

        

        例如,现在我们的语料库包括下面三份文档资料:

        I like deep learning. 

        I like NLP. 

        I enjoy flying.

         作为示例,我们设定的窗口大小为1,也就是只看某个单词周围紧邻着的那个单词。此时,将得到一个对称矩阵——共现矩阵。因为在我们的语料库中,I 和 like做为邻居同时出现在窗口中的次数是2,所以下表中I 和like相交的位置其值就是2。这样我们也实现了将word变成向量的设想,在共现矩阵每一行(或每一列)都是对应单词的一个向量表示。

        虽然Cocurrence matrix一定程度上解决了单词间相对位置也应予以重视这个问题。但是它仍然面对维度灾难。也即是说一个word的向量表示长度太长了。这时,很自然地会想到SVD或者PCA等一些常用的降维方法。当然,这也会带来其他的一些问题,例如,我们的词汇表中有新词加入,那么就很难为他分配一个新的向量。

3 word2vec

3.1 word2vec介绍

        word2vec模型其实就是简单化的神经网络。word2vec是用一个一层的神经网络(即CBOW)把one-hot形式的稀疏词向量映射称为一个n维(n一般为几百)的稠密向量的过程。为了加快模型训练速度,其中的tricks包括Hierarchical softmaxnegative samplingHuffman Tree等。

        在NLP中,最细粒度的对象是词语。如果我们要进行词性标注,用一般的思路,我们可以有一系列的样本数据(x,y)。其中x表示词语,y表示词性。而我们要做的,就是找到一个x -> y的映射关系,传统的方法包括BayesSVM等算法。但是我们的数学模型,一般都是数值型的输入。但是NLP中的词语,是人类的抽象总结,是符号形式的(比如中文、英文、拉丁文等等),所以需要把他们转换成数值形式,或者说——嵌入到一个数学空间里,这种嵌入方式,就叫词嵌入(word embedding),而 Word2vec,就是词嵌入( word embedding) 的一种。

        输入是One-Hot VectorHidden Layer没有激活函数,也就是线性的单元。Output Layer维度跟Input Layer的维度一样,用的是Softmax回归。当这个模型训练好以后,我们并不会用这个训练好的模型处理新的任务,我们真正需要的是这个模型通过训练数据所学得的参数,例如隐层的权重矩阵

        这个模型是如何定义数据的输入和输出呢?一般分为CBOW(Continuous Bag-of-Words)Skip-Gram两种模型。

  • CBOW模型训练输入是某一个特征词的上下文相关的词对应的词向量,而输出就是这特定的一个词的词向量。 
  • Skip-Gram模型CBOW的思路是反着来的,即输入是特定的一个词的词向量,而输出是特定词对应的上下文词向量。

        CBOW小型数据库比较合适,而Skip-Gram大型语料中表现更好。

        Word2Vec模型实际上分为了两个部分,第一部分为建立模型,第二部分是通过模型获取嵌入词向量。Word2Vec的整个建模过程实际上与自编码器(auto-encoder)的思想很相似,即先基于训练数据构建一个神经网络,当这个模型训练好以后,我们并不会用这个训练好的模型处理新的任务,我们真正需要的是这个模型通过训练数据所学得的参数,例如隐层的权重矩阵——后面我们将会看到这些权重在Word2Vec中实际上就是我们试图去学习的“word vectors”。基于训练数据建模的过程,我们给它一个名字叫“Fake Task”,意味着建模并不是我们最终的目的。

上面提到的这种方法实际上会在无监督特征学习(unsupervised feature learning)中见到,最常见的就是自编码器(auto-encoder):通过在隐层将输入进行编码压缩,继而在输出层将数据解码恢复初始状态,训练完成后,我们会将输出层“砍掉”,仅保留隐层。

3.2 CBOW模型

        连续词袋模型与跳字模型类似。与跳字模型最大的不同在于,连续词袋模型假设基于某中心词在文本序列前后的背景词来生成该中心词。在同样的文本序列“the”“man”“loves”“his”“son”里,以“loves”作为中心词,且背景窗口大小为2时,连续词袋模型关心的是,给定背景词“the”“man”“his”“son”生成中心词“loves”的条件概率,也就是

3.2.1 Simple CBOW Model

        先从Simple CBOW model(仅输入一个词,输出一个词)框架说起。

如上图所示:

  • input layer输入的X是单词的one-hot representation(考虑一个词表V,里面的每一个词  都有一个编号i∈{1,...,|V|},那么词  的one-hot表示就是一个维度为|V|的向量,其中第i个元素值非零,其余元素全为0,例如:);
  • 输入层到隐藏层之间有一个权重矩阵W,隐藏层得到的值是由输入X乘上权重矩阵得到的(细心的人会发现,0-1向量乘上一个矩阵,就相当于选择了权重矩阵的某一行,如图:输入的向量X是[0,0,1,0,0,0],W的转置乘上X就相当于从矩阵中选择第3行[2,1,3]作为隐藏层的值);
  • 隐藏层到输出层也有一个权重矩阵W',因此,输出层向量y的每一个值,其实就是隐藏层的向量点乘权重向量W'的每一列,比如输出层的第一个数7,就是向量[2,1,3]和列向量[1,2,1]点乘之后的结果;
  • 最终的输出需要经过softmax函数,将输出向量中的每一个元素归一化到0-1之间的概率,概率最大的,就是预测的词。

 3.2.2 CBOW Multi-Word Context Model

         把单个输入换成多个输入(划红线部分)。

  1. 输入层(Input Layer)
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值