1、word2vector简介

2013年,Google团队发表了word2vec工具。word2vec工具主要包含两个模型:跳字模型(skip-gram)和连续词袋模型(continuous bag of words,简称CBOW),以及两种高效训练的方法:负采样(negative sampling)和层序softmax(hierarchical softmax)。

2、词向量

比如有一个城市的词汇表(北京,上海,宁夏,纽约,巴黎,,,,,南京),One-Hot Encoder按照如下方式表示:

杭州 [0,0,0,0,0,0,0,1,0,……,0,0,0,0,0,0,0]上海 [0,0,0,0,1,0,0,0,0,……,0,0,0,0,0,0,0]宁波 [0,0,0,1,0,0,0,0,0,……,0,0,0,0,0,0,0]北京 [1,0,0,0,0,0,0,0,0,……,0,0,0,0,0,0,0]

比如上面的这个例子,在语料库中,杭州、上海、宁波、北京各对应一个向量,向量中只有一个值为1,其余都为0。但是使用One-Hot Encoder有以下几个问题。一方面,城市编码是随机的,向量之间相互独立,看不出城市之间可能存在的关联关系。其次,向量维度的大小取决于语料库中字词的多少。如果将世界所有城市名称对应的向量合为一个矩阵的话,那这个矩阵过于稀疏,并且会造成维度灾难。使用分布式词向量(distributed word Vector Representations)可以有效解决这个问题。Word2Vec可以将One-Hot Encoder转化为低维度的连续值,也就是稠密向量,并且其中意思相近的词将被映射到向量空间中相近的位置。

分布式词向量是一个固定大小的实数向量,事前确定它的大小比如N=300维或者N=1000维,每个元素都是一个实数,实数的具体值是词库里面每个词通过不同的贡献得来的,所以叫分布式的。而word2vec就是一种学习这个分布式词向量的算法。向量的余弦夹角可以代表词语之间的相似度。这种方法相较于One-hot方式另一个区别是维数下降极多,对于一个10W的词表,我们可以用n维(n可以随意设置,比如:n=10)的实数向量来表示一个词,而One-hot得要10W维。

3、模型简介

one-hot向量作为word2vec的输入,通过word2vec训练低维词向量(word embedding)。

word2vec模型其实就是简单化的神经网络。如图:

输入层:One-Hot Vector
隐藏层:没有激活函数,也就是线性的单元。
输出层:维度跟输入层的维度一样,用的是Softmax回归。

4、CBOW

CBOW(Continuous Bag-of-Word Model)又称连续词袋模型,是一个三层神经网络。如下图所示,该模型的特点是输入已知上下文,输出对当前单词的预测。如图:

更详细的图:

网络计算步骤:

  1. 输入层:上下文单词的onehot。(假设单词向量空间dim为V,上下文单词个数为C)
  2. 所有onehot分别乘以共享的输入权重矩阵W(W为V*N矩阵,N为自己设定的数,需要初始化权重矩阵W)
  3. 所得的向量 (注意onehot向量乘以矩阵的结果) 相加求平均作为隐层向量, size为1*N.
  4. 乘以输出权重矩阵W’ {N*V}
  5. 得到向量 {1*V} 激活函数处理得到V-dim概率分布 {PS: 因为是onehot嘛,其中的每一维都代表着一个单词},概率最大的index所指示的单词为预测出的中间词(target word)
  6. 与true label的onehot做比较,误差越小越好。loss function(一般为交叉熵代价函数)

说明:w是输入层到隐藏层的权重矩阵,维度是{V*N},W’是隐藏层到输出层的权重矩阵,维度是{N * V}.

所以,需要定义loss function(一般为交叉熵代价函数),采用梯度下降算法更新W和W’。训练完毕后,输入层的每个单词与矩阵W相乘得到的向量的就是我们想要的词向量(word embedding),这个矩阵(所有单词的word embedding)也叫做look up table(其实这个look up table就是矩阵W自身),也就是说,任何一个单词的onehot乘以这个矩阵都将得到自己的词向量。有了look up table就可以免去训练过程直接查表得到单词的词向量了。

看个例子:

句子:I drink coffee everyday!

softmax公式:

这里,drink稀疏的表示[0 1 0 0]经过embedding之后变为了稠密的矩阵[2 2 1].

5、skip-gram

Skip-gram与CBOW恰恰相反,即已知当前词语,预测上下文。如图:

详细图:

eg: 句子:“The quick brown fox jumps over lazy dog”,我们设定skip_window的参数,它代表着我们从当前input word的一侧(左边或右边)选取词的数量,设定我们的窗口大小为2(skip_window=2),也就是说我们仅选输入词前后各两个词和输入词进行组合。下图中,蓝色代表input word,方框内代表位于窗口内的单词。Training Samples(输入, 输出)。

