word embedding算法中最为经典的算法就是今天要介绍word2vec,最早来源于Google的Mikolov的:
1、Distributed Representations of Sentences and Documents
2、Efficient estimation of word representations in vector space
也是开创了无监督词嵌入的新局面,让大量之后的NLP工作基于word2vec(或类似的改进工作)的词嵌入再做其他任务。推荐看[1]的论文,相对比较容易看懂。也推荐看下[4],是本文中的公式和基本原理讲解来源,因为我只是用于笔记,不作为商用,所以很多话如果我觉得可以理解的话我就不改了,但是中间会穿插一些自己的理解。希望通过本篇可以把word2vec再巩固一遍。

词向量表示

先讲一讲one-hot词向量和distributed representation分布式词向量

  • one hot的表示形式:word vector = [0,1,0,…,0],其中向量维数为词典的个数|V|,当前词对应的位置为1,其他位置为0。

  • distributed的表示形式:word vector = [0.171,-0.589,-0.346,…,0.863],其中向量维数需要自己指定(比如设定256维等),每个维度的数值需要通过训练学习获得。

虽然one-hot词向量构造起来很容易,但通常并不是一个好选择。一个主要的原因是,one-hot词向量无法准确表达不同词之间的相似度,如我们常常使用的余弦相似度。对于向量 x,y∈Rdx,y \in R^dx,yRd ,它们的余弦相似度是它们之间夹角的余弦值

x⊤y∥x∥∥y∥∈[−1,1].\frac{\boldsymbol{x}^\top \boldsymbol{y}}{\|\boldsymbol{x}\| \|\boldsymbol{y}\|} \in [-1, 1]. xyxy[1,1].

word2vec工具的提出正是为了解决上面这个问题 。它将每个词表示成一个定长的向量,并使得这些向量能较好地表达不同词之间的相似和类比关系。word2vec工具包含了两个模型,即跳字模型(skip-gram) 和连续词袋模型(continuous bag of words,CBOW)。接下来让我们分别介绍这两个模型以及它们的训练方法。

跳字模型(skip-gram)



注解:看到这里,就引出了word2vec的核心方法,其实就是认为每个词相互独立,用连乘来估计最大似然函数,求解目标函数就是最大化似然函数。上面公式涉及到一个中心词向量v,以及北京词向量u,因此呢很有趣的是,可以用一个input-hidden-output的三层神经网络来建模上面的skip-model。

Skip-gram可以表示为由输入层(Input)、映射层(Projection)和输出层(Output)组成的神经网络(示意图如下,来自[2]):
图1

  • 输入的表示:输入层中每个词由独热编码方式表示,即所有词均表示成一个N维向量,其中N为词汇表中单词的总数。在向量中,每个词都将与之对应的维度置为1,其余维度的值均为0。
  • 网络中传播的前向过程:输出层向量的值可以通过隐含层向量(K维),以及连接隐藏层和输出层之间的KxN维权重矩阵计算得到。输出层也是一个N维向量,每维与词汇表中的一个单词相对应。最后对输出层向量应用Softmax激活函数,可以计算每一个单词的生成概率。

训练跳字模型


注解:上面的公式每一步都推荐推到一下,都很基础。上面只求了对中心词向量v的梯度,同理对背景词向量的梯度,也很容易计算出来。然后就采用传统的梯度下降(一般采用sgd)来训练词向量(其实我们最后关心的是中心词向量来作为词的表征。)

这里有一个key point说下,也许大家也想到了:词向量到底在哪里呢?回看下前面图1,有两层神经网络,第一层是input层到hidden层,这个中间的weight矩阵就是词向量!!!

