词嵌入之GloVe
什么是GloVe
GloVe(Global Vectors for Word Representation)是一个基于全局词频统计(count-based & overall statistics)的词表征(word representation)工具,它可以把一个单词表达成一个由实数组成的向量,这些向量捕捉到了单词之间一些语义特性,比如相似性(similarity)、类比性(analogy)等。我们通过对向量的运算,比如欧几里得距离或者cosine相似度,可以计算出两个单词之间的语义相似性。
GloVe实现步骤
构建共现矩阵
统计词与词在固定窗口大小内共同出现的次数并构建一个共现矩阵。例如有以下三句话:
- I like deep learning.
- I like NLP.
- I enjoy flying
当窗口大小为2时,构造的共现矩阵为:

词向量与共现矩阵的关系
设共现矩阵为X,其第i行第j个元素为\(X_{ij}\)。与Word2Vec相同,GloVe同样有两个词向量矩阵分别由输入层到隐藏层、隐藏层到输出层。设中心词i在第一个词向量矩阵中所对应的词向量为\(w_i\),上下文词j在第二个词向量矩阵中所对应的词向量为\(\widetilde w_j\),则GloVe所构造的词向量与共现矩阵间的近似关系为:
\[w_i^T\widetilde w_j+b_i+\widetilde b_j=\log X_{ij}
\]其中,\(b_i\)和\(\widetilde b_j\)为词i和词j的偏置项。公式的由来见第三节的推导部分。
损失函数
基于词向量与共现矩阵间的近似关系,可以构造如下损失函数:
\[J=\sum_{i,j=1}^Vf(X_{ij})(w_i^T\widetilde w_j+b_i+\widetilde b_j-\log X_{ij})^2
\]其中V为词汇表大小。这个损失函数是加了权重项的均方误差,关于权重项\(f(X_{ij})\),我们希望:
- 共现次数多的两个词的权重应当大于共现次数少的两个词的权重,因此\(f(X_{ij})\)应当是非递减的;
- 但\(f(X_{ij})\)也不应当过大,因此\(f(X_{ij})\)应当有上限;
- 共现次数为0的两个词其权重也应当为0。
基于以上三点,GloVe作者构造了以下权重函数:
\[f(X_{ij})=\left\{\begin{aligned}
(\frac{X_{ij}}{x_{max}})^\alpha \quad \quad X_{ij}<x_{max}
\\
1 \qquad\quad otherwise
\end{aligned}\right.
\]其中\(\alpha\)在原论文中被设置为了0.75,它的作用与Word2Vec中负采样处的\(\alpha\)类似,也是为了提高共现次数小的两个词的权重,进而提高低频词的词向量的准确度。\(x_{max}\)是共现次数的上限,在原论文中被设置为了100。
其他细节
- 在统计共现矩阵的时候,并不是说只要两个词同时出现在了一个窗口内共现矩阵的对应项就会加1,GloVe根据两个单词在上下文窗口的距离d,提出了一个衰减函数(decreasing weighting):\(decay=\frac{1}{d}\)用于计算权重,也就是说距离越远的两个单词所占总计数(total count)的权重越小。
- 与Word2Vec相同,GloVe同样有两个词向量矩阵分别由输入层到隐藏层、隐藏层到输出层,理论上是这两个矩阵式对称的,唯一的区别是初始化的值不一样而导致最终的值不一样。Word2Vec是选择第一个矩阵作为最终的词向量矩阵,但理论上二者都可以当成最终的结果来使用。GloVe的选择是将二者的和作为最终的词向量。由于二者的初始化不同相当于加了不同的随机噪声,所以能提高鲁棒性。
GloVe公式推导
记\(X_i=\sum_{k=1}^VX_{ik}\)为词i所有窗口内共现词的数量,\(p_{ik}=\frac{X_{ik}}{X_i}\)为单词k出现在单词i的上下文中的概率,\(p_{ij,k}=\frac{p_{ik}}{p_{jk}}\)为为单词k出现在单词i的上下文中的概率与为单词k出现在单词j的上下文中的概率的比值。当单词i和单词j与单词k均相关或者均不相关时该比值趋近于1;当单词i与单词k相关,单词j与单词k不相关时该比值很大;当单词i与单词k不相关,单词j与单词k相关时该比值很小。
作者通过实验发现通过构建词向量与这个比值的关系比直接构建词向量与条件概率的关系效果更好。
假设词向量与上述比值通过函数F进行对应,即:
\[F(w_i,w_j,w_k)=\frac{p_{ik}}{p_{jk}}
\]由于\(\frac{p_{ik}}{p_{jk}}\)最终反应的实际上是单词i和单词j间的关系,因此可以将上式修改为:
\[F(w_i-w_j,w_k)=\frac{p_{ik}}{p_{jk}}
\]上式左边是向量,右边是标量,因此可以对左边进行内积:
\[F((w_i-w_j)^Tw_k)=F(w_i^Tw_k-w_j^Tw_k)=\frac{p_{ik}}{p_{jk}}
\]上式左边是差,右边是商,当F为指数函数时满足,因此:
\[\frac{e^{w_i^Tw_k}}{e^{w_j^Tw_k}}=\frac{p_{ik}}{p_{jk}}
\]分别令分子分母相同,则:
\[e^{w_i^Tw_k}=\frac{X_{ik}}{X_i}
\]则:
\[w_i^Tw_k=\log X_{ik}-\log X_i
\]将i和k交换后上式左边仍然不变,但右边值变了。为了保持右边的值不变,考虑到对称性,在上式左边加上两个偏置项\(b_i\)和\(b_k\),则:
\[w_i^Tw_k+b_i+b_j=\log X_{ik}
\]GloVe与Word2Vec的比较
Word2Vec每次都是利用局部窗口内的信息进行更新,而GloVe每次更新都利用到了共现矩阵中所统计的全局共现信息,所以理论上来说GloVe抗噪声能力更强,对语料的利用更加充分,效果也应当更好。从原论文给出的实验结果来看,GloVe的性能是远超Word2Vec的,但网上也有人说GloVe和Word2Vec实际表现其实差不多。
词嵌入之GloVe的更多相关文章
- L25词嵌入进阶GloVe模型
词嵌入进阶 在"Word2Vec的实现"一节中,我们在小规模数据集上训练了一个 Word2Vec 词嵌入模型,并通过词向量的余弦相似度搜索近义词.虽然 Word2Vec 已经能够成 ...
- DeepLearning.ai学习笔记(五)序列模型 -- week2 自然语言处理与词嵌入
一.词汇表征 首先回顾一下之前介绍的单词表示方法,即one hot表示法. 如下图示,"Man"这个单词可以用 \(O_{5391}\) 表示,其中O表示One_hot.其他单词同 ...
- DLNg序列模型第二周NLP与词嵌入
1.使用词嵌入 给了一个命名实体识别的例子,如果两句分别是“orange farmer”和“apple farmer”,由于两种都是比较常见的,那么可以判断主语为人名. 但是如果是榴莲种植员可能就无法 ...
- NLP领域的ImageNet时代到来:词嵌入「已死」,语言模型当立
http://3g.163.com/all/article/DM995J240511AQHO.html 选自the Gradient 作者:Sebastian Ruder 机器之心编译 计算机视觉领域 ...
- 2.keras实现-->字符级或单词级的one-hot编码 VS 词嵌入
1. one-hot编码 # 字符集的one-hot编码 import string samples = ['zzh is a pig','he loves himself very much','p ...
- 13.深度学习(词嵌入)与自然语言处理--HanLP实现
笔记转载于GitHub项目:https://github.com/NLP-LOVE/Introduction-NLP 13. 深度学习与自然语言处理 13.1 传统方法的局限 前面已经讲过了隐马尔可夫 ...
- Coursera Deep Learning笔记 序列模型(二)NLP & Word Embeddings(自然语言处理与词嵌入)
参考 1. Word Representation 之前介绍用词汇表表示单词,使用one-hot 向量表示词,缺点:它使每个词孤立起来,使得算法对相关词的泛化能力不强. 从上图可以看出相似的单词分布距 ...
- NLP之基于词嵌入(WordVec)的嵌入矩阵生成并可视化
词嵌入 @ 目录 词嵌入 1.理论 1.1 为什么使用词嵌入? 1.2 词嵌入的类比推理 1.3 学习词嵌入 1.4 Word2Vec & Skip-Gram(跳字模型) 1.5 分级& ...
- cips2016+学习笔记︱简述常见的语言表示模型(词嵌入、句表示、篇章表示)
在cips2016出来之前,笔者也总结过种类繁多,类似词向量的内容,自然语言处理︱简述四大类文本分析中的"词向量"(文本词特征提取)事实证明,笔者当时所写的基本跟CIPS2016一 ...
随机推荐
- 精尽Spring MVC源码分析 - HandlerAdapter 组件(一)之 HandlerAdapter
该系列文档是本人在学习 Spring MVC 的源码过程中总结下来的,可能对读者不太友好,请结合我的源码注释 Spring MVC 源码分析 GitHub 地址 进行阅读 Spring 版本:5.2. ...
- matplotlib的学习6-annotation的标注
import matplotlib.pyplot as plt import numpy as np ''' 当图线中某些特殊地方需要标注时,我们可以使用 annotation. matplotlib ...
- Python科学计算库Numpy
Python科学计算库Numpy NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库. 1.简 ...
- [.NET] - 在Socket编程中遇到的问题总结
问题1.无法访问已释放的对象. 对象名:"System.Net.Sockets.Socket" 产生这个scenario的原因是程序中的某个地方调用到了socket.close后, ...
- 使用OpenOffice实现文档预览
概述 使用OpenOffice将 office文档转为pdf,然后再将pdf转为图片,实现文档预览的功能. 依赖组件 OpenOffice.org或者LibreOffice JODConverter ...
- 记一次Apache的代码导致生产服务耗时增加
引言 二狗:二胖快醒醒,赶紧看看刚才报警邮件,你上次写的保存用户接口耗时(<二胖的参数校验坎坷之路>)大大上升,赶紧排查下原因. 二胖:好的,马上看,内心戏可十足(心里却在抱怨,大中午的搅 ...
- MongoDb二
获取集合的时候,可以传入bean的class文件.来实现数据的绑定.在这之前.需要自定义一个Codec类.进行数据的转换. MongoClient client=new MongoClient(new ...
- 在 Emit 代码中如何await一个异步方法
0. 前言 首先立马解释一波为啥会有这样一篇伪标题的Demo随笔呢? 不是本人有知识误区,或者要误人子弟 因为大家都知道emit写出来的都是同步方法,不可能await,至少现在这么多年来没有提供对应的 ...
- spark优化项
一.Shuffle优化项 1.Shuffle优化配置 - spark.shuffle.file.buffer 默认值:32k 参数说明:该参数用于设置shuffle write task的Buffer ...
- wdCP V3.2
wdCP是什么?关于wdCP更多的介绍,可看http://www.wdlinux.cn/wdcp/安装前先去体验下,看演示站吧http://www.wdlinux.cn/bbs/thread-5285 ...