第八周:深度学习基础

目录

摘要

Abstract

1. 独热编码

2. 词嵌入(embeding)

2.1 词嵌入的表示 

 2.2 词嵌入的特性

2.3 嵌入矩阵

 2.4 学习词嵌入

2.5 word2vec    

总结


摘要

本文探讨了自然语言处理领域中的一种先进有效的词表示方法——词嵌入,并分析了其关键特性:类比推理能力。在词嵌入的基础上,文章介绍了嵌入矩阵,并介绍了几种算法来说明如何学习嵌入矩阵。在文末,重点介绍了用 Skip-Gram 模型来学习嵌入矩阵的方法,还分析了其不足之处, 同时简要介绍了一种改进方案,即采用分级softmax分类器来优化模型性能。

Abstract

This article explores an advanced and effective word representation method in the field of natural language processing—word embedding—and analyzes its key characteristic: the ability for analogical reasoning. Building on the concept of word embedding, the article introduces the embedding matrix and presents several algorithms to illustrate how to learn this matrix. Towards the end, the article focuses on the method of using the Skip-Gram model to learn the embedding matrix, analyzes its shortcomings, and briefly introduces an improvement plan, namely the use of a hierarchical softmax classifier to optimize model performance.

1. 独热编码

在前面学习的循环神经网络中,使用的都是独热编码。独热编码就是在一个向量里只有一个元素为“1”,其余元素都是“0”。例如,现在有一个长度为10000的词汇表,每个单词(单词出现在词汇表里面)在词汇表里面都有一个位置,在对这个单词进行独热编码时,相当于对新建一个单词表向量,再进行单词标记,显然,标记的结果只有一个“1”,其在单词向量中的位置与其在单词表中的位置相同,而单词向量的其他位置都是“0” 。具体例子如下图,Man在单词表中的位置为5791,所以其对应的独热编码向量中,只有5791的位置上的元素“1”,其余元素都是“0”。

但这种编码将每个单词都孤立了,即单词之间的关系没有体现出来,因为每个单词的向量与其他单词向量都是完全不同的,内积都是0 。但在实际任务中,单词间的关系是很有用处的,比如,当模型已经学习到了下面的第一句话中应该在空白处填写“juice”,想让模型通过学习到的知识预测第二句话的空白处,但独热编码中“orange”与“Apple”毫无关系,只能进行重新学习。

 独热编码有两个缺点:

  1. 浪费空间和计算资源,每个独热编码向量均只有一个元素为“1”而其余元素是“0”,这所花费的数据空间远超能区分每个单词所花费的空间,所以在实际任务中,独热编码会消耗大量不必要的存储空间和计算资源。
  2. 无法表达语义信息,One-hot编码无法捕捉词汇之间的语义关系,每个词的向量表示都是孤立的,缺乏关联性。

2. 词嵌入(embeding)

  • 词嵌入(Word Embedding)是自然语言处理(NLP)中的一种技术,它将单词从离散的符号表示转换为连续的向量表示。简单来说,就是把每个单词映射到一个低维实数向量空间中,使得语义相近的单词在这个向量空间中的距离更近。

2.1 词嵌入的表示 

与独热编码不同,词嵌入是采用特征化的形式来表示每个单词。对于每个单词,需要学习其多个特征。

例如,上图中,“Man”在性别特征上的值为“-1”,而“Women”为‘1’,“Apple”和‘orange’的取值几乎为‘0’,取值的绝对值越大,代表单词与该特征的关系越大,取值越接近‘0’,表示单词与该特征的关系越小。再举个例子,“Man”和“Women”在age特征上的值接近‘0’,而“King”和“Queen”在age上的值接近“1”,是因为“Women”和“Man”不看年龄,所以基本无关;而“King”和“Queen”一般都是成年的,所以其在age上的取值较大。

有了特征表示之后,就可以用每个单词在各个特征上的取值来组成向量,这种方式就是词嵌入。实际上,词嵌入所采用的特征和每个单词在每个特征上的取值并不是人为指定的,而是模型训练出来的,所以很难说明词嵌入的特征具体表示的是什么,但却很容易地能够知道两个单词之间关联的强弱。词嵌入得到的单词向量的表示称为词向量。

若使用 t-SNE 算法来对以上 300 维词向量映射到二维中,可以发现关联性强的单词的距离近。这也意味着在词向量空间中,概念上越相似的单词,距离越近。

 2.2 词嵌入的特性

词嵌入的最重要的特性就是具有类比推理特性。

假设现在只考虑几个单词和几个特征,如下图所示:

每个单词都能用词向量表示,那么,“Man”与“Women”的关系相似与“King”与哪个单词的关系呢?

 这就是词向量的类比推理思想,下面将这种思想表示成算法:

 在词向量空间中(这里的例子为300维),“Man”和“Women”之间的的差距(是一个向量)与“King”和“Queen”之间的差距(向量)在理想情况下是一样的,从向量角度就是两个差距向量是平行且长度相等的。

词嵌入可以学习类比推理

 只要在一个大型的文本库上实现词嵌入算法,就能从大量的文本中自主学习这些类比机制。

2.3 嵌入矩阵

当运用算法来学习词嵌入时,实际上是学习一个嵌入矩阵。

假设字典有10000个单词,词嵌入考虑300个特征,要学习词嵌入,就要对所有字典的单词都进行学习,而不是单单对某些或某个单词进行学习。此时要学习的词嵌入矩阵的维度就是300*10000,记为矩阵 E,实际上嵌入矩阵的每一列都是对应单词的词嵌入向量,每个词嵌入向量都是300维。

