首页 > 其他分享 >word2vec

word2vec

时间:2022-10-06 12:55:31浏览次数:49  
标签:中心词 word2vec tensor 张量 batch 向量 size

词嵌入

深度学习的本质是对数字的学习,机器无法直接处理文本字符串,这要求我们先将文本转换为数字,然后继续执行后续的任务。这里介绍两种词嵌入的方法


1、独热嵌入(one-hot embedding)

根据所要处理的文本字符串信息创建一个词库表,从0开始为词库中的每一个词依次编号。比如词库中有1000个词,“我”这个词在词库中的位置是第123个,那么“我”用独热向量便表示为一个1×1000维的向量,其中第123维是1,其余位置均为0。
这是自然语言处理算法中最常见的第一步,其能够清晰的表示每一个词。但其缺点也显而易见,一是若用该方法表示一段文本,矩阵会非常稀疏,二是随着词量的增加,会造成维度爆炸问题,三是这种方法无法表示不同词之间的相互关系,存在语义鸿沟。


2、词向量嵌入(Word2Vec Embedding)

词向量嵌入是用一个一层的线性神经网络将N维独热形式的稀疏向量映射为一个M维的稠密向量的过程。
其有两种语言模型
Skip-gram模型:用一个词作为输入,预测它周围的上下文。
CBOW模型:用一个词的上下文作为输入,来预测该词语本身。

我们以这句话:“Pineapples are spiked and yellow”为例分别介绍CBOW和Skip-gram的算法实现。

如图1所示,CBOW是一个具有3层结构的神经网络,分别是:

图1:CBOW的算法实现

 

    输入层: 一个形状为C×V的one-hot张量,其中C代表上线文中词的个数,通常是一个偶数,我们假设为4;V表示词表大小,我们假设为5000,该张量的每一行都是一个上下文词的one-hot向量表示,比如“Pineapples, are, and, yellow”。
    隐藏层: 一个形状为V×N的参数张量W1,一般称为word-embedding,N表示每个词的词向量长度,我们假设为128。输入张量和word embedding W1进行矩阵乘法,就会得到一个形状为C×N的张量。综合考虑上下文中所有词的信息去推理中心词,因此将上下文中C个词相加得一个1×N的向量,是整个上下文的一个隐含表示。
    输出层: 创建另一个形状为N×V的参数张量,将隐藏层得到的1×N的向量乘以该N×V的参数张量,得到了一个形状为1×V的向量。最终,1×V的向量代表了使用上下文去推理中心词,每个候选词的打分,再经过softmax函数的归一化,即得到了对中心词的推理概率。

如图2所示,Skip-gram是一个具有3层结构的神经网络,分别是:

图2:Skip-gram算法实现 

    Input Layer(输入层):接收一个one-hot张量 V\in R^{1\times vocabsize}作为网络的输入,里面存储着当前句子中心词的one-hot表示。
    Hidden Layer(隐藏层):将张量V乘以一个word embedding张量W_1\in R^{vocabsize\times embedsize},并把结果作为隐藏层的输出,得到一个形状为R^{1\times embedsize}的张量,里面存储着当前句子中心词的词向量。
    Output Layer(输出层):将隐藏层的结果乘以另一个word embedding张量W_2\in R^{embedsize\times vocabsize},得到一个形状为R^{1\times vocabsize}的张量。这个张量经过softmax变换后,就得到了使用当前中心词对上下文的预测结果。根据这个softmax的结果,我们就可以去训练词向量模型。

在实际操作中,使用一个滑动窗口(一般情况下,长度是奇数),从左到右开始扫描当前句子。每个扫描出来的片段被当成一个小句子,每个小句子中间的词被认为是中心词,其余的词被认为是这个中心词的上下文。
Skip-gram的理想实现

使用神经网络实现Skip-gram中,模型接收的输入应该有2个不同的tensor:

    代表中心词的tensor:假设我们称之为center_words V,一般来说,这个tensor是一个形状为[batch_size, vocab_size]的one-hot tensor,表示在一个mini-batch中,每个中心词的ID,对应位置为1,其余为0。

    代表目标词的tensor:目标词是指需要推理出来的上下文词,假设我们称之为target_words T,一般来说,这个tensor是一个形状为[batch_size, 1]的整型tensor,这个tensor中的每个元素是一个[0, vocab_size-1]的值,代表目标词的ID。

在理想情况下,我们可以使用一个简单的方式实现skip-gram。即把需要推理的每个目标词都当成一个标签,把skip-gram当成一个大规模分类任务进行网络构建,过程如下:

    声明一个形状为[vocab_size, embedding_size]的张量,作为需要学习的词向量,记为W0​。对于给定的输入V,使用向量乘法,将V乘以W0​,这样就得到了一个形状为[batch_size, embedding_size]的张量,记为H=V×W0​。这个张量H就可以看成是经过词向量查表后的结果。
    声明另外一个需要学习的参数W1​,这个参数的形状为[embedding_size, vocab_size]。将上一步得到的H去乘以W1,得到一个新的tensor O=H×W1,此时的O是一个形状为[batch_size, vocab_size]的tensor,表示当前这个mini-batch中的每个中心词预测出的目标词的概率。
    使用softmax函数对mini-batch中每个中心词的预测结果做归一化,即可完成网络构建。

