共计 5023 个字符,预计需要花费 13 分钟才能阅读完成。
深度学习根底入门篇[10]:序列模型 - 词示意{One-Hot 编码、Word Embedding、Word2Vec、词向量的一些乏味利用}
在 NLP 畛域,自然语言通常是指以文本的模式存在,然而计算无奈对这些文本数据进行计算,通常须要将这些文本数据转换为一系列的数值进行计算。那么具体怎么做的呢?这里就用到词向量的概念。
个别状况下,当咱们拿到文本数据的时候,会先对文本进行分词,而后将每个单词映射为相应的词向量,最初基于这些词向量进行计算,达到预设工作的成果,下边咱们分如下几节开展介绍词向量相干的常识。
1.One-Hot 编码: 一种简略的单词编码方式
在 NLP 畛域,如何将单词数值化呢,One-Hot 编码就是一种很简略的形式。假如咱们当初有单词数量为 $N$ 的词表,那能够生成一个长度为 $N$ 的向量来示意一个单词,在这个向量中该单词对应的地位数值为 1,其余单词对应的地位数值全副为 0。举例如下:
词典: [queen, king, man, woman, boy, girl]
图 1 one-hot 编码图
假如以后词典中有以上 6 个单词,图 1 展现了其中 4 个单词的 one-hot 编码表示。这个示意是不是挺简略的,然而这种示意形式也有一些不太适合的中央。
首先,在理论利用中词表中单词的数量往往比拟多,高达几十万,甚至百万。这种状况下应用 one-hot 编码的形式示意一个单词,向量维度过长,同时向量会极其稠密。
其次 ,从 图 1 咱们也能够看出向量之间是正交的,向量之间的点积为 0,因而无奈间接通过向量计算的形式来得出单词之间的关系。直观上咱们心愿语义相近的单词之间的间隔比拟近。比方,咱们晓得,“香蕉”和“橘子”更加类似,而“香蕉”和“句子”就没有那么类似,同时,“香蕉”和“食物”,“水果”的类似水平,可能介于“橘子”和“句子之间”。
2.Word Embedding: 一种分布式单词示意形式
前边咱们谈到了 one-hot 编码的缺点,这一节咱们来聊另一种分布式的示意形式:Word Embedding,看他是怎么解决这些问题的。
假如每个单词都能够用 $n$ 个特色进行示意,即能够应用这 $n$ 个特色来刻画每个单词,如 图 2 所示,咱们应用 图 2 中的这 5 个特色来刻画”狗”、”蜈蚣”、”君子兰”和”填空”这几个词。
图 2 单词示意样例
显然,有了这些特色去构建词向量,咱们可能依据这些特色比拟容易地去划分单词的类别,比方”狗”和”蜈蚣”均是动物,在这个角度上说是一类的,他们之间的间隔应该要比”狗”和”君子兰”近。
咱们在回到词向量上来,依照同样的想法,能够应用这 $n$ 个特色来刻画每个单词,并且这 $n$ 个特色是浮点类型的,这样能够拓宽示意范畴。当咱们将视角切换到 $n$ 维空间,那么每个词向量其实就相当于是该 $n$ 维空间的一个点,相当于是将该单词嵌入到该空间中,这也是 Word Embedding 的原始意义。
当然咱们通常是无奈穷举具体的特色类别的,所以在 NLP 畛域个别间接将模型表示为长度为 $n$ 的向量让模型去训练(只是每个向量维度具体代表什么含意是不好去解释的)。但好消息是通过适合的词向量学习算法,是能够比拟好的学习到单词的语义信息的,语义相近的单词之间的间隔会比拟近,语义不同的单词之间间隔会比拟远。
图 3 词向量示意图
图 3 展现了对于词向量的一些例子,当咱们将词向量训练好之后,咱们能够看到 France, England, Italy 等国家之间比拟近,并造成一个小簇;dog, dogs,cat,cats 造成一个小簇。簇内的单词间隔个别会比拟近,不同簇的单词间隔会比拟远。
3.Word2Vec: 一种词向量的训练方法
前边咱们貌似提出了一个对词向量比拟好的冀望,然而如何去学习这些词向量,达到这种成果呢?这就是本节探讨的话题,本节将通过 Word2Vec 为大家解说词向量的训练方法。
简略地讲,Word2Vec 是建模了一个单词预测的工作,通过这个工作来学习词向量。假如有这样一句话Pineapples are spiked and yellow,当初假如 spiked 这个单词被删掉了,当初要预测这个地位本来的单词是什么。
Word2Vec 自身就是在建模这个单词预测工作,当这个单词预测工作训练实现之后,那每个单词对应的词向量也就训练好了。下边咱们来具体看看吧。
3.1 Word2Vec 概述¶
在正式介绍之前,咱们先来科普一下 Word2Vec,Word2vec 是 2013 年被 Mikolov 提出来的词向量训练算法,在论文中作者提到了两种 word2vec 的具体实现形式:间断词袋模型 CBOW和 Skip-gram,如 图 4 所示。
图 4 CBOW 和 Skip-gram 的比照
图 4 中应用了这句话作为例子:Pineapples are spiked and yellow,在这句话中假如中心词是 spiked,这个单词的 上下文 是其余单词:Pineapples are and yellow。
间断词袋模型 CBOW的建模形式是应用上下文单词来预测 spiked 这个单词,当然图片上展现的是 spikey,相当于是预测错了。Skip-gram正好反过来,它是通过中心词来预测上下文。
一般来说,CBOW比 Skip-garm 训练快且更加稳固一些,然而,Skip-garm不会刻意地回避生僻词(即呈现频率比拟低的词),比 CBOW 可能更好地解决生僻词。在本节呢,咱们将以 Skip-garm 的形式探讨词向量的训练过程。
3.2 Skip-gram 训练词向量原理
前边咱们说到,Skip-gram是通过中心词来预测上下文。咱们还是以 Pineapples are spiked and yellow 为例进行解说,如 图 5 所示,中心词是 spiked,上下文是 Pineapples are and yellow,在 Skip-gram 中,上下文是咱们要预测的词,因而这些词也叫指标词。
图 5 Skip-gram 原理图
咱们来看看 Skip-garm 具体是怎么工作的,首先 skip-gram 是应用中心词来预测上下文,即利用 spiked 这个单词来预测 pineapples are and yellow 这 4 个单词,然而训练过程中,这个预测后果很有可能并不是这 4 个单词,然而没关系,咱们会应用这 4 个单词和预测的单词进行计算损失,通过损失的形式将正确的这 4 个单词的信息,应用梯度信息反向流传中心词 spiked,这样在 spiked 单词在下次预测的时候,就会更精确一点。
总结一下,在训练过程中通过梯度的形式,将上下文单词的语义传入到了中心词的示意中,即应用了 spiked 的上下文来训练了 spiked 的词向量。然而咱们来看 spiked,和 prickly 这两个单词,他们的意思都是有刺,多刺的意思,那么实在的文本语料中,他们的上下文大概率也是差不多的,这样通过差不多的上下文去训练这个中心词,那么天然具备雷同语义的词的词向量间隔会比拟近。
3.3 Skip-gram 网络结构
前边咱们提到,Word2Vec 是建模了一个单词预测的工作,通过这个工作来学习词向量。同时呢,Skip-gram 是一种以中心词预测上下文的形式进行的,那咱们来看看它的网络结构长什么样子,如 图 6 所示。
图 6 Skip-gram 网络结构
Skip-gram的网络结构共蕴含三层:输出层,暗藏层和输入层。它的解决步骤是这样的:
- 输出层接管 shape 为 $[1,V]$ 的 one-hot 向量 $x$,其中 $V$ 代表词表中单词的数量,这个 one-hot 向量就是上边提到的中心词。
- 暗藏层蕴含一个 shape 为 $[V,N]$ 的参数矩阵 $W_1$,其中这个 $N$ 代表词向量的维度,$W_1$ 就是 word embedding 矩阵,即咱们要学习的词向量。将输出的 one-hot 向量 $x$ 与 $W_1$ 相乘,便可失去一个 shape 为 $[1, N]$ 的向量,即该输出单词对应的词向量 $e$。
- 输入层蕴含一个 shape 为 $[N,V]$ 的参数矩阵 $W_2$,将暗藏层输入的 $e$ 与 $W_2$ 相乘,便能够失去 shape 为 $[1,V]$ 的向量 $r$,外部的数值别离代表每个候选词的打分,应用 softmax 函数,对这些打分进行归一化,即失去中心词的预测各个单词的概率。
这是一种比拟 现实的 实现形式,然而这里有两个问题:
- 这个输出向量是个 one-hot 编码的形式,只有一个元素为 1,其余全是 0,是个极其稠密的向量,假如它第 2 个地位为 1,它和 word embedding 相乘,便可取得 word embedding 矩阵的第二行的数据。那么咱们晓得这个法则,间接通过访存的形式间接获取就能够了,不须要进行矩阵相乘。
- 在获取了输出单词对应的词向量 $e$ 后,它是一个 $[1,N]$ 向量。接下来,会应用这个向量和另外一个大的矩阵 $W_2$ 进行相乘,最终会取得一个 1 * V 的向量,而后对这个向量进行 softmax,能够看到这个向量具备词表的长度,对这么长的向量进行 softmax 自身也是一个极其耗费资源的事件。
第 1 个问题解决起来比较简单,咱们次要来看第 2 个问题,那怎么解决呢?直观的想法是咱们不要去生成这么多的类别,所以采纳了一个负采样的策略,将海量分类转化成了二分类,来缓解这个问题,下咱们来看看它具体是怎么做的。
3.4 负采样解决大规模分类问题
图 7 应用负采样策略训练 Skip-gram 模型
还是以 Pineapples are spiked and yellow 为例进行解说,如 图 7 所示,其中中心词是 spiked 和上下文词是正样本 Pineapples are and yellow,这里这个正样本代表该词是中心词的上下文。
以正样本单词 Pineapples 为例,之前的做法 是在应用 softmax 学习时,须要最大化 Pineapples 的推理概率,同时最小化其余词表中词的推理概率。之所以计算迟缓,是因为须要对词表中的所有词都计算一遍。然而 咱们还能够应用另一种办法,就是随机从词表中抉择几个代表词,通过最小化这几个代表词的概率,去 近似 最小化整体的预测概率。
例如,先指定一个中心词(spiked)和一个指标词正样本(Pineapples),再随机在词表中采样几个指标词负样本(如”dog,house”等)。
有了这些正负样本,咱们的 skip-gram 模型就变成了一个二分类工作。对于指标词正样本,咱们须要最大化它的预测概率;对于指标词负样本,咱们须要最小化它的预测概率。通过这种形式,咱们就能够实现计算减速。这个做法就是 负采样。
咱们再回到 图 7 看一看整体的训练流程是怎么样的。图 7 中相当于有两个词向量矩阵:黄色的和灰色的,他们的 shape 都是一样的。整体的流程大略是这样的。
- 获取中心词 spiked 的正负样本(正负样本是指标词),这里个别会设定个固定的窗口,比方中心词前后 3 个词算是中心词的上下文(即正样本);
- 获取对应词的词向量,其中中心词从黄色的向量矩阵中获取词向量,指标词从灰色的向量矩阵中获取词向量。
- 将中心词和指标词的词向量进行点积并通过 sigmoid 函数,咱们晓得 sigmoid 是能够用于 2 分类的函数,通过这种形式来预测中心词和指标词是否具备上下文关系。
- 将预测的后果和标签应用穿插熵计算损失值,并计算梯度进行反向迭代,优化参数。
通过这个训练的形式,咱们就能够训练出咱们想要的词向量,但 图 7 中蕴含两个词向量矩阵(黄色的和灰色的),个别是将中心词对应的词向量矩阵 (黄色的) 作为正式训练出的词向量。看到这里我想你曾经明确 Skip-gram 大抵是如何训练词向量了。
4. 对于词向量的一些乏味利用
前边几节咱们提到,对词向量的冀望是具备雷同语义的词之间的间隔比拟近,不同语义的词之间的间隔比拟远。那么在词向量训练实现之后,咱们能够基于这个冀望去试验一些乏味的利用,也相当于是验证词向量学习的好坏。
4.1 类似度计算
咱们能够去开掘某个单词的同义词,行将一个单词的词向量和其余所有单词词向量进行间隔计算,间隔最小的那些词就是和该单词语义相近的,例如:
- nice: good, great, wonderful
- dog: dogs, puppy
4.2 词聚类
依据各个单词的词向量,能够执行词聚类的算法,这样能够挖掘出一批语义相近的单词,例如:
- Beijing, Washington, Paris, Berlin
- slow, slowser, slowest
4.3 词关系推理
这是比拟乏味的一个利用,通过词语义上的一些关系来进行推理一些词,例如上面几个例子。
- King – Man + Woman = Queen
- China – Beijing + Washington = America