word2vec生成词向量原理
假设每个词对应一个词向量,假设:
1)两个词的相似度正比于对应词向量的乘积。即:$sim(v_1,v_2)=v_1\cdot v_2$。即点乘原则;
2)多个词$v_1\sim v_n$组成的一个上下文用$C$来表示,其中$C=\sum_{i=1}^{n}v_i$。$\frac{C}{|C|}$称作上下文C的中心向量。即加和原则;
3)在上下文$C$中出现单词$A$的概率正比于能量因子$e^{-E(A,C)},where E=-A\cdot C$。即能量法则(可参看热统中的配分函数)。
因此:
\[p(A|C)=\frac{e^{-E(A,C)}}{\sum_{i=1}^Ve^{-E(v_i,C)}}=\frac{e^{A\cdot C}}{\sum_{i=1}^Ve^{v_i\cdot C}}~~~~(1)\]
其中$V$是整个词汇空间。
$ref{1}$的分母计算是非常耗时的,下面推导比较方面快速的计算$ref{1}$的方法。
把整个词汇空间分成两部分$G$和$H$,同时在下面的公式中$G$和$H$也表示各自的词向量中心,并且设$A$存在于$G$中,则:
\[p(A|C)=p(A|G,C)\cdot p(G|C) ~~~~(2)\]
where,
\[p(G|C)=\frac{e^{G\cdot C}}{e^{G\cdot C}+e^{H\cdot C}}=\frac{1}{1+e^{(H-G)\cdot C}}~~~~(3)\]
and,
\[p(A|G,C)=\frac{e^{A\cdot C}}{\sum_{w\in G}e^{w\cdot C}}~~~~(4)\]
引入$sigmoid$函数$\sigma(x)=1/(1+e^{-x})$,则
\[p(G|C)=\sigma(-(H-G)\cdot C)=\sigma((G-H)\cdot C)\]
$p(G|C)$只是简单的计算两部分向量之差,不能再简化了。
另外,根据上述定义,很容易得到这个关系$p(G|C)=1-(H|C)$,因为$C$要么落在$G$要么落在$H$。
观看$ref{4}$,则知$p(A|G,C)$是另一个版本的$p(A,C)$,只是词汇空间从$V\rightarrow G$而已。然后我们继续拆分$G$递归的计算下去,最后只需要计算各兄弟部分的向量差而已。这是一个典型的二叉树,划分规则在开始就可确定,如果考虑查询效率的话,就是一个霍夫曼树。其中每个叶子节点表示一个单词,每个中间节点$G~ or~ H$的向量为所有子向量的中心。
展开来就是:
\[p(A|C)=\prod \sigma((G_i-H_i)\cdot C)\]
那么问题来了,这个词向量是怎么搞出来了?学习词向量哪家强?
现在我们这里有一堆的语料,一行一行分好词的,语料那是相当的多,以至于它涵盖了自然语言中的所有正确句子,每个单词在它所在的位置都是恰到好处。现在每个单词我们有一个对应的词向量,我们怎么来衡量这批词向量的好坏呢。
这批词向量张成一个自然语言的空间(从线性代数来说这样描述可能不太准确),它自己规定的自然语言空间,在这个空间中,它可以导出给定语料在它的空间中出现的概率。熟悉吧,这就是语言模型。
我们可以根据词向量计算出来每个单词在它的位置出现的概率,然后这整个语料在这个向量空间中出现的概率就等于每个词在其位置出现概率的乘积。
即,
\[p(T)=\prod p(w_i|Context_i)~~~~(5)\]
$T$为整个语料样本,$Context_i$为单词$i$的上下文,理论上是扣除该单词后剩下的所有单词包括位置。当然了,我们只考虑它的前后$c$个邻居。
我们的目标是使$ref 5$最大化,实际中是加$log$加负之后的最小化。怎么以高效率优化这个目标函数呢,这是一个典型的运筹学问题,而且还是非线性规划。我要翻一下运筹学的教材了。
word2vec生成词向量原理的更多相关文章
- word2vec生成词向量和字向量
生成字符向量的过程中需要注意: 1)在收集数据生成corpus时候,通过Word2Vec生成字向量的时候,产生了“ ”空格字符向量,但是加载模型是不会成功的.那么你不是生成的binary文件,就可以修 ...
- 基于word2vec训练词向量(二)
转自:http://www.tensorflownews.com/2018/04/19/word2vec2/ 一.基于Hierarchical Softmax的word2vec模型的缺点 上篇说了Hi ...
- 基于word2vec训练词向量(一)
转自:https://blog.csdn.net/fendouaini/article/details/79905328 1.回顾DNN训练词向量 上次说到了通过DNN模型训练词获得词向量,这次来讲解 ...
- [Algorithm & NLP] 文本深度表示模型——word2vec&doc2vec词向量模型
深度学习掀开了机器学习的新篇章,目前深度学习应用于图像和语音已经产生了突破性的研究进展.深度学习一直被人们推崇为一种类似于人脑结构的人工智能算法,那为什么深度学习在语义分析领域仍然没有实质性的进展呢? ...
- 文本分布式表示(二):用tensorflow和word2vec训练词向量
看了几天word2vec的理论,终于是懂了一些.理论部分我推荐以下几篇教程,有博客也有视频: 1.<word2vec中的数学原理>:http://www.cnblogs.com/pegho ...
- DNN模型训练词向量原理
转自:https://blog.csdn.net/fendouaini/article/details/79821852 1 词向量 在NLP里,最细的粒度是词语,由词语再组成句子,段落,文章.所以处 ...
- CountVectorizer,Tf-idfVectorizer和word2vec构建词向量的区别
CountVectorizer和Tf-idfVectorizer构建词向量都是通过构建字典的方式,比如在情感分析问题中,我需要把每一个句子(评论)转化为词向量,这两种方法是如何构建的呢?拿CountV ...
- Python Word2Vec使用训练好的模型生成词向量
# 文本文件必须是utf-8无bom格式 from gensim.models.deprecated.word2vec import Word2Vec model = Word2Vec.load( ' ...
- 学习笔记CB009:人工神经网络模型、手写数字识别、多层卷积网络、词向量、word2vec
人工神经网络,借鉴生物神经网络工作原理数学模型. 由n个输入特征得出与输入特征几乎相同的n个结果,训练隐藏层得到意想不到信息.信息检索领域,模型训练合理排序模型,输入特征,文档质量.文档点击历史.文档 ...
随机推荐
- C Static Inline函数
Inline函数 程序执行时,处理器从Memory中读取代码执行.当程序中调用一个函数时,程序跳到存储器中保存函数的位置开始读取代码执行,执行完后再返回. 为了提高速度,C定义了inline函数,告诉 ...
- UVA 10706 Number Sequence (找规律 + 打表 + 查找)
Problem B Number Sequence Input: standard input Output: standard output Time Limit: 1 second A singl ...
- sublime每次打开时都提示升级,怎么取消这个弹出框?
答案其实很简单,设置如下: 进入Preferences -> Settings-User ,添加 "update_check": false 重启Sublime. 发现了什么 ...
- phpMyAdmin 完整路径泄露漏洞
漏洞名称: phpMyAdmin 完整路径泄露漏洞 CNNVD编号: CNNVD-201307-650 发布时间: 2013-08-09 更新时间: 2013-08-09 危害等级: 中危 漏洞类 ...
- 编写一个单独的Web Service for Delphi7(步骤)
1新建一个SOAP Server Application,在提示输入接口时输入MyHello,把所有文件保存在一个叫Ser的目录下,其中一个包含TWebModule1的文件保存为main.pas.在M ...
- windows下sqlite3静态库和动态库的编译
1.下载sqlite3源码:http://www.sqlite.org/download.html 主要是sqlite-amalgamation-XXXXXXX.zip.sqlite-dll-win3 ...
- Codeforces Round #324 (Div. 2)解题报告
---恢复内容开始--- Codeforces Round #324 (Div. 2) Problem A 题目大意:给二个数n.t,求一个n位数能够被t整除,存在多组解时输出任意一组,不存在时输出“ ...
- poj1017
一个工厂制造的产品形状都是长方体,它们的高度都是h,长和宽都相等,一共有六个型号,他们的长宽分别为1*1, 2*2, 3*3, 4*4, 5*5, 6*6.这些产品通常使用一个 6*6*h 的长方体包 ...
- jSP的3种方式实现radio ,checkBox,select的默认选择值。
jSP的3种方式实现radio ,checkBox,select的默认选择值.以radiao 为例:第一种方式:在jsp中使用java 脚本,这个方法最直接,不过脚本太多,不容易维护<%Stri ...
- ArrayList、LinkedList、HashMap底层实现
ArrayList 底层的实现就是一个数组(固定大小),当数组长度不够用的时候就会重新开辟一个新的数组,然后将原来的数据拷贝到新的数组内. LinkedList 底层是一个链表,是由java实现的一个 ...