一、概述

  关于word2vec,首先需要弄清楚它并不是一个模型或者DL算法,而是描述从自然语言到词向量转换的技术。词向量化的方法有很多种,最简单的是one-hot编码,但是one-hot会有维度灾难的缺点,而且one-hot编码中每个单词都是互相独立的,不能刻画词与词之间的相似性。目前最具有代表性的词向量化方法是Mikolov基于skip-gram和negative sampling开发的,也是大家通常所认为的word2vec。这种方法基于分布假设(Distributed Hypothesis)理论,认为不同的词语如果出现在相同的上下文环境中就会有的相似的语义。word2vec最终将向量表示为低维的向量,具有相似语义的单词的向量之间的距离会比较小,部分词语之间的关系能够用向量的运算表示。例如 vec("Germany")+vec("capital")=vec("Berlin")。tensorflow官网中有关于word2vec的教程,可视化的结果非常直接的表现了word2vec的优点。这篇笔记尝试一步一步梳理word2vec,主要是skip-gram和negative sampling,大部分的内容来自于参考资料1,资料1是国外MIT博士word2vec的解读,最为总结学习非常适合。

二、skip-gram 模型

  skip-gram是简单的三层网络模型,由输入、映射和输出三层组成。skip-gram是神经网络语言模型的一种,与CBOW相反,skip-gram是由目标词汇来预测上下文词汇,最终目标是最大化语料库Text出现的概率。例如:语料库为“the quick brown fox jumped over the lazy dog”(实际语料库中单词的数量会很非常大),当上下文窗口为1时,skip-gram的任务是从‘quick’预测‘the’和‘brown’,从‘brown’预测‘quick’和‘fox’...因此训练skip-gram的输入输出对(input,output)为:(quick, the), (quick, brown), (brown, quick), (brown, fox), ...

  假设给定语料库Text,w是Text中的一个单词,c是w的上下文,skip-gram的目标是最大化语料库Text的概率。theta 是模型的参数,C(w)是单词w的上下文,skip-gram的目标函数如下:

  使用softmax表示条件概率p(c|w),Vc,Vw分别表示单词c和w的向量表示,C表示所有可能的上下文,就是语料库Text中所有不同的单词。

  取对数,最终得到skip-gram的目标函数

  这个目标函数由于需要对所有可能的c‘求和,c’的数量为整个语料库Text中的词,一般会非常大,因此优化上述的目标是的计算代价是非常大的。有两种方法解决这个问题,一是使用层级softmax(Hierarchy softmax)代替softmax,另一种使用Negative sampling。看paper发现两种方法的效果都挺不错的,但是Mikolov挺推荐使用Negative sampling的。

三、Negative sampling

  Mikolov 在paper证实了Negative sampling 非常高效。实际上,negative sampling 基于skip-gram模型的,但是使用了另一个优化函数。它的基本思想是考虑(w,c)对是不是来自训练数据,p(D=1|w,c)表示这个(w,c)队来自于语料库,p(D=0|w,c)=1-p(D=1|w,c)表示(w,c)队不是来自于语料库Text。现在优化的目标是:

p(D=1|w,c)可以使用sofmax,准确的来说是逻辑回归表示:

这个目标函数有一个非常简单的解,迭代调整theta使得Vc=Vw,Vc.Vw=k,当比较大的时候k≈40时,p(D=1|w,c)=1,很显然这并不是我们所要的解。我们需要一种机制去防止所有的向量都相等,一种方法是给模型提供一些(w,c)对,使得p(D=1|w,c)=1很小,例如这些(w,c)对并不是Text中真实存在的,而是随机产生的,这就称之为“Negative sampling”。这些随机产生的(w,c)对组成集合D‘。因此最终的Negative sampling 的优化函数如下所示,可以看出求解的计算量并不是很大。Mikolov 在论文中提到,对高频词汇做二次抽样(subsampling)和去除出现次数非常少的词(pruning rare-word)不仅能加快训练的速度,而且能提高模型的准确度,效果会更好。

四、实现

  参考tennsorflow官方教程:https://www.tensorflow.org/versions/r0.9/tutorials/word2vec/index.html

reference:

[1]. word2vec Explained: Deriving Mikolov et al.'s Negative-Sampling Word-Embedding Method

[2]. Distributed Representations of Words and Phrases and their Compositionality

[3]. Vector Representations of Words

[4]. 深度学习word2Vec笔记

