结构守恒
AI泛化的本质是学到了范畴之间的结构保持映射,跟进化用同一套Hox基因造出苍蝇和人类的眼睛是同一件事。
链上漂流 的文章由 AI 写作引擎 Prose Kit 生成。
2013年,Mikolov做了那个著名的实验。king减man加woman,最近邻是queen。这个结果被讲了十年,讲成了一个关于向量加减法的故事。
很少有人注意到一个细节:在原始论文中,如果不排除输入词本身,king减man加woman的最近邻是king。queen排第二。这意味着那个”完美类比”远没有看起来那么干净。向量加减法只是表象。模型学到的东西比加减法深得多。
它学到了一个函子(functor)。
这个词来自范畴论(category theory),数学中最抽象的分支之一。函子的定义极简:它是两个范畴之间的映射,在映射的过程中保持结构不变。什么叫”保持结构不变”?如果范畴A里有一条从对象X到对象Y的箭头(态射,morphism),那么函子F把X映射到F(X)、Y映射到F(Y)之后,A里那条箭头在范畴B里必须有一条对应的箭头,从F(X)指向F(Y)。箭头的存在性和方向都被保留了。组合关系也被保留了:如果A里X到Y再到Z可以组合成X到Z,那么B里F(X)到F(Y)再到F(Z)也必须能组合成F(X)到F(Z)。
这就是”保结构映射”的精确含义。
king减man加woman等于queen这件事,翻译成范畴论的语言,是这样的:存在一个”性别”范畴(包含男性、女性及其之间的关系)和一个”王权”范畴(包含国王、女王及其之间的关系)。模型学到了一个函子,把性别范畴中的关系映射到王权范畴中,同时保持了关系的结构。”男性到女性”这条箭头,被映射成了”国王到女王”这条箭头。
当你这样理解的时候,一个关键的推论浮出水面:模型在泛化的时候,做的事情跟向量加减法毫无关系。它在做的事情是:识别两个看似无关的领域之间的结构同构,然后沿着这个同构做推断。
这件事在进化生物学中有一个惊人的对应物。
1994年,瑞士巴塞尔大学的Walter Gehring实验室做了一个实验。他们把果蝇的eyeless基因(Pax6的同源基因)错误表达在果蝇的腿部组织中。结果腿上长出了眼睛。完整的、有角膜有光感受器的复眼。
这已经够震撼了。更震撼的是下一步:他们把小鼠的Pax6基因(跟果蝇eyeless基因分离了超过5亿年的同源基因)转入果蝇。小鼠的基因在果蝇体内诱导出了果蝇的眼睛。不是小鼠的眼睛。是果蝇的复眼。
昆虫复眼和哺乳动物相机式眼睛在形态上完全不同。一个是数千个六边形小眼的阵列,一个是带晶状体和视网膜的单腔室结构。进化生物学家曾经认为这两种眼睛是独立进化的,是趋同进化(convergent evolution)的经典案例。
Pax6实验粉碎了这个理解。它证明了一件事:虽然最终的形态截然不同,但驱动眼睛发育的基因调控网络(gene regulatory network, GRN)在5亿年里被保存了下来。昆虫和哺乳动物用的是同一套上游指令集,只是下游的执行模块不同。
进化发育生物学(evo-devo)给这个现象起了一个名字:深同源性(deep homology)。它的意思是,表面看完全不同的结构,底层共享同一套调控逻辑。
现在把这件事翻译成范畴论的语言。
Pax6基因网络就是一个函子。它把”发育指令”这个范畴(包含”启动”、”分化”、”定位”等态射)映射到”形态结构”这个范畴(包含”角膜”、”感光细胞”、”神经连接”等对象)。这个函子在昆虫和哺乳动物身上是同一个。输入端(发育指令范畴)基本相同,输出端(形态范畴)不同,但映射关系的结构被保持了。
这跟AI学到king-queen映射是同一件事。AI学到的函子把”性别”范畴映射到”王权”范畴。Pax6这个生物函子把”发育指令”范畴映射到”眼睛形态”范畴。两者的核心操作完全一致:保结构映射。
理解了函子之后,下一步是理解函子之间的映射。这叫自然变换(natural transformation)。
自然变换是范畴论中最微妙的概念之一。两个函子F和G,都从范畴A映射到范畴B。一个自然变换alpha把F”变形”成G,但变形的方式必须跟A的内部结构兼容。具体说:对于A中任意一条从X到Y的箭头f,下面这个图必须交换(commute)。先用alpha把F(X)变成G(X),再用G(f)映射到G(Y),结果必须跟先用F(f)映射到F(Y)、再用alpha变成G(Y)完全一样。
这听起来很抽象。但它在机器学习中有一个非常具体的对应物:迁移学习(transfer learning)。
假设你有一个在ImageNet上训练好的视觉模型(函子F),和一个你想训练的医学影像模型(函子G)。两个模型都把”输入图像”范畴映射到”特征表示”范畴。迁移学习做的事情是:找到一个从F到G的变换,使得F在ImageNet上学到的结构关系在医学影像领域仍然成立。
这个变换就是自然变换。它的”交换图”条件保证了一件关键的事:变换不会破坏源模型已经学到的结构。如果F学到了”边缘检测”和”纹理识别”之间的某种组合关系,那么经过自然变换之后,G中也存在对应的组合关系,只是具体的特征从自然图像的边缘变成了CT扫描的组织边界。
2019年,Brendan Fong和David Spivak在论文”Backprop as Functor”中用范畴论形式化了这个直觉。他们证明了反向传播算法本身可以被理解为一个函子,从网络架构的范畴映射到学习算法的范畴。这个形式化的好处是:它让你可以用范畴论的工具来推导什么样的迁移学习是”自然的”(在范畴论的技术意义上),什么样的迁移学习会破坏结构。
在实际工程中,迁移学习失败的常见模式是:源域和目标域之间的关系结构差异太大,不存在满足交换图条件的自然变换。比如你把一个英语情感分析模型迁移到中文法律文本分类上,源域中”积极词汇共现”到”正面情感”的箭头,在目标域中没有对应物。这种失败用范畴论的语言说就是:两个范畴之间不存在满足自然性条件的变换。你强行做了迁移,结构就被破坏了,模型表现就崩了。
范畴论中最深刻的定理之一叫米田引理(Yoneda lemma)。它说的是:一个对象完全由它与所有其他对象的关系决定。更精确地说,对于范畴C中的任意对象X,X的”本质”可以被完全捕捉为一个函子Hom(-, X),即”所有其他对象到X的态射的集合”。两个对象如果跟所有其他对象的关系模式完全相同,那它们就是同构的(本质上相同的)。
这个定理在表示学习(representation learning)中有一个精确的对应。
一个词的embedding是什么?它是一个向量。这个向量编码了什么信息?它编码了这个词与词表中所有其他词的关系。word2vec的训练目标就是预测上下文,一个词的向量就是它与所有可能上下文之间的共现模式的压缩表示。
这就是米田引理在做的事。它说一个对象等价于它的”关系档案”。word2vec说一个词等价于它的”上下文档案”。两件事在结构上完全同构。
米田引理的深刻之处在于它给出了一个理论上限。如果你的表示完美地捕捉了一个对象与所有其他对象的关系,那么这个表示就完全决定了这个对象。你不需要知道这个对象”到底是什么”,你只需要知道它跟别的东西怎么互动。
这解释了为什么BERT和GPT这类模型能学到如此丰富的语义表示,即使它们的训练目标看起来很简单(预测下一个词,或预测被遮盖的词)。预测上下文这个任务,本质上就是在逼近米田嵌入(Yoneda embedding):通过学习一个对象与所有其他对象的交互模式来完全刻画这个对象。
它也解释了表示学习的极限在哪里。如果你的训练数据没有覆盖某个对象与足够多其他对象的交互,那这个对象的米田嵌入就是不完整的,它的表示就会有缺陷。低频词的embedding质量差,原因在于这些词的”关系档案”太薄了,米田嵌入信息不足,跟模型大小无关。
这个视角还可以解释为什么few-shot learning在某些情况下能工作。如果一个新概念虽然只出现了几次,但它出现的上下文跟某个已知概念高度相似,那模型可以”借用”已知概念的米田嵌入来近似新概念。这就像你第一次见到”鸸鹋”这个词,它出现在所有你预期”鸵鸟”出现的语境中,你立刻就知道它大概是什么了。你做了一次基于关系模式匹配的推断。
下一个要讲的结构叫幺半范畴(monoidal category)。它跟组合语义(compositional semantics)直接相关,也是理解AI泛化失败的关键。
幺半范畴是一个带张量积(tensor product)运算的范畴。你可以把两个对象”乘”在一起得到一个新对象,这个乘法满足结合律,并且有单位元。
自然语言就是一个幺半范畴。词是对象,词与词的组合(短语、句子)是张量积运算,空字符串是单位元。语法规则定义了哪些组合是合法的。语义解释是一个从语法范畴到意义范畴的函子,它把语法组合映射成语义组合。”红色”和”球”各自有意义,”红色的球”的意义是两个意义的某种组合。这个组合方式必须是系统性的(systematic):如果你理解了”红色的球”和”蓝色的车”,你就应该能理解”蓝色的球”和”红色的车”,即使你从没见过这两个短语。
Bob Coecke和他在牛津的团队在2010年代发展了DisCoCat框架(Distributional Compositional Categorical),用幺半范畴把分布式语义(每个词一个向量)和组合语义(句子的意义由词义加语法结构决定)统一了起来。在这个框架中,词是向量空间中的点(对象),语法关系是张量积运算(态射),句子的意义是一系列张量运算的结果。
这个框架精确地预测了AI在什么时候会泛化失败。
当AI遇到的组合结构超出了它学到的幺半范畴的运算规则时,它就会失败。举一个具体的例子:否定。”这家餐厅的食物好”和”这家餐厅的食物不好”在词袋模型(bag of words)里几乎一样,因为词袋模型没有组合结构,它的范畴是交换幺半群(commutative monoid),词序无关。早期的情感分析模型在否定句上表现极差,根源就在这里:它们的范畴论结构太弱了,不支持否定这种非交换运算。
Transformer改善了这个问题,因为注意力机制(attention mechanism)引入了位置信息和词间依赖关系,相当于给范畴增加了更丰富的态射结构。但Transformer仍然在某些组合性任务上挣扎。比如多重嵌套的逻辑推理:”如果A不知道B知道C不在场,那么A会不会通知D”。这种句子的组合深度超出了模型隐式学到的幺半范畴的递归处理能力。
在范畴论的视角下,这种失败的诊断变得清晰:模型学到的函子在浅层组合上是忠实的(faithful),在深层组合上开始丢失结构。”忠实”是一个技术术语,意思是函子在态射层面是单射的(不同的箭头映射到不同的箭头)。当组合深度超过某个阈值,函子不再忠实,不同的语法结构被映射到相同的语义表示,区分度消失,模型就”分不清”了。
现在让我从一个完全不同的方向来照亮同一个结构。拓扑学。
持久同调(persistent homology)是拓扑数据分析(TDA)的核心工具。它做的事情是:在不同的尺度下观察数据的”形状”,记录哪些拓扑特征(连通分量、环、空腔)在什么尺度下出现,在什么尺度下消失。一个特征如果跨越了很大的尺度范围才消失,它就是”持久的”,代表数据的真实结构。一个特征如果刚出现就消失,它就是噪声。
2024年发表的一项研究将持久同调应用于神经网络损失函数的地形分析(loss landscape)。研究者发现了一个反直觉的结论:损失函数地形中的鞍点(saddle point)数量与模型的泛化能力呈负相关。鞍点越多,地形越崎岖,模型越难泛化。而当他们移除ResNet-20中的残差连接(residual connection)后,鞍点数量急剧增加,地形变得碎裂。
从范畴论的角度看,这件事有一个简洁的解释。残差连接的作用是保持恒等态射(identity morphism)的畅通。在范畴论中,每个对象必须有一条指向自己的恒等箭头。残差连接就是神经网络中的恒等箭头:输入可以不经过任何变换直接传到输出。这保证了函子有一条”什么都不做”的路径可选,不会被迫在每一层都做非线性变换。
没有残差连接的网络,相当于一个缺少恒等态射的”准范畴”。这个结构在数学上是病态的(ill-defined),信息在传播过程中没有”直通路”,每一步都必须被变换,累积的变形会导致梯度消失或爆炸。拓扑上,这表现为损失函数地形中大量鞍点和局部极小的出现。从持久同调的角度看,Betti数(衡量拓扑”洞”的数量)增大了,地形变得千疮百孔。
这就是拓扑和范畴论在神经网络中的交汇点:一个好的网络架构应该对应一个结构完整的范畴(有恒等态射、有组合律),这样它的损失函数地形在拓扑上就是”平滑”的(少鞍点、少局部极小),模型在训练时能沿着测地线走到全局最优解附近。
这给出了一个可以立刻用的架构设计原则:检查你的网络中每一层是否有信息直通的路径。如果某一层没有skip connection也没有residual path,那它就是范畴论意义上的”恒等缺失”,拓扑分析会告诉你这一层附近的损失地形可能特别崎岖。
最后一个类比来自免疫学。它会把前面讲的所有结构串在一起。
你的免疫系统面对一个从未见过的病原体时,做了什么?克隆选择(clonal selection)。B细胞中,碰巧能结合抗原的那几个被选中,大量复制。然后进入体细胞高频突变(somatic hypermutation):在抗体基因的可变区引入随机突变。突变后的B细胞再次接受筛选,结合力更强的存活,更弱的死亡。这个循环反复进行,每一轮都产生结合力更强的抗体。整个过程叫亲和力成熟(affinity maturation)。
这是一个学习算法。输入是抗原(数据),输出是高亲和力抗体(模型),训练过程是突变加选择。
从范畴论的角度看,亲和力成熟是一个在”抗体空间”范畴中寻找最优态射的过程。每个抗体是一个对象,结合力定义了对象之间的态射(从低亲和力到高亲和力)。体细胞高频突变是在范畴中探索邻域,克隆选择是沿着态射方向前进。
关键来了:免疫系统的泛化能力。
你的身体能应对从未见过的病原体。它没有在进化过程中”记住”每一种可能的病毒。它的策略是:维持一个极其多样的初始抗体库(每个人大约有10^11种不同的B细胞受体),保证对于几乎任何形状的抗原,都至少有几个B细胞能弱结合。然后通过亲和力成熟把弱结合变成强结合。
这跟神经网络的泛化策略在范畴论层面完全同构。
预训练是初始抗体库。大规模预训练让模型对几乎任何输入都有一个粗略的表示(弱结合)。微调(fine-tuning)是亲和力成熟。在特定任务的数据上反复训练,把粗略的表示精炼成高度特异的表示(强结合)。
迁移学习的自然变换对应什么?对应免疫系统的交叉反应(cross-reactivity)。一个针对甲流的抗体,可能对乙流也有一定的结合力,因为两种病毒的表面蛋白共享某些结构特征。这种交叉反应就是一个从”甲流抗体函子”到”乙流抗体函子”的自然变换。它保持了结构(结合模式的相对关系不变),但改变了具体的结合对象。
免疫系统在什么时候泛化失败?当新病原体的结构跟已有抗体库中所有受体的形状都不匹配时。这意味着初始范畴中没有任何对象能提供起点,亲和力成熟无从开始。在AI的语言里,这叫分布外(out-of-distribution)样本:训练数据完全没有覆盖的区域,模型的表示空间中没有相关的锚点。
还有一种更隐蔽的失败:自免疫(autoimmunity)。抗体错误地结合了自身组织。翻译成AI术语就是过拟合(overfitting)的一种极端形式:模型学到了训练数据中的噪声模式,把它当成了真实信号,在新数据上产生了有害的错误匹配。免疫系统用中枢耐受(central tolerance)和外周耐受(peripheral tolerance)机制来防止自免疫,本质上是负选择(negative selection):删掉那些对自身抗原有高亲和力的B细胞。机器学习中的正则化(regularization)、dropout、对抗训练,做的是同样的事:惩罚那些对训练数据中的噪声”过度匹配”的参数。
把拓扑、进化发育生物学和免疫学这三个视角叠在一起看,一个统一的图景浮现了。
AI泛化的本质是学到一个函子:一个保结构映射。这个映射把一个已知的关系结构(源范畴)转移到一个新的领域(目标范畴)。Pax6基因是一个生物函子,保持了眼睛发育的调控结构在5亿年的进化中不变。免疫系统的亲和力成熟是一个在抗体范畴中搜索最优态射的算法。神经网络的残差连接保证了范畴论中恒等态射的存在,让损失函数的拓扑变得可通行。
米田引理告诉你表示学习的天花板在哪里:一个对象的表示最多能完美到”等价于它与所有其他对象的关系总和”,不可能更多了。自然变换告诉你迁移学习什么时候能成功:当源域和目标域之间存在保结构的函子间映射时。幺半范畴告诉你组合语义什么时候会崩溃:当输入的组合深度超过了模型隐式学到的张量积运算的递归上限时。
三个可以带走的操作要点。
第一个:当你评估一个预训练模型在新任务上的迁移学习潜力时,不要只看源域和目标域的表面相似度。看它们的关系结构是否兼容。一个在代码上训练的模型迁移到数学证明上可能比迁移到诗歌写作上更成功,因为代码和数学证明共享”前提-推导-结论”的态射结构,而诗歌的结构完全不同。判断标准是:源域中的”箭头”(关系、转换、依赖)在目标域中有没有对应物。如果有,迁移大概率成功。如果没有,放弃迁移,从头训练。
第二个:如果你在设计网络架构,从范畴论的角度检查你的设计是否有完整的恒等态射(skip connection / residual path)和良定义的组合律(信息在层间传递的一致性)。每一个缺失恒等路径的层都是潜在的拓扑故障点。持久同调工具(比如Giotto-TDA这个Python库)可以直接用来分析你的损失函数地形,看看有没有异常多的鞍点或局部极小。如果有,首先检查的就是这些层。
第三个:用米田引理的思路来诊断你的模型为什么在某些样本上表现差。找出那些低质量预测对应的输入,检查这些输入在训练集中”关系档案”的丰富程度。一个词、一个实体、一个类别,如果它在训练数据中只跟极少数其他对象共现过,它的米田嵌入就是稀疏的,表示质量必然差。解决方案在于增加这些稀疏对象的关系覆盖,而非增大模型:找更多包含它们的上下文数据,或者用数据增强(data augmentation)人工制造新的关系。
范畴论被数学家戏称为”一般性的废话”(general abstract nonsense),因为它研究的是所有数学结构共有的骨架,抽象到了几乎没有实质内容的程度。
但这恰恰是它解释AI泛化的理由。
泛化本身就是一种”一般性”的操作。它的核心问题是:什么东西在从A到B的转移中保留了下来。范畴论精确地回答了这个问题:保留下来的是态射的结构。一个好的函子保留所有箭头和它们的组合关系。一个坏的函子丢失箭头、打乱组合、把不同的结构混为一谈。
进化用了5亿年来验证这件事。Pax6是一个好函子,所以它在苍蝇和人类之间保留了眼睛发育的调控结构。Hox基因簇是一个好函子,所以它在蠕虫和脊椎动物之间保留了体节(segment)的排布逻辑。免疫系统的亲和力成熟是一个在线学习算法(online learning algorithm),它在抗体范畴中搜索好函子的速度决定了你能不能在病原体杀死你之前产生有效的防御。
当你下次看到一个AI模型在新任务上表现得出乎意料地好,或者出乎意料地差,试着问一个范畴论的问题:它学到的函子保持了哪些结构,丢失了哪些结构。
这个问题的答案,往往比任何性能指标都更接近真相。