本文首发于微信公众号「对白的算法屋」,来一起学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的本质的更多相关文章

  1. 【C语言/C++编程学习笔记】:通俗易懂讲解 - 链表!学不会?不存在的!

    C语言是面向过程的,而C++是面向对象的 C和C++的区别: C是一个结构化语言,它的重点在于算法和数据结构.C程序的设计首要考虑的是如何通过一个过程,对输入(或环境条件)进行运算处理得到输出(或实现 ...

  2. DOM 之通俗易懂讲解

    DOM是所有前端开发每天打交道的东西,但是随着jQuery等库的出现,大大简化了DOM操作,导致大家慢慢的“遗忘”了它的本来面貌.不过,要想深入学习前端知识,对DOM的了解是不可或缺的,所以本文力图系 ...

  3. 【NLP】大白话讲解word2vec到底在做些什么

    转载自:http://blog.csdn.net/mylove0414/article/details/61616617 词向量 word2vec也叫word embeddings,中文名“词向量”, ...

  4. DOM之通俗易懂讲解

    DOM是所有前端开发每天打交道的东西,但是随着jQuery等库的出现,大大简化了DOM操作,导致大家慢慢的“遗忘”了它的本来面貌.不过,要想深入学习前端知识,对DOM的了解是不可或缺的,所以本文力图系 ...

  5. 通俗易懂讲解TCP流量控制机制,了解一下

    上篇文章讲了TCP拥塞控制机制的原理,没看过的不妨看下:5分钟读懂拥塞控制,这篇文章讲讲TCP流量控制机制. 一.为什么需要流量控制? 双方在通信的时候,发送方的速率与接收方的速率是不一定相等,如果发 ...

  6. 通俗易懂的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 ...

  7. 通俗易懂讲解happens-before原则

      在接下来的叙述里我首先会说明happens-before规则是干什么用的,然后用一个简单的小程序说明happens-before规则 一.happens-before规则 我们编写的程序都要经过优 ...

  8. 通俗易懂讲解IO模型

    前言 说到IO模型,都会牵扯到同步.异步.阻塞.非阻塞这几个词.从词的表面上看,很多人都觉得很容易理解.但是细细一想,却总会发现有点摸不着头脑.自己也曾被这几个词弄的迷迷糊糊的,每次看相关资料弄明白了 ...

  9. svm算法 最通俗易懂讲解

    最近在学习svm算法,借此文章记录自己的学习过程,在学习很多处借鉴了z老师的讲义和李航的统计,若有不足的地方,请海涵:svm算法通俗的理解在二维上,就是找一分割线把两类分开,问题是如下图三条颜色都可以 ...

随机推荐

  1. Capture One 21 Pro 14.0.2.36中文版安装教程

    Capture One 21 Pro 14.0.2.36 for windows是一款由丹麦PHASE ONE飞思公司推出的.非常专业强大的图像处理编辑工具. 下载 Capture One 21 Pr ...

  2. ThinkPHP 5

    use think\Controller 1.$this->request->param();      内置request 安全对象, 不再使用 $_GET ,$_POST 2.path ...

  3. djinn靶机

    仅供个人娱乐 靶机信息 https://download.vulnhub.com/djinn/djinn.ova 一.主机探测 二.漏洞的查找和利用 21端口ftp 匿名登录 7331端口 命令执行  ...

  4. 大数据学习(24)—— Spark入门

    在学Spark之前,我们再回顾一下MapReduce的知识,这对我们理解Spark大有裨益. 在大数据的技术分层中,Spark和MapReduce同为计算层的批处理技术,但是Spark比MapRedu ...

  5. 聊聊TCP Keepalive、Netty和Docker

    聊聊TCP Keepalive.Netty和Docker 本文主要阐述TCP Keepalive和对应的内核参数,及其在Netty,Docker中的实现.简单总结了工作中遇到的问题,与大家共勉. 起因 ...

  6. vue 传参动态

    方法一: router/index.js { path: '/src/views/activitiesDetails', name: activitiesDetails, component: act ...

  7. Java方法02——定义与调用

    方法的定义与调用 定义与调用 例子  package method; ​ public class Demon03 {     public static void main(String[] arg ...

  8. 关于修改.net core webapi中null默认返回的状态码。

    在asp .net core webapi中,http请求的响应数据如果是null的话,我们知道状态码会返回204,即NoContent,为什么会出现这种情况呢?   因为在返回响应数据的时候,nul ...

  9. [数据结构-平衡树]普通 FHQ_Treap从入门到精通(注释比代码多系列)

    普通 FHQ_Treap从入门到精通(注释比代码多系列) 前提说明,作者写注释太累了,文章里的部分讲解来源于Oi-wiki,并根据代码,有部分增改.本文仅仅发布于博客园,其他地方出现本文,均是未经许可 ...

  10. 003 TCP/IP协议详解(二)

    一.ping ping可以说是ICMP的最著名的应用,是TCP/IP协议的一部分.利用"ping"命令可以检查网络是否连通,可以很好地帮助我们分析和判定网络故障. 例如:当我们某一 ...