假设input的词汇表N长度是10000,hidden层的长度K=300,左乘以一个10000长度one-hot编码,实际上就是在做一个查表!因此,这个weight矩阵的行就是10000个词的词向量。很有创意是不是?再来看神经网络的第二层,hidden到out层,中间hidden层有没有激活函数呢?从前面建模看到,u和v是直接相乘的,没有激活层,所以hidden是一个线性层。out层就是建模了v和u相乘,结果过一个softmax,那么loss函数是最大似然怎么办呢?其实就是接多个只有一个true label(背景词)的cross entropy loss,把这些loss求和。因为交叉熵就是最大似然估计,如果这点不清楚的可以去网上搜一下,很容易知道。

所以呢,我们即可用前面常规的最大似然建模来理解如何对u和v的进行优化求解;也完全可以把skip-model套到上面图1这样的一个简单神经网络中,然后就让工具自己来完成weight的训练,就得到了我们想要的中心词向量。
下图是对这个过程的简单可视化过程示意图。左边矩阵为词汇表中第四个单词的one-hot表示,右边矩阵表示包含3个神经元的隐藏层的权重矩阵,做矩阵乘法的结果就是从权重矩阵中选取了第四行的权重。因此,这个隐藏层的权重矩阵就是我们最终想要获得的词向量字典[2]

获取训练样本:按照上下文窗口的大小从训练文本中提取出词汇对,下面以句子The quick brown fox jumps over the lazy dog为例提取用于训练的词汇对,然后将词汇对的两个单词使用one-hot编码就得到了训练用的train_data和target_data。 下面的图中给出了一些我们的训练样本的例子。我们选定句子“The quick brown fox jumps over lazy dog”,设定我们的窗口大小为2(window_size=2),也就是说我们仅选输入词前后各两个词和输入词进行组合。下图中,蓝色代表input word,方框内代表位于窗口内的单词。Training Samples(输入, 输出)示意图如下:

如果使用随机梯度下降,那么在每一次迭代里我们随机采样一个较短的子序列来计算有关该子序列的损失,然后计算梯度来更新模型参数。

连续词袋模型(CBOW)

CBOW就倒过来,用多个背景词来预测一个中心词,CBOW对小型数据库比较合适,而Skip-Gram在大型语料中表现更好[2]。但是方法和上面是很像的,因此这里我就放下图。推导的方法是一样的。

训练连续词袋模型


我们发现,不论是跳字模型(skip-gram) 还是连续词袋模型(CBOW),我们实际上都是取得input-hidden这个词向量(weight矩阵),而不是后面带着loss那一部分,这样我们也很容易可以对loss(训练方法)进行修改,这个也是下一篇要说的内容:

问:每次梯度的计算复杂度是多少?当词典很大时,会有什么问题?

word2vec作者很创造性地提出了2种近似训练方法(分层softmax(hierarchical softmax)和负采样(negative sampling)),得益于此,可以训练大规模语料库。

参考资料:
[1] word2vec Parameter Learning Explained,《word2vec Parameter Learning Explained》论文学习笔记
[2] Word2Vector之详解Skip-gram(1toN)
[3] 探索:word2vec
[4] http://zh.gluon.ai/chapter_natural-language-processing/word2vec.html

