词嵌入

一、词嵌入背景

词嵌入(Word Embedding)是一种将文本中的词转换成数字向量的方法,为了使用标准机器学习算法来对它们进行分析,就需要把这些被转换成数字的向量以数字形式作为输入。词嵌入过程就是把一个维数为所有词数量的高维空间嵌入到一个维数低得多的连续向量空间中,每个单词或词组被映射为实数域上的向量,词嵌入的结果就生成了词向量。

词向量是各种NLP任务中文本向量化的首选技术,如词性标注、命名实体识别、文本分类、文档聚类、情感分析、文档生成、问答系统等。

二、词嵌入方法介绍

1.One-hot编码

One-hot编码(被称为独热码或独热编码)的词向量。One-hot编码是最基本的向量方法。One-hot编码通过词汇大小的向量表示文本中的词,其中只有对应于该词的项是1而所有其他的项都是零。

One-hot编码的主要问题是不能表示词之间的相似性。在任何给定的语料库中,我们会期望诸如(猫、狗)之类的词具有一些相似性,使用点积计算向量之间的相似性。点积是向量元素乘法的总和。在One-hot编码中,语料库中任何两个词之间的点积总是为零。

2.信息检索(IR)技术

为了克服One-hot编码的局限性,NLP领域借用了信心检索 (IR)技术,使用文档作为上下文来对文本进行矢量化。比如TF-IDF,LSA和主题建模。

3.分布式表示

分布式表示的目的是找到一个变换函数,以便将每个词转换为其相关的向量。换句话说,分布是表示就是将词转化成向量,其中向量之间的相似性与词之间的语义相似性相关。

分布式假说。上下文中相似的词其语义也相似,这样一来,我们可以把信息分布式存储在向量的各个维度中,这种分布式表示方法具有紧密低维、句法和语义信息容易获取的特点。

基于分布式假说,根据建模不同,大体可以分为三类:基于矩阵分布表示,基于聚类的分布表示和基于神经网络的分布表示。他们的核心思想由两部分组成:1.选择一种方法描述该词的下上文;2.选择一种模式刻画某个词(“目标词”)与其上下文的关系。

(a)基于矩阵的分布表示

基于矩阵的分布表示主要是构建“词-上下文”矩阵,通过某种技术从该矩阵中获取词的分布表示,矩阵的行表示打词,列表示上下文,每个元素表示某个词和上下文共现的次数。这样矩阵的一行就描述了该词的上下文分布情况。

常见的上下文有:1.文档:即“词-文档“矩阵;2.上下文的每个词:即“词-词”矩阵;3.n-元词组,即“词-n-元组”矩阵。矩阵中每个元素为词和上下文共现次数,通常会采用TF-IDF、取对数等方法进行加权平滑。另外,矩阵的维度教高并且非常稀疏的话,可以通过SVD等手段进行姜维,变为较低稠密矩阵。

(b)基于聚类的分布表示

通过聚类手段构建词语上下文之间的关系,代表模型为布朗聚类(Brown Clustering)

(c)基于神经网络的分布表示

  1. 基于神经网络语言模型
  2. 循环神经网络语言模型
  3. C&W模型
  4. 著名的Word2Vec‘’
    (1). skip-gram
    (2). CBOW(continuous Bags-of-Words)

三、Word2vec算法

Word2vec是一种开创性的方法,可以在没有任何人干预的情况下学习单词的含义。此外,Word2vec通过查看给定单词周围的单词来学习单词的数字表示。

Word2vec通过查看单词上下文并以数字方式表示它,来学习给定单词的含义。所谓“上下文”,指的是感兴趣的单词的前面和后面固定数量的单词。假设我们有一个包含N个单词的语料库,在数学上,这可以由以w_o,w_1,\dots,w_i,\dots,w_N来表示,其中w_i是语料库中的第i个单词。

