Word2vec,Skip-Gram,CBOW,NEG,负采样
深度学习,图神经网络,城市计算,Fintech,异常检测
Word2vec是NLP领域的WordEmbedding方法之一。2013年由Google的Mikolov提出了一套新的词嵌入方法。Google同年开源推出wordvector简单高效的工具包引起了人们的关注。
在Word2vec在出现之前,已经有一些了WordEmbedding但之前的方法并不成熟,也没有大规模应用。Word2vec主流在2022年之前,但随着BERT、GPT2.0的出现,这种方式已经不算效果最好的方法了。18年之后想要得到最好的效果,已经不使用WordEmbedding方法,所以不会用Word2vec。
Word2Vec克服了one-hot编码带来的词向量维度高、稀疏的问题将词向量从高维度降低到低维度,并增加上下文关系,使低维度空间的词向量表示上下文信息。
Word2Vec它是一种非常有效的预测模型,可以从原始语料中学毕业证书中学习单词空间向量。它有两种模式:样本前可以使用什么单词
CBOW(ContinuousBag-of-WordsModel)和Skip-gram(ContinuousSkip-gramModel)。Skip-gram该模型使用一个单词作为输入来预测它周围的上下文(一个或多个单词)。也就是说,给你一个单词,让你猜猜前面和后面可能会出现什么单词。CBOW该模式以一个单词的上下文作为输入来预测单词本身。也就是说,在一个句子中扣除一个单词,让你猜猜这个单词是什么。
假设语料库是 hequickbrownfoxjumpedoverthelazydog}。我们需要建立一个目标单词和语境单词的映射关系,其中语境单词是指目标单词的左右单词。我们必须首先设置它skip_window参数代表了我们可以从目标词的一侧(左侧或右侧)选择词的最远距离。例如,目前的目标单词是"brown",设定skip_window=2,则"brown"对应的整个选词窗口是[the,quick,brown,fox,jumped]。
由于Skip-Gram模型用目标单词预测语境单词,针对目标单词"brown"样本可以构造:样本前可以用什么词?
(brown->quick),(brown->the),(brown->fox),(brown->jumped)。其他样本的结构如下图所示:样本前可以使用什么词?
注意,参数skip_window例如,每个目标单词最多可以构建的样本数量skip_window=2,则每个目标单词最多可构造4个样本。
CBOW模型用语境单词预测目标单词,针对目标单词"brown"可构造样本:(quick->brown),(the->brown),(fox->brown),(jumped->brown)。可以看出,其样本结构模式Skip-Gram模型反过来。
假设现在手里有一个.txt文件,文件大小是100M,里面是英语语料。
(1)首先,统计语料库中的单词频率,取出前4999个单词,语料库中频率4999以外的单词全部使用‘UNK'替换。
(1)按频率由高到低,为单词编号,'UNK为0,共5000个编号,范围为[0,5000),得到两个表:词汇表,key是单词,value是编号;逆词汇表,key是编号,value是单词。
(3)将语料库从词汇映射到编号。
为skip-gram生成一个模型batch函数如下:
参数batch_size按顺序取多少个目标单词。num_skips表示每个目标单词取多少次。skip_window是目标词左右最远的可取词长度,比如skip_window=2,左边的第一个和第二个单词可以取目标单词;同样,右边的第一个和第二个单词也可以取。
假设目标单词共有上下文单词,则以平均值作为模型输入:,其中第一个上下文单词one-hot表示。
输入通过隐藏层,隐藏层的维度是,这意味着单词从维空间映射到低维维空间,该层的输出是:。其中,第一行是数字对应的低维词向量。one-hot向量,即某一行,即单词对应的低维词向量,是上下文单词低维词向量的平均值。
通过输出层,输出层的维度是,模型的输出是。其中,第一列是对应的上下文向量。Softmax然后得到概率分布。即编号为单词的预测概率,
Skip-Gram模型的输入是目标单词one-hot表示:。
该输入经过一个隐藏层,隐藏层的维度是,意味着单词从维空间映射到低维度的维空间,该层的输出是:。其中,第一行是数字对应的低维词向量。one-hot向量,即某一行,即对应词对应的低维词向量。
可以看到,CBOW模型和Skip-Gram除输入层不同外,隐藏层与输出层相同。
因为每个单词都会被表示为维度,所以单个样本的损失one-hot向量是字典的大小,所以在每个样本中,输入是一个维度one-hot向量,标签也是维度one-hot向量。通过模型输入后获得维向量输出Softmax产生一个维的概率分布,然后使用交叉熵Cross-Entropy计算损失。
具体来说,设模型输出经过Softmax之后,生成概率分布;如果标签是,损失函数是:
是一个one-hot向量,如果单词是标签,则其他位置为0。模型的概率输出是指预测单词为单词的概率。
当它很大的时候,也就是说,当有很多单词时,它是由的Softmax计算样本的复杂性是,效率很低。
为了解决这个问题,在word2vec里面提出了基于Huffman编码的层次Softmax(HS)。HS结构还是太复杂了,所以Mnih以采样为基础的NCE(NoiseContrastiveEstimation),提高训练速度Mikolov提出NEG(NegativeSampling)作为NCE简化版。NEG和NCE形式不同,但本质不同。
使用(复杂)Hufman树
NEG不再使用使用(复杂)Hufman采用(相对简单)随机负采样可以大大提高性能。用编造噪声词汇训练的方法称为NegativeSampling(NEG)。
具体来说,对于每个输入,除了它自己label(样本)同时采样N个其他label(负样本)所以我们只需要在这里计算样本N 1个label所有样本都不需要计算概率label上概率N 1个label计算概率时,不再使用Softmax,但对每一个label,逻辑回归sigmoid。在设计优化目标时,我们希望输出正样本的概率尽可能高,负样本的概率尽可能低。
基于NEG的CBOW优化模型的目标是CBOW已知词的上下文需要预测,所以它是一个正样本,其他词构成负样本。假设已经选择了一个负样本,其中。
(1)正样本的概率
对于正样本,CBOW模型的输出是:
它是上下文中所有单词的低维词向量的平均值;它是输出层权重矩阵中单词对应的上下文向量。也就是说sigmoid函数。为了预测正样本的概率,我们希望越大越好。
(2)负样本的概率
负样本,CBOW模型的输出是:
它是上下文中所有单词的低维词向量的平均值;它是输出层权重矩阵中单词对应的上下文向量。也就是说sigmoid函数。为预测负样本的概率,我们希望尽可能小,即越大越好。
(3)总概率
因此,在给定正样本及其对应的负样本后,其优化目标可设计为:
请注意,我们应该最大化目标,而不是最小化目标。
(4)最终优化目标
对于给定的语料库,其优化目标可设计为:
对对对数(仍记为)的最终优化目标是:
因为,所以
上式就是Mikolov等人在《DistributedRepresentationsofWordsandPhrasesandtheirCompositionality》优化目标(最大化)。
基于NEG的Skig-Gram优化模型的目标是Skig-Gram对于已知的目标词,需要预测其上下文。可能有多个单词,所以每个单词构成一个正样本,共同构成一个正样本。假设已经选择了一个负样本假设已经选择了一个负样本。
对于正样本,Skig-Gram模型的输出是:
其中,目标单词的低维词向量;是输出层权重矩阵中单词对应的上下文向量。也就是说sigmoid函数。为了预测正样本的概率,我们希望越大越好。
负样本,Skig-Gram模型的输出是:
其中,目标单词的低维词向量;是输出层权重矩阵中单词对应的上下文向量。也就是说sigmoid函数。为了预测负样本的概率,我们希望尽可能小,即越大越好。
给定,可以构建一个正样本。每个正样本对应一个负样本,其优化目标可设计为:
以上推导是基于每个样本m次负采样,但源代码中并非如此。
引用别人的话:
值得一提的是,word2vec基于源代码NegativeSampling的Skip-gram模型不是基于上述目标函数编程的.判断依据非常简单。如果编程是基于上述类型,对于每个样本(w,Context(w),需要针对Context(w)负采样中的每个单词,word2vec只针对源码w进行了|Context(w)|次负采样。
基于负采样算法NegativeSampling的CBOW和Skip-gram负采样是模型中一个非常重要的环节。如何生成给定标签单词的负样本?
采样的原则是语料库中高频词被选为负样本的概率高,低频词被选中的概率低。
具体步骤:(1)字典中有一个单词,每个单词出现在语料中的频率为。设置累积频率。
(2)整数中随机产生一个整数,如果采样单词为负样本。总共采样。
(3)如果采样过程中采样到标签单词本身,则丢弃。
Word2vec采样时,不直接使用源码,而是使用其次幂:
NCE细节有点复杂,其本质是利用已知的概率密度函数来估计未知的概率密度函数。简单地说,假设未知的概率密度函数是X,已知的概率密度为Y,如果得到了X和Y的关系,那么X也可以找出来。具体参考文献《Noise-contrastiveestimation:Anewestimationprincipleforunnormalizedstatisticalmodels》
Tensorflow在Tensorflow中的tf.nn.nce_loss()直接实现这一点loss。
使用Word2Vec训练语料库可以得到一些非常有趣的结果,比如在向量空间中有相似含义的单词的位置。Google从训练超大语料库的结果来看,比如Beijing,London,NewYork等待城市的名称将聚集在向量空间中
一起,而Cat,Dog,Fish等动物词汇也会聚集在一起。
{n}
同时,Word2Vec还会学习到一些高阶的语言概念,比如
毕业证样本网创作《样本前可以用什么词?(Word2vec, Skip-Gram, CBOW, NEG, 负采样)》发布不易,请尊重! 转转请注明出处:https://www.czyyhgd.com/183351.html