GloVe(Global Vector)
之前介绍了word2vec模型,简单来说,它就是通过一个个句子去发掘出词与词之间的关系,再通过向量去表示出这种关系。而现在将要介绍的GloVe,我觉得它的思想也是和word2vec接近的。
word2vec是通过一个个句子去分析词与词之间的关系,而GloVe是通过整个语料库所有的句子去分析词与词之间的关系,在具体说明之前,首先介绍一下共现矩阵(co-occurrence matrix)。
共现矩阵主要统计了语料库中单词i的上下文中单词j的次数,和word2vec一样,这里的上下文通过指定滑动窗口(context window)大小确定单词数量,比如我们有一个语料库:"he is a boy. He is smart."假设滑动窗口大小为2(也就是分析目标词前后的两个词),可得到共现矩阵:
得到了语料库的共现矩阵,接下来就是GloVe的核心思想了,首先,GloVe定义了概率:
Pij=P(j∣i)=xijxiP_{ij} = P(j|i) = \frac{x_{ij}}{x_i}Pij=P(j∣i)=xixij
这个概率表示单词i的前后文中出现单词j的概率,然后,GloVe认为,比起这个概率,更有意义的是概率的ratio:
Ratio=PikPjkRatio = \frac{P_{ik}}{P_{jk}}Ratio=PjkPik
简单来理解就是,如果两个单词ij,以十分接近的概率出现在单词k的上下文,那么就可以认为ij之间具有较大的某种联系。但是要分析这种关系有需要依赖于单词k,所以针对单词i、j、k,GloVe提出了以下公式:
F(wi,wj,wk)=PikPjkF(w_i, w_j, w_k) = \frac{P_{ik}}{P_{jk}}F(wi,wj,wk)=PjkPik
以上公式的意思就是,如果我们能够用一个合理的向量表示这三个单词,那么它们经过一个函数的处理后,应该反映出它们之间的关系(ratio)。
接下来的问题就剩下如何确认这个函数的具体形式了(因为ratio是可以通过共现矩阵计算出来的一个标量,是确定的,所以主要研究左边的函数形式)。
第一步,ratio是通过i和k的关系以及j和k的关系推断出i和j的关系,因而i和j的关系亲疏通过作差去表示;
F(wi,wj,wk)=F((wi−wj)T,wk)=PikPjkF(w_i, w_j, w_k) = F((w_i-w_j)^T, w_k) = \frac{P_{ik}}{P_{jk}}F(wi,wj,wk)=F((wi−wj)T,wk)=PjkPik
第二步,因为ratio是一个标量,ij作差后还是向量,k也是一个向量,因此GloVe就通过两个向量求内积把向量转化为标量:
F((wi−wj)Twk)=F(wiTwk−wjTwk)=PikPjkF((w_i-w_j)^T w_k) = F(w_i^T w_k - w_j^T w_k) = \frac{P_{ik}}{P_{jk}}F((wi−wj)Twk)=F(wiTwk−wjTwk)=PjkPik
第三步,因为左边是差,右边是商,所以最后通过指数函数把两个联系起来:
exp(wiTwk−wjTwk)=exp(wiTwk)exp(wjTwk)=PikPjkexp(w_i^T w_k - w_j^T w_k) = \frac{exp(w_i^T w_k)}{exp(w_j^T w_k)} = \frac{P_{ik}}{P_{jk}}exp(wiTwk−wjTwk)=exp(wjTwk)exp(wiTwk)=PjkPik
第三步,因为左边是差,右边是商,所以最后通过指数函数把两个联系起来:
exp(wiTwk−wjTwk)=exp(wiTwk)exp(wjTwk)=PikPjkexp(w_i^T w_k - w_j^T w_k) = \frac{exp(w_i^T w_k)}{exp(w_j^T w_k)} = \frac{P_{ik}}{P_{jk}}exp(wiTwk−wjTwk)=exp(wjTwk)exp(wiTwk)=PjkPik
本来,我们只需要让对应的分子分母相等就可以了:
exp(wiTwk)=Pikexp(w_i^T w_k) = P_{ik}exp(wiTwk)=Pik
wiTwk=logPik=log(Xik)−log(Xi)w_i^T w_k = log P_{ik} = log(X_{ik}) - log(X_i)wiTwk=logPik=log(Xik)−log(Xi)
等式左边两个词向量相乘对顺序是不敏感的,可是右边不一样,所以会出现问题:
wkTwi=log(Xki)−log(Xk)w_k^T w_i = log(X_{ki}) - log(X_k)wkTwi=log(Xki)−log(Xk)
wkTwi=wiTwkw_k^T w_i = w_i^T w_kwkTwi=wiTwk
log(Xki)−log(Xk)≠log(Xik)−log(Xi)log(X_{ki}) - log(X_k) \neq log(X_{ik}) - log(X_i)log(Xki)−log(Xk)̸=log(Xik)−log(Xi)
所以在原式引入偏置项(网上很多文章对这个偏置项的推导不算太详细,我这里具体写一下):
wkTwi+bi=log(Xki)−log(Xk)w_k^T w_i + b_i = log(X_{ki}) - log(X_k)wkTwi+bi=log(Xki)−log(Xk)
wiTwk+bk=log(Xik)−log(Xi)w_i^T w_k + b_k = log(X_{ik}) - log(X_i)wiTwk+bk=log(Xik)−log(Xi)
我们知道:
log(Xki)=log(Xik)log(X_{ki}) = log(X_{ik}) log(Xki)=log(Xik)
wiTwk=wkTwiw_i^T w_k = w_k^T w_iwiTwk=wkTwi
所以其实:
bi−bk=−log(Xk)+log(Xi)b_i - b_k = - log(X_k) + log(X_i)bi−bk=−log(Xk)+log(Xi)
也就是说,偏置项主要和X_k、X_i有关,我们把两式相加:
wiTwk+wkTwi+bk+bi=log(Xik)+log(Xki)−log(Xi)−log(Xk)w_i^T w_k + w_k^T w_i + b_k + b_i = log(X_{ik}) + log(X_{ki}) - log(X_i) - log(X_k)wiTwk+wkTwi+bk+bi=log(Xik)+log(Xki)−log(Xi)−log(Xk)
2∗wiTwk+bk+bi=2∗log(Xik)−log(Xi)−log(Xk)2*w_i^T w_k+ b_k + b_i = 2*log(X_{ik}) - log(X_i) - log(X_k)2∗wiTwk+bk+bi=2∗log(Xik)−log(Xi)−log(Xk)
因为偏置项和X_k、X_i有关,所以可以进一步简化,消去log(X_i)、log(X_k),其实就是把它们包含在b_i、b_k里面,然后再简化一下式子得到:
wiTwk+bk+bi=log(Xik)w_i^T w_k+ b_k + b_i = log(X_{ik})wiTwk+bk+bi=log(Xik)
终于得到了最终的结果,这个结果是基于最完美的词向量得到的,所以,接下来的步骤,就是定义损失函数,通过训练神经网络,从初始向量开始求出这些最完美的词向量:
Loss=∑(wiTwk+bk+bi−log(Xik))2Loss = \sum (w_i^T w_k+ b_k + b_i - log(X_{ik}))^2Loss=∑(wiTwk+bk+bi−log(Xik))2
同时,GloVe也考虑到两个词共同出现的次数越多,那么在这两个词在损失函数的影响就应该更大,所以可以根据两个词共同出现的次数设计一个权重来对损失函数中的每一项进行加权:
Loss=∑f(Xik)(wiTwk+bk+bi−log(Xik))2Loss = \sum f(X_{ik}) (w_i^T w_k+ b_k + b_i - log(X_{ik}))^2Loss=∑f(Xik)(wiTwk+bk+bi−log(Xik))2
关于这个权重这里我就不再详细说明。
以上就是关于GloVe的详细推导过程,可以看到,GloVe的思想和word2vec的思想接近,但是GloVe是从全局的角度出发,构建一个共现矩阵,每一次的训练都是基于整个语料库进行分析的,所以它才叫Global Vector,而word2vec则是从一个个句子出发,但我认为重点都在于通过句子去分析词与词之间的联系。
想浏览更多关于数学、机器学习、深度学习的内容,可浏览本人博客
GloVe(Global Vector)相关推荐
- GloVe: Global Vectors for Word Representation-学习笔记
GloVe: Global Vectors for Word Representation GloVe是一种用于获取单词向量表示的无监督学习算法. 用于最近邻居评估的相似性度量产生一个量化两个词的相关 ...
- glove中文词向量_《GloVe:Global Vectors for Word Representation》学习
1.概述 自从2013年Mikolov提出了word2vec之后,无监督预训练的word embedding越来越火,很多学者都在研究如何获得更好的语义表达.于是,出现了同样是静态表示的Glove,动 ...
- GloVe:Global Vectors for Word Representation
论文总体结构: 一.摘要 主要提出新的词向量学习方法glove,利用全局统计信息和局部上下文信息学习 1.当前词向量学习模型能够通过向量的算数计算捕捉之间语法和语意规律,但是背后的规律依旧不可解释 2 ...
- 文本表示(一)—— word2vec(skip-gram CBOW) glove, transformer, BERT
文本离散表示 1. one-hot 简单说,就是用一个词典维度的向量来表示词语,当前词语位置为1,其余位置为0. 例如 vocabulary = ['胡萝卜' , '兔子', '猕猴桃'], 采用三维 ...
- 自然语言处理中的语言模型与预训练技术的总结
目录 0. 背景 1. 统计语言模型(Statistical Language Model) 马尔科夫假设(Markov Assumption) N-Gram模型 拉普拉斯平滑(Laplace Smo ...
- Word2vec And Doc2vec - 文本向量化
word2vec 与 doc2vec的区别: 两者从字面意思上就可以大致判断出区别来,word2vec主要针对与单词,而doc2vec主要针对于文本: 顾名思义,Word2Vec是在单个单词上训练的, ...
- Andrew Ng 深度学习课程——序列模型
主要是记录网易云课堂上的网络课序列模型的笔记 date version comments 2019/10/04 V0.1 Init 文章目录 循环序列模型 模型基础 语言模型和序列生成 梯度消失问题 ...
- [转] GloVe公式推导
from: https://pengfoo.com/post/machine-learning/2017-04-11 GloVe(Global Vectors for Word Representat ...
- 详解GloVe词向量模型
词向量的表示可以分成两个大类1:基于统计方法例如共现矩阵.奇异值分解SVD:2:基于语言模型例如神经网络语言模型(NNLM).word2vector(CBOW.skip-gram).GloVe.E ...
最新文章
- 使用Runtime执行推理(C++)
- 三十八、判断服务是否运行及定位问题
- Openstack组件部署 — Nova_Install and configure a compute node
- linux zip和tar的区别,Linux入门:tar、gzip、bzip2以及zip的区别
- SQL优化的若干原则
- Linux有问必答:如何检查Linux的内存使用状况
- 面试题,说说你理解的中台
- 随想录(招聘怎样的员工)
- linux shell中怎样批量修改文件名为 文件夹_文件名
- layui表格合并单元格多表_layui合并单元格各种办法
- 安卓TV开发(前言)— AndroidTV模拟器初识与搭建
- MATLAB图像处理之图像去模糊处理
- 集成学习与随机森林练习题
- c语言教材课后习题答案,C语言课后习题答案(最终).doc
- 软件的生命周期与特点
- lizbaka的周记
- 初步学习CRM的感想
- 用python批量发送短信_Python批量发短信
- Facebook 应用开发认证和授权登录流程
- K8S污点容忍度调度