接下来,我们想找到一个能够学习单词含义的好算法,那么,在给定一个单词之后,我们的算法应该能够正确地预测上下文单词。这意味着对于任何给定的单词w_i,以下的概率应该较高。

P(w_{i-m},\dots,w_{i-1},w_{i+1},\dots,w_{i+m}|w_i)=\prod_{j\ne i,j=1-m}^{i+m}P(w_j|w_i)
为了等到等式右边成立,我们需要假设给定目标单词w_i的上下文单词彼此独立,虽然不完全成立,但这种近似使得学习问题贴合实际,并且在实际中效果很好

1.Skip-gram算法

该算法是一种利用文本单词的上下文来学习好的词嵌入的算法,首先我们将讨论数据准备过程,然后介绍理解算法所需要的表示法,最后,我们将讨论算法本身。

(1)从原始文本到结构化的数据

首先,无票需要设计一种方法来提取可以送入学习模型的数据集,这样的数据集应该是格式为(输入,输出)这样的一组二元组,而且,这需要以无监督的方式创建。也就是说,人们不应该手动设置数据的标签,总之,数据准备过程应该执行以下操作:

  • 获取给定的单词的周围单词
  • 以无监督的方式执行
    skip-gram模型使用以下方法来构建数据集:
  1. 对于给定的单词w_i,假设上下文窗口大小为m。长下文窗口大小,指的是单侧被视为上下文的单词数。因此,对于w_i,上下文窗口(包含目标词w_i)的大小为2m+1,
  2. 接下来,输入输出元组为[\dots,(w_i,w_{i-m}),\dots,(w_i,w_{i+1}),\dots,(w_i,w_{i+m}),\dots],这里m+1 \le i \le N-m,N是文本中用于获得实际含义的单词数。

让我们假设一下句子和上下文窗口大小m为1:
The dog barked at the mailman
对于此示例,数据集将如下表示:
[(dog,the),(dog,barked),(barked,dog),(barked,at),\dots,(the,at),(the,mailman)]

(2)使用神经网络学习词嵌入

一旦数据是(输入,输出)格式,我们就可以使用神经网络来学习词嵌入。首先,让我们确定学习词嵌入所需的变量。为了存储词嵌入,我们需要一个V*D矩阵,其中V是次汇量大小,D是词嵌入的维度(即向量中表示单个单词的元素数量)。D是用户定义的超参数,D越大,学习到的词嵌入表达力跃迁。该矩阵将称为嵌入空间或嵌入层。

接下来,我们有一个softmax层,其权重大小为D*V,偏置大小为V。
每个词将被表示为大小为V的独热编码向量,其中一个元素为1,所有其他元素为0。因此,输入单词和相应的输出单词各自的大小为V,让我们把第i个输入记为x_ix_i的对应嵌入记为z_i,对应的输出为y_i

此时,我们定义了所需的变量。接下来,对于每个输入x_i,我们将从对应于输入的嵌入层中找到嵌入向量。该操作为我们提供z_i,它是大小为D的向量(即长度为D的嵌入向量),然后,我们做提下转换以计算x_i的预测输出
\begin{aligned} logit(x_i)=z_iW+b\\ \hat y_i =softmax(logit(x_i)) \end{aligned}
这里,logit(x_i)表示非标准化分数(即logits),\hat y_i是V大小的预测输出(表示输出是V大小的词汇表的单词的概率)。W是DV权重矩阵,b是V1偏置矢量,softmax是softmax激活。我们将可视化skip-gram模型的概念

  • V是词汇量大小
  • D是嵌入层的维度
  • x_i表示定i个输入单词,表示独热编码向量
  • z_i是与第i个输入单词对应的嵌入向量
  • y_i是与x_i对应输出单词的独热编码向量
  • \hat y_i表示x_i的预测输出
  • logit(x_i)输入x_i的非标准化得分
  • \prod_{wj}是单词w_j的独热码表示
  • W是softmax权重矩阵
  • b是softmax的偏置
    通过使用现有单词和计数得到的实体,我们可以使用符对数似然损失函数来计算给定数据点(x_i,y+i)的损失。