深度学习方法(十七):word2vec算法原理(1):跳字模型(skip-gram) 和连续词袋模型(CBOW)相关推荐

  1. 深度强化学习-DDPG算法原理和实现

    全文共3077个字,8张图,预计阅读时间15分钟. 基于值的强化学习算法的基本思想是根据当前的状态,计算采取每个动作的价值,然后根据价值贪心的选择动作.如果我们省略中间的步骤,即直接根据当前的状态来选 ...

  2. 深度学习之 神经网络算法原理

    深度学习之 神经网络算法原理 什么是神经网络算法? 初中映射 神经网络 求映射? 求解参数 图解求参 参考文献 什么是神经网络算法? 初中映射 初中的时候 y = f(x) 老师进过 映射 . 通过 ...

  3. SEO技术深度解析(TF-IDF算法原理及公式)

    做为SEO行业老鸟应该听说过TF-IDF算法,TF-IDF算法属于搜索引擎中的核心部分.TF-IDF算法是增加相关词的覆盖率,以及高优布局关键词密度,从而在百度谷歌等搜索引擎内容质量这一项上的排名加分 ...

  4. 深度强化学习-Actor-Critic算法原理和实现

    全文共2543个字,2张图,预计阅读时间15分钟. 基于值的强化学习算法的基本思想是根据当前的状态,计算采取每个动作的价值,然后根据价值贪心的选择动作.如果我们省略中间的步骤,即直接根据当前的状态来选 ...

  5. 深度学习分析--TextCNN算法原理及分类实现

    深度学习算法背景 人工智能发展历史 随着算力提高以及深度学习的应用,近几年算法发展很快 应用场景 计算机视觉 用于车牌识别和面部识别等的应用. 信息检索 用于诸如搜索引擎的应用 - 包括文本搜索和图像 ...

  6. 深度强化学习-D3QN算法原理与代码

    Dueling Double Deep Q Network(D3QN)算法结合了Double DQN和Dueling DQN算法的思想,进一步提升了算法的性能.如果对Doubel DQN和Duelin ...

  7. 深度强化学习——DQN算法原理

    DQN算法原理 一.DQN算法是什么 二.DQN训练过程 三.经验回放 (Experience Replay) 四.目标网络(Target Network) 1.自举(Bootstrapping) 2 ...

  8. 深度强化学习-DQN算法原理与代码

    DQN算法是DeepMind团队提出的一种深度强化学习算法,在许多电动游戏中达到人类玩家甚至超越人类玩家的水准,本文就带领大家了解一下这个算法,论文和代码的链接见下方. 论文:Human-level ...

  9. 论文笔记:深度学习方法的翼型设计及性能预测代理模型

    论文题目:<Airfoil design and surrogate modeling for performance prediction based on deep learning met ...

最新文章

  1. 微型计算机实验代码,上师大,微型计算机实验全代码.doc
  2. 045_Collapse折叠面板
  3. PacificA: Replication in Log-Based Distributed Storage Systems 论文理解
  4. 中国互联网大佬江湖拼什么?拼财力拼出身拼前景拼造势
  5. CSS 优化、提高性能的方法
  6. 导入mysql source_mysql导入source数据库
  7. Java虚拟机10:类加载器
  8. 介绍两款API管理工具
  9. 信息学奥赛一本通 1820:【00NOIP提高组】进制转换 | 洛谷 P1017 [NOIP2000 提高组] 进制转换
  10. 关于灵魂安放,年轻人如何选择适合自己的城市呢?学长有话说
  11. 大数据之-Hadoop之HDFS的API操作_配置参数的优先级说明_以设置hdfs文件副本数量参数为案例---大数据之hadoop工作笔记0057
  12. 基于cxf框架javaweb服务说明
  13. python 并查集_python 实现并查集源代码 | 学步园
  14. 日本惠普发表14.1型液晶内藏笔记本PC「dv4」系列2种模式
  15. 细等线体cass_CAD中,刚打开一个文件,细等线体显示不出来,然后换个字体后在换回细等线体才正常显示,怎么回事?...
  16. 【人工智能】动物、植物、车型、菜品、LOGO识别示例代码
  17. DataHunter完成千万级A轮融资 打造数据协作平台
  18. [附源码]Python计算机毕业设计常见病辅助食疗系统
  19. Atom-beautify插件的安装,使用过程
  20. 2016年腾讯实习生面试技术面一面二面

热门文章

  1. EM算法:期望最大算法,原来你是这么得灵性,很多机器学习的参数都是通过EM算法求解的
  2. FZU - 1921 栀子花开(线段树)
  3. FZU-1921 栀子花开(线段树)
  4. [企业微信]查看userid
  5. Python实现对脑电数据情绪分析
  6. 新版微信支付 v3 php uniapp
  7. php怎么安装fpm,apache php fpm安装方法详解
  8. 机器学习数学基础——线性代数
  9. laradock mysql 设置_修改laradock端口,让valet和laradock完美共存
  10. 新概念英语视频教学(共4册)