比如:训练样本取(The,quick),根据句子[The,quick, brown ,fox ,jumps, over,the, lazy, dog],它们被编码成one-hot向量后,The是(1,0,0,0,0,0,0,0,0),quick是(0,1,0,0,0,0,0,0,0)。因此输入是1 * 9维的one-hot向量The(1,0,0,0,0,0,0,0,0),乘以9 * 5(9是单词个数,5是随机取的数字)的输入层到隐藏层的权重矩阵W,得到1 * 5维的隐藏层神经元向量,该神经元向量乘以5 * 9的权重矩阵,得到1*9的向量,对该向量的每个元素值做softmax函数运算,得到另一个1 * 9的向量,该向量的每个值代表每个词的概率,而且之和为1,每个值的大小是什么意思呢?这个向量是the这个词经过训练得到的输出,该输出是一个包含9个概率值分布的向量,向量中的每个概率值代表着对应词汇表中9个单词的概率大小,理想情况是这个向量等于给定的labels向量quick,但由于softmax函数的特性,这种情况永远达不到,所以只能通过反向传播的过程让它们不断逼近。

具体步骤如下:
第一步,输入层到隐藏层:

该图输入的The的one-hot向量称为x,乘以9*5维的权重矩阵W,得到5维的隐藏层神经单元,每个值代表一个神经元,看下计算过程,计算后得到的隐藏层神经元的值其实就是W矩阵的第1行。因为每次输入都是像The这样的向量,one-hot向量中第几列值为1,隐藏层就是W矩阵的第几行。因此对任何输入而言,隐藏层就是W矩阵的某一行,所以:每个词的one-hot向量输入到隐藏层后,隐藏层的值就是权重矩阵W某一行的值,该行的值也就是该词的词向量,因此我们要更新迭代的模型就是W矩阵(即每个词的词向量),w矩阵即是我们模型输出的最终结果
第二步,隐藏层到输出层:

步骤1计算得到的1 * 5维矩阵,作为隐藏层神经元的值[3,0,5,2,4],再乘以一个5 * 9维的权重矩阵Q,得到上述等式右边1 * 9维的矩阵Z[z1,z2,…,z9],对该矩阵的每个值作softmax函数运算,得到Z’[z’1,z’2,…,z’9],其中z’1+z’2+…+z’9 = 1, 这9个z’值,最大那个,就对应着The这个词本应该的输出,而The的labels是quick,quick这个词的one-hot向量为(0,1,0,0,0,0,0,0,0),那么我们训练并且迭代W权重矩阵的目的就是使z’2这个值最大。同理对应其他单词输入输出对(The, brown),(quick,The)等等,采用同样的训练过程,可以不断的调整输入层到隐藏层的W向量9 * 5中每行的值,一共9行9个主要词汇,因此得到9个词向量。

小结:无论是CBOW还是skip-gram,最终我们需要的是训练出来的输入层到隐藏层的权重矩阵w,w每行对应每个词的词向量。

6、训练及优化

在第一部分讲解完成后,我们会发现Word2Vec模型是一个超级大的神经网络(权重矩阵规模非常大)。

举个栗子,我们拥有10000个单词的词汇表,我们如果想嵌入300维的词向量,那么我们的输入-隐层权重矩阵和隐层-输出层的权重矩阵都会有 10000 x 300 = 300万个权重,在如此庞大的神经网络中进行梯度下降是相当慢的。更糟糕的是,你需要大量的训练数据来调整这些权重并且避免过拟合。百万数量级的权重矩阵和亿万数量级的训练样本意味着训练这个模型将会是个灾难。

下面主要介绍两种方法优化训练过程。
1.负采样(negative sampling)
负采样(negative sampling)解决了这个问题,它是用来提高训练速度并且改善所得到词向量的质量的一种方法。不同于原本每个训练样本更新所有的权重,负采样每次让一个训练样本仅仅更新一小部分的权重,这样就会降低梯度下降过程中的计算量。至于具体的细节我在这里就不在介绍了。
2.层序softmax(Hierarchical Softmax)也是解决这个问题的一种方法。

参考:
https://blog.csdn.net/lilong117194/article/details/81979522
https://blog.csdn.net/free356/article/details/79445895
https://blog.csdn.net/mylove0414/article/details/61616617
https://blog.csdn.net/yu5064/article/details/79601683
https://zhuanlan.zhihu.com/p/29020179

