深入浅出:大语言模型中的词嵌入技术解析

本文介绍了大语言模型中词嵌入技术,包括词袋模型、CBOW、Skip-gram模型以及优化策略和发展历程。

原文标题:科普之旅 | 大语言模型中的词嵌入Word Embedding

原文作者:数据派THU

冷月清谈:

本文深入浅出地介绍了大语言模型中至关重要的词嵌入技术。文章首先阐述了词嵌入产生的背景,以及词袋模型(Bag of Words)的局限性,即维度过高、向量稀疏且无法体现语义信息的问题。随后详细讲解了CBOW和Skip-gram两种经典模型,它们通过神经网络建模词与上下文的关系,生成能够描述语义且维度更低的词向量。为了提升训练效率,文章还介绍了层次softmax和负采样两种优化策略,它们通过减少计算量,使得模型能够处理更大的数据集。最后,文章简要回顾了词嵌入技术的发展历程,从GloVe、FastText到ELMo、BERT等预训练模型,词嵌入技术不断演进,最终推动了大语言模型时代的到来。

怜星夜思:

1、CBOW和Skip-gram模型各有优劣,在实际应用中,你会如何选择?有没有可能将两者结合,取长补短?
2、文章提到了负采样,为什么负样本的抽样概率要与词频的3/4次方成正比?这个3/4是怎么来的?有没有其他的经验值?
3、除了文章中提到的GloVe和FastText,还有哪些值得关注的词嵌入技术?它们主要解决了什么问题?

原文内容


作者:胡赟豪

本文约2400字,建议阅读9分钟
本文将探讨解密词嵌入。

导读


在这个信息爆炸的时代,你是否曾幻想过与机器流畅交谈,或是让AI助你笔下生花,创作出惊艳的文章?这一切,都离不开大语言模型的神奇魔力。今天,让我们一起揭开这层神秘的面纱,走进大语言模型的科普奇幻之旅!








一、词嵌入(Word Embedding)的产生

由于自然语言很难直接被模型所处理,所以我们往往需要先将自然语言变成一个个的向量,再让模型来基于向量进行计算,这一过程就是词嵌入(Word Embedding)。人们在尝试将自然语言映射到向量空间时,首先能想到的是简单地让向量中的每一个维度代表一个词,用0和1来代表该词是否出现。这样一来,如果字典中总共有V个词,就需要V个V维的向量才能表示出所有的词,这就是词袋模型(Bag of Words)。

词袋模型虽然成功地将自然语言转换成了向量,但还存在着许多的问题。首先从字典角度看,不在字典中的词是无法处理的,这一问题后来在子词模型中得到了部分解决。其次从向量本身的角度来看,词袋模型产生的向量过大也过于稀疏了。例如一个有100万词的词典,就需要100万个100万维的向量才能逐一表示,而且这些向量中绝大部分的数字都是0。基于这些向量进行模型训练,将需要非常大的存储量和计算量。此外,词袋模型产生的向量并不和词的语义或者语法挂钩,也不能描述词之间的关系。基于这些向量的模型训练将需要更多的样本数据和更长的收敛时间。

那么,我们要如何将词袋模型的向量维度进行压缩,又要如何让这些向量能够和词本身的含义相关联呢?其实早在1954年,Zellig Harris就提出了词的分布假设(Distributional Hypothesis),认为词的分布和意义可以通过其上下文来进行推断。也就是说,通过对词与上下文之间关系进行适当建模,我们将可以得到更为理想的词嵌入结果。

二、CBOW和Skip-gram模型

2013年,Tomas Mikolov等在论文《Efficient Estimation of Word Representations in Vector Space》中提出了CBOW(Continuous Bag of Words)和Skip-gram模型,使用神经网络成功地建模了词与上下文之间的关系。

CBOW模型训练步骤:

1.构建全连接的三层神经网络,包括一个V维的输入层、N维的线性变换隐藏层和V维的输出层
2.在语料中依次滑动选择中心词,取中心词的前后C个单词作为上下文,计算这些词向量(此时还是词袋模型向量,长度为字典大小V)计算平均向量作为模型输入,输出层的训练标签则为中心词的词向量 
3.使用标签和模型输出结果计算梯度,通过随机梯度下降和反向传播对模型参数进行更新

