1.什么是word2vector?

我们先来看一个问题,假如有一个句子 " the dog bark at the mailman"。
假如用向量来表示每个单词,我们最先想到的是用one hot 编码的方式来表达每个单词,具体来说。
the 可以表示为 [1,0,0,0,0]
dog 可以表示为 [0,1,0,0,0]
bark 可以表示为 [0,0,1,0,0]
at 可以表示为[0,0,0,1,0]
mailman可以表示为[0,0,0,0,1]
 
 
我们可以看到每个单词其实就用一个向量来表示。我们发现几个问题:
第一,每个向量之间相互正交的(内积为0)。也就是说词与词之间是没有任何关系的。
第二,每个词的向量维度和不同词的个数有关。比方说,在上面的这个句子里,有5个不同的词,所以向量的维度是5。然而往往现实中,一篇文章的中不同的词的个数是很多的。这样,向量的维度会非常的高。
这种对词的向量表示方法存在着以上的问题,忽略了词与词之间的关系(比如说,dog和cat都是动物,并非完全无关系)。维度太高的向量作为模型输入会导致模型变的复杂(模型复杂需要更多的训练样本才能够收敛)
 
那么是否存在一种更加合理的对词的用向量的表达方式呢?有的,其实就是word embedding。
word embedding说的简单一点其实就是将高维稀疏的向量降维成稠密的低维向量。(一种高维到低维的映射)
 
那么如和实现word embedding?
w2v其实就是一种高效实现word embedding的工具。
所以,如果用一句话来描述word2vector的话你会怎么描述?简单的说,我觉得可以这么说w2v其实是一种将单词转化向量的工具。这一种向量的其实是对单词更有效的表达。
 

2.word2vector怎么做?

上面提到为了得到表达能力更强的词向量,我们可以进行word embedding。那么w2v是如何实现word embedding的呢?
下面我总结一下主要的思想,详细的原理可以参考以上给的三篇文章。
 

2.1 Skip-Gram& CBOW

 在介绍w2v模型之前,先介绍两个模型。一个是Skip-Gram和CBOW(Continuous Bag-of-Words)。
首先看CBOW,它的做法是,将一个词所在的上下文中的词作为输入,而那个词本身作为输出。
再来看Skip-Gram,它的做法和CBOW相反,将一个词所在的上下文中的词作为输出,而词本身作为输入。(下面有例子说明)
另外,我们介绍这两个模型都会涉及到的一个重要参数。
window_size:窗口大小。
举一个例子,还是上面那句话:" the dog bark at the mailman"
假设window_size取1时,利用CBOW模型可以得到:
([the,bark],dog)
([dog,at],bark)
([bark,the],at)
([at,mailman],the)
一共4组数据。
同样滴,假设window_size还是1,利用Skip-Gram模型可以得到:
(dog,[the,bark])
(bark,[dog,at])
(at,[bark,the])
(the,[at,mailman])

对于每组数据会稍微做一下处理。

比如对于第一组 (dog,[the,bark])一般处理成
(dog,the),(dog,bark)。类似有:
(bark,dog),(bark,at),(at,bark),(at,the),(the,at),(the,mailman)共8组数据。
 
 

2.2 word2vector

下面就可以直接介绍如何进行w2v,上面提到w2v可以看作是一个将高维空间映射到低维空间的过程,用一个单层神经网络就可以实现这种功能(和自编码器有点类似其实)。
对于CBOW,假如还是上面的句子,训练数据是([the,brak],dog)那么网络的输入输出如下图所示:
这里有几个细节:
1.上面介绍CBOW模型的时有一个模型的结构图,其中的SUM意思其实就是把各个上下文的词one-hot后的向量相加。
比如对于the的向量是[1,0,0,0,0]。bark向量是[0,0,1,0,0],SUM之后就是[1,0,1,0,0]这就是网络的输入。
输出就是[0,1,0,0,0]-dog
2.我们所谓的embedding vetcor其实就第二个红框里的线,每一根线其实就是一个权值。
3.第二个框里的红线其实就是dog这个单词的embedding结果(由5维变成3维)

4.这个单层NN训练完毕之后有用的部分就是embedding martrix这部分,其大小为 输入个数(词汇表长度)×embedding后的维度。

 
类似对于Skip-Gram模型有:
当取训练数据(dog,bark)时,网络结构如上图,对比上面的CBOW最大的不同其实就是在于输入数据。
 

2.3 其他问题

上面只是关于w2v一个非常浅显方面的介绍,其实还有比如 负采样(negative sampling),层级SoftMax以及代码解读等,自己尝试写了几次,但是感觉都并没有太多的新东西,也没有什么犀利的见解。所以就没贴上来,下面只是简单概括一下负采样。
 
1.为什么需要负采样?
其实理由很简单,比如对于CBOW模型,已经知道词w的上下文Context(w)。如果希望预测词w,因此,当给定Context(w)时,词w就是一个正样本,其他词就是负样本。在上面的网络里面我们可以容易地看出输出有多少个就是词汇表里有多少个词。通常来说,我们的词汇表是非常庞大的,对于某一个词w,每个负样本逐个去算一次计算的代价是很大的。

-------------------------------------------------------------------------------------------------------------------------------------------------------------

网上已经有许多对w2v的介绍了,这里只是做一个简单的概括。下面这篇文章我认为是关于W2V写的比较好的文章:
另外一篇是关于Skip-Gram和CBow的介绍。
 