(3)制定实际的损失函数

我们得出的损失函数如下:
J(\theta)=-(\frac{1}{N-2m})\sum_{i=m+1}^{N-m}\sum_{j\ne i,j=i-m}^{i+m}logP(w_j|w_i)
但是根据目前掌握的信息,计算这一特定损失并不很容易。

首先,让我们理解P(w_j|w_i)代表什么。为此,我们将从单词表示法转为单个数据点表示。也就是说,我们会说P(w_j|w_i)由第n个数据点给出,其中w_i的独热编码向量作为输入x_nw_j#的独热编码表示作为真实输出y_n$,这由等式给出
P(w_j|w_i)=\frac{exp(logit(x_n)_{w_j})}{\sum_{w_k \in vocabulary} exp(logit(x_n)_{w_k})}

logit(x_n)表示给定输入x_n获得的非标准化预测得分(即logit)向量(V大小),而logit(x_n)_{w_j}w_j的独热编码中非零的索引所对应的得分值(从现在开始,我们称之为w_j的索引)。然后,我们将w_j索引处的logit值相对于整个词汇表中所有单词所对应的所有logit非标准化。这种特定类型的归一化成为softmax激活(或归一化)。现在,我们通过将其转化成对数空间,我们得到以下等式
J(\theta)=-(\frac{1}{N-2m})\sum_{i=m+1}^{N-m}\sum_{j\ne i,j=i-m}^{i+m}logit(x_n)_{w_j}-log\bigg(\sum_{w_k in vocabulary}exp(logit(x_n)_{w_k})\bigg)

从实际角度来看,该损失函数的目标是,使预测给定单词的上下文单词的概率最大化,同时使预测给出单词的“所有”非上下文单词的概率最小化。

(4)有效的损失函数

上面实际的损失函数,将不可避免地面对算法执行得非常缓慢的问题,这种缓慢是由于词汇量大而导致的性能瓶颈。上面实际的损失函数需要计算词汇表中所有单词的logit,与通过数百个输出类别就足以解决大多数现有的真实问题的计算机视觉不同,skip-gram并不剧本这些特性。因此,我们需要在不失去模型效果的前提下寻找有效的损失近似方案。

  • 负采样
  • 多层softmax
(a)对softmax层进行负采样

负采样是对噪声对比估计(NCE)方法的近似。NCE要求,一个好的模型应该通过逻辑回归来区分数据和噪声。

考虑到这个属性,让我们重新设计学习词嵌入的目标。我们不需要完全概率模型,该模型对给定单词给出词汇表中所有单词的确切概率。我们需要的是高质量的词向量。因此,我们可以简化我们的问题,将其变成区分实际数据(即输入输出对)与噪声(即K个虚拟噪声输入输出对)。噪声指的是使用不属于给定单词的上下文的单词所创建的错误输入输出对。我们还将摆脱softmax激活层,并将其替换成sigmoid激活(也称为逻辑函数)。这使得我们能够使输出保持在[0,1]之间的同时,消除损失对完整词表的依赖。

经过一些简化后,我们得出以下等式
J(\theta)=-(\frac{1}{N})\sum_{i=m+1}^{N-m}\sum_{j\ne i,j=i-m}(\sigma(logit(x_n)_{w_j}))+\sum_{q=1}^k E_{w_q \tilde vocabulary-(w_i,w_j)}log(\sigma(-logit(x_n)_{w_q}))

这里w_j表示w_i的上下文单词,w_q表示其非上下文单词。这个等式基本上说的是,为了使J(\theta)最小化,我们应该使\sigma(logit(x_n)_{w_i}) \approx 1,这意味着logit(x_n)_{w_j}需要一个很大的正值,然后\sigma(-logit(x_n)_{w_q}) \approx 1需要一个大的负值。换句话说,对应表示真实单词和上下文的真实数据点应该获得大的正值,而表示目标单词和噪声的伪数据点应该获得大的负值,这与softmax函数获得的效果相同,但具有很高的计算概率。

