NLP中的词向量对比:word2vec/glove/fastText/elmo/GPT/bert

点击上方,选择星标置顶,每天给你送干货!

阅读大概需要15分钟

跟随小博主,每天进步一丢丢

作者:JayLou,NLP算法工程师

知乎专栏:高能NLP之路

地址:https://zhuanlan.zhihu.com/p/56382372

本文以QA形式对自然语言处理中的词向量进行总结:

包含word2vec/glove/fastText/elmo/bert。

目录


一、文本表示和各词向量间的对比 

二、深入解剖word2vec

三、深入解剖Glove详解

四、深入解剖bert(与elmo和GPT比较)

一、文本表示和各词向量间的对比

1、文本表示哪些方法?

下面对文本表示进行一个归纳,也就是对于一篇文本可以如何用数学语言表示呢?

  • 基于one-hot、tf-idf、textrank等的bag-of-words;

  • 主题模型:LSA(SVD)、pLSA、LDA;

  • 基于词向量的固定表征:word2vec、fastText、glove

  • 基于词向量的动态表征:elmo、GPT、bert

2、怎么从语言模型理解词向量?怎么理解分布式假设?

上面给出的4个类型也是nlp领域最为常用的文本表示了,文本是由每个单词构成的,而谈起词向量,one-hot是可认为是最为简单的词向量,但存在维度灾难和语义鸿沟等问题;通过构建共现矩阵并利用SVD求解构建词向量,则计算复杂度高;而早期词向量的研究通常来源于语言模型,比如NNLM和RNNLM,其主要目的是语言模型,而词向量只是一个副产物。

640?wx_fmt=jpeg

NNLM

所谓分布式假设,用一句话可以表达:相同上下文语境的词有似含义。而由此引申出了word2vec、fastText,在此类词向量中,虽然其本质仍然是语言模型,但是它的目标并不是语言模型本身,而是词向量,其所作的一系列优化,都是为了更快更好的得到词向量。glove则是基于全局语料库、并结合上下文语境构建词向量,结合了LSA和word2vec的优点。

640?wx_fmt=jpeg

3、传统的词向量有什么问题?怎么解决?各种词向量的特点是什么?

上述方法得到的词向量是固定表征的,无法解决一词多义等问题,如“川普”。为此引入基于语言模型的动态表征方法:elmo、GPT、bert。

各种词向量的特点:

(1)One-hot 表示 :维度灾难、语义鸿沟;

(2)分布式表示 (distributed representation) :

  • 矩阵分解(LSA):利用全局语料特征,但SVD求解计算复杂度大;

  • 基于NNLM/RNNLM的词向量:词向量为副产物,存在效率不高等问题;

  • word2vec、fastText:优化效率高,但是基于局部语料;

  • glove:基于全局预料,结合了LSA和word2vec的优点;

  • elmo、GPT、bert:动态特征;

4、word2vec和NNLM对比有什么区别?(word2vec vs NNLM)

1)其本质都可以看作是语言模型;

2)词向量只不过NNLM一个产物,word2vec虽然其本质也是语言模型,但是其专注于词向量本身,因此做了许多优化来提高计算效率:

  • 与NNLM相比,词向量直接sum,不再拼接,并舍弃隐层;

  • 考虑到sofmax归一化需要遍历整个词汇表,采用hierarchical softmax 和negative sampling进行优化,hierarchical softmax 实质上生成一颗带权路径最小的哈夫曼树,让高频词搜索路劲变小;negative sampling更为直接,实质上对每一个样本中每一个词都进行负例采样;

5、word2vec和fastText对比有什么区别?(word2vec vs fastText)

1)都可以无监督学习词向量, fastText训练词向量时会考虑subword;

2) fastText还可以进行有监督学习进行文本分类,其主要特点:

  • 结构与CBOW类似,但学习目标是人工标注的分类结果;

  • 采用hierarchical softmax对输出的分类标签建立哈夫曼树,样本中标签多的类别被分配短的搜寻路径;

  • 引入N-gram,考虑词序特征;

  • 引入subword来处理长词,处理未登陆词问题;