通俗理解word2vector词向量模型相关推荐

  1. 词袋模型(BOW,bag of words)和词向量模型(Word Embedding)理解

    Word2vec 向量空间模型在信息检索中是众所周知的,其中每个文档被表示为向量.矢量分量表示文档中每个单词的权重或重要性.使用余弦相似性度量计算两个文档之间的相似性. 尽管对单词使用矢量表示的想法也 ...

  2. AI绘画能力的起源:通俗理解VAE、扩散模型DDPM、DETR、ViT/Swin transformer

    前言 2018年我写过一篇博客,叫:<一文读懂目标检测:R-CNN.Fast R-CNN.Faster R-CNN.YOLO.SSD>,该文相当于梳理了2019年之前CV领域的典型视觉模型 ...

  3. 文本深度表示模型——word2vecdoc2vec词向量模型(转)

    from: https://www.cnblogs.com/maybe2030/p/5427148.html 阅读目录 1. 词向量 2.Distributed representation词向量表示 ...

  4. 飞桨模型保存_手把手教你用飞桨做词向量模型 SkipGram

    飞桨开发者说成员:肥猫.忆臻 在做 NLP 的任务时,一个非常 basic 的操作就是如何编码自然语言中的符号,例如词.短语,甚至词缀.目前流行的方法有大约三种: •  特征工程:这类方法依赖于手工特 ...

  5. 文本深度表示模型—word2vecdoc2vec词向量模型

    来源:http://www.dataguru.cn/article-9478-1.html 深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展.深度学习一直被人们推 ...

  6. PaperWeekly 第52期 | 更别致的词向量模型:Simpler GloVe - Part 1

    作者丨苏剑林 学校丨中山大学硕士生 研究方向丨NLP,神经网络 个人主页丨kexue.fm 前言 如果问我哪个是最方便.最好用的词向量模型,我觉得应该是 word2vec,但如果问我哪个是最漂亮的词向 ...

  7. 干货分享 | 自然语言处理及词向量模型介绍(附PPT)

    云脑科技机器学习训练营第二期,对自然语言处理及词向量模型进行了详细介绍,量子位作为合作媒体为大家带来本期干货分享~ 本期讲师简介 樊向军 云脑科技核心算法工程师,清华大学学士,日本东京大学与美国华盛顿 ...

  8. Ubuntu下GloVe中文词向量模型训练

    开启美好的九月 最近在学习textCNN进行文本分类,然后随机生成向量构建embedding网络的分类效果不是很佳,便考虑训练Glove词向量来进行训练,整个过程还是有遇到一些问题,希望懂的旁友能来指 ...

  9. PaperWeekly 第53期 | 更别致的词向量模型:Simpler GloVe - Part 2

    作者丨苏剑林 学校丨中山大学硕士生 研究方向丨NLP,神经网络 个人主页丨kexue.fm 前言 本文作者在更别致的词向量模型:Simpler GloVe - Part 1一文中提出了一个新的类似 G ...

最新文章

  1. 塞尔达amiibo_塞尔达荒野之息pC版(附带全Amiibo)安装教程,最无敌的游戏
  2. 《OpenGL编程指南(原书第9版)》——导读
  3. 【数据竞赛】竞赛宝典黑科技:基于开源结果的高端融合策略
  4. UVA 103 Stacking Boxes
  5. 三维重建:SLAM算法的考题总结
  6. <input type=“text“ name=““ id=““/>中的name和id有什么区别?
  7. string转为char数组_StringBuilder的区别是什么?String是不可变?一点课堂(多岸学院)...
  8. [开源]快速构建文件下载,支持文件加密,自定义限速
  9. Python爬虫-《神雕侠侣》
  10. 针对小游戏中PNG、JPG压缩工具优化(nodejs)
  11. 高斯09linux教程,Gaussian 09的安装与使用
  12. 最新声鉴卡H5网页源码_完整可运转,引流专用神器
  13. Windows Server 2012 R2 服务器密码忘记问题
  14. CCS6.2 编译出现 error #10099-D: program will not fit into available memory. 使用哪种类型定义的变量会占用.ebss空间
  15. C C++实现网络验证和本地验证
  16. python中的eval函数的使用详解
  17. 树莓派网线直连海康威视摄像头
  18. 桌面和文件管理器右键卡顿几秒的解决办法
  19. GIS毕业生经典笔试、面试题汇总(待续)
  20. js 中使用getUTCMonth() 与 getMonth() 区别

热门文章

  1. 少年,当你谈论飞翔的时候
  2. 使用python画柱状图
  3. 瘦子的肠道菌群和胖子的区别_胖子与瘦子的区别 竟然都是细菌惹的祸!
  4. 栈溢出实例--笔记三(ret2libc)
  5. 前端text(),html() ,val()的区别以及共同点
  6. 公链抱紧USDT大腿
  7. 硬件虚拟化和软件虚拟化
  8. CFF刷题-202012-1期末预测之安全指数
  9. python画正方形-如何用python画正方形
  10. Java 获取Enum枚举中的值,以列表方式返回