Skip-gram的实际实现

然而在实际情况中,vocab_size通常很大(几十万甚至几百万),导致W0和W1也会非常大。对于W0而言,所参与的矩阵运算并不是通过一个矩阵乘法实现,而是通过指定ID,对参数W0进行访存的方式获取。然而对W1而言,仍要处理一个非常大的矩阵运算(计算过程非常缓慢,需要消耗大量的内存/显存)。为了缓解这个问题,通常采取负采样(negative_sampling)的方式来近似模拟多分类任务。此时新定义的W0和W1​均为形状为[vocab_size, embedding_size]的张量。

假设有一个中心词ccc和一个上下文词正样本tp。在Skip-gram的理想实现里,需要最大化使用c推理tp的概率。在使用softmax学习时,需要最大化tp的推理概率,同时最小化其他词表中词的推理概率。之所以计算缓慢,是因为需要对词表中的所有词都计算一遍。然而我们还可以使用另一种方法,就是随机从词表中选择几个代表词,通过最小化这几个代表词的概率,去近似最小化整体的预测概率。比如,先指定一个中心词(如“人工”)和一个目标词正样本(如“智能”),再随机在词表中采样几个目标词负样本(如“日本”,“喝茶”等)。有了这些内容,我们的skip-gram模型就变成了一个二分类任务。对于目标词正样本,我们需要最大化它的预测概率;对于目标词负样本,我们需要最小化它的预测概率。通过这种方式,我们就可以完成计算加速。上述做法,我们称之为负采样。

在实现的过程中,通常会让模型接收3个tensor输入:

    代表中心词的tensor:假设我们称之为center_words V,一般来说,这个tensor是一个形状为[batch_size, vocab_size]的one-hot tensor,表示在一个mini-batch中每个中心词具体的ID。

    代表目标词的tensor:假设我们称之为target_words T,一般来说,这个tensor同样是一个形状为[batch_size, vocab_size]的one-hot tensor,表示在一个mini-batch中每个目标词具体的ID。

    代表目标词标签的tensor:假设我们称之为labels L,一般来说,这个tensor是一个形状为[batch_size, 1]的tensor,每个元素不是0就是1(0:负样本,1:正样本)。

模型训练过程如下:

    用V去查询W0​,用T去查询W1​,分别得到两个形状为[batch_size, embedding_size]的tensor,记为H1​和H2。
    将这两个tensor进行点积运算,最终得到一个形状为[batch_size]的tensor O = [O_i=\sum_{j}^{}H_0[i,j]\times H_1[i,j]]_{i=1}^{batchsize}。
    使用sigmoid函数作用在O上,将上述点积的结果归一化为一个0-1的概率值,作为预测概率,根据标签信息L训练这个模型即可。

在结束模型训练之后,一般使用W0作为最终要使用的词向量,用W0的向量表示。通过向量点乘的方式,计算不同词之间的相似度。

 

 

 

 

 

 

以CBOW模型为例,假设单词向量空间的维度为V(即整个词库大小为V),上下文单词窗口的大小为C,最终词向量的维度大小为N。一般来说V远远大于N。
下面详细介绍其计算过程如下:

    输入层(Input layer)是某词语(Word)的C个上下文单词的独热向量,每个向量的大小均为1*V。
    权值共享矩阵W的大小为V∗N,用随机数对其进行初始化。
    将C个1*V大小的独热向量分别跟同一个大小为V∗N的权值共享矩阵W相乘,得到的是C个1∗N大小的隐层向量(hidden
    layer)。
    C个1∗N 大小的hidden layer取平均,得到一个1∗N大小的向量。
    输出权重矩阵W‘的大小为N∗V,用随机数对其进行初始化。
    将得到的隐层向量1∗N与W’相乘(矩阵W‘是矩阵W的转置),并且用softmax处理,得到1∗V的向量,此向量的每一维代表词库中的一个单词。概率中最大的index所代表的单词为预测出的中间词。
    与词语(Word)中的独热向量比较,求loss function的极小值。

Word2Vec的最终目的,不是要把这个一层的网络训练得多么完美,而是得到模型训练完后的副产物——模型参数(即矩阵W),从而得到每一个独热向量在N维空间中的表示。

标签:中心词,word2vec,tensor,张量,batch,向量,size
From: https://www.cnblogs.com/zz-w/p/16757420.html

相关文章

  • word2vec
    Word2vec,是一群用来产生词向量的相关模型。这些模型为浅而双层的神经网络,用来训练以重新建构语言学之词文本。网络以词表现,并且需猜测相邻位置的输入词,在word2vec中词袋模......
  • Word2Vec
    词嵌入1.为什么使用词嵌入?one-hot向量(长度为词库大小,去重排序,一个one-hot仅在单词序号处取1,其余均为0)可以表示词,但是各个单词的one-hot乘积均为0,也就是看不出关......
  • word2vec使用skip-gram实现
    importtorchimporttorch.nnasnnfromtorch.utils.dataimportDataLoader,Datasetimportnumpyasnpfromtqdmimporttqdmsentences=["jacklikedog","j......