word2vec是一种将word转为向量的方法,其包含两种算法,分别是skip-gram和CBOW,它们的最大区别是skip-gram是通过中心词去预测中心词周围的词,而CBOW是通过周围的词去预测中心词。

这个word2vec的方法是在2013年的论文《Efficient Estimation of Word Representations inVector Space》中提出的,作者来自google,文章下载链接:https://arxiv.org/pdf/1301.3781.pdf

文章提出了这两种方法如下图所示:

你现在看这张图可能一头雾水,不知所措,没关系,我们慢慢来学习。

在处理自然语言时,通常将词语或者字做向量化,例如one-hot编码,例如我们有一句话为:“我爱北京天安门”,我们分词后对其进行one-hot编码,结果可以是:

“我”: 【1,0,0,0】
“爱”: 【0,1,0,0】
“北京”: 【0,0,1,0】
“天安门”: 【0,0,0,1】

这样,我们就可以将每个词用一个向量表示了。

但是ont-hot编码在大量数据的情况下会出现维度灾难,通过观察我们可以知道上面的one-hot编码例子中,如果不同的词语不是4个而是n个,则one-hot编码的向量维度为1*n,也就是说,任何一个词的one-hot编码中,有一位为1,其他n-1位为0,这会导致数据非常稀疏(0特别多,1很少),存储开销也很大(n很大的情况下)。

那有什么办法可以解决这个问题呢?

于是,分布式表示被提出来了。什么是分布式表示?

它的思路是通过训练,将每个词都映射到一个较短的词向量上来。这个较短的词向量维度是多大呢?这个一般需要我们在训练时自己来指定。现在很常见的例如300维。

例如下面图展示了四个不同的单词,可以用一个可变化的维度长度表示(图中只画出了前4维),其实可以是多少维由你指定。假设为4维。

大家如果细心,会发现在展示的这些维度中的数字已经不是1和0了,而是一些其他的浮点数。

这种将高维度的词表示转换为低维度的词表示的方法,我们称之为词嵌入(word embedding)。


上图是将一个3维词向量表示转为2维词向量表示。

有个有意思的发现是,当我们使用词嵌入后,词之间可以存在一些关系,例如:
kingkingking的词向量减去manmanman的词向量,再加上womanwomanwoman的词向量会等于queenqueenqueen的词向量!

出现这种神奇现象的原因是,我们使用的分布式表示的词向量包含有词语上下文信息。

怎么理解上下文信息呢?

其实很简单,我们在上学时,做阅读理解经常会提到联系上下文,所谓的上下文信息无非是当前内容在文本中前后的其他内容信息。

如下图所示,learning这个词的上下文信息可以是它左右两边的content标记的内容。


试想一下,如果这里的learning换成studying,是不是这句话仍然很合适呢?毕竟这两个单词都是学习的意思。

再转换一下思维,由于在当前上下文信息中,learning和studying都可以出现,是不是learning和studying是近义词了呢?没错,在当前的CBOW下确实是这样,甚至man和woman,cat和dog都可能是近义词。

所以大家是否理解了呢?

其实就是拥有相似或者相同的上下文的多个词可能是近义词或者同义词。

这里慢慢将CBOW的算法思想透露出来了,因为CBOW就是通过当前中心词的上下文单词信息预测当前中心词。

此时再来看CBOW这张示意图,是不是有点感觉了?


接下来进入具体的算法模型部分!

首先我们需要训练CBOW模型,该模型的结构如下图:

这张图略微复杂,我们需要从最左边开始看,最左边的一列是当前词的上下文词语,例如当前词的前两个词和后两个词,一共4个上下文词。

这些上下文词即为图中的x1kx_{1k}x1kx2kx_{2k}x2kxckx_{ck}xck

这些词是one-hot编码表示,维度为1V(虽然图上画得像列向量V1,这图画的容易理解错误,其中V为词空间的大小,也就是有多少个不同的词,则one-hot编码的维度为多少,也就是V个不同的词)。

