1. Introduction

今天学的论文是斯坦福大学 2014 年的工作《GloVe: Global Vectors for Word Representation》,在当时有两种主流的 Word Embedding 方式,一种是矩阵分解,类似 LSA;另一种是 13 年提出的 Word2Vec,基于滑动窗口的浅层神经网络。前者的优点是利用了全局的统计信息(共现矩阵),后者的优点是计算简单且效果好 = =,但缺点是没利用全局的统计信息。所以这篇论文的主要工作是想综合两者的优点。

在看论文前我们不妨来思考一下,如果你是研究员,现在有这样的想法(综合全局信息和局部信息),你该如何去实现?

2. GloVe Model

2.1 Weighted Least Squares

我们先来给些定义,另 X 为词与词的共现矩阵, 表示单词 j 出现在单词 i 上下文中的次数。于是我们有单词 j 出现在单词 i 上下文的共现概率:

我们观察下表的共现概率,只看第一行第二行我们能看出 ice 和 stream 与 solid gas water fashion 等词的相关性吗?答案是否定的,但如果我们使用比值  就可以很直观的看到其相关性。当 k = solid 时,其值为 8.9,则表明,ice 与 solid 更相关;当 k = gas 时,其值为  ,所以 steam 与 gas 更相关;当值为 1 左右时,表明 ice 和 steam 与目标单词 k 都相关或者都不相关。

Co-occurrence Probabilities

从上面的表述中我们看出,比值更能反映相关性,而不是共现单词概率。所以我们有:

其中, 表示单词 i 的词向量, 是独立的上下文向量将在后面进行介绍,F 可以视为一种映射或是一种运算。

我们再来看下上面的等式,一个很直观的感觉就是 F 可能取值很广。不过不要紧,我们现在给它加些约束。由于向量空间是线形的,所以可以使用向量差:

为了保证混合向量的维度不变,我们再做个点乘:

实际中,单词和共现单词是可以可交换的,现在的等式不满足交换律。

为了保证交换律,我们先让 F 保证为群  到群  的群同态:

群同态:设  和  是两个群,,,有 ,则称  为 M 到 S 的同态或群映射。

所以我们有:

从加减到乘除的运算最容易想到的是指数运算,所以 :

但是有  存在依然没法符合交换律,又由于其与 k 无关,所以可以将其视为一个常数  :

现在还不满足,不过已经很快了,我们在额外的添加一个偏执项 :

好了,现在的等式是对原始等式的一个极端简化。但这个等式还有一个问题:当  时怎么办?所以在实际的算法中我们会加一个偏执: ,这样即保证了稀疏性,又不至于导致发散。

以上想法看似天马行空,其实一部分想法是与 LSA 密切相关的(参考 SVD 的变种)。我们 LSA 所有的共现都是等价的, 即使共现次数非常小。然而很多非常小的共现可能是源于噪声,其携带的信息非常少,所以我们引入加权最小二乘法来约束一下噪声:

其中,权重应该遵循以下原则:

  1. ,保证了代价函数 J 在 0 点的连续性;
  2. 应该非递减的,这个很好理解,共现越多,权值越大;
  3. 对于较大的 x , 不能太大;

这样的函数有很多,我们自己设计一个:

这里的  为经验参数,可以取 1 或者 3/4,我们这里取 3/4(是不是想起了什么?提示一下:Word2Vec 中 Negative Sampling )。下图为  的函数的可视化:

Weight Function f

2.2 Relationship to Word2Vec

目前所有的 Word Embedding 的无监督方法最终都是基于语料库的,只是某些方法不是特别明显,如 Word2Vec,本节将说明我们定义的模型与现有模型的一些关系。

我们先来给出 Skip-Gram 的预测概率:

全局交叉熵代价函数为:

计算代价昂贵,Skip-Gram 给出会采用近似解。

由于相同单词 i 和 j 可以在语料库中出现多次,所以将相同值的 i 和 j 放在一起:

由于  ,所以:

其中, 为分布  和  的交叉熵。J 可以视为交叉上误差的加权和。

交叉熵损失的一个重要缺点是需要对分布 Q 进行归一化,代价昂贵,所以我们使用最小二乘法来代替交叉熵:

其中, 都是非正态分布,舍弃原来的归一化因子。

但这个式子引入了一个新的问题: 通常取值很大。一个有效的方式是取 log:

当然 Mikolov 等人也采用了 Sub-Sampling 来减少高频单词的权重,所以我们有:

至此就完成了公式推导,可以看到其实这和我们给出的 GloVe 的代价函数基本是一致的。

3. Experiments

然后我们来看下与其他模型的对比实验部分:

Experiments_1

Experiment

Experiments

还有参数敏感性的实验:

Experiments