逻辑比较清晰的综述文章:
 
数学原理很清晰很短的一篇文章(也有关于负采样的简单说明)

---------------------------------------------------------------------------------------------------------------------------------------------------------------

仅为学习记录之用,侵删。

参考:https://blog.csdn.net/qq_22238533/article/details/78534743

https://www.leiphone.com/news/201706/PamWKpfRFEI42McI.html

word2vector 理解入门的更多相关文章

  1. C#委托,事件理解入门 (译稿)

    原文地址:http://www.codeproject.com/Articles/4773/Events-and-Delegates-Simplified 引用翻译地址:http://www.cnbl ...

  2. 初识React-Redux之粗暴理解入门

    权当暂记 日后再行补充完善,若有阅读者,请翻到下文黄色标题'从这里开始'起阅读. Rudex在我看来最本质做的事情就是将所有的State属性统一存储(一个属性就是一个注册到store的Reducer) ...

  3. AQS简单理解入门---1

    这篇文章,我们来聊聊面试时一个比较有杀伤力的问题:聊聊你对AQS的理解? 之前有同学反馈,去互联网公司面试,面试官聊到并发时就问到了这个问题.当时那位同学内心估计受到了一万点伤害... 因为首先,很多 ...

  4. java字节码理解-入门

    前记:作为一名JAVA Developer,每次打开Eclipse,查找一个没有源码的类时,都会看到一个这样的画面: 大意是:这个jar文件,没有附带源码.紧接着后面的就看不懂了,很好奇下面的一部分是 ...

  5. 个人对vuex的表象理解(笔记)

    一个东西,首先要知道为什么用它,为什么要vuex,官方解释为了解决繁杂事件订阅和广播,那么事件的$dispatch,$on,怎么就复杂了?许多人是不是感觉后者还挺简单的,对的 如果简单小型项目,那么不 ...

  6. [转] 对vuex的表象理解(笔记)

    一个东西,首先要知道为什么用它,为什么要vuex,官方解释为了解决繁杂事件订阅和广播,那么事件的$dispatch,$on,怎么就复杂了?许多人是不是感觉后者还挺简单的,对的 如果简单小型项目,那么不 ...

  7. 从ReentrantLock实现非公平锁的源码理解AQS中的CLH队列

    虽然前面也看过AQS的文章,并且转载过一篇大佬的分析,但是我觉得他们对于AQS和ReentrantLock部分的源码的分析并不详细,自己理解期来还是有问题,于是自己准备花时间重新梳理下,好了,进入正题 ...

  8. .Net设计模式_单列模式

    理解 博友的经典说法:很多人排队去厕所蹲坑一样,每一次只能让一个人去蹲坑,这是一种通俗的理解. 理论上的理解则为,我们需要写一个类,这个类的作用就是控制,从而保证在整个应用程序的生命周期中,在任何时刻 ...

  9. DotNet基础

    DotNet基础 URL特殊字符转义 摘要: URL中一些字符的特殊含义,基本编码规则如下: 1.空格换成加号(+) 2.正斜杠(/)分隔目录和子目录 3.问号(?)分隔URL和查询 4.百分号(%) ...

随机推荐

  1. Generator函数(一)

    Generator函数是ES6提供的一种异步编程解决方案,语法行为与传统函数完全不同.对于这个函数有多种理解.从语法上来理解,可以将它理解成一个状态机,封装了多个内部状态.内部的不同状态是通过yiel ...

  2. Linux下Git命令中文显示乱码的问题解决:274\232\350\256\256\346\200\273\347\273\223

    使用git add添加要提交的文件的时候,如果文件名是中文,会显示形如274\232\350\256\256\346\200\273\347\273\223的乱码. 解决方案:在bash提示符下输入: ...

  3. 【maven】pom.xml文件没错,但是项目有小红叉,Problems中可以看到错误:“Dynamic Web Module 3.0 requires Java 1.6 or newer.”

    解决方法: 1.将 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>m ...

  4. (判断url文件大小)关于inputStream.available()方法获取下载文件的总大小

    转自:http://hold-on.iteye.com/blog/1017449 如果用inputStream对象的available()方法获取流中可读取的数据大小,通常我们调用这个函数是在下载文件 ...

  5. Scut快速开发

    1     开发环境 Scut Lib版本:5.2.3.2 需要安装的软件 a)        IIS和消息队列(MSMQ) b)        数据库,Sql2005以上版本 c)        V ...

  6. Nginx" upstream prematurely closed connection while reading response header from upstream"问题排查

    问题背景 我们这边是一个基于Nginx的API网关(以下标记为A),最近两天有调用方反馈,偶尔会出现502错误,我们从Nginx的error日志里看,就会发现有" upstream prem ...

  7. Linux/Unix C编程之的perror函数,strerror函数,errno

    #include <stdio.h> // void perror(const char *msg); #include <string.h> // char *strerro ...

  8. YARN Application执行流程

    原文见  http://xiguada.org/yarn-application_run/ 本节简单描述了一个Application在YARN上的执行流程,希望对初识YARN的同学提供一些帮助. 图1 ...

  9. java 获取进程的processId

    package us.mine.demo.jvm.util; import java.lang.management.ManagementFactory; import java.lang.manag ...

  10. CocoSourcesCS 2

    CocoSourcesCS 2 /*------------------------------------------------------------------------- DFA.cs - ...