然后刚说的每个上下文的词向量都需要乘以一个共享的矩阵WWW,由于整个模型是一个神经网络结构,我们将这个存在于输入层和隐藏层之间的矩阵称为W1W_1W1,该矩阵的维度为V∗NV*NVN,其中VVV如前所述,NNN为我们自己定义的一个维度。

学过线性代数的矩阵乘法我们知道,这里的one-hot编码向量1∗V1*V1V乘上维度为V∗NV*NVN的矩阵W1W_1W1,结果是1∗N1*N1N的向量。

这里因为一个中心词会有多个上下文词,而每个上下文词都会计算得到一个1∗N1*N1N向量,我们将这些上下文词的1∗N1*N1N向量相加取平均,得到中间层(隐藏层)的向量,这个向量也为1∗N1*N1N,之后,这个向量需要乘以一个N∗VN*VNV的矩阵W2W_2W2,最终得到的输出层维度为1∗V1*V1V

然后将1∗V1*V1V的向量softmax归一化处理得到新的1∗V1*V1V向量,在VVV个取值中概率值最大的数字对应的位置所表示的词就是预测结果。如果对softmax的概念陌生,可以搜索学习一下。

而这个输出的结果1∗V1*V1V就是预测出的中心词的分布式表示。

别急,我们只是讲通了这个CBOW模型的前向计算过程。

我们接下来说说模型的训练过程。

  1. 当前词的上下文词语的one-hot编码输入到输入层。
  2. 这些词分别乘以同一个矩阵W1W_1W1后分别得到各自的1∗N1*N1N向量。
  3. 将这些1∗N1*N1N向量取平均为一个1∗N1*N1N向量。
  4. 将这个1∗N1*N1N向量乘矩阵W2W_2W2,变成一个1∗V1*V1V向量。
  5. 1∗V1*V1V向量softmax归一化后输出取每个词的概率向量1∗V1*V1V
  6. 将概率值最大的数对应的词作为预测词。
  7. 将预测的结果1∗V1*V1V向量和真实标签1∗V1*V1V向量(真实标签中的V个值中有一个是1,其他是0)计算误差,一般是交叉熵。
  8. 在每次前向传播之后反向传播误差,不断调整W1W_1W1W2W_2W2矩阵的值。

预测的时候,做一次前向传播即可得到预测的中心词结果。

你可能会想,word2vec不是要将词转为分布式表示的词嵌入么?怎么变成预测中心词了?
其实我们在做CBOW时,最终要的是W1W_1W1这个V∗NV*NVN矩阵,想想这是为什么呢?

因为我们是要将词转换为分布式表示的词嵌入,我们先将词进行one-hot编码,每个词的向量表示是1∗V1*V1V的,经过乘以W1W_1W1后,根据矩阵乘法的理解,假设1∗V1*V1V向量中第n位是1,其他是0,则矩阵乘法结果是得到了W1W_1W1矩阵中的第n行结果,也就是将词表示为了一个1∗N1*N1N的向量,一般NNN远小于VVV,这也就将长度为VVV的one-hot编码稀疏词向量表示转为了稠密的长度为NNN的词向量表示。

如果还没啥感觉,看下面这张图帮助你理解:

所以,当我们下次要查某个词的词向量时,只需要和矩阵W1W_1W1相乘就能得到结果。常用的词向量长度有300,大家想想300是不是远小于我们词表里所有不重复词的数量呢?