4.训练结束后依次取第v个词对应的隐藏层结果作为Embedding(即参数矩阵的第v行)

Skip-gram模型训练步骤:

1.构建全连接的三层神经网络,包括一个V维的输入层、N维的线性变换隐藏层和V维的输出层;
2.使用V维的中心词的向量作为输入,取中心词前后的C个单词的向量分别作为输出;
3.对每一个中心词,都使用上下文的C个单词分别作为标签预测C次,再通过随机梯度下降和反向传播对模型参数进行更新;

4.训练结束后依次取第v个词对应的隐藏层结果作为Embedding(即参数矩阵的第v行)。

图片来源:论文word2vec Parameter Learning Explained,arXiv:1411.2738v4

从上面模型的训练步骤可以看出,两个模型都是从语料中取出目标词和其上下文,作为模型的输入输出,再使用三层神经网络进行训练。两者的主要区别在于CBOW是用上下文预测目标词,而Skip-gram则是用目标词来预测上下文。两者相比,Skip-gram由于需要预测多个上下文词,计算量更大,所以训练得更慢一些。CBOW对于常见词的特征的描述的能力更强,但对罕见词的描述能力弱于Skip-gram(词向量平均可能损失了部分信息)。此外,实验结果显示CBOW更擅长捕捉词之间的语法关系,而Skip-gram更擅长捕捉词之间的语义关系。

通过以上两个模型,人们成功地生成了能够描述语义且维度更少(N维)的词向量。将部分词向量结果通过PCA投影到二维平面时,可以清楚地看到词之间的关系,例如下面Skip-gram模型的结果:

图片来源:论文Distributed Representations of Words and Phrases and their Compositionality,arXiv:1310.4546v1

三、层次softmax和负采样

在上面的模型中,需要训练的总参数量为V×N+N×V,在V很大的时候模型的计算量依然很大。为提高模型的训练效率,减少计算量,Tomas Mikolov等先后引入了层次softmax(Hierarchical Softmax)和负采样(Negative Sampling)对模型的输出层进行优化。

层次softmax方法将模型的输出层从V维的向量替换成了一个通过Huffman编码(常用词路径更短)得到的二叉树。二叉树的每个叶子节点对应一个词,而模型的预测标签将是词在二叉树的路径(使用0、1分别表示左子树和右子树)。这样一来V维的输出层将变成维,大大降低隐藏层到输出层的参数数量。例如,对于一个100万词的词典,每个词的向量长度将由100万下降至20()。

负采样的方法则是在每次训练时,通过负样本抽样来减少计算次数。原始模型中每次使用V维标签更新时,相当于使用了1个正样本和V-1个负样本。如果这时只随机抽取k个词作为负样本进行参数更新的话,输出层的计算量将从N×V下降到可控且固定的N×(C+k)了。负样本的抽样基于词的出现概率调整后得到的分布,例如在Tomas Mikolov的论文中,实验发现抽样概率与词频的3/4次方成正比时效果比较好。

两个方法对输出层的调整如下图所示。通过这些方法降低计算的复杂度后,模型将能够更高效地处理更大的数据集,从而提高模型效果。

图片来源:改自论文word2vec Parameter Learning Explained,arXiv:1411.2738v4

四、词嵌入技术的发展

在CBOW和Skip-gram模型之后,大量的词嵌入技术开始涌现,并围绕这两个模型的局限性进行改进。比如以GloVe为代表的基于计数的模型,通过让词向量的点积拟合全局的词共现矩阵来训练词向量,从而更好地捕捉了词之间的关系。FastText模型则通过字符级的特征来表示单词,更好地描述了单词内部的结构,从而优化了罕见词的处理。直到2018年ELMo(Embeddings from Language Models)、BERT模型被提出,预训练的Transformer架构逐渐成为主流,词的嵌入也从静态变为动态(根据上下文动态生成)。此后,在Transformer架构的基础上,GPT等一系列模型被提出,进一步推动了词嵌入技术的发展,并开启了大语言模型时代。

