3.词嵌入
【内含公式,建议PC端浏览器阅读】
鞋匠起身舒展了下筋骨,2维世界化身为神对鞋匠来说没有吸引力,他还是喜欢现实的擦鞋人生。理解了AI这颗大树远古时代幼苗的成长史,鞋匠觉得是时候踏入大模型的世界了。朦胧间,他觉得在朦胧的尽头,大模型的世界似乎触手可及。鞋匠怀着敬畏之心伸手敲开了大模型世界的第一扇门 --- 词嵌入。
词嵌入的宏观想象
每一个字词有着其语言学上固有的特征,比如词性、语义、褒贬意义等。顺着历史的长河回望,鞋匠还看到了他们所带着的远古时代先祖的信息。比如“易”字,在古代,它的本意与“变化”、“交换”相关,最初是关于自然界变化和动物适应环境变化的象征,然而,发展到今天,“易”字更多地与“容易”、“简单”等意义相连。就这样,鞋匠的脑海里浮现出许许多多可以用来描述某个字词的特征,那么到底要定义多少个特征维度来描述它们呢?答案或许是很多。很多时候都没有一个确定的答案。但鞋匠坚信按照若干个维度来理解一个字词必定是个有效的方法,这就是词嵌入的雏形。
如果让人工神经网络来处理一个词、一段话,有一个先决条件就是要对这些字词进行量化。按照刚刚多维度的形式来理解一个字词是一个好方法。如果有一种方法可以对每个字词的每个维度进行量化,比如,对于词性这个维度,用1来代表名词,2代表动词,3代表形容词,就是一个有效的方法;对于褒贬义这个维度,用1代表最大的贬义,10代表最高的褒义,中间的数代表不同程度的褒贬义;同样对于像情感这类的词,还可以有衡量喜怒哀乐程度的维度,并对不同程度进行量化,等等,那么就有可能利用人工神经网络来处理这些字词了。鞋匠觉得人工神经网络听起来总让人感觉还在远古时代,也感受不到网络自我学习与演化的内涵,后面用AI模型这个称呼似乎更有吸引力,他觉得更多人会喜欢这样的称呼,因为这些称呼隐藏了网络自身的构造与脉络,毕竟没有人愿意对着一堆人的生理结构说他是一个智能的人。人靠衣服马靠鞍,人工神经网络的发展靠名字!
将每个具体的字词量化成不同的维度值来表示是一个复杂的过程。其结果就是让每个字词都由一组各个特征维度组成的具体的特征数值来表示。鞋匠称这个过程为词嵌入的过程,而这个数值结果就叫每个词的词嵌入。
那么问题来了,即便是假设现在有了一个比较全面的维度划分,针对一个具体的词,每个维度的具体的值又怎么来确定呢?鞋匠想,难不成要找100个人,各自根据自己的体会估计一个值出来,然后做平均?这倒是一个方法,但这100个人怎么选?他们能代表整个人类吗?或者以中文为例,他们能代表所有说中文的中国人吗?另外,为什么必须是100人呢?怎么来定多少人代表所有中国人是合适的?即便是确定好了100人,他们能很好的代表所有中国人,让他们来确定所有的维度,并对每个字词的每个维度根据自己的经验来量化一个值,那每个人要完成的工作将是极为庞杂的。举个例子来看,假设有10000个字词(第11版新华字典收录了13000多个汉字)需要嵌入,每个字词的维度是100(当前行业中词嵌入的维度大多都在百这个数量级),那将会有100万个具体数值待确定。一个人要区分出并给定100万个数值,还要确保评分标准的一致性,这几乎是不可能的。
鞋匠觉得想个办法,这在计算机科学里称之为算法,来让计算机按照算法主动的完成这一切。这正是计算机所擅长的。在当今的信息社会,可以说几乎所有的知识,都以文字的形式记录下来并代代相传。这是好事,可以从这些海量的文字里找到方法。这些文字段落里,必然隐藏着鞋匠刚刚想象的那些维度,每个字词也都有其各自的应有的归宿。鞋匠继续想象着,比如在人类所在的3维空间中,用3个数值就可以确定在地球上的一个点,比如(经度值,纬度值,高度值)。数学上这叫一个3维向量。如果想要的词嵌入的维度也是3维的话,那同样也可以用类似的3个数值来确定一个词,即(维度1的值,维度2的值,维度3的值),这和确定地球上一个点的向量很相似,除了数值不一样外,其实它们的数学性质是一样的。再仔细想想,如果要确定地球上的某个人的具体位置,只有这3个维度(经度,纬度,高度)是不充分的,因为人是可以移动的。于是鞋匠增加了一个维度,即时间维,变成4个维度,来定位一个人的时空(空间+时间)位置,即(经度值,纬度值,高度值,时间值)。现在某个人的具体位置就可以表述成,在2024年5月11日上午9点9分36秒,这个人在东经120.123456度、北纬36.654321度、高3.99米处。嗯,这样看起来就舒服多了。同样的,还可以增加更多的维度来更为精确的定位一个人,或者说更为准确的衡量、确定一个人,为其在社会上找到一个位置,也就是为他在其所生活的地球这样一个生态圈内确定一个位置。要做这样的衡量,需要很多维度,包括他的当前的地理位置、所属国家、家庭关系、朋友关系、同事关系、性格、财富、文化水平、特长、专业等等,鞋匠列举了很多很多。如果把这些所有的衡量维度放到一起,那人类所在的地球这样一个生态圈,也是一个高维的生活空间。同样的,词嵌入也是如此,随着维度的增加,所能量化的信息也就越多,也就能越精确的确定一个词。如果把词嵌入这样的很多维度的东西形象的称之为空间,那么就得到了一个高维的词嵌入空间。每个字词,在被量化后,都对应了一个在这个空间内的位置。鞋匠意识到接下来要做的就是为每个字词确定其位置,为每个字词找到其各自应有的归属。这样把一个字词转化为一组“数值”来代表它,后面用计算机来处理这个字词就会方便许多。
假设词嵌入空间有n个维度,那么每个字词就可以用这样一个向量来表示它了,即
(维度1的值,维度2的值,维度3的值,…,维度n的值)
想到词嵌入空间,鞋匠觉得有一种代入感,感觉每个字词都应该是一个有生命的个体。他们和谐的生活在一个确定的n维的词嵌入空间中,他们之间通过所有的这些维度形成了千丝万缕的联系。就像人类所在的地球这个生态圈一样,在这样的生活空间中,每个人都有家人、朋友、同事等关系,即便是与其擦肩而过的人,也与他建立了一面之缘的联系。这些联系、这些关系就在那里,体现在地球这样一个生态圈里,抹不去,也改不了。每个人所经历的一切总会以某种方式留下痕迹,彼此间建立联系。在词嵌入空间中也是一样,一群在某种程度上相近的词,必定会以某种方式汇聚在相近的地方。这种程度可能是由某个维度来衡量或者几个维度综合衡量的结果。就像人类一样,它们会形成类似家人、朋友、同事等关系。而这一切关系都隐藏在人类创造的海量的文本中,这些文本以其自身承载的信息,把这些关系刻画下来,抹不去,也改不了。那么怎么量化这n个维度,准确表示一个词所对应的词嵌入呢?鞋匠想万事开头难,就先为世界上所有的字词都随机的创建一个向量吧,每个向量里都有n个数值,它们代表的是n个特征维度的量化值。这些值千差万别,这种做法大概率为每个字词产生了一个和实际的现实情况差别很大的词嵌入,不过鞋匠觉得这无关紧要,它们不过是一些初始值。想到初始值,鞋匠想到前面研究人工神经网络时网络参数的初始化。一开始那些网络参数是以某种方式随机初始化的,而后按照一些规则进行调整,最终形成比较优化的网络参数。这里让每个词嵌入都按照某种规则计算出上面那些关系值,并与实际的现实情况对比,如果发现不对,就向着对的方向调整一点点,为这个字词得到一个新的词嵌入,如此循环往复,直到调整到与现实的实际情况的误差在可接受的范围内。这样就可以按照人工神经网络的优化方式来生成每个字词的词嵌入了。
为更好的理解它是怎么调整的,鞋匠想到了一个人的n维向量(描述这个人的各维度值组成的向量)在人类生活空间中的调整过程。每个人的现实情况就在那里,那是调整的目标,即近似的用一个n维向量来表示这个人在高维人类生活空间的位置,来反映其实际情况。每个人的向量都是随机初始化的,用这样的向量来表示的一个人的高维空间位置,由此计算出的人与人之间的关系必定是杂乱的、完全不符合实际的现实关系的。但至少人类的生活空间里的每一个人都有了一个向量。接下来,所有人按照一定的顺序,每个人逐一按照其各个维度的值计算与他人之间的关系并与现实情况进行对比,比如张三有三个朋友,甲、乙、丙,甲与张三最好,乙次之,丙最差,所以在衡量朋友关系上,张三期望得出的计算值是10分、6分、1分,分别代表其与甲、乙、丙的朋友关系的好坏程度,但由于每个人的朋友维度上的值是随机初始化的,所以计算出来的朋友关系值可能与实际期望的完全不同,比如计算值可能是2分、3分、7分。在这一轮的比较过程中张三记下了对甲、乙、丙在朋友维度上应该怎么调整,比如,与甲的朋友关系往高分调整(从2分向着10分调整),与已的朋友关系往高分调整(从3分向着6分调整),与丙的朋友关系往低分调整(从7分向着1分调整)。正如人工神经网络的训练一样,要找到最符合现实情况的所有人对应的n维向量,只能慢慢来,一步一步扎扎实实的来调整。这里也有步长的概念,比如张三和甲的朋友关系预测值和真实值差距太大,预测值是2分,而期望的真实值是10分,这种情况下,步长(调整量)可以大一点,通过这种方式,差距比较大的可以调整的快一些,差距较小的,可以调整的慢一些。注意,这里的调整往往是牵一发而动全身的。比如,张三与甲的关系调整好了,各种关系的计算值都符合现实情况,但这种调整可能影响了张三和乙的关系值。所以整个人类生活空间中每个人的n维向量的调整是一个慢慢优化的过程,时好时坏,但最终是向着选定范围内的最佳方向调整的。
现在回到词嵌入。词嵌入也可以用类似的方法来调整。词嵌入空间中每个词的位置,即确定每个词嵌入各个维度的值,是基于与当前海量文本内容的实际情况进行对比的结果。这是如何对比的呢?常用的方法是基于当前给定的文本信息预测目标词,如果预测的这个目标词符合当前文本内容的实际情况,那么由此确定的词嵌入对当前文本来说就是合适的词嵌入。想到这里,鞋匠很兴奋,他看着先前初始化好的所有词嵌入,即每个词对应一个n维向量,有了继续做下去的动力。把维度数确定为某个具体的数值,比如100维,200维,是基于鞋匠对现实的深入研究与理解。为此,鞋匠找了语言学领域以及各相关学科(计算机、数学、信息学、概率论、物理学等)最有权威的专家一起,研究某种语言有哪些特征,如何提取这些特征,如何表征这些特征等等,这些都是选择维度数的依据。那么经过这些努力确定的维度就一定是正确的吗?鞋匠倔强的认为没有人可以做出确定的评价,并确定一个最佳的特征维度数量,但鞋匠确定的是应该按照这种方式来解决所面临的现实问题,即量化每一个字词,便于使用计算机进行文本的处理,至少,他认为这种方法值得尝试一下。当然,他深知这个过程中要考虑的东西很多,比如,模型复杂度、数据规模、计算资源的平衡、实验验证效果等等,综合这些结果才可能最终确定一个合适的维度数。
鞋匠认真的整理了所有的词嵌入,形成了一张词汇表。词汇表的大小对应现实世界里字词的多少。这里使用先前的假设,假设现实世界有10000个字词,那么词汇表就会有10000个词嵌入(后面章节会拓展为token),再假设每个词嵌入有100个维度(现实中各大模型实际使用的维度一般是2的次方来表示的,比如512维,768维等),那么就得到了100万个待确定的数值(10000 × 100 = 1,000,000),即每个词嵌入的每个待确定的维度值个数加起来有100万个,就是说有100万个变化的量待确定。注意,这里的100万个变化量和通常意义的人工神经网络参数的意义是不同的,但对人工神经网络参数的优化算法是可以通用到这里每个变化量的优化的。看到100万个量待确定,鞋匠惊叹于这一计算量之庞大,但这也仅仅是词嵌入的计算。所以有些AI大佬指出未来算力的争夺将会愈演愈烈,鞋匠觉得就不足为奇了。
终于,鞋匠开始了第一轮的调整。首先需要选择一段文本。文本的选定可以是一部小说,一篇化学论文,一个物理学定律的教学,一份新闻稿,一篇小学作文,一段程序代码,等等。内容越丰富,后面得到的词嵌入就越准确。在这段文本中,选出一定长度的文本,这个长度称之为上下文窗口大小。鞋匠用这个窗口从文本的开始,依次框出很多很多的文本段落来。他把所框出来的文本段的中间一个字词确定为目标词,然后把所有字词作为训练生成词嵌入的AI模型的输入。每个字词都是以当前其对应的词嵌入来表示的。这些词嵌入被整体输入到AI模型,并按照一定的算法计算得出一个能代表当前输入的所有词嵌入的上下文向量,并以此为基础,计算出在当前的情况下(即当前上下文窗口所框出的段落里)词汇表内所有词作为目标词的可能性,即可用作目标词的概率。鞋匠知道正确的目标词是他刚刚选定的那个词。所以他把AI模型的预测输出和这个正确的目标词进行对比,如果这个词出现的概率小于1,那就是预测有误差,他希望这个概率值越接近1越好。对于词汇表中真正的目标词所对应的预测概率,要向着1的方向调整,对于在词汇表里的其它非目标词的预测概率,向着0的方向调整。误差越大,调整的量就越大。误差是根据预测概率与实际期望的概率对比计算出来的。具体的对比方法以函数的形式表示出来就是前面人工神经网络的调整过程中提到的损失函数L。在实际的调整过程中,实际调整的数值就是每个词嵌入向量里每个维度的值。就像上面讲的,调整张三和甲的朋友关系值,可能会影响到张三与乙的朋友关系值。在这里,鞋匠遇到了类似的问题。针对这段文本的调整,可能会影响到另外一段文本目标词的预测。所以只能动态的、慢慢的、一轮一轮的进行调整,直到对所有文本的绝大多数的预测都令其满意为止。
鞋匠把上面用于优化词嵌入的模型称之为Word2Vec词嵌入的CBOW模型(Continuous Bag of Words)。词嵌入的生成不仅仅是上面讲的这一种方法,但大家的思路都是一致的。整个词汇表里所有词嵌入的生成过程,可以看作是将每个词慢慢嵌入到词嵌入空间的过程。嵌入位置向词嵌入空间每个维度的投射量就是这个词在该维度上的数值,这些数值放到一起就形成了一个n维的向量,这个向量就是该词的词嵌入。有了这样的表示,每个词在词嵌入空间的位置都清清楚楚。词与词之间的各类关系变得可以量化计算。鞋匠的脑海里浮现出一幅词嵌入之间关系的生动展现,同一类别的字词,比如同一词性的字词,同一情感的字词等,它们都以在词嵌入空间的位置关系的形式可视化的展现了出来。他很是兴奋!不过,鞋匠还有个未解之谜。还记得一开始他请语言学家和各相关学科的专家确定的具体维度以及维度数量吗?在词嵌入空间中最终形成的维度就一定是原来专家们所设想的或者说原来专家们所期望的维度吗?举个例子,最后形成了(维度1,维度2,维度3,…,维度n)n维的词嵌入空间。那么一开始专家们设想的维度1代表词性,维度2代表情感,维度3代表朋友关系等等,现在有了最终的一个词嵌入空间,并在空间中恰到好处的嵌入了整张词汇表,这个最终的词嵌入空间的维度就真的是维度1代表词性,维度2代表情感,维度3代表朋友关系吗?鞋匠深深地觉得不是这样的。专家按照现实的意义给AI模型定了一个必须遵守的法则,但训练结果只能是现实情况被这个法则具象化的表示出来了,它并不一定按照专家们所设想的那样反映现实。所以鞋匠觉得在现有的知识范围内,无法精确确定每个维度所代表的意义,某个维度可能是代表词性,也可能代表词性与情感的组合,还可能是词性、情感等专家所划分的维度都被不同程度的分解到了当前词嵌入空间的各个维度上。鞋匠感叹到,这也是为什么AI模型的可解释性不好确定的原因之一吧。
词嵌入的生成
词汇表与概率分布
那么每个词的词嵌入的每一个维度的分量是具体怎么计算出来的呢?
鞋匠打算用以下的假设来研究CBOW的计算过程:
- 词汇表的大小:10000
- 词嵌入的维度:256
- 上下文窗口的大小:11
首先鞋匠初始化了词汇表里