自学内容网 自学内容网

深度学习基础—学习词嵌入

引言

深度学习基础—了解词嵌入icon-default.png?t=O83Ahttps://blog.csdn.net/sniper_fandc/article/details/143526865?fromshare=blogdetail&sharetype=blogdetail&sharerId=143526865&sharerefer=PC&sharesource=sniper_fandc&sharefrom=from_link

        在上面这篇博客中,我们了解了词嵌入的相关概念和作用,下面一起来了解一下如何学习一个词嵌入模型。

1.学习词嵌入

        实践证明,建立一个语言模型是学习词嵌入的好方法。

        假如要构建一个语言模型,并且用神经网络来实现这个模型。在训练过程中,我们希望给定一个输入序列,比如输入:“I want a glass of orange ___.”,然后预测这句话的下一个词。

        那么我们首先生成一个参数矩阵E(嵌入矩阵),将每个词对应的one-hot向量与E相乘,得到词向量,将词向量输入到网络中,最终经过softmax层,输出预测词(概率)。通过反向传播进行梯度下降,从而学习模型。这是学习词嵌入矩阵的基本做法,但是我们有许多选择的细节,可以优化算法。

        假设要预测的词成为目标词,比如预测:“I want a glass of orange juice to go along with my cereal.”中的juice,那么juice就是目标词。如果要学习词嵌入矩阵或者语言模型,可以不用将整个序列都输入到网络中,而是借助上下文来学习。

        注意:由于整个序列用同一个参数矩阵E(嵌入矩阵),每一个词的嵌入矩阵都一样,因此我们可以用上下文来简化学习过程。

        如果要学习语言模型,那么一般选择目标词的前4个词作为上下文。比如选择juice的前4个单词作为上下文:“a glass of orange”来训练。

        如果要学习词嵌入矩阵,那么常见有3种做法:(1)目标词的前4个词和后4个词作为上下文。(2)目标词的前4个词作为上下文。(3)目标词的附近1个词作为上下文。

        (1)比如:选择juice的前4个单词和后4个单词作为上下文:“a glass of orange”和“to go along with”来训练。

        (2)比如:选择juice的前1个单词作为上下文:“orange”来训练。

        (3)比如:选择juice的附近1个单词作为上下文:“glass”来训练。注意:这个思想也是Skip-Gram模型的思想。

        为什么这样选择可以帮助模型更好的学习呢?事实上,比如orange jucie,apple juice的例子,在这个算法的激励下,apple和orange会学到很相似的嵌入,这样做能够让算法更好地拟合训练集,因为模型有时看到的是orange juice,有时看到的是apple juice。如果只用一个300维的特征向量来表示所有这些词,算法会发现要想最好地拟合训练集,就要使apple(苹果)、orange(橘子)、grape(葡萄)、pear(梨)和durian(榴莲)等等水果都拥有相似的特征向量。

2.Word2Vec

        Word2Vec 是一种用于生成词嵌入(word embeddings)的算法,它通过分析大量文本数据来发现词之间的相似性。Word2Vec 算法有两种主要模型:Skip-Gram模型和CBOW模型。

        注:模型原文来自Mikolov T, Chen K, Corrado G, et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013.

2.1.Skip-Gram模型

        假设在训练集中有这样的句子:“I want a glass of orange juice to go along with my cereal.”,Skip-Gram模型需要做的就是构造监督学习问题:上下文词(词c)与目标词(词t)匹配。比如选择orange作为上下文词,随机在一定词距内选另一个词,词距可以选择为前后10个词或5个词,目标词可能选择juice,也可能选择了glass等等。

        注意:构造这个监督学习问题的目标并不是想要解决这个监督学习问题本身,而是想要使用这个学习问题来学到一个好的词嵌入模型。

        接下来,模型的输入是上下文词的初始词向量,即:

        其中,E是嵌入矩阵,Oc是词c的one-hot向量。我们把输入的词向量喂给softmax单元,让其预测概率,公式如下:

        其中省略了softmax中的偏差项,并且假设有一个10000词的词典,θ表示与输出t有关的参数,即目标词t和标签相符的概率是多少。最终损失函数表示如下:

        接下来,训练这个模型,优化嵌入矩阵E和softmax单元的参数,最终将会得到一个较好的嵌入矩阵,这就是Skip-Gram模型。

        注意:如何对上下文词c进行采样?(1)均匀且随机地采样,缺点是常见的词出现频率高,比如the、of、a、and等等,不常见的词出现频率低,比如orange、apple或durian等等,这样模型会花费大量时间更新嵌入矩阵的频繁单词相关的列,对于不频繁单词相关的列优化很少。(2)采用不同的分级来平衡常见的词和不常见的词,这样就可以兼顾到不常见的词进行优化。

2.2.CBOW模型

        与Skip-Gram相反,CBOW模型给定一个词的上下文词汇,然后尝试预测这个中心词是什么。由于它利用周围的词来预测中心词,因此它在小型数据库上更为高效。此外,CBOW模型在处理常见词和短语时通常表现较好。更为详细的模型请阅读原文。