6、glove和word2vec、 LSA对比有什么区别?(word2vec vs glove vs LSA)

1)glove vs LSA

  • LSA(Latent Semantic Analysis)可以基于co-occurance matrix构建词向量,实质上是基于全局语料采用SVD进行矩阵分解,然而SVD计算复杂度高;

  • glove可看作是对LSA一种优化的高效矩阵分解算法,采用Adagrad对最小平方损失进行优化;

2)word2vec vs glove

  • word2vec是局部语料库训练的,其特征提取是基于滑窗的;而glove的滑窗是为了构建co-occurance matrix,是基于全局语料的,可见glove需要事先统计共现概率;因此,word2vec可以进行在线学习,glove则需要统计固定语料信息。

  • word2vec是无监督学习,同样由于不需要人工标注;glove通常被认为是无监督学习,但实际上glove还是有label的,即共现次数640?wx_fmt=svg

  • word2vec损失函数实质上是带权重的交叉熵,权重固定;glove的损失函数是最小平方损失函数,权重可以做映射变换。

  • 总体来看,glove可以被看作是更换了目标函数和权重函数的全局word2vec。

640?wx_fmt=jpeg

elmo vs GPT vs bert

7、 elmo、GPT、bert三者之间有什么区别?(elmo vs GPT vs bert)

(1)特征提取器:elmo采用LSTM进行提取,GPT和bert则采用Transformer进行提取。很多任务表明Transformer特征提取能力强于LSTM,elmo采用1层静态向量+2层LSTM,多层提取能力有限,而GPT和bert中的Transformer可采用多层,并行计算能力强。

(2)单/双向语言模型:

  • GPT采用单向语言模型,elmo和bert采用双向语言模型。但是elmo实际上是两个单向语言模型(方向相反)的拼接,这种融合特征的能力比bert一体化融合特征方式弱。

  • GPT和bert都采用Transformer,Transformer是encoder-decoder结构,GPT的单向语言模型采用decoder部分,decoder的部分见到的都是不完整的句子;bert的双向语言模型则采用encoder部分,采用了完整句子。


二、深入解剖word2vec

1、word2vec的两种模型分别是什么?

word2Vec 有两种模型:CBOW 和 Skip-Gram:

  • CBOW 在已知 context(w) 的情况下,预测 w;

  • Skip-Gram在已知 w 的情况下预测 context(w) ;

640?wx_fmt=jpeg

word2vec

与NNLM相比,word2vec的主要目的是生成词向量而不是语言模型,在CBOW中,投射层将词向量直接相加而不是拼接起来,并舍弃了隐层,这些牺牲都是为了减少计算量,使训练更加

2、word2vec的两种优化方法是什么?它们的目标函数怎样确定的?训练过程又是怎样的?

不经过优化的CBOW和Skip-gram中 ,在每个样本中每个词的训练过程都要遍历整个词汇表,也就是都需要经过softmax归一化,计算误差向量和梯度以更新两个词向量矩阵(这两个词向量矩阵实际上就是最终的词向量,可认为初始化不一样),当语料库规模变大、词汇表增长时,训练变得不切实际。为了解决这个问题,word2vec支持两种优化方法:hierarchical softmax 和negative sampling。此部分仅做关键介绍,数学推导请仔细阅读《word2vec 中的数学原理详解》。

(1)基于hierarchical softmax 的 CBOW 和 Skip-gram

640?wx_fmt=jpeg

基于hierarchical softmax 的 CBOW 和 Skip-gram

hierarchical softmax 使用一颗二叉树表示词汇表中的单词,每个单词都作为二叉树的叶子节点。对于一个大小为V的词汇表,其对应的二叉树包含V-1非叶子节点。假如每个非叶子节点向左转标记为1,向右转标记为0,那么每个单词都具有唯一的从根节点到达该叶子节点的由{0 1}组成的代号(实际上为哈夫曼编码,为哈夫曼树,是带权路径长度最短的树,哈夫曼树保证了词频高的单词的路径短,词频相对低的单词的路径长,这种编码方式很大程度减少了计算量)。