这里\sigma表示sigmoid激活函数。直观地看,在计算损失的时候,我们做了如下2步:

  • 计算w_j的非零列的损失(推向正值)
  • 计算K各噪声样本的损失(拉向负值)
(b)分层softmax

分层softmax比负采样略复杂,但与负采样的目标相同,也就是说,近似softmax而不必计训练样本的词汇表所有单词的激活状态。但是,与负采样不同,分层softmax仅使用实际数据,并且不需要噪声采样。

要了解分层softmax,让我们考虑一个例子:
I like NNP.Deep learning is amazing.
其词汇表如下:
I,like,NLP,learning,is,amazing

使用词汇表,构建二叉树,其中,词汇表中所有单词以叶节点的形式出现,我们还将添加一个特殊的标记PAD,以确保所有叶结点都有两个成员。

然后,最后一个隐藏层将完全连接到分层结构中的所有节点,注意,与经典的softmax层相比,该模型具相似的总权重,但是对于给定的计算,它仅使用其中一部分。

假如我们要推断P(NLP|like)的概率,其中like是输入词,那么我们只需要权重的子集即可计算。

具体地,以下是概率计算的过程
(NLP|like)=P(left at 1|like)p(right at 2|like)p(left at 5|like)
现在,我们知道如何计算P(w_j|w_i),我们可以使用原始的损失函数
注意,该方法仅使用连接到路径中的节点的权重进行计算,从而提高了计算效率

学习分层结构:
我们如何确定树的分支?更准确地说,哪个词会跟随哪个分支?有几种方法可以实现这一目标
* 随机初始化层次结构:词方法确实存在一些性能下降,因为随机分配无法保证单词之间是最佳分支
* 使用wordNet确定层次结构:WordNet可用于确定树中单词的合适顺序,该方法明显比随机初始化有更好的性能。

2.连续词袋算法(CBOW)