2.3.Skip-Gram模型计算优化

        在Skip-Gram模型中,但是还存在一个问题,对于softmax单元的计算,每次计算概率时,都要对分母这10000个词求和,如果词典的词数很多时,很影响效率。我们有以下两种优化方式:

(1)分级softmax分类器

        利用二分法思想,构建二分查找树,每个子节点都是一个二分类器(比如逻辑回归分类器),这个二分类器会告诉我们词在词表的左半部分还是右半部分,叶子节点即为最终预测的词。通过这种方式,计算成本与词汇表大小的对数成正比,而不是词汇表大小的线性函数。

        值得注意的是,实践中分级softmax分类器并不是完美的平衡二叉树或左右分支词数平相同的对称树。因为对于预测概率比较高的词,比如the、of等等,它们索引的频率高,因此通常构建在二叉树的浅层。而对于不常见的单词,比如durian等等就会构建在二叉树的深层。

(2)负采样

        这个思想来源于Tomas Mikolov,Ilya Sutskever,Kai Chen,Greg Corrado 和 Jeff Dean。(Mikolov T, Sutskever I, Chen K, et al. Distributed Representations of Words and Phrases and their Compositionality[J]. 2013, 26:3111-3119.)

        构造新的监督学习问题:给定一对单词,预测这对词是否是一对上下文词-目标词(context-word)。在“I want a glass of orange juice to go along with my cereal.”这个句子中,orange和juice是一对上下文词-目标词,因此输出为1,即这是正样本。而orange和king这对词,king是从词典中抽取的,并不是一对上下文词-目标词,因此输出为0,是负样本。

        生成多对上下文词-目标词的方式是选择一个上下文词,再选一个目标词(从上下文词的词距内选择),并给定标签为1(正样本),即上图第一行所示。然后选取K次负样本(标签为0),用相同的上下文词orange,再从字典中选取随机的词如king、book、the、of等。

        注意:(1)如果从字典中随机选到的词,正好出现在上下文词词距附近,比如说在上下文词orange前后10个词之内,这种情况下我们也把这对词标记为0,即负样本。(2)K的取值,数据集较小的情况下,K=[5,20]。数据集很大,K=[2,5]。数据集越小K就越大。那么在这个例子中,我们就用K=4。

        定义逻辑回归模型:

        基于逻辑回归模型,我们将sigmoid函数作用于参数向量θ和词嵌入向量e,c表示上下文词,t表示目标词,预测给定的c-t对,y=1的概率。

        比如,输入词是orange(编号6257),输入one-hot向量,再传递给E,通过两者相乘获得嵌入向量e,我们就得到10000个逻辑回归分类问题,但并不是每次迭代都训练10000个逻辑回归分类器,而是只训练其中的5个,要训练对应真正目标词那一个分类器(orange-juice),再训练4个随机选取的负样本。因为我们没有使用10000维度的softmax模型,而把它转变为10000个二分类问题,每个分类器都很容易计算,每次迭代训练它们中的5个(一般而言就是K+1个,其中个K负样本和1个正样本),所以负采样算法计算成本更低。

        注意:如何选取负样本?(1)基于词频进行采样,缺点:像the、of、and诸如此类的词频率很高。(2)用1除以词汇表总词数,均匀且随机地抽取负样本,缺点:单词的分布没有代表性。(3)原文作者Mikolov等人根据经验,用如下公式采样:

        f(wi)即为某个英文词在语料库的词频。这种方式位于方法(1)和(2)两个极端之间,效果不错。

