词向量学习总结 [独热表示-分布式表示-word2vec -Glove - fast text - ELMO - BERT]

最近面试**公司,被问到word2vec和Glove的损失函数的区别,有点忘记了,回来后便看了一下。

参考博客资料:NLP中词向量对比:word2vec/glove/fastText/elmo/GPT/bert

该博客的目录:

想知道具体的解释,可以点进上方的链接!

一、文本表示和各词向量间的对比 
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、 elmo、GPT、bert三者之间有什么区别?(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 representation)是将每一个词写成一个N维的向量,其中只有一个分量为1,其他为零。N代表的是现有语料库的词汇表的大小。这种方法被称为词的离散化表示,单离散表示有很大的缺点:维数灾难,内存占用大,速度慢。  所以引出将词表示成一个定长的连续的稠密向量,词向量形式。

2、词向量表示

基于此,学者们提出了分布式的词表现形式,即词向量。它主要拥有以下优点:

  • 预训练获得,习得一个好的词向量可以在多个任务中被继续使用
  • 可以表示单词之间的联系和差异,让模型更好地“读”懂单词和句子
  • 它是一个定长连续的稠密向量,占用资源少,计算速度快

直观理解:目前业界常用的是谷歌的300维词向量(即用一个300维的列向量来表示一个单词),它通常是通过神经网络训练而来的。若是将这些高维词进行降维处理并投影到坐标上,可以看到相近的词会倾向集中在一起,无关的词会远离,反映了词向量下单词的联系与差异。

词向量的缺点:

诚然,我们在上文已经看到词向量的种种优点了,但是词向量也仍然有着它的缺点。

  • 可解释性较弱 ,我们没办法确切知道各个维度代表什么含义,这使它看起来有点黑箱。
  • 多义词歧义问题。我们知道一个单词是可以有多重含义的,比如苹果,它既可以代表我们日常使用的苹果,也可以代表乔布斯老爷子的苹果公司。而这两重含义在我们的日常语料中都是大量存在的,而词向量在学习的过程中强行把这两种含义放在一个词向量里面,这就使得它变得有点“不伦不类”,谁都不像。
  • 偏见问题 。这个其实本身并非是词向量的问题,而是人类的问题。词向量是通过人们的语料进行学习的,它在学习的时候是没有辨别能力的,所以它可能会学到人们的一些缺点,比如性别歧视、种族歧视和地域歧视等等。

3.Word2Vec向量表示:【CBOW 和 Skip-Gram表示】

这两种有着相似的思想,只是在实现方面有一些差异,且word2vec属于神经网络语言模型(NNLM)中的一个特例,

                    

词向量是上述神经网络模型的一个具体产物,两者的区别如下:

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

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

举例如下:

这样使得模型不管看到”orange”还是看到”apple”都要预测出”juice”,就”逼”着它让它学习让它认为这两个单词是高度相似的,即我们最终得到的”orange”和”apple”词向量是高度相似的。
而CBOW则与之相反,用的是上下文词来预测中心词。但是与skip-gram有一点差别的是,它获得的训练样本并非是直观以为的(context: juice, center: orange)。而是将窗口内的所有上下文词放在一起来预测中心词,即(context: [glass, of, juice], center: orange),即:

Skip-Gram模型和CBOW模型有和异同?
我们先说相同点,Skip-Gram和CBOW模型都是构造Fake Task,利用句子中的词去预测其它词从而获得单词的词向量。
而它们的不同点来源于上文提到的小差别。CBOW的一个训练样本是(context: [glass, of, juice], center: orange),它对周围词的调整是统一的,CBOW的训练次数跟整个文本的词数几乎相等(每次训练滑动一次中心词窗格获得一个训练样本,而Skip-Gram滑动一次中心词窗格获得多个训练样本)。
由此可看出,Skip-Gram的训练次数是要多于CBOW的,训练时间要比CBOW长。
Skip-Gram训练时间长但也有它的好处。在skip-gram中,每个词在作为中心词的时候,都要进行K次(window_size * 2)的训练和调整。因此当训练语料库较小,或语料中多生僻词时, 这种多次调整会使得词向量更加精准(毕竟训练了多次)。
而在CBOW中,单词的词向量是和周围的词一起平均调整的(比如上述中”glass”、”of”、”juice”是一起调整的),代表若是存在生僻词,它并没有得到因材施教和专门的训练,而是和周围的词一起进行。

Skip-Gram与CBOW模型总结:

CBOW中的目标函数是使条件概率 P(w|context(w)) 最大化.

