word2vec主要实现方法是Skip-gram和CBOW。 CBOW的目标是根据上下文来预测当前词的概率且上下文所有的词对当前词出现概率的影响的权重是一样的,因此叫做continuous bag-of-words模型。如在袋子中取词,去取出数量足够的词就可以了,与取出词的先后顺序无关。Skip-gram刚好相反,其是根据当前词来预测上下文概率的。在实际应用中算法并无高下之分,主要根据呈现的效果来进行算法选择。这里介绍Skip-gram,并通过例子来理解Skip-gram是如何实现预测上下文,并如何训练得到词向量。

Skip-gram 模型

skip-gram模型是根据中心词预测上下文m个词的算法,m是用户自己定义的预测窗口大小,比如一句话“I love natural language processing”,假设词典库就是{“I”,“ love”,“ natural”,“ language”,“ processing”},这些词事先都用one-hot编码。中心词为“natural”作为输入,给定窗口2,那么就要通过Skip-gram 模型预测出上下文为“I”,“love”,“language”,“processing”。
skip-gram需要做的就是使得概率P({“I”,“ love”,“ language”,“ processing”|“ natural”)最大。由于词语词之间相互独立,所以可以将概率公式转化为:P(“I"∣“natural")⋅P(“love"∣“natural")⋅P(“language"∣“natural")⋅P(“processing"∣“natural")
用下面两个图表示表示如下:


下图是skip-gram的神经网络结构,隐含层没有使用任何激活函数,隐藏层到输出层进行全连接,然后是一个softmax,输出概率。
过程比较简单,一个Forward Propagation,一个Backward Propagation。完成参数的更新。


举个例子来看看skip-gram是如何预测上下文和实现word2vec的。

skip-gram预测上下文

skip-gram预测主要围绕下面这个图进行:

1.one-hot编码:
one-hot编码是一个(V * V)的矩阵,其中V代表字典库的大小。假设字典库就是{“I”,“ love”,“ natural”,“ language”,“ processing”},对应的one-hot编码如下:

2.中心词向量矩阵W:
中心词向量矩阵也叫输入层到隐含层的权重矩阵W(d*V)。
由于one-hot编码的稀疏性以及无法计算词与词之间的相似性等缺点,所以我们希望通过一个稠密的向量来表示词语,即将词语映射到低维的向量表示,我们把这种映射叫做词嵌入(word embedding)。那么如何做到embedding呢?
如果我们现在把一个词典库的10000个单词(V=10000)分别用300个特征(d=300)来表示的话,那么隐含层就有300个神经元,看下面的图片,左右两张图分别从不同角度代表了输入层-隐层的权重矩阵。左图中每一列代表一个10000维的词向量和隐层单个神经元连接的权重向量。从右边的图来看,每一行实际上代表了每个单词的词向量。

用刚刚的例子解释一下,将每个词的one-hot编码向量乘以一个学习好的低维的共享矩阵W(V *d)。比如要把例子5维向量(这里V=5)表示的词语映射到3维向量(d=3),假设学习好的W为:

中心词“nature”one-hot编码的向量和共享矩阵相乘就得到它的词向量,用Vc表示,对向量进行归一化得到Vc=(0.46 0.15 0.39):

3.上下文向量矩阵
类似词典中心词向量矩阵,但这里的词向量中d个维度储存的抽象信息,是作为上下文的词而言,它与中心词之间的对应关系信息,对于词典中的每一个词都对应一个上下文向量矩阵。比如nature的上下文你向量矩阵是W’,(3 12 8),(13 11 26),(20 32 23),(8 22 12)分别是“I”,“ love”,“ language”,“ processing”相对“ natural”的上下文向量。

将中心词(nature)的词向量和学习好的权重矩阵的其他词做内积,此时会得到每个词的计算结果:

为了方便计算,再将结果进行归一化得到

4.softmax
输出层是一个softmax回归分类器,它的每个结点将会输出一个0-1之间的值(概率),是词典中每个词成为当前指定中心词的上下文的概率,这些所有输出层神经元结点的概率之和为1。计算方法为:

这个例子的softmax计算结果如下,有些地方分母会是包括中心词的五个数相加,但这样并不会影响结果:

“I”是“nature”的上下文的概率为0.226,以此类推,选择4个(2*2)softmax最大的词作为当前中心词的上下文,因为这个例子词典库就5个词语,所以剩下4个都作为natural的上下文。

BP算法
上面的例子是在已经学习好了中心词向量矩阵和上下文向量矩阵完成的,那么在这之前就要训练模型学习这两个矩阵,训练的过程就是一个BP算法。在学习的过程是一个监督学习,对于一个中心词我们是有明确的上下文的,我们期望窗口内的词的输出概率最大。在此之前我们学习另一种目标函数的表示方法。
对于一个句子:S=(w1 w2 w3 w4 w5 w6).有六个单词分别问w1~w6,我们用P(D=1|wi,wj;θ)表示wi,wj作为上下文的概率,其中θ为模型参数,后文会接着解释模型参数。如果wi,wj作为上下文,我们就希望下面这个概率公式越大越好,其中概率公式表示是条件概率的逻辑回归表示,其中u和v分别代表中心词向量和上下文向量:

那么目标函数就是要最大化下面这个函数,其中w是文章T中的词,c是中心词w对应的所有上下文单词:

对于刚刚说的要学习中心词向量矩阵W和上下文向量矩阵W’就是要更新目标函数的ucu_cucvwv_wvw,这两个参数也正是上面提到的模型参数θ。将目标函数用L(θ)表示,用梯度下降法分别计算这两个参数的梯度:

然后更新ucu_cucvwv_wvw

接着更新两个向量矩阵即可。每一次迭代都把词典库中的所有词学习完,并更新两个矩阵,当达到最大迭代次数时,也就完成了word2vec的工作了。
中心词向量矩阵跟one-hot编码是有关系的,只要将one-hot编码和W相乘就是我们要查的那个单词的word embedding了,这个也叫查表(Lookup table)。
通常语义比较相近的词出现在上下文的概率是比较大的,word2vec模型会把两个语义相近的词的word embedding训练的比较接近。

参考和引用
[1] Mikolov T, Chen K, Corrado G, et al. Efficient Estimation of Word Representations in Vector Space[J]. Computer Science, 2013.
[2]《Python自然语言处理实战》涂铭、刘详、刘树春 著

通过实例理解word2vec之Skip-gram相关推荐

  1. 《自然语言处理学习之路》02 词向量模型Word2Vec,CBOW,Skip Gram

    本文主要是学习参考莫烦老师的教学,对老师课程的学习,记忆笔记. 原文链接 文章目录 书山有路勤为径,学海无涯苦作舟. 零.吃水不忘挖井人 一.计算机如何实现对于词语的理解 1.1 万物数字化 1.2 ...

  2. 理解 Word2Vec 之 Skip-Gram 模型

    20211003 NLP系列:Word2Vec原始论文:Efficient Estimation of Word Representations in Vector Space - 简书 原始论文翻译 ...

  3. 通过实例理解 RabbitMQ 的基本概念

    先说下自己开发的实例. 最近在使用 Spring Cloud Config 做分布式配置中心(基于 SVN/Git),当所有服务启动后,SVN/Git 中的配置文件更改后,客户端服务读取的还是旧的配置 ...

  4. 通过实例理解 JDK8 的 CompletableFuture

    转载自 通过实例理解 JDK8 的 CompletableFuture 前言 Java 5 并发库主要关注于异步任务的处理,它采用了这样一种模式,producer 线程创建任务并且利用阻塞队列将其传递 ...

  5. 如何通俗理解Word2Vec

    如何通俗理解Word2Vec 看本文之前,建议先看此文:<BERT通俗笔记:从Word2Vec/Transformer逐步理解到BERT> 前言 今年上半年,我在我的上一篇LSTM博客中写 ...

  6. 通过实例理解Go Execution Tracer

    本文永久链接[1] - https://tonybai.com/2021/06/28/understand-go-execution-tracer-by-example Netflix(奈飞公司)的性 ...

  7. (一)理解word2vec:原理篇

    为什么想起来学习word2vec呢?其实之前自己根本没有接触过NLP的知识和任务,只是最近尝试使用了embedding的方法去处理类别特征和用embedding去做推荐,发现有不错的效果.同时,自己也 ...

  8. (二)理解word2vec:实践篇

    在<(一)理解word2vec:原理篇>中,我已经介绍了word2vec的相关应用和原理.在这篇博客中,我主要介绍word2vec的实践. 本篇博客的基础实践代码仍然参考刘新建老师的博客, ...

  9. 让电脑读懂你的语言——如何理解 Word2Vec

    让电脑读懂你的语言--如何理解 Word2Vec 将单词向量化在 NLP 领域,是非常常见的一个技术.这篇文章介绍一下 Word2Vec 这个算法的具体思想.如果有什么理解不到位的地方也欢迎各位指正. ...

最新文章

  1. 【.NET Core项目实战-统一认证平台】第四章 网关篇-数据库存储配置(2)
  2. source tree 递归子模块_每日刷题3--漫谈二叉树的递归遍历
  3. 【LeetCode从零单排】No.135Candy(双向动态规划)
  4. python3精要(43)--变量注释
  5. BERT原理、代码、相关模型、精调技巧,看这个就够了
  6. matlab 矩阵jocobi迭代_高校MATLAB被禁用,掀起中国本土软件脆弱的冰山一角
  7. 为什么鞋带总是松开?罪魁祸首其实是…
  8. 委托BegionInvoke和窗体BegionInvoke
  9. 如何做职业规划并进行求职准备(持续更新)
  10. 无数本高清古籍善本下载,200多个G
  11. Objective-C延迟执行方法总结
  12. 学生个人html静态网页制作 基于HTML+CSS+JavaScript+jquery仿苏宁易购官网商城模板
  13. Windows系统下的Git安装教程
  14. 根据英语单词学法语单词
  15. Android 远程协助(亲情助手||投屏||远程演示)实现思路和简单实现
  16. jQuery实现雪花飘落效果
  17. Kafka分区副本重分配源码分析
  18. 双11前夕,阿里启用机房巡检机器人、京东加了2000+台服务器!这下你们可以放心剁手了...
  19. 物联网仪表ADW300无线通讯灵活安装
  20. Java-POI读取excel(null的cell也读取输出)

热门文章

  1. 关于C#调用API的理解(汇多考勤机HD4K)
  2. WF4.0 基础篇 (二十八) WF调用PowerShell
  3. 动态链接库dll,静态链接库lib, 导入库lib 转
  4. 拔掉网线时Socket的检查方法
  5. 趣链 BitXHub跨链平台 (10)跨链自治
  6. 分组密码Feistel结构补充说明
  7. buu Alice与Bob
  8. [Issue Fixed]-执行脚本时出现invalid option错误
  9. optee内存管理和页表建立
  10. CSS层叠样式表进阶