一步一步理解word2Vec的更多相关文章

  1. 一步一步理解GB、GBDT、xgboost

    GBDT和xgboost在竞赛和工业界使用都非常频繁,能有效的应用到分类.回归.排序问题,虽然使用起来不难,但是要能完整的理解还是有一点麻烦的.本文尝试一步一步梳理GB.GBDT.xgboost,它们 ...

  2. 一步一步理解Paxos算法

    一步一步理解Paxos算法 背景 Paxos 算法是Lamport于1990年提出的一种基于消息传递的一致性算法.由于算法难以理解起初并没有引起人们的重视,使Lamport在八年后重新发表到 TOCS ...

  3. 一步一步的理解C++STL迭代器

    一步一步的理解C++STL迭代器 "指针"对全部C/C++的程序猿来说,一点都不陌生. 在接触到C语言中的malloc函数和C++中的new函数后.我们也知道这两个函数返回的都是一 ...

  4. 一步一步理解 python web 框架,才不会从入门到放弃 -- 开始使用 Django

    背景知识 要使用 Django,首先必须先安装 Django. 下图是 Django 官网的版本支持,我们可以看到上面有一个 LTS 存在.什么是 LTS 呢?LTS ,long-term suppo ...

  5. 如何一步一步用DDD设计一个电商网站(九)—— 小心陷入值对象持久化的坑

    阅读目录 前言 场景1的思考 场景2的思考 避坑方式 实践 结语 一.前言 在上一篇中(如何一步一步用DDD设计一个电商网站(八)—— 会员价的集成),有一行注释的代码: public interfa ...

  6. 如何一步一步用DDD设计一个电商网站(六)—— 给购物车加点料,集成售价上下文

    阅读目录 前言 如何在一个项目中实现多个上下文的业务 售价上下文与购买上下文的集成 结语 一.前言 前几篇已经实现了一个最简单的购买过程,这次开始往这个过程中增加一些东西.比如促销.会员价等,在我们的 ...

  7. 如何一步一步用DDD设计一个电商网站(三)—— 初涉核心域

    一.前言 结合我们本次系列的第一篇博文中提到的上下文映射图(传送门:如何一步一步用DDD设计一个电商网站(一)—— 先理解核心概念),得知我们这个电商网站的核心域就是销售子域.因为电子商务是以信息网络 ...

  8. 一步一步使用ABP框架搭建正式项目系列教程

    研究ABP框架好多天了,第一次看到这个框架的名称到现在已经很久了,但由于当时内功有限,看不太懂,所以就只是大概记住了ABP这个名字.最近几天,看到了园友@阳光铭睿的系列ABP教程,又点燃了我内心要研究 ...

  9. 一步一步开发Game服务器(四)地图线程

    时隔这么久 才再一次的回归正题继续讲解游戏服务器开发. 开始讲解前有一个问题需要修正.之前讲的线程和定时器线程的时候是分开的. 但是真正地图线程与之前的线程模型是有区别的. 为什么会有区别呢?一个地图 ...

随机推荐

  1. [翻译]AKKA笔记 - CHILD ACTORS与ACTORPATH -6

    原文:http://rerun.me/2014/10/21/akka-notes-child-actors-and-path/ Actor是完全的继承结构.你创建的任何Actor肯定都是一个其他Act ...

  2. javaScript的call关键字

    function add(a, b) { alert(a + b); } function sub(a, b) { alert(a - b); } add.call(sub,3,1); //这个例子中 ...

  3. dataguru(炼数成金)大数据培训基地印象

    dataguru访问地址:http://f.dataguru.cn/?fromuid=99611 课程优惠码:C4B6  这段时间一直在dataguru(炼数成金)上学习<hadoop数据分析平 ...

  4. 多线程进行http请求

    昨天需要一个线下脚本进行单播推送,大约有1kw个用户,考虑到推送速度就临时搞了个请求线上的一个脚本 /** * 临时支持invoke单播推送 */ #include <stdio.h> # ...

  5. PCTF-2016-WEB

    Pctf ** web100 PORT51**  开始看到这个真的无法下手,想过用python–socket编程或者scapy发包.自己觉得是可以的,但是没有去试,后面看一大神writeup,知道: ...

  6. 【Mysql】日期时间格式化

    1.日期转成指定格式:DATE_FORMAT(date, format) 2.int型时间转成指定格式:FROM_UNIXTIME(unix_timestamp,format) 根据format字符串 ...

  7. Thrift搭建分布式微服务(二)

    第二篇 连接池  连接池配置,请前往Thrift搭建分布式微服务(一)  下面要介绍的其实不是单一的连接池,应该说是连接池集合.因为它要管理多个Tcp Socket连接节点,每个服务节点都有设置了自己 ...

  8. Angulajs系列-01-入门

    1.解决什么问题? a, controller的各种的创建 b,体验angular的双向绑定 2.怎么解决 2.1 引入angularjs 下载地址 2.2 创建controller的方法 2.2.1 ...

  9. apktool反编译工具

    几个报错的解决办法 apktool反编译时经常会出现下面的信息 Input file was not found or was not readable. Destination directory ...

  10. C# 编码约定

    参考自 MSDN     https://msdn.microsoft.com/zh-cn/library/ff926074.aspx , 只摘要个人觉得有用部分 命名约定 在不包括 using 指令 ...