HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

搞懂 NLP 中的词向量,看这一篇就足够

  • 2019-08-30
  • 本文字数:7597 字

    阅读完需:约 25 分钟

搞懂NLP中的词向量,看这一篇就足够

本文由原作者授权转载自知乎专栏:高能NLP之路

目录

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


1、文本表示哪些方法?


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


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


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


5、Word2vec 和FastText对比有什么区别?(Word2vec vs FastText)


6、GloVe 和 Word2vec、 LSA 对比有什么区别?(Word2vec vs GloVe vs LSA)


7、 ELMoGPTBERT三者之间有什么区别?(ELMo vs GPT vs BERT)


二、深入解剖 Word2vec


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


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


三、深入解剖 Glove 详解


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


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


3、Glove 损失函数是如何确定的?


四、深入解剖 BERT(与 ELMo 和 GPT 比较)


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


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


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


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


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

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

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,其主要目的是语言模型,而词向量只是一个副产物。



NNLM


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


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 对比有什么区别?(Word2vecvs 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 对比有什么区别?(Word2vecvs GloVe vs LSA)

1)GloVe vs LSA


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

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


2)Word2vecvs GloVe


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

  • Word2vec 是无监督学习,同样由于不需要人工标注;GloVe 通常被认为是无监督学习,但实际上 GloVe 还是有 label 的,即共现次数[公式]。

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

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



ELMo vs GPT vs BERT


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

之前介绍词向量均是静态的词向量,无法解决一次多义等问题。下面介绍三种 ELMo、GPT、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) ;



Word2vec


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

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

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


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



基于 hierarchical softmax 的 CBOW 和 Skip-gram


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


CBOW 中的目标函数是使条件概率 [公式] 最大化,其等价于:



Skip-gram 中的目标函数是使条件概率 [公式] 最大化,其等价于:



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


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


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





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





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




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


三、深入解剖 GloVe 详解

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

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

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


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



这个 loss function 的基本形式就是最简单的 mean square loss,只不过在此基础上加了一个权重函数 f(xij) :



根据实验发现 Xmax 的值对结果的影响并不是很大,原作者采用了 Xmax=100。而 α=3/4 时的结果要比 α=1 时要更好。下面是 α=3/4 时 f(x) 的函数图象,可以看出对于较小的 xij ,权值也较小。这个函数图像如下所示:


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

1.实质上还是监督学习:虽然 GloVe 不需要人工标注为无监督学习,但实质还是有 label 就是 log(xij) 。


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


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

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



四、深入解剖 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 这样深度越深,学习效果会越好。可是为什么不直接应用双向模型呢?因为随着网络深度增加会导致标签泄露。如下图:



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


深度双向模型比 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]替换所选单词:


80%的时间:用[MASK]标记替换单词,例如,my dog is hairy → my dog is [MASK]


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


10%的时间:保持单词不变,例如,my dog is hairy → my dog is hairy. 这样做的目的是将表示偏向于实际观察到的单词。


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。



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



Transformer Encoder



multi-head attention


2019-08-30 11:5929591

评论

发布
暂无评论
发现更多内容

算法题:链表的第一个合并节点

破晓_dawn

极客大学

程序员的晚餐 | 7 月 27 日 美味鲫鱼豆腐汤

清远

美食

HTML5+CSS3前端入门教程---从0开始通过一个商城实例手把手教你学习PC端和移动端页面开发第2章HTML基础知识

Geek_8dbdc1

CSS html

第四范式自动化推荐系统:搜索协同过滤中的交互函数

天枢数智运营

人工智能 推荐系统 搜索

4. JSON字符串是如何被解析的?JsonParser了解一下

YourBatman

Jackson JSON库

《深度工作》学习笔记(2)

石云升

学习 专注 深度工作

判断链表相交

GalaxyCreater

算法

百万并发「零拷贝」技术系列之Java实现

码农神说

Java 架构 高性能 零拷贝

nginx安装配置(windows)

陈靓-哲露

BIGO技术 | Paxos的工程实践与极致优化

InfoQ_3597a20b53cc

技术

判断两个链表是否合并

Z冰红茶

判断两个链表是否重合

LEAF

What's New in Dubbo-go v1.5

apache/dubbo-go

dubbo Go 语言

服务器是什么?其作用及有哪些分类?

德胜网络-阳

服务器

案例解读:深入理解浏览器的缓存机制

华为云开发者联盟

缓存 浏览器 服务器 缓存穿透 华为云

NameNode架构图解

我是个bug

Java 大数据 hadoop

区块链在公益慈善行业的应用研究

CECBC

区块链技术 公益组织 治理 数据透明

河南省区块链产业联盟成立暨可信区块链技术创新大会启幕

CECBC

可信区块链 提升核心技术 产业联盟 产学研用

拒绝贴标签的懒惰

zhoo299

随笔杂谈

JVM系列之:String.intern的性能

程序那些事

性能 JVM string GC

IT世界里的《三十而已》:不比包包的男士们在比什么?

脑极体

极客大学架构师训练营-单向链表相交问题

Geek_zhangjian

什么是数字孪生,它的应用价值在哪里?

华为云开发者联盟

AI IoT 数字化 汽车电子 工业互联网

【好书推荐】《Python黑魔法指南》-附高清PDF版

华为云开发者联盟

Python 开发者 书摘 python3.7 书籍推荐

极客大学架构师训练营 - 本周总结

Geek_zhangjian

敏捷开发:一文了解影响地图和用户故事地图之间的那些事儿

华为云开发者联盟

产品设计 敏捷开发 后端 地图 开发流程

BIGO技术 | Paxos的工程实践与极致优化

InfoQ_3597a20b53cc

BIGO

区块链的现象级应用应该什么样子

CECBC

产业落地 政策扶持 区块链革命 价值传递

应用开发基础之-数据结构与算法

superman

硬核干货:葡萄城 SpreadJS 前端表格技术分享

葡萄城技术团队

Excel SpreadJS 表格控件 表格开发

CDN百科第八期 | 我的网站到底需不需要CDN加速?

阿里云Edge Plus

网站 CDN 云直播

搞懂NLP中的词向量,看这一篇就足够_AI&大模型_JayLou_InfoQ精选文章