细心的同学可以看到这里有一个 Window Size 的参数,这个是用来统计共现矩阵的。

至此,我们的论文就结束了。但我看完这篇论文还有一个非常大的疑惑:GloVe 是怎么训练的呢?

4. Training

我觉得出现这个疑惑一个很大的原因在于,我一直以为 GloVe 是在 Skip-Gram 架构的基础上添加语料库的全局信息,所以也没有太明白为什么论文要证明 Word2Vec 的代价函数与 GloVe 的代价函数相似。

但其实 GloVe 与 LSA 更相关,我们来看下 GloVe 推导的公式:

是不是和带有偏置的 SVD 的数学表达式很像:

这样一看应该就明白了,GloVe 的训练方式其实和 SVD 类似。而推导 Skip-Gram  的代价函数其实是为了证明其代价函数与 GloVe 设计的代价函数是有关的。所以 Glove 更像是拥有 LSA 的优点,并加入 Skip-Gram 的优点,而不是反过来的。

下面简要给出 GloVe 的训练过程:

  1. 首先,预统计 GloVe 的共现矩阵;
  2. 接着,随机初始化两个矩阵:W 和  ,大小为 ,还有两个偏置向量:B 和  大小为 ;
  3. 然后,计算 GloVe 的损失函数,并通过 Adagrad 来更新参数,参数包括两个矩阵和两个偏置向量;
  4. 最后,重复第三步知道达到停止条件后结束训练。

我们最终得到的词向量为 W 和 ,类似于 Skip-Gram 里面的输入矩阵和输出矩阵。

那么问题来了:为什么不用一个矩阵和一个偏置项呢?这样计算量还可以减少一半,何乐不为?

欢迎大家在留言区讨论留言。

我们再简单分析一下 GloVe 的时间复杂度,从上面的实验结果来看 GloVe 的速度是非常快的,其原因主要有以下几点:

  1. 时间复杂度低,最差为 O(C) ,即统计一遍语料库的共现矩阵,具体推导看论文;
  2. 参数稀疏,可以用异步梯度下降算法进行优化;
  3. 关注全局信息,收敛速度快。

5. Conclusion

至此,我们便结束了 GloVe 的介绍,用一句话总结便是:GloVe 使用具有全局信息的共现矩阵,并采用类似矩阵分解的方式求解词向量,通过修改代价函数将 Word2Vec 关注局部特征的优点加入进来,并取得了良好的效果。

我们尝试着将 GloVe 与 Word2Vec 进行对比:

  1. Word2Vec 有神经网络,GloVe 没有;
  2. Word2Vec 关注了局部信息,GloVe 关注局部信息和全局信息;
  3. 都有滑动窗口但 Word2Vec 是用来训练的,GloVe 是用来统计共现矩阵的;
  4. GloVe 的结构比 Word2Vec 还要简单,所以速度更快;
  5. Word2Vec 是无监督学习,而 GloVe 可是视为有监督的,其 Label 为 。

再试着将 GLoVe 与 SVD 进行对比:

  1. SVD 所有单词统计权重一致,GloVe 对此进行了优化;
  2. GloVe 使用比值而没有直接使用共现矩阵。

当然 GloVe 看着那么好,其实并不一定,在很多任务中都没 Word2Vec 的效果好。

毕竟没有最好的模型,只有最适合的模型。

6. Reference

  1. 《GloVe: Global Vectors for Word Representation》

推荐阅读

AINLP年度阅读收藏清单

斯坦福大学NLP组Python深度学习自然语言处理工具Stanza试用

DistilBERT Understanding

太赞了!Springer面向公众开放电子书籍,附65本数学、编程、机器学习、深度学习、数据挖掘、数据科学等书籍链接及打包下载

数学之美中盛赞的 Michael Collins 教授,他的NLP课程要不要收藏?

自动作诗机&藏头诗生成器:五言、七言、绝句、律诗全了

模型压缩实践系列之——bert-of-theseus,一个非常亲民的bert压缩方法

这门斯坦福大学自然语言处理经典入门课,我放到B站了

征稿启示 | 稿费+GPU算力+星球嘉宾一个都不少

关于AINLP

AINLP 是一个有趣有AI的自然语言处理社区,专注于 AI、NLP、机器学习、深度学习、推荐算法等相关技术的分享,主题包括文本摘要、智能问答、聊天机器人、机器翻译、自动生成、知识图谱、预训练模型、推荐系统、计算广告、招聘信息、求职经验分享等,欢迎关注!加技术交流群请添加AINLPer(id:ainlper),备注工作/研究方向+加群目的。