CBOW中的目标函数是使条件概率640?wx_fmt=png最大化,其等价于:

640?wx_fmt=jpeg

Skip-gram中的目标函数是使条件概率640?wx_fmt=png最大化,其等价于:

640?wx_fmt=jpeg

(2)基于negative sampling的 CBOW 和 Skip-gram

negative sampling是一种不同于hierarchical softmax的优化策略,相比于hierarchical softmax,negative sampling的想法更直接——为每个训练实例都提供负例。

对于CBOW,其目标函数是最大化:

640?wx_fmt=jpeg
640?wx_fmt=png
640?wx_fmt=jpeg

对于Skip-gram,同样也可以得到其目标函数是最大化:

640?wx_fmt=jpeg
640?wx_fmt=png
640?wx_fmt=jpeg

负采样算法实际上就是一个带权采样过程,负例的选择机制是和单词词频联系起来的。

640?wx_fmt=png
640?wx_fmt=png

具体做法是以 N+1 个点对区间 [0,1] 做非等距切分,并引入的一个在区间 [0,1] 上的 M 等距切分,其中 M >> N。源码中取 M = 10^8。然后对两个切分做投影,得到映射关系:采样时,每次生成一个 [1, M-1] 之间的整数 i,则 Table(i) 就对应一个样本;当采样到正例时,跳过(拒绝采样)。

640?wx_fmt=jpeg

三、深入解剖Glove详解

GloVe的全称叫Global Vectors for Word Representation,它是一个基于全局词频统计(count-based & overall statistics)的词表征(word representation)工具。

1、GloVe构建过程是怎样的?

(1)根据语料库构建一个共现矩阵,矩阵中的每一个元素 640?wx_fmt=svg 代表单词 640?wx_fmt=svg 和上下文单词 640?wx_fmt=svg 在特定大小的上下文窗口内共同出现的次数。

(2)构建词向量(Word Vector)和共现矩阵之间的近似关系,其目标函数为: 640?wx_fmt=svg 640?wx_fmt=svg :

640?wx_fmt=png

根据实验发现 640?wx_fmt=svg 的值对结果的影响并不是很大,原作者采用了 640?wx_fmt=svg 。而 640?wx_fmt=svg时的结果要比 640?wx_fmt=svg 时要更好。下面是 640?wx_fmt=svg 时 640?wx_fmt=svg 的函数图象,可以看出对于较小的 640?wx_fmt=svg ,权值也较小。这个函数图像如下所示:

640?wx_fmt=jpeg

2、GloVe的训练过程是怎样的?

  1. 实质上还是监督学习:虽然glove不需要人工标注为无监督学习,但实质还是有label就是 640?wx_fmt=svg 。

  2. 向量 640?wx_fmt=svg 和 640?wx_fmt=svg为学习参数,本质上与监督学习的训练方法一样,采用了AdaGrad的梯度下降算法,对矩阵 640?wx_fmt=svg 中的所有非零元素进行随机采样,学习曲率(learning rate)设为0.05,在vector size小于300的情况下迭代了50次,其他大小的vectors上迭代了100次,直至收敛。

  3. 最终学习得到的是两个词向量是 640?wx_fmt=svg 和 640?wx_fmt=svg ,因为 640?wx_fmt=svg 是对称的(symmetric),所以从原理上讲640?wx_fmt=svg 和 640?wx_fmt=svg ,是也是对称的,他们唯一的区别是初始化的值不一样,而导致最终的值不一样。所以这两者其实是等价的,都可以当成最终的结果来使用。但是为了提高鲁棒性,我们最终会选择两者之和 640?wx_fmt=svg 作为最终的vector(两者的初始化不同相当于加了不同的随机噪声,所以能提高鲁棒性)。

3、Glove损失函数是如何确定的?(来自GloVe详解)

640?wx_fmt=jpeg
640?wx_fmt=jpeg

640?wx_fmt=jpeg

