word2vec(一)——skip-gram原理理解
目录
1 什么是word2vec
2 skip-gram模型
2.1 skip-gram模型用来做什么
2.2 什么是Fake Task?
2.3 skip-gram模型细节
2.3.1 输入层
2.3.2 隐层
2.3.3 输出层
2.4 skip-gram公式推导
3 其他补充
1 什么是word2vec
word2vec顾名思义,就是将词(word)映射到(to)实向量(vector),用一一实数向量表示一个词,也被叫做词嵌入(word embedding),也可以认为词向量是词的特征向量。通过这种词嵌入的方式可以将词语映射为可以计算的数学形式,使计算机对自然的语言的计算变得更加可行,同时也赋予了它一定的数学性质,例如可以用向量的相似度来表示两个词的相似度等等。word2vec可以参考这篇文章中有提到https://blog.csdn.net/qq_31267769/article/details/108036005。
最简单的一种方式就是利用一个维数为V的onehot向量表示一个长度为V的词库,这种方法用词的index平等的表示了词库中的每个词,但是显然不是一个好的方法。onehot向量是一共稀疏向量,并且维数与词库中词数相同,当词数很大,这种表示的计算效率就很低,并且很多神经网络工具很难计算高维的稀疏向量。此外,用onehot表示词语也会出现一个问题,不同的词向量永远两两正交,没有办法用相似度来计算两个词的关系,也就是onehot的表示形式忽略了两个词之间的关系。
常用的两种基于预测的计算词嵌入的算法就是CBOW和skip-gram,skip-gram是根据一个中心词生成上下文词,CBOW是根据上下文词生成一个中心词,本文主要介绍skip-gram。
2 skip-gram模型
下图是CBOW和skip-gram模型的网络结构图,可以看到CBOW模型是通过上下文词来生成中心词,而skip-gram是通过中心词来生成上下文词,两个模型似乎是完全对称的,这次主要介绍skip-gram。
2.1 skip-gram模型用来做什么
文章开头讲到了word2vec,上面又提到了skip-gram是通过中心词来生成上下文词,所以word2vec和skip-gram生成上下文词有什么关系?
模型的细节很多博客都有细致的讲解,但是这个问题很少有人明确提出。首先skip-gram确实是通过softmax计算输出概率最大的上下文词,也确实是使用skip-gram来计算词向量,所以这个模型到底是输出什么?这里就引入了Fake Task。
2.2 什么是Fake Task?
上面提到了Fake Task,word2vec模型的最终目的并不是建模,而是通过训练数据来学习隐层的参数,而隐层的参数实际就是word vectors,就是说将中心词和上下文词成组输入,(input word, output word),然后最大化他们的概率,从而学习隐层参数,而隐层的参数就是最终要获取的词向量。
下面举一个例子来展示如何训练神经网络:
首先这里有一句话:[I, want, to ,learn, NLP],下面使用这句话来训练神经网络。
- 首先遍历这句话,选取中心词,假设现在遍历到了“learn”这个单词,然后这里有一个超参数叫做window size。假设window_size=1,则这个window中包括中心词前后各一个单词(window_size=n,则这个window中包括中心词前后各n个单词,window长度为2n)。
- 然后我们可以在window中获得两组(input word, output word),分别是:(learn, to),(learn, NLP)。
- 神经网络基于这些训练数据将会输出一个概率分布,这个概率代表着我们的词典中的每个词是output word的可能性,后优化参数,最大化这个概率,就完成了对网络的训练。
- 然后训练好的网络模型的隐层权重矩阵就是最终想得到的词向量。
其中:
- 使用得到的两组数据来训练神经网络,训练的过程使用word pair(inputword,outputword),inputword是一个One-Hot的向量,outputword的也是一个表示输出单词的One-Hot的向量。
- 当使用训练好的网络进行预测时,输出的向量实际上是一个概率分布,并不是一个One-Hot向量,因为输出层使用了softmax,将输出映射成了一个概率分布。
2.3 skip-gram模型细节
2.3.1 输入层
首先要将单词表示为计算机可表示的形式然后输入模型,这里仍然使用one-hot向量表示。但是开头提到one hot向量有很多问题。首先这里使用one hot向量表示单词并不需要表示出单词的之间的关系,只需要将每个单词区分开来,然后以计算机所理解的形式输入就可以了。这么做仅仅是为了解决编码问题,这里的向量并不是最终的词向量,所以没关系,可以使用onehot表示。
2.3.2 隐层
隐层所作的事情实际就是降维,通过矩阵乘法将输入层输入的稀疏onehot向量降维成低维的稠密向量。例如原始是10000维的onehot向量,如果想用300维的稠密向量来表示一个单词,那么隐层的权重矩阵应该为10000行,300列(隐层有300个结点)。在做矩阵乘法后就获得了一个1*300的向量,相等于通过矩阵乘法将onehot向量映射为了一个低维稠密向量,在映射之后,仍然表示原来的单词,信息量不会发生变化。
而最终的目的就是学习隐层的权重矩阵,通过权重矩阵与单热向量相乘就可以得到每个单词的降维后的稠密向量,这个就是词向量。这个把高维稀疏向量映射为低维稠密向量的过程就叫做嵌入,也就是词嵌入。由于矩阵运算计算量巨大,而单热向量在进行矩阵运算的时候,只有对应位置为一的那一行元素相乘不会为0,且就等于原始值,所以这个矩阵乘法就可以简化为查表的过程,将权重矩阵中与单热向量对应位置唯一的行向量选出来就是词嵌入。因此可以想到,对于一个1*10000的单热向量,会学习出一个10000*300的权重矩阵(300是一个超参数,表示词向量的维度),所以这个权重矩阵的每一维都是一个向量,也就是说为什么最终目的是为了学习这个权重矩阵,有了权重矩阵就可以计算出每个单词的向量。
2.3.3 输出层
输出层为softmax分类器,词库中的每个单词都会对应一个输出神经元,对应上面的例子,词库有10000个词,那么就有10000个输出神经元。每个输出神经元都会产生一个0-1的结果,表示输出结果为对应单词的概率是多少,这些输出神经元的输出总和为1,根据softmax的公式可以知道。就是说,每个输出神经元都有一个权重向量,这个权重向量就是所说的上下文词向量,然后将输出神经元的权重向量与中间隐层的权重向量相乘,然后求指数后归一化,将这个结果除以来自所有10,000个输出节点的结果之和,就得到了softmax的概率分布。
2.4 skip-gram公式推导
下面用一个例子做数学推导:
假设现在有一个文本序列:I, want, to, learn, NLP
首先遍历这句话,选取中心词,假设现在遍历到了“to”这个单词,然后这里有一个超参数叫做window size。假设window_size=2,则这个window中包括中心词前后各两个单词。根据skip-gram,给定中心词“to”,生成窗口内单词的概率(注意这里暂时不考虑停用词):
假设在给定中心词的条件下每个单词出现的概率是独立的,这里很类似朴素贝叶斯的条件独立性假设,可以大大的简化运算。
上面模型介绍中也提到,输出层通过一个softmax将结果转换成了概率分布,因此计算的概率公式如下:
其中分别代表上下文词和中心词,代表上下文词词向量和中心向量,是全体词库。这个概率就是给定中心词的条件下,某个词是上下文词的概率。根据上面的简化:
每个词的条件概率相互独立,所以可以写成连乘的形式:
其中,t表示中心词的位置,m是窗口大小这样就得到了每个中心词的计算上下文词的概率,在这个式子中变量是上下文向量和中心词向量,于是只要改变参数使概率最大化就可以了。在这里使用极大似然估计,首先对上式进行化简,对上式取负对数:
加负号后,最大化变成最小化然后使用梯度下降最小化损失函数即可。接着对上式进行化简后对参数求导,计算梯度:
至此求得梯度,然后用梯度下降就可以对中心词向量进行优化:,上下文词向量也是同样的方法
梯度下降优化结束后,我们便能得到两个向量u和v,分别表示上下文词向量和中心词向量,这就是我们要找的词向量。
3 其他补充
上面粗劣的推导了一下数学公式,还有很多地方不清楚。
- 如何对同时对中心词向量和上下文词向量进行优化?
- 为什么要计算中心词向量和上下文词向量相乘,数学意义是什么?
- 为什么同一个词要使用两个向量表示?据说是方便求导计算
- 最终使用哪个向量作为词向量?版本一,取两向量均值;版本二,取中心词向量
注意:
- skip-gram并没有考虑语序问题。
- 建模是fake task,真正目的是获得权重矩阵,权重矩阵的每行分别是每个单词的词向量。
- 在隐层只是用了矩阵乘法将高维onehot向量映射为一个低维稠密向量,这个向量就是中心词向量,并没有使用激活函数。
- 在输出层是将隐层输出的中心词向量和上下文词向量相乘后输入softmax分类器,最终输出的是概率分布。
- 在训练时每个词都会交替变成中心词向量和上下文词向量,而中心词向量和上下文词向量
word2vec(一)——skip-gram原理理解相关推荐
- 《自然语言处理学习之路》02 词向量模型Word2Vec,CBOW,Skip Gram
本文主要是学习参考莫烦老师的教学,对老师课程的学习,记忆笔记. 原文链接 文章目录 书山有路勤为径,学海无涯苦作舟. 零.吃水不忘挖井人 一.计算机如何实现对于词语的理解 1.1 万物数字化 1.2 ...
- 【word2vec】篇一:理解词向量、CBOW与Skip-Gram等知识
文章目录 词向量基础 One-hot represention Distributed Representation word2vec 基础知识 CBOW 和 Skip-gram 霍夫曼树 系列文章: ...
- 转:word2vec 中的数学原理详解
1,目录和前言 https://blog.csdn.net/itplus/article/details/37969519 2,预备知识:逻辑回归.贝叶斯公式.霍夫曼树 https://blog.cs ...
- 【转载】word2vec 中的数学原理详解
文章目录 一.前言 二.预备知识 三.背景知识 四.基于 Hierarchical Softmax 的模型 五.基于 Negative Sampling 的模型 六.若干源码细节 原文传送门: wor ...
- Linux 输入子系统原理理解(原创)
linux 输入子系统原理理解(原创) 以前学了单独的按键设备驱动以及鼠标驱动,实际上,在linux中实现这些设备驱动,有一种更为推荐的方法,就是input输入子系统.平常我们的按键,触摸屏,鼠 ...
- 集成学习——NGBoost论文研读与原理理解
NGBoost(Natural Gradient Boosting)是一个比较新的Boosting方法,它是2019年10月斯坦福吴恩达团队在arXiv上发表的,论文连接为:NGBoost: Natu ...
- 集成学习—GBDT原理理解
GBDT,全称为梯度提升决策树,即Gradient Boosting Decision Tree.上一篇博客:集成学习-GBDT(论文研读)中已经对GBDT原始论文--Jerome H. Friedm ...
- 2021-08-06随记(vertical-align, 顶线、底线、中线、基线,vue原理理解)
vertical-align 父元素是inline或者是table-cel,如果是inline-block或者block则必须要设置line-height(和高度一样)子元素为inline或者inli ...
- win10自动修复无法修复你的电脑的解决方法(操作+原理理解)
目录 前言 步骤与原理 疑惑 总结 参考文献 前言 早起开机,突遇下面问题,以为重启即可,后来无济于事,于是查找资料,找到了解决方法,给出了具体操作,更重要的是其中一些操作语句的原理理解,因为每个人出 ...
- 【Educoder作业】冯·诺依曼体系结构及工作原理理解
[Educoder作业]冯·诺依曼体系结构及工作原理理解 所有的那个实际场景模拟的题就不更了,没难度,趣味性更高. 这个题和我们之前的一篇博客里面的题只一模一样的,链接. 我们这里就不做任何讲解了,要 ...
最新文章
- 癌细胞“绑架”神经元帮自己壮大,科学家破译癌细胞分子机制 | 最新Nature封面...
- php把年份转为int,PHP将DateInterval转换为int
- 【数学基础】运筹学:拉格朗日乘子法和KKT条件(上)
- 一个简单粗暴的前后端分离方案
- UIControl-IOS开发
- 一款世界上最快的固态硬盘
- 静态类对象指针需要delete吗 vc_C/C++真的有那么难学吗?其实不然,无非是你没有找对方法罢了...
- SpringBoot之Interceptor拦截器注入使用
- 一个基于SpringBoot+vue的学生信息管理系统详细设计
- 你要的《高性能MySQL》.pdf
- 发那可g10_fanuc系统中的G10格式会根据输入的数据不同而不同
- ubuntu搜狗拼音输入法选词框乱码
- 已知主机IP地址,计算网络地址和广播地址
- 离线打包报错缺少io.dcloud.PandoraEntry
- hdu 6080-度度熊保护村庄
- Ubuntu18.04-使用wine打开CAJ文件并解决乱码问题
- 造梦西游4手游服务器维护,造梦西游4手机版常见问题解答 新手看过来
- 【OJ每日一练】1044 - 下落又弹起的小球
- idv和vdi的优劣势_IDV和VDI区别
- HDU- 1151 Air Raid(最小路径覆盖)