嵌入矩阵乘某单词对应的独热编码向量,其结果就是该单词对应的词嵌入向量,也就是嵌入矩阵中该单词对应的一列,学习词嵌入的目标就是学习词嵌入矩阵中的每一个元素的取值。在实践中,有函数来取出矩阵中的某一列,而不需进行冗余极大的矩阵乘独热编码向量的计算。

 2.4 学习词嵌入

本小节会介绍具体的算法来学习词嵌入。在深度学习应用于学习词嵌入的历史上,人们一开始使用的算法比较复杂,但后来研究者们发现,即使使用简单的算法也能达到一样好的效果,特别是在数据集很大的情况下。现在为了更好地理解,从较复杂的算法开始。

假设模型的输入为:“I want a glass of orange ___.”,网络的目标就是预测下一个词。

将每个单词的词向量都送入神经网络,这里假设词向量的长度为30,6个单词的词向量长度就是1800,经过隐藏层后再经过softmax层,softmax分类器会在10000个可能的输出中(字典中含10000个单词)给出最可能的输出来预测结尾的单词。网络中的隐藏层和softmax层都有自己的参数。

但是输入的长度是可变的,实际上更常见的是用一个固定的历史窗口。

例如,只用结尾之前的四个单词来对结尾进行预测,所以网络的输入大小就固定为1200,接下来的方法和上面的一样。这种固定历史窗口的方法中,窗口大小是可变的,是一个超参数,这种方法的好处是可以处理任意长度的句子,因为其网络输入的维度是固定的。通过训练数据的不断训练,可以更新嵌入矩阵和神经网络的参数。接下来看几种更简单的方法。

将需要预测的词称为“目标词”,如果要建立一个语言模型,那么一般选取目标词之前的几个词作为上下文。但如果目标不是学习语言模型本身的话,那么可以选择其他的上下文。

比如可以用目标词的前四个单词来预测目标词、用目标词的前后各四个单词来预测目标词,也可以简单的用目标词前的一个单词或者目标词附近的某个单词对目标词进行预测。其中用目标词附近的某个单词预测目标词,用的是skip-gram思想,其上下文很简单,但是这种算法依然有效。    

2.5 word2vec    

Word2Vec算法是用来学习词嵌入矩阵的一种简单而且计算时更加高效的方式。

假设在训练集中给定了一个这样的句子:“I want a glass of orange juice to go along with my cereal.”,在Skip-Gram模型中,我们要做的是抽取上下文和目标词配对,来构造一个监督学习问题。上下文不一定是目标单词离得最近的n个单词。随机选取一个词作为上下文,如选取orange,然后随机在一定词距内选另一个词。如此,可以构造一个监督学习问题,它给定上下文词,要求预测在某个固定的词距内随机选择的某个目标词。这并不是个简单的学习问题,因为在词距内可能有很多不同的单词,但构造这个监督学习问题的目标并不是想要解决监督问题本身,而是想使用这个学习问题来学到一个好的词嵌入模型。

下面用例子来说明模型的细节。假设词表的长度为10000,选取的上下文记为 c,目标词记为 t ,假如当前的上下文为 orange,目标词为 juice ,在词汇表中,orange是第6257个单词,juice是第4834个。

将上下文词嵌入向量(初始的)输入到softmax单元,得到输出 \hat{y}, \hat{y} 是10000维的向量,这个向量是所有可能目标词的概率,其元素的具体值计算如下:

 其中,位于底数位置的 e 就是数值的意思,而位于指数上的 e_{c} 表示的是上下文的词嵌入向量,另外,\theta _{t} 是一个与输出 t 有关的参数,反映单词 t 与标签相符的概率大小。

将目标词用其独热编码向量表示,记为 y ,则损失函数为:

 这是个交叉熵损失,可以反映向量的差别大小。

词嵌入矩阵有对应所有嵌入向量的参数,softmax单元也有的参数。如果优化这个关于所有参数的损失函数,就会得到一个较好的嵌入向量集,这个就叫做Skip-Gram模型。它把一个像orange这样的词作为输入,并预测这个输入词,从左数或从右数的某个词,预测上下文词的前面一些或者后面一些是什么词。

但实际上这种算法有个问题,就是在用 softmax 来计算 \hat{y} 时分母求和操作需要大量的累加运算,需要累加的数的数目与词汇表长度一致,实际上的词汇表都是很大的,这就导致其计算速度很慢。

针对这一问题有两个解决方案:分级的softmax分类器和负采样

分级的softmax分类器不是一次就找到预测的词,而是分多次寻找。分级的softmax分类器的输出是一个哈夫曼树,目标词的分类器的寻找是从根节点分类器开始的,逐层往下寻找,树的内部的每个节点都可以是一个二分类器,所以不需要对每个单词的概率进行求和。实际上这种分类树的计算成本与词汇表大小的对数成正比。

实际上,分级的 softmax 分类器通常不会用一个平衡的哈夫曼树,其构造通常将常用词放在离根部近的位置,而不常用词放在较深的节点,这也是哈夫曼树的思想,这样做可以加快总体的查找速度。

总结

本周主要学习了深度学习在自然语言处理领域中词汇的表示方法,理解了词嵌入向量和词嵌入矩阵的含义和方便性,词嵌入矩阵并不是自己定义的,而是通过学习得来的,词嵌入矩阵其实就是词表中每个单词的词嵌入向量结合而成的矩阵。意思相近的词在词嵌入向量上的相似度越高,这也是词嵌入方法具有类比推理能力的原因。本周还学习了词嵌入矩阵的几种算法,在直观上理解了词嵌入矩阵是如何进行学习的,下周将继续对词嵌入进行深入的学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值