
机器如何能学习像“国王”(king)这样一个词的意义——不仅仅是作为一串字母,而是作为一个与“王后”(queen)和“王室”(royalty)相关但又与“卷心菜”(cabbage)截然不同的概念?这个问题是现代人工智能的核心,其答案在于分布式假设:一个词的意义由其相伴的词所定义。Skip-gram 模型是一个强大的计算框架,它将这一原则付诸实践,将海量文本转化为一种几何化的意义地图。本文旨在探讨如何将这一优雅的语言学理论转化为实用且可扩展的算法。我们将首先探索 Skip-gram 的核心原理和机制,从它如何处理文本、通过梯度下降进行学习,到负采样的计算魔法。随后,在应用部分,我们将看到这个革命性的思想如何超越语言,为生物信息学和网络科学等不同领域的问题提供一个统一的视角。
现代语言理解的核心是一个优美简洁却又意涵深远的想法,最早由语言学家 J. R. Firth 提出:“观其伴而知其义。” 这就是分布式假设,它表明意义相似的词倾向于出现在相似的上下文中。如果我告诉你,我看到一只毛茸茸的、四条腿的 ____ 在追一个球,你大概能猜到哪些词可以填入这个空格——dog (狗)、puppy (小狗),甚至可能是 cat (猫)——但几乎不可能是 sandwich (三明治) 或 galaxy (星系)。词的意义并非内在于词本身,而在于它与其他所有词构成的关系网络中。
Skip-gram 模型是这一原则的绝妙计算体现。它将这个哲学思想重构成一个简单的游戏:“给定一个词,你能预测它的邻居吗?”如果我们能构建一台擅长这个游戏的机器,那么这台机器必然已经学到了关于词义的深层知识。
在学习任何东西之前,我们需要处理数据。想象一下,一篇浩瀚的文本,比如整个维基百科,就像一条由词语(或称词元 (token))组成的巨大连续长带。Skip-gram 过程的第一步,就是将这条长带转化为适用于我们游戏的结构化数据集。我们通过在文本上滑动一个“窗口”来实现这一点。
让我们具体说明。假设我们的文本是一个包含 1200 个词元的数组。我们选择一个中心词,比如说,文本中的第 110 个词。然后,我们围绕它定义一个上下文窗口,比如包括其左边的 9 个词和右边的 9 个词。这些窗口内的词就是它的“伴侣”。对于这一个实例,我们游戏的目标就是根据中心词预测这 18 个上下文词。然后,我们将窗口向右滑动一步,选择第 111 个词作为新的中心词,并重复此过程。
这种机械的滑动操作会生成一个庞大的 (中心词, 上下文词) 词对列表。对于像“cat”这样的中心词,我们可能会生成 (cat, the)、(cat, sat)、(cat, on) 和 (cat, mat) 这样的词对。正如一个简化的模型过程 所探讨的,通过系统地定义我们如何选择中心词(例如,每隔 20 个词)和上下文词(例如,仅选择与中心词距离为奇数位置的词),我们可以精确地量化生成的训练样本数量。这个数据生成步骤虽然简单,却是构建一切的基础。它将非结构化文本转化为了学习的原始材料。
现在的游戏规则很清晰了:对于数据集中每一个 (word, context) 词对,我们希望模型能赋予其一个高概率 。这就是 Skip-gram 的精髓。值得注意的是,这是一种设计选择。我们本可以反向进行游戏:“给定一组上下文词,预测中间的词。”这种替代方案被称为连续词袋模型 (Continuous Bag-of-Words, CBOW),或者在更现代的形式中称为掩码语言建模 (Masked Language Modeling),它导向一个不同的目标函数 。正如人们可能预料的那样,提出这两个不同的问题会导致学习到略有不同的关系类型。目前,我们还是坚持 Skip-gram 的问题:一个词与哪些词为伴?
那么,我们如何构建一台能玩这个游戏的机器呢?我们首先为词汇表中的每一个词赋予一个独一无二的向量,即它的嵌入 (embedding)。你可以把这想象成在某个高维“意义空间”中为每个词赋予一个坐标。起初,我们随机地散布这些向量。词“king”(国王)可能与“cabbage”(卷心菜)的距离和它与“queen”(王后)的距离一样近。训练的目标就是移动这些向量,使它们形成一个有意义的几何结构——一张地图,其中“king”靠近“queen”,“Paris”(巴黎)靠近“France”(法国),而这两者都远离“cabbage”。
学习过程是一场由微积分引导的美妙舞蹈,这个过程被称为梯度下降 (gradient descent)。想象一下,词“bank”的嵌入向量在一个二维空间中从原点 开始。现在,模型观察到了一个来自文本的训练样本:(bank, money)。模型的任务是调整“bank”的向量,使“money”在未来成为一个更可能的上下文词。它通过给“bank”向量一个微小的“推动”,使其朝向更接近“money”向量的方向移动。
但如果下一个训练样本是 (bank, river) 呢?这时,模型会再次给“bank”向量一个推动,但这次是朝向使“river”更可能出现的方向。经过数百万个这样的样本,词“bank”的嵌入向量被它出现过的所有上下文拉扯和推动。最终,“bank”向量的位置将是所有这些推动的加权平均。它将停留在一个既合理地靠近空间的“money”(钱)区域,又合理地靠近“river”(河)区域的位置,从而捕捉到它的多种含义,即多义性 (polysemy)。
一个极其清晰的思想实验 完美地阐释了这一点。如果我们设计一个玩具世界,其中一个词义(例如,river bank,河岸)只与 轴相关,而另一个词义(例如,money bank,银行)只与 轴相关,那么梯度——这个告诉我们向量该朝哪个方向推动的数学对象——会完美地分解。一个“river”上下文产生的梯度向量只包含 分量,将嵌入向量水平拉动。一个“money”上下文产生的梯度向量只包含 分量,将其垂直拉动。总梯度是这些单独拉力的总和,将嵌入向量移动到一个反映其不同用法频率和性质的位置。学习就是上下文之间的一场物理“拔河比赛”。
我们甚至可以用物理类比来形式化这个过程。学习目标可以被看作一种势能函数。每个正确的 (word, context) 词对都会产生一种引力,就像一根弹簧将它们的嵌入向量拉到一起。训练的目标就是将嵌入向量移动到一个低能量配置,一个稳定状态,在这个状态下,一同出现的词在意义空间中紧密地依偎在一起。
到目前为止的图景虽然优雅,但存在一个令人望而生畏的计算难题。为了计算概率 ,我们需要使用一个名为 softmax 的函数。
问题出在分母上。为了计算它,我们必须对词汇表中的每一个词进行求和——这可能涉及数百万个词——而且是针对每一个训练样本!这在计算上是不可行的。
这时,一个名为负采样 (Negative Sampling) 的天才创举应运而生。我们不再执行从数百万个选项中预测正确上下文词的复杂任务,而是把游戏变得简单得多:“这里有两个词。你能告诉我它们是文本中真实的上下文词对,还是我刚编造的假词对吗?”
对于文本中每个真实的 (word, context) 词对(一个“正”样本),我们生成几个假的词对,比如 (word, cabbage) 或 (word, tectonic)(“负”样本),方法是从词汇表中随机挑选词语。模型的新任务是学会为正样本对输出高分,为负样本对输出低分。
这重构了我们的物理类比。正样本对仍然产生引力,将嵌入向量拉到一起。但现在,负样本产生了斥力,将词的嵌入向量推离那些随机、不相关的词的嵌入向量。学习过程变成了一场引力与斥力的美妙平衡,以更高的效率雕塑着嵌入空间。
乍一看,负采样似乎是一个聪明但有点缺乏原则的计算技巧。但故事在这里发生了转折,揭示了一个惊人而优雅的真相。事实证明,这个简化的“真假辨别”游戏根本不是一个取巧的办法。正如 Levy 和 Goldberg 的里程碑式工作所示,并在 中详细探讨的,带有负采样的 Skip-gram (SGNS) 目标函数会隐式地使学到的嵌入向量具有一个非常特殊的性质:它们的点积 近似于这两个词之间的点互信息 (PMI),再加上一个常数偏移。
PMI 是一个源于信息论的概念。它衡量两个词共同出现的频率比它们在统计上独立的情况下预期的要高多少。高 PMI 意味着一种强烈的、有意义的关联。因此,SGNS 不仅仅是在学习哪些词会共现;它是在学习近似一种强大的统计关联度量。
更重要的是,负采样的参数直接控制着学习的内容。负样本的数量 ,以及选择负样本的噪声分布(通常是提升到 次方的 unigram 分布),系统性地改变了 PMI 方程中的偏移量。这意味着这些不仅仅是随意的超参数;它们是让我们能够微调模型所学习的语义空间本质的杠杆。
事实上,选择负样本是一门艺术。选择像“and”或“the”这样完全随机的词作为负样本,提供的信息量并不大。模型可以轻易学会区分 (cat, sat) 和 (cat, the)。信息量最丰富的负样本是“难负例”——那些貌似合理但实际不正确的词。对于短语“the cat sat on the ___”,词“rug”(小地毯)比“galaxy”(星系)是一个更难(因此也更有教育意义)的负例。
我们可以设计精巧的采样器来精确地教模型我们想让它学的东西。一种方法是倾向于选择那些在语义上已经与目标词很接近的负样本,因为这迫使模型学习更细微的差别。另一种创造性的方法是构建一个能够平衡不同类型相似性的采样器。我们可以混合语义距离(基于嵌入相似度)和句法距离(基于拼写,如 Levenshtein 距离)。通过调整参数 ,我们可以告诉模型在多大程度上关注拼写与意义,引导它学习对两者都敏感的表示。
分布式假设以及由此衍生的 Skip-gram 模型,是人工智能领域最成功的思想之一。然而,它有一个根本的局限性。它从文本中学习,且仅从文本中学习。当文本不完整、有偏见或充满隐喻时,会发生什么?
思考一个引人入胜的思想实验。想象我们创建一个特殊的语料库,其中“lion”(狮子)这个词只出现在比喻性的语境中,比如“Richard the Lionheart”(狮心王理查)或“he fought like a lion”(他像狮子一样战斗)。一个用这个文本训练的模型会学到,狮子与勇敢、国王和战斗相关联。它无从知晓狮子也是一种生活在非洲的大型食肉猫科动物。这种意义是未接地的,与物理世界脱节。
这就是所谓的接地问题 (grounding problem)。解决方案在于认识到语言并非一个自给自足的系统。要真正理解意义,我们必须将词语与它们所描述的世界联系起来。表示学习的下一个前沿是构建多模态模型 (multimodal models),这些模型不仅从文本中学习,还从图像、声音和像百科全书这样的结构化知识库中学习。通过训练一个模型,将“lion”这个词与其文本上下文以及狮子的图片关联起来,我们可以将其意义根植于一个更丰富、更稳健的现实中。这场始于预测一个词的伴侣的简单游戏的旅程,最终将我们引向统一语言与所有其他形式人类知识的宏大挑战。
现在我们已经拆解了 Skip-gram 模型精巧的内部构造,看到了它如何仅仅通过观察词语的邻居就学会在一种“意义空间”中定位这些词语,你可能会倾向于认为这只是一个处理语言的巧妙技巧。但这就像看到牛顿万有引力定律后,认为它只是解释苹果下落的一个聪明方法一样。一个深刻科学原理的真正美妙之处不在于其最初的应用,而在于其普适性。Skip-gram 核心的思想——一个实体的特性由其“伴侣”所决定——就是这样一个原则。它是一把钥匙,能打开那些乍一看与语言毫无关联的领域的大门。在本章中,我们将踏上一段旅程,看看这个简单的想法如何帮助我们解码基因的语言,驾驭错综复杂的社交网络,甚至理解隐藏在产品评论中的情感。让我们开始吧。
我们的第一站是该模型的故乡:人类语言。在像 Skip-gram 这样的方法出现之前,计算机可能会认为“cat”(猫)和“feline”(猫科动物)这两个词之间的差异,与“cat”(猫)和“rocket”(火箭)之间的差异一样大。它们只是字典里任意的符号。Skip-gram 通过为每个词赋予高维空间中的坐标来改变这一点。由于意义相近的词在数百万个句子中出现在相似的上下文中,它们最终会彼此靠近。这就创造了一种意义的几何学,其中方向和距离可以捕捉语义关系。
但是,这种几何学能有方向吗?想象一条从“terrible”(糟糕的)延伸到“wonderful”(极好的)的轴。事实证明,通过在海量文本上进行训练,Skip-gram 模型能够在没有被明确告知的情况下,自然地发现这样的轴。与积极情绪相关的词聚集在空间的一个区域,而与消极情绪相关的词则聚集在另一个区域。这使我们能够构建强大的情感分类器。即使只有少数标记为“好”和“坏”的评论样本来校准我们的“指南针”,我们也可以利用从庞大未标记语料库中学到的丰富地图,来准确地衡量新的、未见过文本的情感。这是因为情感的底层结构已经蕴含在嵌入的几何结构中,等待着被利用。这种强大的半监督方法,利用海量文本来从少量标签中学习,是自然语言处理领域的一场悄然革命。
现在让我们来一次巨大的飞跃。如果我们把生命之书当作任何其他文本来对待会怎样?毕竟,一个蛋白质只是一段长序列——一个由 20 种标准氨基酸组成的字母表写成的“句子”。我们能否通过观察氨基酸在这些蛋白质序列中的邻居来学习它的“意义”?
生物学家们正是这样做的。通过将庞大的已知蛋白质序列数据库输入 Skip-gram 模型,他们可以为 20 种氨基酸中的每一种学习一个密集的向量嵌入。由此产生的“生物化学空间”非同寻常。具有相似物理或化学性质的氨基酸——例如,那些疏水的或带有正电荷的——会自然地聚集在一起。这并不是因为我们告诉了模型任何关于化学的知识,而是因为这些性质影响了它们在一个折叠的功能性蛋白质中可能与哪些其他氨基酸相邻。模型纯粹从共现统计中重新发现了基本的生物化学原理。
我们可以更进一步,从字母(氨基酸)到基因组本身的“单词”:DNA。这里的单词是短的、重叠的核苷酸串,称为 -mers(例如 GA[TTA](/sciencepedia/feynman/keyword/test_time_augmentation)CA)。通过将 Skip-gram 模型应用于基因组数据,我们可以学习这些 -mers 的嵌入。但在这里,我们必须更加巧妙,因为 DNA 具有语言所不具备的美丽对称性。它是一个双螺旋结构。一条链上的序列意味着另一条链上存在一个“反向互补”序列(A 与 T 配对,C 与 G 配对,且顺序相反)。对于许多生物功能来说,这两个序列在信息上是等价的。
我们可以把这一基本的生物学知识教给我们的模型!通过在训练期间强制一个 -mer 的嵌入与其反向互补序列的嵌入相同,我们将这种对称性直接构建到我们的模型中。这是一个根据领域物理特性来定制算法的绝佳范例。由此产生的嵌入更加稳健,可用于艰巨的任务,例如从混乱的 DNA 碎片混合物中识别土壤样本中的细菌种类(宏基因组学),或寻找赋予抗生素抗性的基因。
到目前为止,我们的“上下文”一直是由线性序列定义的。但对于那些并非排列在一条整齐直线上的事物,比如社交网络或相互作用的蛋白质网络,情况又如何呢?在这里,上下文的概念变得更加通用和强大。
想象一下在网络中进行一次随机游走,像一个人浏览网页或一个信号在神经元之间传递一样,从一个节点跳到另一个节点。你访问的节点序列构成了一种“句子”。如果我们从一个图中生成数百万个这样的随机游走句子,并将它们输入 Skip-gram 算法,我们就可以为网络中的每一个节点学习一个嵌入。这就是 DeepWalk 和 Node2Vec 等有影响力方法背后的优雅思想。
这些嵌入告诉我们什么?在网络中扮演相似“角色”的节点——例如,两个不同的人都是连接多个社区的枢纽,或者两种蛋白质都对某个特定的细胞过程至关重要——往往会出现在相似的随机游走中。因此,它们最终会得到相似的嵌入。然后,我们可以测量它们嵌入向量的相似度(例如,通过计算它们之间夹角的余弦值)来发现这些结构等价性。
这具有深远的应用。在蛋白质-蛋白质相互作用网络中,我们可以用已知通路成员的嵌入来训练一个简单的分类器,以寻找具有相似向量的其他蛋白质,从而发现该生物机器中新的、以前未知的组成部分。在社交网络中,我们可以识别社群或预测友谊。在推荐引擎中,这个原理可以用来在同一空间中表示用户和物品,使我们能够根据在这个学习到的“品味空间”中的邻近度向用户推荐电影或产品。
从语言的细微之处到细胞的精密机制,再到社会的宏大结构,Skip-gram 原理为我们提供了一个统一的视角。它告诉我们,要理解一个事物,就必须观察它的周围环境。通过将这个简单、近乎哲学的思想转化为具体的计算算法,我们创造了一个功能惊人多样的工具。它揭示了看似不相关的领域之间的深层联系,一个诞生于词语研究的方法,竟能阐明基因的功能和网络的结构。这正是一个真正伟大思想的标志——它不仅解决一个问题,它改变了我们看待世界的方式。