通俗易懂讲解Word2vec的本质
本文首发于微信公众号「对白的算法屋」,来一起学AI叭
一、Word2vec
CBOW(Continuous Bag-of-Words):每个词的含义都由相邻词决定。
Skip-gram:依据分布的相似性,一个词的含义可以通过上下文获得。

注:Skip-gram 是预测一个词的上下文,而 CBOW 是用上下文预测这个词
1.1 CBOW (one-word context):

1.2 CBOW (Multi-word context):

1.3 Skip-gram:

二、计算效率优化技术
2.1 Hierarchical Softmax技术:
诞生背景:word2vec为什么不用现成的DNN模型,要继续优化出新方法呢?最主要的问题是DNN模型的这个处理过程非常耗时。我们的词汇表一般在百万级别以上,这意味着我们DNN的输出层需要进行softmax计算各个词的输出概率的的计算量很大。
优化思路:使用哈夫曼树来代替隐藏层和输出层的神经元,哈夫曼树的叶子节点起到输出层神经元的作用,叶子节点的个数即为词汇表的小大。 而内部节点则起到隐藏层神经元的作用。


由于我们把之前所有都要计算的从输出softmax层的概率计算变成了一颗二叉哈夫曼树,那么我们的softmax概率计算只需要沿着树形结构进行就可以了。在哈夫曼树中,隐藏层到输出层的softmax映射不是一下子完成的,而是沿着哈夫曼树一步步完成的,因此这种softmax取名为"Hierarchical Softmax"。
现在有一句话:“我喜欢观看足球世界杯”,我们需要通过Hierarchical Softmax获得“足球”的词向量,则哈夫曼树结构如下所示:

以图中ω=“足球”为例,从根节点出发到达“足球”这个叶子节点,中间共经历了4次分支(每条红色的边对应一次分支),而每一次分支都可视为进行了一次二分类。
既然是从二分类的角度来考虑问题,那么对于每一个非叶子节点,就需要为其左右孩子结点指定一个类别,即哪个是正类(标签为1),哪个是负类(标签为0)。
Word2vec定义编码为0是正类,编码为1是负类。
根据逻辑回归,易知一个结点被分为正类的概率是

被分为负类的概率是:

对于从根节点出发到达“足球”这个叶子节点所经历的4次二分类,将每次分类结果的概率写出来是:

但是,我们要求的是P(足球|Contex(足球)),它跟着4个概率值有什么关系呢?关系就是

至此,通过w=“足球”这个例子,Hierarchical Softmax的基本思想其实就已经介绍完了。
总结:对于词典中任意词ω,哈夫曼树中必存在一条从根节点到词w对应结点的路径pω(且这条路径是唯一的)。路径pω上存在lω-1个分支,将每个分支看做一次二分类,每一次分类就产生一个概率,将这些概率连乘起来,就是所需的P(ω|Context(ω))。
条件概率P(ω|Context(ω))的一般公式可写为:

将上式代入对数似然函数便得:

为下面梯度推导方便起见,将上式中双重求和符号下花括号里的内容简记为:

以上就是CBOW模型的目标函数。在word2vec中,由于使用的是随机梯度上升法,所以并没有把所有样本的似然乘起来得到真正的训练集最大似然,仅仅每次只用一个样本更新梯度,这样做的目的是减少梯度计算量。
要得到模型中 词向量和内部节点的模型参数 , 我们使用梯度上升法即可。首先我们求模型参数 的梯度:

同样的方法,可以求出 的梯度表达式如下:

有了梯度表达式,我们就可以用梯度上升法进行迭代来一步步的求解我们需要的所有的 −1和 。
Hierarchical Softmax的优缺点:
优点:将softmax问题转化为多层二分类问题。
缺点:当目标词是一个生僻词时,从根节点到叶子节点的路径将会非常长,这无疑增加了计算量。
2.2 Negative Sampling技术:
Negative Sampling是NCE(Noise Contrastive Estimation)的一个简化版本,目的是用来提高训练速度并改善词向量的质量(低频词)。与Hierarchical Softmax相比,NEG不再使用复杂的哈夫曼树,而是利用相对简单的随机负采样,能大幅提高性能,因而可作为Hierarchical Softmax的一种替代。
2.2.1 CBOW模型:
在CBOW模型中,已知词ω的上下文Context(ω),需要预测ω,因此,对于给定的Context(ω),词ω就是一个正样本,其它词就是负样本了。



2.2.2 负采样构建训练集的方法:


最后欢迎大家关注我的微信公众号:对白的算法屋(duibainotes),跟踪NLP、推荐系统和对比学习等机器学习领域前沿。
想进一步交流的同学也可以通过公众号加我的微信一同探讨技术问题,谢谢。
通俗易懂讲解Word2vec的本质的更多相关文章
- 【C语言/C++编程学习笔记】:通俗易懂讲解 - 链表!学不会?不存在的!
C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...
- DOM 之通俗易懂讲解
DOM是所有前端开发每天打交道的东西,但是随着jQuery等库的出现,大大简化了DOM操作,导致大家慢慢的“遗忘”了它的本来面貌.不过,要想深入学习前端知识,对DOM的了解是不可或缺的,所以本文力图系 ...
- 【NLP】大白话讲解word2vec到底在做些什么
转载自:http://blog.csdn.net/mylove0414/article/details/61616617 词向量 word2vec也叫word embeddings,中文名“词向量”, ...
- DOM之通俗易懂讲解
DOM是所有前端开发每天打交道的东西,但是随着jQuery等库的出现,大大简化了DOM操作,导致大家慢慢的“遗忘”了它的本来面貌.不过,要想深入学习前端知识,对DOM的了解是不可或缺的,所以本文力图系 ...
- 通俗易懂讲解TCP流量控制机制,了解一下
上篇文章讲了TCP拥塞控制机制的原理,没看过的不妨看下:5分钟读懂拥塞控制,这篇文章讲讲TCP流量控制机制. 一.为什么需要流量控制? 双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发 ...
- 通俗易懂的word2Vec负采样理解
理解:http://www.shuang0420.com/2017/03/21/NLP%20%E7%AC%94%E8%AE%B0%20-%20%E5%86%8D%E8%B0%88%E8%AF%8D%E ...
- 通俗易懂讲解happens-before原则
在接下来的叙述里我首先会说明happens-before规则是干什么用的,然后用一个简单的小程序说明happens-before规则 一.happens-before规则 我们编写的程序都要经过优 ...
- 通俗易懂讲解IO模型
前言 说到IO模型,都会牵扯到同步.异步.阻塞.非阻塞这几个词.从词的表面上看,很多人都觉得很容易理解.但是细细一想,却总会发现有点摸不着头脑.自己也曾被这几个词弄的迷迷糊糊的,每次看相关资料弄明白了 ...
- svm算法 最通俗易懂讲解
最近在学习svm算法,借此文章记录自己的学习过程,在学习很多处借鉴了z老师的讲义和李航的统计,若有不足的地方,请海涵:svm算法通俗的理解在二维上,就是找一分割线把两类分开,问题是如下图三条颜色都可以 ...
随机推荐
- SQL SERVER获取某张表创建的索引
1 SELECT 索引名称=a.name 2 ,表名=c.name 3 ,索引字段名=d.name 4 ,索引字段位置=d.colid 5 FROM sysindexes a 6 JOIN sysin ...
- Session与Cookie的原理以及使用小案例>从零开始学JAVA系列
目录 Session与Cookie的原理以及使用小案例 Cookie和Session所解决的问题 Session与Cookie的原理 Cookie的原理 Cookie的失效时机 小提示 Session ...
- 记录21.08.04 — mybatis入门学习
mybatis入门 mybatis简介 MyBatis 是一款优秀的持久层框架,它支持自定义 SQL.存储过程以及高级映射.MyBatis 免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工 ...
- jmeter之json提取器详解
Json提取器详解 *Apply to:参照正则表达式提取器 *Names of created:自定义变量名. 变量名可以填写多个,变量名之间使用分号进行分隔. 一旦变量名有多个,则下方的json ...
- 可怕!字节跳动大牛爆出的“Android进阶指南”,强到无法形容,GitHub已标星“8.5k”!
前言 从去年8月份开始,我开始重新找工作,在这期间刷了不少面试题和大牛博客,无意中薅到一份字节跳动大牛整理的一份"Android进阶指南",包含Android面试常见问题.主流技术 ...
- pom.xml中web.xml is missing and <failOnMissingWebXml> is set to true错误的解决
.personSunflowerP { background: rgba(51, 153, 0, 0.66); border-bottom: 1px solid rgba(0, 102, 0, 1); ...
- Using Emacs as Clojure IDE
Open emacs24; Change CWD to parent folder of project home: M-x cd ~/docs/tmp; Build a leiningen proj ...
- SpringCloud升级之路2020.0.x版-16.Eureka架构和核心概念
本系列代码地址:https://github.com/HashZhang/spring-cloud-scaffold/tree/master/spring-cloud-iiford Eureka 目前 ...
- Pikachu-File Inclusion模块
一.概述 文件包含,是一个功能.在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件. 比如 在PHP中,提供了:include(),inclu ...
- IP实验笔记
代码: 对LSW1: Vlan 10 Interface ethernet 0/0/1 Port link-type access Port default vlan 10 Interface eth ...