四、深入解剖bert(与elmo和GPT比较)


bert的全称是Bidirectional Encoder Representation from Transformers,bert的核心是双向Transformer Encoder,提出以下问题并进行解答:

1、为什么bert采取的是双向Transformer Encoder,而不叫decoder?

BERT Transformer 使用双向self-attention,而GPT Transformer 使用受限制的self-attention,其中每个token只能处理其左侧的上下文。双向 Transformer 通常被称为“Transformer encoder”,而左侧上下文被称为“Transformer decoder”,decoder是不能获要预测的信息的。

2、elmo、GPT和bert在单双向语言模型处理上的不同之处?

在上述3个模型中,只有bert共同依赖于左右上下文。那elmo不是双向吗?实际上elmo使用的是经过独立训练的从左到右和从右到左LSTM的串联拼接起来的。而GPT使用从左到右的Transformer,实际就是“Transformer decoder”。

3、bert构建双向语言模型不是很简单吗?不也可以直接像elmo拼接Transformer decoder吗?

BERT 的作者认为,这种拼接式的bi-directional 仍然不能完整地理解整个语句的语义。更好的办法是用上下文全向来预测[mask],也就是用 “能/实现/语言/表征/../的/模型”,来预测[mask]。BERT 作者把上下文全向的预测方法,称之为 deep bi-directional。

4、bert为什么要采取Marked LM,而不直接应用Transformer Encoder?

我们知道向Transformer这样深度越深,学习效果会越好。可是为什么不直接应用双向模型呢?因为随着网络深度增加会导致标签泄露。如下图:

640?wx_fmt=jpeg

双向编码与网络深度的冲突

深度双向模型比left-to-right 模型或left-to-right and right-to-left模型的浅层连接更强大。遗憾的是,标准条件语言模型只能从左到右或从右到左进行训练,因为双向条件作用将允许每个单词在多层上下文中间接地“see itself”。

为了训练一个深度双向表示(deep bidirectional representation),研究团队采用了一种简单的方法,即随机屏蔽(masking)部分输入token,然后只预测那些被屏蔽的token。论文将这个过程称为“masked LM”(MLM)。

5、bert为什么并不总是用实际的[MASK]token替换被“masked”的词汇?

NLP必读 | 十分钟读懂谷歌BERT模型:虽然这确实能让团队获得双向预训练模型,但这种方法有两个缺点。首先,预训练和finetuning之间不匹配,因为在finetuning期间从未看到[MASK]token。为了解决这个问题,团队并不总是用实际的[MASK]token替换被“masked”的词汇。相反,训练数据生成器随机选择15%的token。例如在这个句子“my dog is hairy”中,它选择的token是“hairy”。然后,执行以下过程:

数据生成器将执行以下操作,而不是始终用[MASK]替换所选单词:

10%的时间:用一个随机的单词替换该单词,例如,my dog is hairy → my dog is apple

Transformer encoder不知道它将被要求预测哪些单词或哪些单词已被随机单词替换,因此它被迫保持每个输入token的分布式上下文表示。此外,因为随机替换只发生在所有token的1.5%(即15%的10%),这似乎不会损害模型的语言理解能力。

使用MLM的第二个缺点是每个batch只预测了15%的token,这表明模型可能需要更多的预训练步骤才能收敛。团队证明MLM的收敛速度略慢于 left-to-right的模型(预测每个token),但MLM模型在实验上获得的提升远远超过增加的训练成本。

bert模型的主要创新点都在pre-train方法上,即用了Masked LM和Next Sentence Prediction两种方法分别捕捉词语和句子级别的representation。

640?wx_fmt=jpeg

下面给出了Transformer Encoder模型的整体结构:

640?wx_fmt=jpeg

Transformer Encoder

640?wx_fmt=jpeg

multi-head attention