Skip-gram中的目标函数是使条件概率 P(context(w)|w) 最大化.


                          

 

4.Glove词向量表示:

区别于Skip-Gram和CBOW,GLOVE模型的训练并没有使用神经网络,而是计算共线矩阵通过统计的方法获得。

GLOVE模型获得词向量的步骤可以简单分为两步:

  1. 构造共现矩阵。
  2. 构造损失函数并训练模型。

1. 构造共现矩阵

GLOVE模型训练词向量的第一步骤是根据语料库构建共现矩阵X。假设语料库的大小为N(即有N个单词),则共现矩阵是一个形状为(N, N)的二维向量,其中每个元素 X_{ij} 当窗口滑动遍历完整个语料库之后,即可更新得到共线矩阵X,比如代表单词i和单词j共同出现在一个窗口(window)中的频数。

我们假设语料库中有如下句子,共包含8个单词:

I would like a glass of orange juice.

设置window_size=2,即中心词左右2个单词记为上下文词,其包括中心词构成窗口里面的词。如果我们从左到右滑动窗口,每滑动一次记录一个新的窗口,则会生成以下窗口内容:

                            

当窗口滑动到编号3时,中心词为like,窗口内的词为I、would、like、a、glass,因此对共现矩阵内的元素进行更新:

                                          

当窗口滑动遍历完整个语料库之后,即可更新得到共线矩阵X,比如:

 I would like a glass of orange juice.
 I like orange juice.

    

 应该还有一列,这是一个对称矩阵,且对角线为全零。

理解了Glove中的共现矩阵之后,我们将依此构造Glove模型的目标损失函数。

2 构造损失函数

 

在写Glove的损失函数前,我们先看看最简单的线性回归的损失函数,即平方误差损失函数。

平方误差损失函数:   

                                   

我们希望预测值wx_i +b 和实际值 y_i 的差距越小越好,反应在函数中即损失函数J的值越小越好(上图中各灰色线段越短越好), 加上平方则是避免值为负数且方便求导。可见,在平方误差损失函数的训练过程中,预测值和实际值的差距将越来越小。

从平方误差损失函数出发,我们只需要找到两个值,其中一个代表词向量,另外一个代表它的真实标签,我们就可以借助平方误差损失函数让它们越来越接近,最后得到词向量

然而我们并不能找到一个真实标签来直接代表词向量,所以在论文中采用了一种迂回的方法,即以单词i和单词j共同出现在一个窗口(window)中的频数作为真实标签,以词向量的点乘作为预测值。

由此我们先写下一个Glove模型的简化版损失函数。

                                                           

其中,v_i  和 v_j 是在初始阶段单词i和单词j的词向量(在后续的训练中会逼近真实的词向量), X_{ij}为根据共现矩阵得到的单词i和单词j共同出现在一个窗口(window)中的频数。

有线性代数基础的同学应该知道向量的点乘结果类似余弦相似度可以在一定程度上反映两个向量的相近程度,此处就是使用两个词向量的点乘来反映预测相似度,以两个单词共同出现的频数来反映实际相似度。通过对平方误差损失函数的不断训练,可以让预测相似度不断地逼近实际相似度,当预测相似度和实际相似度非常的接近时,我们也就得到了我们想要的词向量。

理解了简化版Glove损失函数之后对Glove的理解就差不多了,剩下的细枝末节只是为了让模型更鲁棒。

其中f(x)的设计,有3点考虑:

1.当x趋近于0时,由于log x的平方趋于无穷大,因此f(x)必须有较大的导数快速趋近于0,从而保证J不爆炸

2.f(x)需要是递增的,从而保证罕见的Xij没有过分重要

3.f(x)在x特别大时,应该相对不能太大,保证高频的共现没有过分重要

 

综上,f(x)被设计为:

 

3. Glove和Skip-Gram、CBOW的区别

Glove相对于Skip-Gram和CBOW利用了词共现的信息,即不仅仅关注word2vector窗口大小的上下文,而是利用共现矩阵用到了全局的信息。

同时,Glove的优点是训练快,可以拓展到大规模语料,也适用于小规模语料和小向量,且最终效果通常更好。

                  

5.预训练词向量方法:【ELMO + GPT + BERT】

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

 

Reference

  1. word2vec 中的数学原理详解
  2. GloVe详解
  3. 从Word Embedding到Bert模型—自然语言处理中的预训练技术发展史
  4. NLP必读 | 十分钟读懂谷歌BERT模型
  5. 谷歌BERT解析----2小时上手最强NLP训练模型
  6. https://zhuanlan.zhihu.com/p/56382372

 

  • 4
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值