word2vec原理与Gensim使用[通俗易懂]

word2vec原理与Gensim使用[通俗易懂]word2vec原理1NeuralNetworkLanguageModel2CBOW2.1HierarchicalSoftmax2.2NegativeSampling3Skip-gram3.1HierarchicalSoftmax3.2NegativeSampling4负采样算法5.word2vec实战1NeuralNetworkLanguageModel…

大家好,又见面了,我是你们的朋友全栈君。

1 Neural Network Language Model

NNLM模型的基本思想可以概括如下:

  • 假定词表中的每一个word都对应着一个连续的特征向量;
  • 假定一个连续平滑的概率模型,输入一段词向量的序列,可以输出这段序列的联合概率;
  • 同时学习词向量的权重和概率模型里的参数。

在这里插入图片描述
将整个模型拆分成两部分加以理解:

  1. 首先是一个线性的Embedding层。它将输入的N−1个one-hot词向量,通过一个共享的V×D的矩阵C,映射为N−1个分布式的词向量(distributed vector)。其中,V是词典的大小,D是Embedding向量的维度(一个先验参数)。C矩阵里存储了要学习的word vector。
  2. 其次是一个简单的前向反馈神经网络g。它由一个tanh隐层和一个softmax输出层组成。通过将Embedding层输出的N−1个词向量映射为一个长度为V的概率分布向量,从而对词典中的word在输入context下的条件概率做出预估

缺点:

  1. NNLM模型只能处理定长的序列
  2. NNLM的训练太慢了

与NNLM相比,word2vec的主要目的是生成词向量而不是语言模型,在CBOW中,投射层将词向量直接相加而不是拼接起来,并舍弃了隐层,这些牺牲都是为了减少计算量。不经过优化的CBOW和Skip-gram中 ,在每个样本中每个词的训练过程都要遍历整个词汇表,也就是都需要经过softmax归一化,计算误差向量和梯度以更新两个词向量矩阵(这两个词向量矩阵实际上就是最终的词向量,可认为初始化不一样),当语料库规模变大、词汇表增长时,训练变得不切实际。为了解决这个问题,word2vec支持两种优化方法:hierarchical softmax 和negative sampling

2 CBOW

在这里插入图片描述
CBOW 是 Continuous Bag-of-Words Model 的缩写,是一种根据上下文的词语预测当前词语的出现概率的模型。其学习目标是最大化对数似然函数: L = ∑ w l o g p ( w ∣ c o n t e x t ( w ) ) L=\sum_{w}logp(w|context(w)) L=wlogp(wcontext(w))

  • 输入层:上下文的词语的词向量
  • 投影层:对其求和,所谓求和,就是简单的向量加法。
  • 输出层:输出最可能的w,从词汇量|C|个分类中挑一个。输出层对应一个二叉树

2.1 Hierarchical Softmax

上图输出层的树形结构即为Hierarchical Softmax,每个叶子节点代表语料库中的一个词语,以各词在语料中出现的次数当权值构造Huffman树,于是每个词语都可以被01唯一地编码。哈夫曼树,是带权路径长度最短的树,哈夫曼树保证了词频高的单词的路径短,词频相对低的单词的路径长,这种编码方式很大程度减少了计算量

  • p w p^w pw:从根结点出发到达w对应叶子结点的路径.
  • l w l^w lw:路径中包含结点的个数
  • p 1 w , p 2 w , . . . , p l w w p^w_1,p^w_2,…, p^w_{l^w} p1w,p2w,...,plww:路径 p w p_w pw 中的各个节点
  • d 2 w , d 3 w , . . . , d l w w d^w_2,d^w_3,…, d^w_{l^w} d2w,d3w,...,dlww:词w的Huffman编码, d j w d^w_j djw表示 p w p^w pw 第j个节点对应的编码(根节点无编码)
  • θ 1 w , θ 2 w , . . . , θ l w − 1 w θ^w_1,θ^w_2,…, θ^w_{l^w-1} θ1w,θ2w,...,θlw1w:路径 p w p_w pw 中非叶节点对应的参数向量

考虑 w = “足球” 的情形
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
对目标函数取对数似然: L = ∑ w l o g p ( w ∣ c o n t e x t ( w ) ) L=\sum_{w}logp(w|context(w)) L=wlogp(wcontext(w))
在这里插入图片描述
随机梯度上升:
考虑 L ( w , j ) L(w,j) L(w,j) 关于 θ j − 1 w θ^w_{j-1} θj1w 的梯度计算:
在这里插入图片描述
在这里插入图片描述
考虑 L ( w , j ) L(w,j) L(w,j) 关于 x w x_w xw 的梯度计算:
在这里插入图片描述
最终目的是求词典中每个词的词向量,而这里 x w x_w xw C o n t e x t ( w ) Context(w) Context(w)中各词词向量的累加,直接将梯度的更新贡献到每个词中:
在这里插入图片描述
CBOW模型中采用随机梯度上升法更新各参数伪代码(Hierarchical Softmax):(其中 3.3 和3.4不能交换)