Reference

  • word2vec 中的数学原理详解

    https://blog.csdn.net/itplus/article/details/37969519

  • GloVe详解

    http://www.fanyeong.com/2018/02/19/glove-in-detail/#comment-1462

  • 从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史

    https://zhuanlan.zhihu.com/p/49271699

  • NLP必读 | 十分钟读懂谷歌BERT模型

    https://www.jianshu.com/p/4dbdb5ab959b

  • 谷歌BERT解析----2小时上手最强NLP训练模型

    http://www.chinahadoop.cn/course/1253

zenRRan:

我最近有个想法,想通过留言打卡的方式,来督促大家每天学习一丢丢,每天进步一丢丢!留言内容为:【day n】今天我学到了什么或者今天打算学什么等。(至少10个字,越详细越好)奖励的方式暂定为打卡够50次送书!大家怎么看?可以留言告诉我!

这种方式类似于简短的日志!因为我们实验室之前一直都是写日志的(对不是周志是日志),效果还是很不错的,一天不逼着自己干点正事,晚上都不知道写点啥。这种倒逼的学习方式,我感觉还不错!

昨天已经有小伙伴参与了,很开心,希望坚持下来!

640?wx_fmt=png

- END -
如果看到这里,说明你喜欢这篇文章,请转发、点赞。微信搜索「 perfect_iscas 」,关注后回复「进群」或者扫描下方二维码即可进入无广告技术交流群。
扫描二维码进群↓

640?wx_fmt=jpeg

640

640?wx_fmt=gif

在看 640?wx_fmt=jpeg

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/31911.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

6款AI写作工具类网站推荐(第二版)

我们搜集了一些AI写作工具,希望对你有帮助,不论是在提升工作效率方面,还是在了解最新的AI技术方面,帮助你提升工作效率。 Notion AI https://www.notion.so/product/ai NotionAi可以提供AI智能写作,还能检查代码、语法…

国内大模型侵权第一案,6 年成果,被爬取 200+ 万次,仅索赔 1 元?

整理 | 郑丽媛 出品 | CSDN(ID:CSDNnews) 上个月,学而思曾透露消息称,目前其正在自研数学大模型 MathGPT,即面向全球数学爱好者和科研机构,以数学领域的解题和讲题算法为核心打造而成。 彼时许多…

用GPT-4 写2022年天津高考作文能得多少分?

正文共 792 字,阅读大约需要 3 分钟 学生必备技巧,您将在3分钟后获得以下超能力: 积累作文素材 Beezy评级 :B级 *经过简单的寻找, 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图片由Lexica …

react聊天组件:用antd和react-chat-element组装的聊天列表

效果图: 安装库 用到了antd design和github上的一个库:react-chat-element (1)antd design: 安装:yarn add antd 修改 src/App.css,在文件顶部引入 antd/dist/antd.css import ~antd/dist/a…

chatgpt赋能python:人脸识别技术进程Python应用

人脸识别技术进程Python应用 人脸识别技术是计算机视觉领域的重要应用,随着深度学习技术的发展,越来越多的人开始关注并使用这种技术。Python作为一种高效、易用的编程语言,也在人脸识别领域得到了广泛应用,本文将介绍Python如何…

chatgpt赋能python:Python人脸搜索:进入智能搜索的新时代

Python人脸搜索:进入智能搜索的新时代 随着神经网络和深度学习的迅猛发展,人工智能已经成为许多领域中最重要的研究方向。人脸搜索的普及,是人工智能引领的技术革命最具有代表性的例子。Python作为一种高级编程语言,在人脸搜索领…

chatgpt赋能python:Python实现人脸识别系统

Python实现人脸识别系统 在当今科技发展的时代,人脸识别技术已经广泛应用于各行各业中,如安全防范、金融交易、医学检测等领域,成为了一个备受瞩目的技术。Python作为当今最流行的编程语言之一,其实现人脸识别系统的能力备受重视…

chatgpt赋能python:人脸识别软件的作用及发展

人脸识别软件的作用及发展 随着科技的飞速发展,人脸识别技术越来越广泛地应用于各个领域,例如安全监控、金融交易、社交网络等。人脸识别软件通过识别人脸图像中的特征来进行身份验证或辨认,具有高效、准确、便捷等优点。而Python作为一种易…