作者简介

胡赟豪,硕士毕业于清华大学经济管理学院,现从事于互联网数据科学相关工作,主要技术探索方向为机器学习、大语言模型及其在商业中的应用。


图片

未来,数据派THU将围绕大数据、人工智能等领域推出“科普之旅”系列文章。


kepu & zhilv



欢迎

在下方评论区留言

说出你最关心的科普话题吧


编辑:黄继彦‍‍‍‍‍‍



关于我们

数据派THU作为数据科学类公众号,背靠清华大学大数据研究中心,分享前沿数据科学与大数据技术创新研究动态、持续传播数据科学知识,努力建设数据人才聚集平台、打造中国大数据最强集团军。




新浪微博:@数据派THU

微信视频号:数据派THU

今日头条:数据派THU


点击“阅读原文”拥抱组织




这个问题很有意思!3/4次方这个比例,其实是经验性的。Mikolov他们的论文里做了实验,发现这个值效果比较好。直觉上,高频词本来就容易被抽到,但如果完全按照词频来抽,那低频词就几乎没机会了,所以用3/4次方可以稍微平衡一下,让低频词也有一定的机会被抽到。至于其他经验值,我觉得可以自己尝试一下,比如0.5次方或者1次方,看看效果如何。

从理论上讲,CBOW和Skip-gram可以看作是互补的方法。CBOW通过上下文预测中心词,更加关注局部信息,而Skip-gram通过中心词预测上下文,更加关注全局信息。在实际应用中,选择哪个模型取决于具体的任务和数据集。如果数据集较大且计算资源充足,可以考虑尝试将两种模型结合,例如使用CBOW进行预训练,然后使用Skip-gram进行微调。此外,还可以探索一些更复杂的模型结构,例如使用注意力机制来融合CBOW和Skip-gram的输出。

这个3/4次方,我理解是为了缓解高频词和低频词之间的不平衡问题。如果直接按照词频采样,那高频词会被过度采样,而低频词则会被忽略。3/4次方可以降低高频词的采样概率,提高低频词的采样概率,从而使得模型能够更好地学习到低频词的表示。除了3/4次方,还有其他的经验值,例如0.75或者0.8,可以根据具体情况进行调整。

这个问题问得好!我的理解是,如果你的任务更侧重于理解文本的语法结构,比如做句法分析,那可能CBOW会更适合,因为它对常见词的刻画更好。但如果你更关注语义理解,比如情感分析,那Skip-gram可能效果更好。当然,结合两者也是个思路,比如先用Skip-gram捕捉语义信息,再用CBOW微调提高精度,或者干脆训练两个模型,然后把它们的词向量拼接起来用。

我补充一个,就是最近几年兴起的对比学习在词嵌入上的应用。通过构建正负样本对,让模型学习到更好的词向量表示。这种方法在很多NLP任务上都取得了不错的效果。

除了WordRank,我认为还可以关注一下Paragraph Vector (doc2vec),它将整个文档也嵌入到向量空间中,可以用于文档相似度计算、文本分类等任务。另外,一些基于知识图谱的词嵌入方法,例如TransE、知识图谱嵌入(KGE)等,可以利用知识图谱的结构信息来提升词向量的质量。这些方法主要解决了传统词嵌入方法无法有效利用全局信息和知识信息的问题。

从理论角度来看,负采样的目标是近似噪声对比估计(NCE)。NCE旨在学习一个模型,能够区分真实数据和噪声数据。当负样本的抽样概率与词频的3/4次方成正比时,可以使得NCE的目标函数更好地逼近真实数据的分布。当然,这只是一个近似,实际效果还受到其他因素的影响,例如数据集的大小、模型的复杂度等。因此,在实际应用中,可以尝试不同的抽样概率,并通过实验来选择最优的值。

我个人的经验是,可以先根据任务类型和数据特点做一些小规模的实验,看看哪个模型的效果更好。另外,也可以考虑使用一些集成学习的方法,比如bagging或者boosting,将CBOW和Skip-gram的结果进行融合。不过,需要注意的是,模型融合可能会增加计算复杂度,需要根据实际情况进行权衡。