在这里插入图片描述

2.2 Negative Sampling

Negative Sampling目的:提高速度、改进模型质量
在CBOW中给定训练样本,即一个词w和它的上下文Context(w),Context(w)是输入,w是输出。那么w就是正例,词汇表中其他的词语的就是负例。假设我们通过某种采样方法获得了负例子集NEG(w)。对于正负样本,分别定义一个标签:(正样本为1,负样本为0)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
为了增大正样本的概率同时降低负样本的概率,最大化 g ( w ) g(w) g(w),给定语料库C,函数G作为整体优化目标: G = ∏ w ∈ C g ( w ) G=\prod_{w\in C}g(w) G=wCg(w)
在这里插入图片描述
在这里插入图片描述
随机梯度上升:
考虑 L ( w , u ) L(w,u) L(w,u) 关于 θ u θ^u θu 的梯度计算:
在这里插入图片描述
在这里插入图片描述
CBOW模型中采用随机梯度上升法更新各参数伪代码(Negative Sampling):
在这里插入图片描述

3 Skip-gram

在这里插入图片描述
Skip-gram只是逆转了CBOW的因果关系而已,即已知当前词语,预测上下文。其学习目标是最大化对数似然函数: L = ∑ w l o g p ( c o n t e x t ( w ) ∣ w ) L=\sum_{w}logp(context(w)|w) L=wlogp(context(w)w)

  • 输入层:中心词词向量
  • 投影层:直接将输入层的词向量传递给输出层。
  • 输出层:对应Huffman树

3.1 Hierarchical Softmax

在这里插入图片描述
随机梯度上升:
考虑 L ( w , u , j ) L(w,u,j) L(w,u,j) 关于 θ j − 1 u θ^u_{j-1} θj1u 的梯度计算:

在这里插入图片描述
Skip-gram模型中采用随机梯度上升法更新各参数伪代码(Hierarchical Softmax):(其中 3 和4不能交换)
在这里插入图片描述

3.2 Negative Sampling

将优化的目标函数由原来的 G = ∏ w ∈ C g ( w ) G=\prod_{w\in C}g(w) G=wCg(w) 改写成: G = ∏ w ∈ C ∏ u ∈ C o n t e x t ( w ) g ( u ) G=\prod_{w\in C}\prod_{u\in Context(w)}g(u) G=wCuContext(w)g(u)
在这里插入图片描述
在这里插入图片描述
在上式中,用 w w w 替换 u u u,用 w w w 替换 w w w,用 u u u 替换 z z z
在这里插入图片描述
随机梯度上升:
在这里插入图片描述
Skip-gram模型中采用随机梯度上升法更新各参数伪代码(Negative Sampling):

在这里插入图片描述

4 负采样算法

给定一个词,如何生成NEG(w):任何采样算法都应该保证频次越高的样本越容易被采样出来。基本的思路是对于长度为1的线段,根据词语的词频将其公平地分配给每个词语:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

5. word2vec实战

gensim文档:https://radimrehurek.com/gensim/models/word2vec.html
在gensim中,word2vec 相关的API都在包gensim.models.word2vec中。和算法有关的参数都在类gensim.models.word2vec.Word2Vec中。算法需要注意的参数有:

  1. sentences: 我们要分析的语料,可以是一个列表,或者从文件中遍历读出。
  2. size: 词向量的维度,默认值是100。如果是超大的语料,建议增大维度。
  3. window:即词向量上下文最大距离,window越大,则和某一词较远的词也会产生上下文关系。默认值为5。
  4. sg: word2vec两个模型的选择了。如果是0, 则是CBOW模型,是1则是Skip-Gram模型,默认是0即CBOW模型。
  5. hs: word2vec两个解法的选择了,如果是0, 则是Negative Sampling,是1则是Hierarchical Softmax。默认是0即Negative Sampling。
  6. negative:即使用Negative Sampling时负采样的个数,默认是5。推荐在[3,10]之间。
  7. cbow_mean: 仅用于CBOW在做投影的时候,为0: x w x_w xw 为上下文的词向量之和,为1则为上下文的词向量的平均值(默认)。
  8. min_count:需要计算词向量的最小词频。这个值可以去掉一些很生僻的低频词,默认是5。如果是小语料,可以调低这个值。
  9. iter: 随机梯度下降法中迭代的最大次数,默认是5。对于大语料,可以增大这个值。
  10. alpha: 在随机梯度下降法中迭代的初始步长。算法原理篇中标记为η,即学习率,默认是0.025。
  11. min_alpha: 由于算法支持在迭代的过程中逐渐减小步长,min_alpha给出了最小的迭代步长值。随机梯度下降中每轮的迭代步长可以由iter,alpha, min_alpha一起得出。