chatgpt赋能python:Python人脸匹配:自动识别人脸并进行匹配

Python人脸匹配:自动识别人脸并进行匹配 介绍 Python已经成为一种广泛使用的编程语言,在许多任务中被广泛应用。其中一项任务是人脸匹配,这是在安全性和身份验证方面非常有用的应用程序。Python提供了一些很好的库,使得在Python…

chatgpt赋能python:Python人脸识别教程

Python人脸识别教程 什么是人脸识别? 人脸识别是一种通过人脸图像进行身份识别的技术,根据人脸的特征信息进行比对,以识别一个人的身份。 Python人脸识别技术 Python是一种高级编程语言,现在被广泛应用于人工智能,…

IDEA官方中文插件!!!

随着IDEA2020.1版本的到来,官方也悄悄更新了IDEA的中文插件 不得不说,还是比较给力的。 打开设置–>插件: 搜索 Chinese (Simplified) Language Pack 下载重启,IDEA中文版就来啦。 整体效果还是不错的: ATFWU…

IDEA官方中文版插件

IDEA官方中文插件安装步骤: 打开Settings–>Plugins:搜索 Chinese (Simplified) Language Pack 下载重启,IDEA中文版安装完成。

IDEA好用的插件推荐

目录 1.Translation 2.GsonFormat 3. VisualVM Launcher 4.CodeGlance Pro 5.Key Promoter X 6.GenerateAllSetter 7..ignore 8.MyBatisCodeHelperPro 9.Grazie 10.Background Image Plus 1.Translation 翻译插件。程序员最痛苦的事莫过于阅读代码时遇到不懂的英文单词&#…

IDEA实用插件

IDEA中引入插件支持方式如下: 点击File-- Settings设置界面--PlugIns,安装指定的插件,安装后自动或手动重启IDEA。 1、Translation 【实用程度 ★★★★★】 用处:直接选中你想要翻译的词,然后右键选择,或…

idea中文版插件

IDEA怎么设置成中文? 首先点击左上角的File-Settings 进入设置 进入Settings后点击Plugins,在搜索框输入Chinese language pack,点击install安装插件 下载成功后,点击installed,找到下载的汉化插件,点击Restart IDE&…

如何缓解高考前紧张的情绪,ChatGPT这么说......

明天就要高考了,看到家长有各种打气的做法,既有上灵隐寺的,也有穿着旗袍希望旗开得胜的,还有说什么失败了不要紧的......,反正都是焦虑的不行。 面对高考,大多考生都会紧张,但适度的紧张对发挥出…

13、列表

一.列表 列表是python的基础数据类型之一 ,其他编程语言也有类似的数据类型. 比如JS中的数 组, java中的数组等等. 它是以[ ]括起来, 每个元素用’ , 隔开而且可以存放各种数据类型: 列表是python中的基础数据类型之一,其他语言中也有类似于列表的数据类型&#…

基于单片机无线防丢报警器设计过程分享

目录 【功能介绍】 【原理图】 【PCB】 【实物图】 【元器件清单】 【源代码】 【模块介绍】 【参考资料】 【参考文献】 【功能介绍】 本设计利用51单片机结合NRF24L01无线模块进行设计,防丢器分为两个部分,分为从机和主机,即发射模…

基于单片机倾角检测仪设计分享

目录 【功能介绍】 【原理图】 【PCB】 【实物图】 【元器件清单】 【源代码】 【参考资料】 【参考文献】 【功能介绍】 本设计利用51单片机为主控系统,采用三轴加速度传感器ADXL345进行倾角测量,可以实现两大功能: 实时显示当前测…

360数科港交所上市:市值超160亿港元 周鸿祎为大股东

雷递网 雷建平 11月29日 360数科股份有限公司 (股票代码:3660)今日在港交所主板上市,发行价为50.03港元,募资净额为2.77亿港元。 360数科开盘价为50.6港元,较发行价小幅上涨,收盘价为51.75港元,较发行价上涨…