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

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

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

(0)
上一篇 2022年5月16日 下午6:00
下一篇 2022年5月16日 下午6:20


相关推荐

  • RHCE是否还值得考取?

    RHCE是否还值得考取?工作了也已经有了 2 年左右的时间 平常也会接触到各种各样的技术 但是老本行还是运维 那么对于 Linux 还是比较感兴趣的 也加了各种各样的技术交流群 也买了各种各样的学习书籍 自然而然得也知道了 RHCE 认证 公司里的同事也都知道 随着工作年限的增长 大家也都在想办法提升自己的实力 来获得涨薪或者跳槽的资本 有的同事觉得考一个国际的认证 会更加的有说服力 有的则不以为然 觉得有证书并不能达到预期的效果

    2026年3月19日
    2
  • 服饰供应链协同提效:Nano-Banana软萌拆拆屋生成供应商可读结构分解图

    服饰供应链协同提效:Nano-Banana软萌拆拆屋生成供应商可读结构分解图

    2026年3月16日
    3
  • 图书馆管理系统程序设计

    图书馆管理系统程序设计

    2021年11月18日
    47
  • CAD快捷键大全

    CAD快捷键大全作者简介 大家好 我是泽奀 全栈领域新星创作者 个人主页 weixin 的博客 泽奀 CSDN 博客 点赞 评论 收藏 习惯 常用功能键 F1 获取帮助 F2 实现作图窗和文本窗口的切换 F3 控制是否实现对象自动捕捉 F4 数字化仪控制 F5 等轴测平面切换 F6 控制状态行上坐标的显示方式 F7 栅格显示模式控制 F8 正交模式控制 F9 栅格捕捉模式控制 F10

    2026年3月17日
    2
  • linux 安装 maven

    linux 安装 maven在 linux 上安装 maven 步骤如下笔者这里使用 centos7 apache maven 3 8 5 安装 maven 环境前 需要先安装 java 环境 笔者这里已经成功安装 java 环境 如果没有安装 java 环境 可以参考 https blog csdn net wsjzzcbq article details maven 官网下载安装包 maven 官网地址 https maven apache org download cgi

    2026年3月26日
    2
  • IIS无法启动:发生意外错误0x8ffe2740的原因

    IIS无法启动:发生意外错误0x8ffe2740的原因原因如果系统中存在端口冲突就有可能发生本情况. IIS默认使用80端口进行HTTP通信. 如果除IIS外的应用程序正在运行并且正在相同的IP地址上使用80端口,在您试图使用IIS管理器启动网站时您也可能收到该错误讯息. 解决方法要解决这个问题,您可以进行以下任一项操作:• 在IIS管理器中更改网站绑定端口为除80端口外的其它端口. • 停止正在使用80端口的应

    2022年7月26日
    10

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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