3.GloVe 词向量

        GloVe算法的核心思想是基于词汇共现统计来学习词嵌入,由于利用全局的共现矩阵来训练词向量,而不是仅仅依赖于局部的上下文信息,因此这个算法的全称为global vectors for word representation。(Glove算法的原文:Pennington J, Socher R, Manning C. Glove: Global Vectors for Word Representation[C]// Conference on Empirical Methods in Natural Language Processing. 2014:1532-1543.))

        在此之前,我们曾通过挑选语料库中位置相近的两个词,即上下文词和目标词,GloVe算法做的就是使其关系明确化。具体来说就是统计单词i在单词j上下文中(一定词距内)出现的次数,我们用Xij表示这种关系(共现次数)。通过遍历数据集,我们可以得到Xij。Xij的所有项用矩阵表示,就是GloVe算法的共现矩阵。

        根据定义可以发现,在一定长度的上下文中(比较长),我们会发现Xij=Xji,这是因为在比较长的上下文中,i词出现在j词的上下文,很大可能j词也出现在i词的上下文;而如果上下文长度就是前后1词,那就不会有这样的对称关系了。

        对于GloVe算法的优化目标:

        其中,i相当于目标词t,j相当于上下文词c,平方项的第一项相当于衡量两个单词之间有多少联系,即它预测了词i和词j的共现概率。b是偏置项,用于调整每个词的共现概率。对数项是对共现次数取对数,取对数是因为共现次数的分布往往是长尾的,取对数可以减少极端值的影响。

        注意:整个平方项可以这样理解,当共现次数很多时,我们认为这对词有比较大的联系,此时log项值很大,为了最小化优化目标,就需要预测的共现概率也比较大同时贴近共现次数。

        对于f(Xij),这是一个权重函数,它是一种启发式的函数,可以根据不同的共现次数Xij施加不同的权重,给较少共现的词对赋予更高的权重,以此来平衡数据的分布。考虑一种情况Xij=0,那么log(Xij)就是负无穷,那么就令f(Xij)=0,并规定0log(0)=0。如果是the、of、a和and等高频率的词,就施加较小的权重,即f(Xij)的值小。如果是durion、orange等频率较低的词,f(Xij)的值大。

        还有个可以优化的点是:由于θ和e是对称的,可以将它们颠倒或者将它们进行排序,但实际上都输出了最佳结果。因此可以一致地初始化θ和e,然后使用梯度下降法来最小化目标函数,当每个词w都处理完之后取平均值:

4.理解特征

        假设有空间如右上角所示,第一个轴(编号1)是Gender,第二个轴(编号2)是Royal,这两个轴是正交的(也就是独立的),能够保证的是第一个嵌入向量编号3对应的轴和Gender轴、Royal轴有关系。但是学习算法可能会选择编号3作为第一维的轴,所以给定一些上下文词,第二维也许是编号4轴,它们可能不正交,它也可能是非正交轴编号5。因此在平方项第一项(编号6),如果有某个可逆矩阵A,那么这项就可以简单地替换成:

        我们将其展开:

        发现替换前后两式等价,也就是存在某种线性变换,让我们能将特征按照平行四边形法则进行映射,从而解决问题。即我们不能保证这些用来表示特征的轴能够等同于大家可能简单理解的轴,比如第一个特征可能是个Gender、Roya、Age、Food、Cost和Size的组合,所以很难看出特征的独立组成部分,即嵌入矩阵的单行,然后解释出它的意思。

5.情感分类

        情感分类任务就是通过一段文本,然后分辨这个人在讨论的东西的情感是什么?喜欢or不喜欢、高分or低分等等,这是NLP中最重要的模块之一。情感分类一个最大的挑战就是可能标记的训练集没有那么多,但是有了词嵌入模型,即使只有中等大小的标记的训练集,我们也能构建一个不错的情感分类器,让我们看看是怎么做到的。

        上图所示是一个情感分类问题,输入是一段文本,而输出是预测的相应情感。比如一个餐馆评价的星级,有人说:“The dessert is excellent.”(甜点很棒),并给出了四星的评价;有人说:“Service was quite slow”(服务太慢),两星评价;有人说:“Good for a quick meal but nothing special”(适合吃快餐但没什么亮点),三星评价;还有比较刁钻的评论:“Completely lacking in good taste, good service and good ambiance.”(完全没有好的味道,好的服务,好的氛围),给出一星评价。对于这样的分类问题,我们有两种解决模型:

(1)平均

        假设我们已经在大文本集训练了嵌入矩阵E,那么要做的是将评论转化为词嵌入向量e,通过一个求和或求平均单元,在将计算的结果输入softmax单元,这个单元输出5个可能的概率,分别对应5个星级评价。

        平均值计算单元适用于任意长度的评论,因为即使评论有100个词,我们也可以对这100个词的词嵌入向量求和或者平均,然后得到一个300维的特征向量(假设嵌入矩阵有300个特征),然后把它送进softmax分类器。实际上会把所有单词的意思给平均,或者把所有单词的意思相加。

        但是算法有一个缺点:没考虑词序,像“Completely lacking in good taste, good service, and good ambiance.”,虽然good这个词出现了很多次,有3个good,如果忽略词序,仅把所有单词的词嵌入加起来或平均,最后的特征向量会倾向good的意思,分类器很可能认为这是一个好评,但是事实上这是一个差评,只有一星。

(2)多对一RNN

        用多对一RNN来做情感分类,把每个词的词嵌入向量送进RNN里。RNN的输出在最后一个时间步,用来预测评价。由于RNN模型考虑了词的顺序,比如lacking出现在前,于是模型就会考虑一定的负面评价,对于多次出现的good,不再倾向正面评价,因此效果更好。

        由于词嵌入模型是在一个更大的数据集里训练的,因此训练的模型泛化性更好。比如其他人可能会说:“Completely absent of good taste, good service, and good ambiance.”,即使absent(缺乏的)这个词不在标记的训练集里,但如果是在一亿或一百亿单词集里训练词嵌入,模型仍可以正确判断,并且泛化的很好。


原文地址:https://blog.csdn.net/sniper_fandc/article/details/143667627

免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!