from gensim.models import word2vec
// 直接用gemsim提供的API去读取txt文件,读取文件的API有LineSentence 和 Text8Corpus, PathLineSentences等。
sentences = word2vec.LineSentence("data.txt")

// 模型的训练
model = gensim.models.Word2Vec(sentences, size=200, sg=1, iter=8)
// 或:
model= Word2Vec()
model.build_vocab(sentences)
model.train(sentences,total_examples = model.corpus_count,epochs = model.iter)

// 模型的保存
model.save("word2vec.model")  //保存可以在读取后追加训练
model.wv.save_word2vec_format("./word2Vec" + ".bin", binary=True)  // 保存不能追加训练
model.wv.save_word2vec_format("./word2Vec" + ".txt", binary=False) // 保存不能追加训练

//模型的加载
model = Word2Vec.load("word2vec.model")
wordVec = gensim.models.load_word2vec_format("word2Vec.bin", binary=True)
wordVec = gensim.models.load_word2vec_format("word2Vec.txt", binary=False)
// 最省内存的加载方法
model = gensim.models.Word2Vec.load("word2vec.model")
word_vectors = model.wv
del model
word_vectors.init_sims(replace=True)

// 引入KeyedVectors 保存和加载bin,txt模型
wordVec = gensim.models.KeyedVectors.load_word2vec_format("word2Vec.bin", binary=True)  // 载入 .bin文件
wordVec = gensim.models.KeyedVectors.load_word2vec_format("word2Vec.bin.gz", binary=True)  // 载入 .bin文件
wordVec = gensim.models.KeyedVectors.load_word2vec_format("word2Vec.txt", binary=False) // 载入 .txt文件

//增量训练
model = gensim.models.Word2Vec.load("word2vec.model")
model.train(more_sentences)

// Word2Vec应用
model.wv['man']    // 获取词向量
model.wv.similarity('first','is')    // 两个词的相似性距离
model.wv.doesnt_match("input is lunch he sentence cat".split())      // 找出不同类的词即不匹配的词语
model.wv.similar_by_word('沙瑞金'.decode('utf-8'), topn =100) // 找出某一个词向量最相近的词集合
model.wv.most_similar(['man'])   //计算一个词的最近似的词,倒排序
for i in model.wv.most_similar(u"戏剧"):
    print (i[0],i[1]) // 词,分数
model.wv.most_similar(positive=['first', 'second'], negative=['sentence'], topn=1) // 计算两词之间的余弦相似度
model.wv.n_similarity(list1,list2)  //计算两个集合之间的余弦似度

参考:
https://blog.csdn.net/itplus/article/details/37969979
https://www.cnblogs.com/sxron/p/5975596.html
https://www.cnblogs.com/pinard/p/7278324.html
https://radimrehurek.com/gensim/models/word2vec.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/145731.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • IDEA 2020激活码_通用破解码

    IDEA 2020激活码_通用破解码,https://javaforall.cn/100143.html。详细ieda激活码不妨到全栈程序员必看教程网一起来了解一下吧!

  • 彻底弄清 anchorPoint 和 position「建议收藏」

    彻底弄清 anchorPoint 和 position「建议收藏」最近在研读《iOSCoreAnimationAdvancedTechniques》这一本书,想系统地学习下关于CALayer、Transition、以及动画等知识点。大家可以在gitbook上面找到该书的翻译版本。传送门在读到图层几何学这一章的时候,了解到了两个概念:anchorPoint和position。之前一直把position当成是矩形的中心点,如同UIView的center属性(事实上,在不改变anchorPoint的前提下,它确实是图层的中心点),但..

  • Microsoft Windows 恶意软件删除工具

    Microsoft Windows 恶意软件删除工具Microsoft恶意软件删除工具与防病毒产品有何差异Microsoft恶意软件删除工具不能取代防病毒产品。严格地讲,该工具是感染后的删除工具。因此,强烈建议您安装并使用最新的防病毒产品。Microsoft恶意软件删除工具主要在以下三个方面与防病毒产品有所不同:该工具从已经受感染的计算机中删除恶意软件。防病毒产品能够阻止恶意软件在计算…

  • 加密和解密

    加密和解密

  • 数组转为list java_java arraylist转数组

    数组转为list java_java arraylist转数组java中将数组转为list集合的方法发布时间:2020-10-2809:42:15来源:亿速云阅读:98作者:小新小编给大家分享一下java中将数组转为list集合的方法,希望大家阅读完这篇文章后大所收获,下面让我们一起去探讨吧!java中将数组转为list集合的方法:1、使用原生方式,使用for()循环来拆分数组,并添加到List中;2、使用Arrays.asList()方法;3、使用Col…

  • pycharm滚动放大缩小字体_pycharm滚轮调整字体大小

    pycharm滚动放大缩小字体_pycharm滚轮调整字体大小pycharm中,设置滚轮直接调整字体大小步骤1、setting2、Editor→General3、勾选Change。。。。。。。4、Apply5、OK

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号