【图文并茂】通过实例理解word2vec之Skip-gram
点击上方,选择星标或置顶,每天给你送干货!
阅读大概需要9分钟
跟随小博主,每天进步一丢丢
作者: 猫猫
CSDN: 猫猫玩机器学习
导读
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’就是要更新目标函数的 ,这两个参数也正是上面提到的模型参数θ。将目标函数用L(θ)表示,用梯度下降法分别计算这两个参数的梯度:
然后更新:
接着更新两个向量矩阵即可。每一次迭代都把词典库中的所有词学习完,并更新两个矩阵,当达到最大迭代次数时,也就完成了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自然语言处理实战》涂铭、刘详、刘树春 著
投稿或交流学习,备注:昵称-学校(公司)-方向,进入DL&NLP交流群。
方向有很多:机器学习、深度学习,python,情感分析、意见挖掘、句法分析、机器翻译、人机对话、知识图谱、语音识别等。
记得备注呦
推荐阅读:
IJCAI2019 | Self-attentive Biaffine Dependency Parsing
NAACL2019-使用感知句法词表示的句法增强神经机器翻译
详解基于转移的依存句法解析器
一个简单有效的联合模型
原创不易,麻烦给个在看!
【图文并茂】通过实例理解word2vec之Skip-gram相关推荐
- 通过实例理解word2vec之Skip-gram
word2vec主要实现方法是Skip-gram和CBOW. CBOW的目标是根据上下文来预测当前词的概率,且上下文所有的词对当前词出现概率的影响的权重是一样的,因此叫做continuous bag- ...
- 《自然语言处理学习之路》02 词向量模型Word2Vec,CBOW,Skip Gram
本文主要是学习参考莫烦老师的教学,对老师课程的学习,记忆笔记. 原文链接 文章目录 书山有路勤为径,学海无涯苦作舟. 零.吃水不忘挖井人 一.计算机如何实现对于词语的理解 1.1 万物数字化 1.2 ...
- 理解 Word2Vec 之 Skip-Gram 模型
20211003 NLP系列:Word2Vec原始论文:Efficient Estimation of Word Representations in Vector Space - 简书 原始论文翻译 ...
- 通过实例理解 RabbitMQ 的基本概念
先说下自己开发的实例. 最近在使用 Spring Cloud Config 做分布式配置中心(基于 SVN/Git),当所有服务启动后,SVN/Git 中的配置文件更改后,客户端服务读取的还是旧的配置 ...
- 通过实例理解 JDK8 的 CompletableFuture
转载自 通过实例理解 JDK8 的 CompletableFuture 前言 Java 5 并发库主要关注于异步任务的处理,它采用了这样一种模式,producer 线程创建任务并且利用阻塞队列将其传递 ...
- 如何通俗理解Word2Vec
如何通俗理解Word2Vec 看本文之前,建议先看此文:<BERT通俗笔记:从Word2Vec/Transformer逐步理解到BERT> 前言 今年上半年,我在我的上一篇LSTM博客中写 ...
- 通过实例理解Go Execution Tracer
本文永久链接[1] - https://tonybai.com/2021/06/28/understand-go-execution-tracer-by-example Netflix(奈飞公司)的性 ...
- (一)理解word2vec:原理篇
为什么想起来学习word2vec呢?其实之前自己根本没有接触过NLP的知识和任务,只是最近尝试使用了embedding的方法去处理类别特征和用embedding去做推荐,发现有不错的效果.同时,自己也 ...
- (二)理解word2vec:实践篇
在<(一)理解word2vec:原理篇>中,我已经介绍了word2vec的相关应用和原理.在这篇博客中,我主要介绍word2vec的实践. 本篇博客的基础实践代码仍然参考刘新建老师的博客, ...
- 让电脑读懂你的语言——如何理解 Word2Vec
让电脑读懂你的语言--如何理解 Word2Vec 将单词向量化在 NLP 领域,是非常常见的一个技术.这篇文章介绍一下 Word2Vec 这个算法的具体思想.如果有什么理解不到位的地方也欢迎各位指正. ...
最新文章
- poj 1284 Primitive Roots(原根+欧拉函数)
- python压缩文件夹下的所有文件_python压缩文件夹内所有文件为zip文件的方法
- leetcode307. Range Sum Query - Mutable
- MySQL备份命令mysqldump参数说明与示例
- RTP之H264封包和解包
- 并查集判断是否有环存在
- 深度学习笔记(22) Padding
- 轮播 一张中间 两张在旁边_黄渤为《五哈》做海报,邓超陈赫都只有一张,唯独对鹿晗待遇不同...
- 剑指offer——4.二维数组中的查找
- 可实现“一台主机多人同用”的 Windows MultiPoint Server 2011 中文正式版
- 自然语言处理——文本的表示
- HTTP之Web服务器
- NUC11猎豹峡谷设置U盘启动
- hg6201m怎么设置虚拟服务器,移动光猫HG6201M定期重启设置
- python转义字符与原字符
- oracle缓冲区闩锁类型,等待缓冲区闩锁时出现超时 -- 类型 4
- 2013年最后2个月的学习目标(成果)(上次更新2013年11月18日)
- MySQL学习总结(一)DB、DMBS、SQL的含义/MySQL语法规范
- socket中pack 和 unpack 的使用
- 【ML】MoG与EM:从EM到MoG
热门文章
- 关于数据分析用到的统计学知识
- Javascript定时器的使用
- linux搭建phantomjs+webdriver+testng+ant自动化工程
- 【windows核心编程】IO完成端口(IOCP)复制文件小例
- Asp.net can do Native Code also can do it(updated)
- foreach写失效的问题
- python coroutine测试
- Python:使用正则去除HTML标签(转)
- 如何保证数据库结构的合理性(三、建立可靠的关系)
- JSON解析(C++)