在skip-gram模型中,我们从目标单词预测上下文单词。在CBOW模型中,我们将从上下文单词预测目标单词。让我们通过前面的例句来比较skipgram和CBOW的数。
The dog barked at the mailam
对于skip-gram,数据元组(即(输入词,输出词))可能如下所示
(dog,the),(dog,barked),(barked,dog),等等
对于CBOW,数据元组如下所示
([the,barked],dog,([dog,at],barked),等等
因此CBOW的输入具有2md的维度,其中m是上下文窗口大小,D是嵌入的维度。

3.比较skip-gram算法和CBOW

在给定一批数据中,对于给定单词的上下文,CBOW接受的信息多于skip-gram。与skip-gram相比,CBOW模型在给定时间可以访问更多信息(输入),从而允许CBOW在某些条件下执行得更好。与skip-gram相比,CBOW损失快速下降。

skip-gram在语义任务中表现更好,而CBOW在句法任务中的表现更好。与CBOW相比,skip-gram更适用于大型数据集,我们的任务只涉及相对较小的数十万字,CBOW可能表现更好。因为skip-gram,单词之间分开,更多关注单词之间的细微差别,CBOW根据语义,会认为近义词之间没有差别,对给定上下文的所有单词进行平均。

4.词嵌入扩展

(1)使用Unigram分布进行负采样

人们已经发现,当从某些分布而不是均匀分布进行采样时,负采样的性能结果更好。一种这样的分布是Unigram分布,单词w_i的unigram概率由以下等式给出
U(w_i) = \frac{count(w_i)}{\sum_{j in Corpus}count(w_j)}
这里,count(w_i)w_i出现在文档中的次数。对于某个常数Z,当unigram分布变形为U(w_i)^{\frac{3}{4}}/Z,可以比均匀分布或标准unigram分布有更好的性能。

(2)降采样:从概率上忽视常用词

降采样(即忽略常用词)被证明也可以提供更好的性能。可以这样直观地理解----从有限上下文(the,france)提取的输入输出单词提供的信息少于元组(paris,france),因此,相比于直接采样,忽略像the这种从语料库中会被频繁采样的无信息词(即停用词)是更好的选择。

在数学上,可以使用概率实现语料库的单词序列中的单词w_i
1-\sqrt{\frac{t}{f(w_i)}}
这里t是一个常数,它控制忽略单词的词频阈值,f(w_i)是语料库中w_i的词频。

5.Glove:全局向量表示

Word2vec技术在捕获单词语义方面非常强大,但是它并非没有限制,例如,它不关心上下文单词语目标单词之间的距离。然而,如果上下文单词离目标单词比较远,那么它对目标单词的影响应该更小。

学习词向量的方法有两类:基于全局分解的方法或者基于局部上下文窗口的方法。潜在语义分析(LSA)是基于全局矩阵分解的方法的例子,而skip-gram和CBOW是基于局部上下文窗口的方法。LSA用文档分析技术,它将文档中的单词映射到被称为概念的对象上,这是一种文档中出现的常见单词模式。基于全局矩阵分解的方法有效地利用了语料库的全局统计信息(比如全局范围内的单词的重复出现),但它在单词类比任务中表现不佳。另一方面,已经证明基于上下文窗口的方法在单词类比任务中表现更好。但是,因为没有利用语料库中的全局统计信息,所以留下了改进空间。Glove试图充分利用这两方面,该方法试图有效利用全局语料库统计数据,同时类似于skip-gram或CBOW这种基于上下文窗口的方式来优化学习模型

(1)理解Glove

对于Glove模型而言,其主要目标是将词进行向量化表示,以便使各个向量之间能够尽可能多地涵盖语境内的语义和语法信息。通过输入语料库而输出词向量。实现方法为:首先基于整个语料库构建词的共现矩阵,然后基于共现矩阵和Glove模型处理学习词向量。

任意词之间的关系都可以通过研究它们的共现概率与多个探测词之间的比例来检测,且词向量学习的合理起点应该是贡现概率的比例,而非概率本身。
F((w_i-w_j)^Tw_k)=\frac{P_{ik}}{P_{jk}}

(2)共现矩阵

设共现矩阵为X,其元素为X_{(i,j)},这里,X_{(i,j)}是指整个语料库中词i和词j共同出现在一个窗口中的次数。

(3)使用Glove模型训练词向量

我们假设i=dog,j=cat,且给出体格探测词k,那么可以定义P_{ik}为词i和词k在一起出现的概率,P_{jk}为词j和词k一起出现的概率。这时,对于k=bark,它很可能与i一起初夏,因此P_{ik}会很高,然而,k不会经常与j一起出现则导致P_{jk}低。因此P_{ik}/P_{jk} >> 1

如果k=whiz,那么它不太可能出现在i附近,因此具有低的P_{ik},但由于k与j高度相关,因此P_{jk}的值很高,所以,P_{ik}/P_{jk} \approx 1

如果k=pet,那么它与i和j都有很强的关系,或者k=lawyer,其中i和j两者都有很小的相关性,我们可以得到,P_{ik}/P_{jk} \approx 1

由此我们可以得知,通过统计彼此相近两个词的频数可以统计其对应共现概率P_{ik},P_{jk},进而可以得到两者的比率与1的关系,最终可以得到词之间的关系情况,所以,P_{ik}/P_{jk}就可以成为学习词向量的重要方法,下面给出最通用的表现形式
F((w_i,w_j)^Tw_K)=\frac{P_{ik}}{P_{jk}}

经过一系列推导,我们最终会得到损失函数
J = \sum_{i,j=1}^V f(X_{ij})(W_i^T \hat{W_j}+b_i+\hat{b_j}-log X_{ij})^2

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

推荐阅读更多精彩内容