word2vec介绍相关推荐

  1. word2vec 介绍

    1.背景 在NLP中,传统算法通常使用one-hot形式表示一个词,存在以下问题: 1)维度爆炸,词表通常会非常大,导致词向量维度也会非常大. 2)损失语义信息,one hot随机给每个词语进行编号映 ...

  2. 《Word2vec》1 模型的引入介绍与相关概念

    文章目录 一 .Word2Vec模型的背景引入 1.1 One-hot模型 1.2 One-Hot编码的手动实现 1.3 Keras中one-hot编码的实现 2. Word2vec的相关概念与知识 ...

  3. 【python gensim使用】word2vec词向量处理中文语料

    word2vec介绍 word2vec官网:https://code.google.com/p/word2vec/ word2vec是google的一个开源工具,能够根据输入的词的集合计算出词与词之间 ...

  4. Word2Vec揭秘: 这是深度学习中的一小步,却是NLP中的巨大跨越

    作者:Suvro Banerjee编译:ronghuaiyang 导读 做NLP现在离不开词向量,词向量给了我们一个非常好的单词的向量表示,用一个有限长度的向量,可以表示出所有的词,还可以表示出词与词 ...

  5. word2vec python 代码实现_python gensim使用word2vec词向量处理中文语料的方法

    word2vec介绍 word2vec是google的一个开源工具,能够根据输入的词的集合计算出词与词之间的距离. 它将term转换成向量形式,可以把对文本内容的处理简化为向量空间中的向量运算,计算出 ...

  6. Word2Vec的安装与使用

    Word2Vec的安装与使用 Word2Vec介绍 Word2Vec安装 Word2Vec使用 安装过程遇到问题 1. error:could not build wheels for word2ve ...

  7. Word2Vec详解-公式推导以及代码

    Word2Vec 1.前记 2.一些背景知识 2.1词向量简单介绍 2.2哈弗曼树简单介绍 3.基于层次softmax的模型 3.1COBW 层次softmax 3.1.1整体结构 3.1.2 前向传 ...

  8. 一文弄懂Word2Vec之skip-gram(含详细代码)

    目录 前言 一.什么是Skip-gram算法 二.目标是什么 三.定义表示法 3.1 one-hot向量 3.2 词向量(word vector) 3.3 单词矩阵 3.4 单词相似度 3.5 sof ...

  9. word2vec预训练词向量+通俗理解word2vec+CountVectorizer+TfidfVectorizer+tf-idf公式及sklearn中TfidfVectorizer

    文章目录 文分类实(一) word2vec预训练词向量 2 数据集 3 数据预处理 4 预训练word2vec模型 canci 通俗理解word2vec 独热编码 word2vec (Continuo ...

最新文章

  1. resnet50 自定义
  2. 二进制安装kubernetes1.14.1-pod配置清单之客户端访问方式03
  3. SVN 放弃修改或撤销删除
  4. (Java集合框架)List接口
  5. Intel 酷睿i5 6300HQ与Intel 酷睿i7 6700HQ哪个好
  6. hdoj1242(dfs 剪枝 解法)
  7. 求职华为,被问观察者模式,从没有这种体验!!!
  8. android tabhost 多个activity,Android:TabHost中Activity的生命周期问题
  9. OSS开源软件是什么
  10. 用Android Studio做一个超好玩的拼图游戏,附送超详细注释的源码
  11. 那个即刻,他回来啦!
  12. SAP 中英文转换-英转中
  13. 《菊与刀》读后感作文5000字
  14. Android 项目必备(八)--> APP 的开发流程
  15. SQL优化13连问,收藏好!
  16. 计算机研究生考试题,全国研究生考试计算机统考试题及答案-20210522014129.docx-原创力文档...
  17. 如何提高本地文件上传至百度云的速度_上传1GB/s,下载1KB/s的原因终于找到了! | 细说网盘储存机制...
  18. macd的python代码同花顺_同花顺顶级MACD指标公式源码-同花顺公式 -程序化交易(CXH99.COM)...
  19. dirac hd sound的奇特“减法”技术
  20. Spark 2.2.1 SQL UDAF用户自定义函数案例

热门文章

  1. extjs学习—-官方模版注释2
  2. 当前标识(NT AUTHORITY\NETWORK SERVICE)没有对“C:\WINDOWS\Microsoft.NET\Frame 的写访
  3. Oracle触发器的语法详解
  4. python模块--BeautifulSoup4 和 lxml
  5. Git根据commitId查看提交内容:根据commitId查看某次提交的内容
  6. Redis之CentOS7安装配置Redis
  7. 序数是什么意思_序数与基数
  8. 桌面云计算机的配置,Citrix桌面云实验环境的部署配置
  9. oracle 11g 清除 trc后缀文件,请教一个跟踪文件的问题。11g 很多trc文件。。
  10. android面试自定义view,资深面试官:自定义View的实现方式,你知道几种?