gpu opencl 向量加_【Embedding】GloVe:大规模语料中快速训练词向量相关推荐

  1. 小白如何快速训练词向量

    但凡谈及自然语言处理,我们都会想到词向量,那么怎么快速地获得词向量呢?最简单的方法就是word2vec.本文不深究word2vec的原理,网上很多细致深入的解读,大家可以自行搜索.今天总结一下如何快速 ...

  2. 神经网络 Embedding层理解; Embedding层中使用预训练词向量

    1.Embedding层理解 高维稀疏特征向量到低维稠密特征向量的转换:嵌入层将正整数(下标)转换为具有固定大小的向量:把一个one hot向量变为一个稠密向量 参考:https://zhuanlan ...

  3. word2vec自训练词向量(代码+注释+训练过程和结果)

    数据集MSRP.SICK.STS下载地址分享 百度云:https://pan.baidu.com/s/1sqlCc702owp_T6KjyNT6Yw 提取码: 66nb 运行:网盘中msr_train ...

  4. PyTorch在NLP任务中使用预训练词向量

    在使用pytorch或tensorflow等神经网络框架进行nlp任务的处理时,可以通过对应的Embedding层做词向量的处理,更多的时候,使用预训练好的词向量会带来更优的性能.下面分别介绍使用ge ...

  5. 加载Glove预训练词向量到字典

    这里感谢一篇论文中的大佬的实现方式,这种将词向量变成字典的写法更加的具体,清晰.考虑的更加的全面. def convert_embedding_file():# 词向量中,第一个是单词,后面的是一个按 ...

  6. 从零开始构建基于textcnn的文本分类模型(上),word2vec向量训练,预训练词向量模型加载,pytorch Dataset、collete_fn、Dataloader转换数据集并行加载

    伴随着bert.transformer模型的提出,文本预训练模型应用于各项NLP任务.文本分类任务是最基础的NLP任务,本文回顾最先采用CNN用于文本分类之一的textcnn模型,意在巩固分词.词向量 ...

  7. 预训练词向量中文维基百科,英文斯坦福glove预训练的词向量下载

    中文预训练词向量--基于中文维基百科语料训练 英文预训练词向量--斯坦福glove预训练的词向量 百度云分享:https://pan.baidu.com/s/1UpZeuqlNMl6XtTB5la53 ...

  8. lstm数学推导_如何在训练LSTM的同时训练词向量?

    你本来也不用自己手动进行词向量更新啊,你搞这么一出最后收敛到0那不是必然的么? @霍华德 老师的答案已经给你推导出来了. 实际上你问的这个问题很简单--只要把Embedding层本身也当成模型参数的一 ...

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

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

  10. 实践:jieba分词和pkuseg分词、去除停用词、加载预训练词向量

    一:jieba分词和pkuseg分词 原代码文件 链接:https://pan.baidu.com/s/1J8kmTFk8lec5ubfwBaSnLg 提取码:e4nv 目录: 1:分词介绍: 目标: ...

最新文章

  1. 2021年大数据常用语言Scala(三十七):scala高级用法 高阶函数用法
  2. 开源多年后,Facebook这个调试工具,再登Github热门榜
  3. CentOS 7 安装记录
  4. 神经网络算法-论证单层感知器的局限性
  5. 随想录(文件系统的第一个用户程序shell)
  6. 南京大学杨杨计算机,国际交流,研途有术 | 博士生国际学术交流经验分享会(四)...
  7. 当网络安全遇上大数据分析(1)
  8. QAction QActionGroup QMenu 使用方法
  9. Android两种获取IP地址的方式(使用WIFI和GPRS)
  10. linux系统如何启动rpcbind,在Linux系统上关闭rpcbind、postfix、rpc.statd、hpiod服务的方法...
  11. java 一元三次方程_一元三次方程盛金公式求解的java实现
  12. Python4班平均成绩统计_空中交通管理学院2017级学生 20182019学年第一学期成绩分析报告...
  13. manjaro/arch chrome an application wants access to the keyring default keyring but it is locked 解决
  14. Skyworks Aeronautics宣布获得GEM的1亿美元投资承诺,计划于未来数月内上市
  15. 利用文件保存数据(c语言)
  16. php-resque 简单的php消息队列
  17. pppd详解_pppd命令使用详解
  18. 04-若依基础架构解析
  19. js电影票预订座位网页js特效
  20. orgchart实现组织结构图

热门文章

  1. 通过消息跨进程发送与接收 TCopyDataStruct 数据 - 回复 skymesh
  2. NEsper Nuget包
  3. 如何让普通人了解网络隐私的重要性
  4. API(应用程序编程接口)
  5. 1.支付平台架构:业务、规划、设计与实现 --- 收银台业务
  6. 3. AJAX 请求与响应
  7. 循序渐进之Spring AOP(3) - 配置代理
  8. 分享一次学习中遇到的问题
  9. 查询视图遇见的问题,以及访问另一个数据库的表
  10. 使用自定义手势处理器-陈鹏