#第一性解释

可解释性终极追问,什么才是第一性解释?20篇CCF-A+ICLR论文给你答案

本文作者为张俊鹏、任启涵、张拳石,其中张俊鹏是张拳石老师的准入学博士生,任启涵是张拳石老师的博士生。

本文首先简单回顾了『等效交互可解释性理论体系』(20 篇 CCF-A 及 ICLR 论文),并在此基础上,严格推导并预测出神经网络在训练过程中其概念表征及其泛化性的动力学变化,即在某种程度上,我们可以解释在训练过程中神经网络在任意时间点的泛化性及其内在根因。

一、前言

长期以来,我们团队一直在思考可解释性领域的一个终极问题,即什么才是解释性领域的第一性原理?所谓第一性原理,目前没有一个被广泛接受的框架,世上本无路,我们需要逐渐去定义这样一个路。我们需要在一个新的理论体系中,提出大量的公理性要求,得出一个可以从不同的角度全方位精确严谨解释神经网络内在机理的理论。一套理论系统能严谨解释神经网络的方方面面才叫 “第一性原理”

如果你真的在严谨地做 “科学”,那么第一性原理一定不是想象中简单,而是一个复杂的体系,需要研究照顾到深度学习中方方面面纷繁复杂的现象。当然,如果你主观上不愿意或者不信一个理论需要足够严谨,那么研究会变得简单千万倍。就像物理学的标准模型一定比牛顿定律复杂,取决于你希望走哪条路。

沿着这个方向,我们团队独立从头构建了『等效交互可解释性理论体系』,并基于此理论,从三个角度来解释神经网络的内在机理。

1. 语义解释的理论基础:数学证明神经网络的决策逻辑是否可以被少量符号化逻辑所充分覆盖(充分解释)。『证明神经网络的决策逻辑是否可以被有限符号化逻辑解释清楚』这一命题是解释神经网络的根本命题。如果此命题被证伪,则从根本上讲,神经网络的可解释性将是无望的,所有的解释性算法只能提供近似的解读,而无法精确地覆盖所有的决策逻辑。幸运的是,我们找到了在大部分应用中神经网络都可以满足的面向遮挡鲁棒性的三个常见的条件,并且数学证明了满足这三个条件的神经网络的决策逻辑可以被写成符号化的交互概念。

参见 https://zhuanlan.zhihu.com/p/693747946

2. 寻找性能指标背后的可证明、可验证的根因:将神经网络泛化性和鲁棒性等终极性能指标的根因拆分具体少数细节逻辑。对神经网络性能(鲁棒性、泛化性)的解释是神经网络可解释性领域的另一个重大问题。然而,目前人们普遍认为神经网络性能是对神经网络整体的描述,而神经网络无法像人类一样将自己的分类判断拆解成具象化的、少量的决策逻辑。在这方面,我们给出了不一样的观点 —— 将性能指标与具象化的交互之间建立起数学关系。我们证明了 1. 等效交互的复杂度可以直接决定神经网络的对抗鲁棒性 / 迁移性,2. 交互的复杂度决定了神经网络的表征能力,3. 并解释神经网络的泛化能力 [1],和 4. 解释神经网络的表征瓶颈。


  • 参见1:https://zhuanlan.zhihu.com/p/369883667
  • 参见2:https://zhuanlan.zhihu.com/p/361686461
  • 参见3:https://zhuanlan.zhihu.com/p/704760363
  • 参见4:https://zhuanlan.zhihu.com/p/468569001

3. 统一工程性深度学习算法。由于缺少基础理论的支撑,目前深度学习算法大都是经验性的、工程性的。可解释性领域的第一性原理应该可以承担起将前人的大量工程性经验总结为科学规律的任务。在等效交互可解释性理论体系下,我们团队既证明了 14 种不同的输入重要性归因算法的计算本质在数学上都可以统一写成对交互作用的再分配形式。此外,我们还统一了 12 种提升对抗迁移性的算法,证明了所有提升对抗迁移性算法的一个公共机理是降低对抗扰动之间的交互效用,实现了对神经网络可解释性方向大部分工程性算法的理论凝练。

  • 参见1:https://zhuanlan.zhihu.com/p/610774894
  • 参见2:https://zhuanlan.zhihu.com/p/546433296

在等效交互可解释性理论体系下,我们的团队在之前的研究中已经成功发表了 20 篇 CCF-A 类和机器学习顶级会议 ICLR 论文,我们已经从理论和实验上充分解答了上述问题。

二、本文研究概述

沿着上述理论框架,在这篇知乎文章中,我们希望精确解释出神经网络训练过程中泛化性的变化规律,具体地涉及两篇论文。

  • 1.Junpeng Zhang, Qing Li, Liang Lin, Quanshi Zhang,“Two-Phase Dynamics of Interactions Explains the Starting Point of a DNN Learning Over-Fitted Features”,in arXiv: 2405.10262
  • 2.Qihan Ren, Yang Xu, Junpeng Zhang, Yue Xin, Dongrui Liu, Quanshi Zhang,“Towards the Dynamics of a DNN Learning Symbolic Interactions” in arXiv:2407.19198

图 1:两阶段现象的示意图。在第一阶段,神经网络逐渐消除中高阶交互,学习低阶交互;在第二阶段,神经网络逐渐建模阶数不断增大的交互。当神经网络训练过程中测试损失和训练损失之间的 loss gap 开始增大时,神经网络恰好也进入训练的第二阶段。

我们希望在等效交互框架里提出新的理论,精确预测出神经网络每一个时间点上神经网络所学到的交互概念的数量、复杂度,以及泛化性变化的动力学规律(如图 1 所示)。具体地,我们希望证明出两方面结论。

第一,基于前人的证明(一个神经网络的决策逻辑可以被严格解构表示为几十个交互概念效用的和的形式),进一步严格推导出在整个训练过程中,神经网络所建模的交互效用的变化动力学过程 —— 即理论需精确预测出在不同训练阶段,神经网络所建模的交互概念的分布的变化 —— 推导出哪些交互会在哪个时间点上被学习到

第二,寻找充分的证据,证明所推导的交互复杂度的变化规律客观反映出神经网络在全训练周期中泛化性变化的规律

综上两点,我们希望具体彻底解释清楚神经网络的泛化性变化的内在根因。

与前人的关系:当然大家可能第一反应想到神经正切核(NTK)[2],但是神经正切核只是把参数的变化曲线解了出来,而没办法进一步深入到决策逻辑层面进行解释,没有将神经网络建模的概念表征与其泛化性的关系建立起来,对泛化性的分析依然停留在特征空间分析的层面,而没有在【符号化概念逻辑】与【泛化性】之间建立起严格的关系。

三、两大研究背景

误会 1:神经网络的第一性表征是『等效交互』,而不是神经网络的参数和结构。单纯从结构层面分析神经网络是人们对神经网络泛化根本表征的误解。目前大部分神经网络泛化性研究主要着眼于神经网络的结构、特征、以及数据。人们认为不同的神经网络结构就自然对应不同的函数,并自然展现出不同的性能。

但是,事实上,如图 2 所示,结构的区别只是神经网络表征的表面形式。除去有明显缺陷的对性能有明显影响的神经网络,所有其他可以实现 SOTA 性能的具有不同结构的神经网络往往都建模了相似的等效交互表征,即不同结构的高性能神经网络在等效交互表征上往往都是殊途同归的 [3, 4]。虽然神经网络其中层特征内部是复杂的混乱的,虽然不同神经网络所建模的特征向量大相径庭,虽然神经网络中单个神经元往往建模了相对比较混乱的语义(不是严格清晰的语义),但是神经网络作为一个整体,我们从理论上证明神经网络的所建模的交互关系是稀疏的符号化的(而不是特征的稀疏性,具体见 “四、交互的定义” 章节),而且面向相同任务的完全不同的神经网络往往建模了相似的交互关系。

图 2:不同结构的神经网络所建模的等效交互往往是殊途同归的。对于一个相同的输入句子,面向两个相同任务的两个完全不同的神经网络建模往往相似的交互。

由于不同神经网络的参数和训练样本不一样,两个神经网络中没有任何一个神经元在表征上具有严格的一一对应关系,且每一个神经元往往建模着不同语义的混合模式。相比之下,正如上段分析,神经网络所建模的交互表征实际上是不同神经网络表征中的不变量。因此,我们有理由认为神经网络根本表征是等效交互,而不是其载体(参数和训练样本),符号化交互表征可能代表了知识表征的第一性原理(被交互的稀疏性定理、无限拟合性定理、以及殊途同归现象所保证,见 “四、交互的定义” 章节,具体详细研究见下面知乎文章。

参见:https://zhuanlan.zhihu.com/p/633531725

误会 2:神经网络的泛化性问题是一个混合模型问题,而不是一个高维空间的向量。如图 3 所示,传统的泛化性分析总是假设单个样本整体是高维空间的一个点,实际上神经网络对单个样本的表征是 mixture model 的形式 —— 实际上通过大量不同的交互来表达。我们发现简单交互的泛化能力比复杂交互的泛化能力更强,所以不再适合用一个简单标量来笼统表示整个神经网络在不同样本上的泛化能力。相反,同一个神经网络在不同的样本上建模了不同复杂度的交互关系,而不同复杂度的交互往往对应着不同泛化能力。通常情况下,神经网络建模的高阶(复杂)的交互往往难以泛化到测试样本上(测试样本上不会触发相同的交互),代表过拟合表征,而神经网络建模的低阶(简单)交互往往代表泛化性较强的表征,具体详细研究见 [1]。

图 3:(a)传统的泛化性分析总是假设单个样本整体是高维空间的一个点。(b)实际上神经网络对单个样本的表征是 mixture model 的形式,神经网络在单个样本会建模简单交互(可泛化的交互)和复杂交互(不可泛化的交互)。

四、交互的定义

让我们考虑一个深度神经网络

和一个输入样本

,它包含

个输入变量,我们用集合

表示这些输入变量的全集。令

表示 DNN 在样本

上的一个标量输出。对于一个面向分类任务的神经网络,我们可以从不同角度来定义其标量输出。例如,对于多类别分类问题,

可以定义为

,也可以定义为 softmax 层之前该样本真实标签所对应的标量输出。这里,

表示真实标签的分类概率。这样,针对每个子集

,我们可以用下面公式来定义

中所有输入变量之间 “等效与交互” 和 “等效或交互”。

如图 4(a)所示,我们可以这样理解上述与或交互:我们可以认为与等效交互表示神经网络所编码的

内输入变量之间的 “与关系”。例如,给定一个输入句子

,神经网络可能会在

之间建模一个交互,使得

产生一个推动神经网络输出 “倾盆大雨” 的数值效用。如果

中的任何输入变量被遮挡,则该数值效用将从神经网络的输出中移除。类似地,等效或交互

表示神经网络所建模的内输入变量之间的 “或关系”。例如,给定一个输入句子

,只要

中的任意一个词出现,就会推动神经网络的输出负面情感分类。

神经网络所建模的等效交互满足 “理想概念” 的三条公理性准则,即无限拟合性、稀疏性、样本间迁移性。

  1. 无限拟合性:如图 4,5 所示,对于任意遮挡样本,神经网络在样本上的输出可以用不同交互概念的效用之和来拟合。即,我们可以构造出一个基于交互的 logical model,无论我们如何遮挡输入样本,这个 logical model 依然可精确拟合模型在此输入样本在任意遮挡状态下的输出值。
  2. 稀疏性:面向分类任务的神经网络往往只建模少量的显著交互概念,而大部分交互概念都是数值效用都接近于 0 的噪声。
  3. 样本间迁移性:交互在不同样本间是可迁移的,即神经网络在(同一类别的)不同样本上建模的显著交互概念往往有很大的重合。

图 4:神经网络的复杂的推理逻辑可以被基于少量交互的逻辑模型

准确拟合。每个交互都是衡量神经网络建模特定输入变量集合

之间非线性关系的度量指标。当且仅当集合中变量同时出现时才会触发与交互,并为输出贡献数值分数

,集合中任意变量出现时会触发或交互。

图 5:神经网络在任意的遮挡样本上的输出可以用不同交互概念的效用之和来拟合,即我们可以构造出一个基于交互的 logical model,无论我们如何遮挡输入样本,哪怕穷举个输入单元上种完全不同的遮挡方式,这个 logical model 依然可精确拟合模型在此输入样本在任意遮挡状态下的输出值。

五、新的发现与证明

5.1 发现神经网络在训练过程中交互变化的两阶段现象

在这篇知乎文章中,我们关注神经网络解释性领域的一个根本问题,即如何从一个解析分析的角度去严格预测出神经网络在训练过程中泛化能力的变化情况,并且精确的分析神经网络从欠拟合到过拟合的整个动态变化过程及其背后的根本原因

首先,我们将交互的阶数(复杂度)定义为交互中的输入变量的数量,

。我们团队之前的工作发现神经网络在某个特定样本所建模的 “与或交互” 的复杂度直接决定了神经网络在这个样本的泛化能力 [1],即神经网络建模的高阶的(大量输入单元之间的)“与或交互” 往往有较差的泛化能力,而低阶的(少量输入单元之间的)“与或交互” 具有较强的泛化能力。

因此,本篇研究的第一步是去预测出神经网络在训练过程中不同时间点所建模的不同阶 “与或交互” 的复杂度的一个解析解,即我们可以通过神经网络在不同时间点所建模的不同阶 “与或交互” 的分布去解释神经网络在不同阶段的泛化能力。交互的泛化能力的定义与神经网络整体泛化能力的定义请见 “5.2 神经网络所建模交互的阶数和其泛化能力的关系” 章节。

我们提出两个指标来表示不同阶(复杂度)的交互的强度的分布。具体来说,我们用

来衡量所有阶正显著交互的强度,用

来衡量所有

阶负显著交互的强度,其中

表示显著交互的集合,

表示显著交互的阈值。

图 6:从训练不同轮次的神经网络中提取的不同阶交互强度

。在不同数据集上、不同任务上训练的不同的神经网络的训练过程都存在两阶段现象。前两个选定时间点属于第一阶段,而后两个时间点属于第二阶段。恰恰在进入神经网络训练过程的第二阶段不久,神经网络的测试损失和训练损失之间的 loss gap 开始显著上升(见最后一列)。这表明神经网络训练的两阶段现象与模型 loss gap 的变化在时间上是 “对齐” 的。更多实验结果请参见论文。

如图 6 所示,神经网络的两阶段现象具体表现为:

  • 在神经训练训练之前,初始化的神经网络主要编码中阶交互,很少编码高阶和低阶交互,并且不同阶交互的分布看起来呈现 “纺锤形”。假设具有随机初始化参数的神经网络建模的是纯噪声,我们在 “5.4 理论证明两阶段现象” 章节证明了具有随机初始化参数的神经网络建模的不同阶的交互的分布呈现 “纺锤形”,即仅建模少量的低阶和高阶交互,大量建模中阶交互。
  • 在神经网络训练的第一阶段,神经网络编码的高阶和中阶交互的强度逐渐减弱,而低阶交互的强度逐渐增强。最终,高阶和中阶交互逐渐被消除,神经网络只编码低阶交互。
  • 在神经网络训练的第二阶段,神经网络在训练过程中编码的交互阶数(复杂度)逐渐增加。在逐渐学习更高复杂度的交互的过程中,神经网络过拟合的风险也在逐渐提高。

上述的两阶段现象广泛存在于不同结构的神经网络训练于不同任务上的不同数据集的训练过程中。我们在图像数据集(CIFAR-10 数据集、MNIST 数据集、CUB200-2011 数据集(使用从图片中裁剪出来的鸟类图像)和 Tiny-ImageNet 数据集)上训练了 VGG-11/13/16 和 AlexNet。我们在 SST-2 数据集上训练了用于情感语义分类 Bert-Medium/Tiny 模型,我们在 ShapeNet 数据集中训练 DGCNN 来分类的 3D 点云数据。上图显示了不同的神经网络在不同训练时期提取的不同阶的显著交互的分布。我们在这些神经网络的训练过程中都发现了两阶段现象,更多实验结果及细节请参考论文。

5.2 神经网络所建模交互的阶数和其泛化能力的关系

我们团队之前的工作已经发现了神经网络所建模交互的阶数和其泛化能力的关系,即高阶交互比低阶交互具有更差的泛化能力 [1]。某个具体交互的泛化性有清晰的定义 —— 如果一个交互同时在训练样本和测试样本中频繁的被神经网络所建模,则这个交互具有较好的泛化能力。在本篇知乎文章中,介绍了两个实验来证明高阶交互具有较差的泛化能力,低阶交互具有较强的泛化能力。

实验一:观察在不同数据集上训练的不同神经网络所建模的交互的泛化性。这里我们用被测试集所触发的交互的分布和被训练集所触发的交互的分布的 Jaccard 相似性来度量交互的泛化性。具体来说,给定一个包含

个输入变量的输入样本

,我们将从输入样本提取到的

阶交互向量化

,其中

表示

个阶交互。然后,我们计算分类任务中所有类别为

的样本中提取到的阶的平均交互向量,表示为

,其中

表示类别为的样本的集合。接下来,我们计算从训练样本中提取的阶的平均交互向量

与从测试样本中提取的阶的平均交互向量

之间的 Jaccard 相似性,以衡量分类任务中类别为的样本的阶交互的泛化能力,即:

其中,

将两个

维交互向量投影到两个

维的非负向量上,以便计算 Jaccard 相似性。对于某一阶的交互,如果此阶交互普遍展现出较大的 Jaccard 相似性,则表示这一阶交互具有较强的泛化能力。

我们进行了实验计算不同阶交互

。我们测试了在 MNIST 数据集上训练的 LeNet、在 CIFAR-10 数据集上训练的 VGG-11、在 CUB200-2011 数据集上训练的 VGG-13,以及在 Tiny-ImageNet 数据集上训练的 AlexNet。为了减少计算成本,我们仅计算了前 10 个类别的 Jaccard 相似性的平均值

。如图 7 所示,随着交互阶数的增加,交互的 Jaccard 相似性不断下降。因此,这验证了高阶交互比低阶交互具有更差的泛化能力。

图 7:从训练样本和测试样本中提取的交互之间的 Jaccard 相似性。低阶交互具有相对较高 Jaccard 相似性表明低阶交互具有较强的泛化能力。

实验二:比较神经网络在正常样本和 OOD 样本建模的交互的分布。我们比较了从正常样本中提取的交互与从分布外 (OOD) 样本中提取的交互,以检查神经网络在 OOD 样本上是否建模更多的高阶交互。我们将少量训练样本的分类标签设置为错误标签。这样,数据集中的原始样本可以视为正常样本,而一些带有错误标签的样本则对应于 OOD 样本,这些 OOD 样本可能会导致神经网络的过拟合。我们在 MNIST 数据集和 CIFAR-10 数据集上分别训练了 VGG-11 和 VGG-13。图 8 比较了从正常样本中提取的交互的分布和从 OOD 样本中提取的交互的分布。我们发现,VGG-11 和 VGG-13 在分类 OOD 样本时建模了更多复杂的交互(高阶交互),而在分类正常样本时则使用了较低阶的交互。这验证了高阶交互的泛化能力通常弱于低阶交互。

图 8:比较从正常样本中提取的交互与从分布外 (OOD) 样本中提取的交互。神经网络通常在 OOD 样本上建模的更高阶的交互。

5.3 两阶段现象和神经网络训练过程 loss gap 的变化相对齐

我们发现上述两阶段现象可以充分表示神经网络泛化性动力学。一个很有趣的现象是神经网络训练过程中的两阶段现象和神经网络在测试集和训练集的 loss gap 的变化在时间上是对齐的。训练损失和测试损失之间的 loss gap 是衡量模型过拟合程度的最广泛使用的指标。图 6 显示了不同的神经网络在训练工程的测试损失和训练损失之间的 loss gap 的曲线,还显示了从不同训练时期的神经网络中提取的交互分布。我们发现当神经网络训练过程中测试损失和训练损失之间的 loss gap 开始增大时,神经网络恰好也进入训练的第二阶段。这表明神经网络训练的两阶段现象与模型 loss gap 的变化在时间上是 “对齐” 的。

我们可以这样理解上述现象:在训练过程开始前,初始化的神经网络所建模的交互全部表示随机噪声,并且不同阶交互的分布看起来像 “纺锤形”。在神经网络训练的第一阶段,神经网络逐渐消除中阶和高阶的交互,并学习最简单的(最低阶的)交互。然后,在神经网络训练的第二阶段,神经网络建模了阶数逐渐增大的交互。由于我们在 “5.2 神经网络所建模交互的阶数和其泛化能力的关系” 章节中的两个实验验证了高阶交互通常比低阶交互具有更差的泛化能力,因此我们可以认为在神经网络训练的第二阶段,DNN 首先学习了泛化能力最强的交互,然后逐渐转向更复杂但泛化能力较弱的交互。最终一些神经网络逐渐过拟合,并编码了大量中阶和高阶交互。

5.4 理论证明两阶段现象

理论证明神经网络训练过程的两阶段现象共分为三个部分,第一部分我们需要证明随机初始化的神经网络在训练过程开始之前建模的交互的分布呈现 “纺锤形”,即很少建模高阶和低阶交互,主要建模中阶交互。第二部分证明神经网络在训练的第二阶段在建模阶数逐渐增大的交互。第三部分证明神经网络在训练的第一阶段逐渐消除中阶和高阶交互,学习最低价的交互。

1. 证明初始化神经网络建模的 “纺锤形” 交互分布。

由于随机初始化的随机网络在训练过程开始之前建模的都是噪声,所以我们假设随机初始化的神经网络建模的交互的服从均值为

,方差为

的正态分布。在上述假设下,我们能够证明初始化的神经网络建模的交互的强度和的分布呈现 “纺锤形”,即很少建模高阶和低阶交互,主要建模中阶交互。

2. 证明神经网络训练的第二阶段的交互变化动态过程。

在进入正式的证明之前,我们需要做以下的预备工作。首先,我们参照 [5, 6] 的做法,将神经网络在特定样本上的 inference 改写为不同交互触发函数的加权和

其中,

为标量权重,满足

。而函数

为交互触发函数,在任意一个遮挡样本

上都满足

。函数的具体形式可以由泰勒展开推导得到,可参考论文,这里不做赘述。

根据上述改写形式,神经网络在特定样本上的学习可近似看成是对交互触发函数的权重

的学习。进一步地,实验室的前期工作 [3] 发现在同一任务上充分训练的不同的神经网络往往会建模相似的交互,所以我们可以将神经网络的学习看成是对一系列潜在的 ground truth 交互的拟合。由此,神经网络在训练到收敛时建模的交互可以看成是最小化下面的目标函数时得到的解:

其中

表示神经网络需要拟合的一系列潜在的 ground truth 交互。

则分别表示将所有权重拼起来得到的向量和将所有交互触发函数的值拼起来得到的向量。

可惜的是,上述建模虽然能得到神经网络训练到收敛时的交互,但是无法很好地刻画神经网络训练过程中学习交互的动态过程。这里引入我们的核心假设:我们假设初始化神经网络的参数上包含了大量噪声,而这些噪声的量级在训练过程中逐步变小。而进一步地,参数上的噪声会导致交互触发函数

上的噪声,且该噪声随着交互阶数指数级增长 (在 [5] 中已有实验上的观察和验证) 。我们将有噪声下的神经网络的学习建模如下:

其中噪声

满足

。且随着训练进行,噪声的方差

逐渐变小。

在给定的噪声量级的情况下最小化上述损失函数,可得到最优交互权重的解析解,如下图中的定理所示。

我们发现,随着训练进行(即噪声量级变小),中低阶交互强度和高阶交互强度的比值逐渐减小(如下面的定理所示)。这解释了训练的第二阶段中神经网络逐渐学到更加高阶的交互的现象。

另外,我们对上述结论进一步做了实验验证。给定一个具有 n 个输入单元的样本,指标

,其中

, 可以用来近似测量第 k 阶交互和第 k+1 阶交互强度的比值。在下图中,我们可以发现,在不同的输入单元个数 n 和不同的阶数 k 下,该比值都会随着的减小而逐渐减小。

图 9:在不同的输入单元个数 n 和不同的阶数 k 下,第 k 阶交互和第 k+1 阶交互强度的比值都会随着噪声量级的减小而逐渐减小。这说明随着训练进行(即逐渐变小),低阶交互强度与高阶交互强度的比值逐渐变小,神经网络逐渐学到更加高阶的交互。

最后,我们对比了在不同噪声量级下的理论交互值

在各个阶数上的分布

和实际训练过程中各阶交互的分布

,发现理论交互分布可以很好地预测实际训练中各时间点的交互强度分布。

图 10:比较理论交互分布

(蓝色直方图)和实际交互分布

(橙色直方图)。在训练第二阶段的不同时间点,理论交互分布都可以很好地预测和匹配实际交互的分布。更多结果请参见论文。开发板商城 天皓智联 TB上有视觉设备哦~

3. 证明神经网络训练的第一阶段的交互变化动态过程。

如果说训练的第二阶段中交互的动态变化可以解释为权重的最优解在噪声逐渐减小时的变化,那么第一阶段就可认为是交互从初始化的随机交互逐渐收敛到最优解的过程。

路漫漫其修远兮,我们团队是做神经网络可解释性的第一性原理,我们希望在更多的方面把这个理论做扎实,能够严格证明等效交互是符号化的解释,并且能够解释神经网络的泛化性、鲁棒性,同时证明神经网络表征瓶颈,统一 12 种提升神经网络对抗迁移性的方法和解释 14 种重要性估计方法。我们后面会做出更扎实的工作,进一步完善理论体系



#Tora

阿里「轨迹可控版Sora」,告别「抽卡」,让视频生成更符合物理规律

你规定路线,Tora 来生成相应轨迹的视频。

目前,扩散模型能够生成多样化且高质量的图像或视频。此前,视频扩散模型采用 U-Net 架构 ,主要侧重于合成有限时长(通常约为两秒)的视频,并且分辨率和纵横比受到固定限制。

Sora 的出现打破了这一限制,其采用 Diffusion Transformer(DiT)架构,不仅擅长制作 10 到 60 秒的高质量视频,而且还因其生成不同分辨率、各种纵横比、且遵守实际物理定律的能力而脱颖而出。

可以说 Sora 是 DiT 架构最有利的证明,然而,基于 Transformer 的扩散模型在有效生成可控动作视频方面还未被充分探索。

针对这一问题,来自阿里的研究者提出了 Tora,这是第一个面向轨迹的 DiT 架构,它将文本、视觉和轨迹条件同时集成在一起以生成视频。

Tora 的设计与 DiT 的可扩展性无缝契合,允许精确控制具有不同持续时间、宽高比和分辨率的视频内容。大量实验证明,Tora 在实现高运动保真度方面表现出色,同时还能细致模拟物理世界的运动。

  • 论文地址:https://arxiv.org/pdf/2407.21705
  • 论文主页:https://ali-videoai.github.io/tora_video/
  • 论文标题:Tora: Trajectory-oriented Diffusion Transformer for Video Generation

一艘老式的木制帆船沿着规定好的路线在迷雾笼罩的河流上平稳地滑行,周围是茂密的绿色森林。

一条鲫鱼优雅地游过火星的红色岩石表面,鱼的轨迹向左,火星的轨迹向右。

热气球沿着不同的轨迹升入夜空,一个沿着规定的斜线,另一个沿着有弯度的轨迹。

两只可爱的小猫并排走在宁静的金色沙滩上。

气泡沿着轨迹轻轻地漂浮在盛开的野花中。

枫叶在清澈的湖面上颤动,映照着秋天的森林。

山间的瀑布倾泻而下,主题、背景的运动都可以按照不同的路线运动。

在 Tora 与其他方法的比较中,可以看出 Tora 生成的视频流畅度更高,更遵循轨迹,且物体不会存在变形的问题,保真度更好。

方法介绍

Tora 采用 OpenSora 作为其 DiT 架构的基础模型,包含一个轨迹提取器 (TE,Trajectory Extractor)、时空 DiT(Spatial-Temporal DiT )和一个运动引导融合器 (MGF,Motion-guidance Fuser) 。TE 使用 3D 视频压缩网络将任意轨迹编码为分层时空运动 patch。MGF 将运动 patch 集成到 DiT 块中,以生成遵循轨迹的一致视频。图 3 概述了 Tora 的工作流程。

时空 DiT(ST-DiT)

ST-DiT 架构包含两种不同的块类型:空间 DiT 块 (S-DiT-B) 和时间 DiT 块 (T-DiT-B),它们交替排列。S-DiT-B 包含两个注意力层,每个层按顺序执行空间自注意力 (SSA) 和交叉注意力,后面跟着一个逐点前馈层,用于连接相邻的 T-DiT-B 块。T-DiT-B 仅通过用时间自注意力 (TSA) 替换 SSA 来修改此架构,从而保持架构一致性。在每个块中,输入在经过规范化后,通过跳跃连接连接回块的输出。通过利用处理可变长度序列的能力,去噪 ST-DiT 可以处理可变持续时间的视频。

轨迹提取器

轨迹已被证明是一种更加用户友好的方法来控制生成视频的运动。然而,DiT 模型采用视频自编码器和 patch 化过程将视频转换为视频 patch。在这里,每个 patch 都是跨多个帧导出,因此直接采用帧间偏移是不合适的。为了解决这个问题,本文提出的 TE 将轨迹转换为运动 patch,运动 patch 与视频 patch 位于相同的潜在空间。

运动引导融合器

为了将基于 DiT 的视频生成与轨迹结合起来,本文探索了三种融合架构变体,将运动 patch 注入每个 ST-DiT 块。这些设计如图 4 所示。

实验结果

在实现细节上,研究者基于 OpenSora v1.2 权重来训练 Tora。训练视频的分辨率由 144p 到 720p 不等。为了平衡训练 FLOP 以及每次迭代不同分辨率和帧数所需的内存,研究者相应地将批大小从 1 调整到 25。

至于训练基础设施,研究者使用了 4 块英伟达 A100 和 Adam 优化器,学习率为 2 × 10^−5。

研究者将 Tora 与流行的运动指导视频生成方法进行了比较。评估中使用了三种设置,分别为 16、64 和 128 帧,所有设置都是 512×512 的分辨率。

结果如下表 1 所示,在 U-Net 方法常用的 16 帧设置下,MotionCtrl 和 DragNUWA 能够更好地与所提供的轨迹实现对齐,但仍弱于 Tora。随着帧数增加,U-Net 方法在某些帧中出现明显偏差,并且错位误差传播会导致后续序列中出现变形、运动模糊或物体消失。

相比之下,得益于集成了 Transformer 的缩放能力,Tora 对帧数变化表现出很高的稳健性。Tora 产生的运动更加流畅,且更符合物理世界。对于 128 帧测试设置下的评估,Tora 的轨迹精度达到其他方法的 3 到 5 倍,展现出了卓越的运动控制能力。

在下图 5 中,研究者对不同分辨率和持续时长的轨迹误差进行分析。结果显示,不同于 U-Net 随时间推移出现明显的轨迹误差,Tora 的轨迹误差随时间推移出现渐进增加。这与 DiT 模型中视频质量随时间增加而下降相一致。Tora 在更长的时间下保持了有效的轨迹控制。

下图 6 展示了 Tora 与主流运动控制方法的比较分析,在包含两人共同运动的场景中,所有方法都能生成相对准确的运动轨迹。不过,Tora 的视觉质量更好,这要归功于更长序列帧的使用,有助于实现更平滑的运动轨迹和更逼真的背景渲染。

可以看到,在 Tora 生成的自行车场景中,人的双腿表现出逼真的踩踏动作,而 DragNUWA 的双腿几乎水平漂浮,违反了物理真实性。此外,DragNUWA 和 MotionCtrl 在视频结尾处都出现了严重的运动模糊。

在另一个生成灯笼的场景中,DragNUWA 随着所提供轨迹的持续升降出现了严重的变形。MotionCtrl 的轨迹虽然相对准确,但生成的视频与两个灯笼的描述不相符。Tora 不仅严格地遵循了轨迹,而且最大程度地减少了物体变形,确保了更高保真度的动作表示。



#让循环语言模型超越Transformer++

小技巧大功效,「仅阅读两次提示」

在当前 AI 领域,大语言模型采用的主流架构是 Transformer。不过,随着 RWKV、Mamba 等架构的陆续问世,出现了一个很明显的趋势:在语言建模困惑度方面与 Transformer 较量的循环大语言模型正在快速进入人们的视线。

令人兴奋的是,这些架构在推理期间使用了恒定量的内存。不过,受制于有限的内存,循环语言模型(LM)无法记忆并使用长上下文中的所有信息,这导致了上下文学习(in-context learning,ICL)质量的不佳。因此,获得高效大语言模型的关键挑战在于选择存储或者丢弃哪些信息。

在最近的论文《Just read twice: closing the recall gap for recurrent language models》中,来自斯坦福大学、布法罗大学的研究者通过简单观察发现,数据在推理期间涌入循环语言模型的排序极大地影响了在有限内存中预测存储哪些信息的难度。

我们假设根据文档 D(比如伽利略・伽利莱的详细维基百科)来提问:伽利略是什么时候搬到的佛罗伦萨?这时,如果提示遵循了 [Q, D] 的排序,则模型只需要记住文档 D 中的一个事实即可。相反,如果提示遵循了 [D, Q] 的排序,则模型需要记住所有事实。如下图 1(左)所示。

因此,本文首先从理论上形式化了数据排序如何影响内存需求,然后提出两种方法来减轻对数据排序的依赖,分别是 Just-read-twice(JRT)提示策略和 JRT 循环架构。本文主要分为以下几个部分展开:

理解数据排序的作用。研究者得出的第一个洞见是:记忆问题的 hardness 要降低到与设置剥离(set disjointness,SD)相同,这是通信复杂度理论中持续数十年的最典型问题。SD 要求一种流算法(比如循环模型)来决定上下文中提供的输入集是否剥离:

理论分析和实验结果表明,第一个集 | A | 掌控了求解 SD 所需的内存。因果模型需要存储 A 中的所有元素以与 B 中的元素进行比较。这表明了,使用上下文中的「正确数据排序」(如将最小 min (|A|, |B|) 的集放在首位)将有助于内存受限的模型。更进一步,观察到上下文非因果逻辑的模型可在空间最小的 (|A|, |B|) 中求解 SD,而无需考虑数据排序。

其次是利用「正确的」排序。本文提出了一种非常简单的 JRT-Prompt 策略,在模型生成答案之前在上下文中将信息重复多次(如上图 1 右所示)。在第二以及更多轮次中,语言模型在决定存储哪些信息时要以完整的上下文为条件,从而有效避免了将数据排序「归正」的问题。

结果表明,JRT-Prompt 在 16 个已有循环语言模型和 6 项 ICL 任务上,实现了平均 11.0 ± 1.3 百分点的提升,而吞吐量是 FlashAttention-2(长度 32k、批大小 16)的 11.9 倍。JRT-Prompt 虽然增加了上下文长度,但渐进来看仍然比注意力更加地计算和内存高效。

超越因果模型。本文提出了 JRT-RNN,它的灵感来源于简单的 Prefix-LM 编码器解码器架构设计。大多数的上下文学习输入包含两部分内容,分别是输入的提示(上下文、指令)和作为输出的模型生成文本。在 Prefix-LM 架构中,LM 并没有遵循因果逻辑地处理提示区域,而对输出进行了因果解码,其中在因果区域仅使用了标准的下一个 token 预测损失,以及非因果区域上的损失。

不过遗憾的是,此前 Prefix-LM 模型的训练方法取得的成功有限,并使用了低效的 Transformer 主干。因此本文通过一些简单的改变来提高质量和效率,包括改进训练损失并使用称之为「Prefix Linear Attention,PLA」 的线性注意力公式。研究者发现,使用他们的 IO 感知实现,JRT-RNN 在 360m 和 1.3b 参数设置下,分别可以提供 13.7 和 6.9 百分点的平均质量改进,吞吐量是 FA2 的 19.2 倍。

  • 论文地址:https://arxiv.org/pdf/2407.05483
  • 项目主页:https://github.com/HazyResearch/prefix-linear-attention

JRT-Prompt 方法概览

上下文学习任务以 (C, Q, Y) 作为输入,其中 C 为一些上下文来源(如文档或代码存储库),Q 为给定上下文时对模型的一些问题或请求,Y 为答案。对于使用自回归 LM A 的标准上下文学习,研究者输入 C 和 Q,并根据正确的完成情况 Y 来评估生成的输出 Yˆ = A (C, Q)。

JRT-Prompt 是一种极其简单的方法,在提示模型输出答案之前会在上下文中重复提示中的信息(如问题和文档),例如下图 1 右的 Yˆ = A (C, Q, C, Q)。因此,在上下文第二次出现时,模型根据完整的上下文来决定存储哪些信息。

此外,JRT-Prompt 可以与现成的 LLM 一起使用。研究者在零样本提示下,在一系列记忆密集型上下文任务上评估了以下 LM:

  • Based 预训练 LM,参数规模为 1.3B,在 Pile 的 10 − 50B 个 token 上进行训练;
  • Mamba 预训练的 LM,参数规模为 130M、370M、1.4B 和 2.8B,在 Pile 的 300B 个 token 上进行训练;
  • Gated Linear Attention 预训练的 LM,参数规模为 1.3B 和 2.7B,在 SlimPajama 数据集的 100B 个 token 上进行训练;
  • Mamba-2 预训练的 LM,参数规模为 130M、370M、1.3B 和 2.7B,在 Pile 的 300B 个 token 上进行训练。

结果如下表 1 所示,通过增加状态(state)大小,研究者发现 JRT-Prompt 方法在各个模型和任务上平均带来了 11.0 ± 1.3 百分点的性能提升,利用该方法的 Based 模型平均优于利用标准提示的 Transformer 模型。

他们还发现,JRT-Prompt 可以使 Transformer 模型受益,并且该方法在一些任务上(附录 2)比少样本学习更加有效。值得注意的是,Springer 等人在论文《Repetition improves language model embeddings》中提出使用自回归 Transformer 模型来重复上下文以实现生成嵌入的目的,本文的研究结果也类似。研究者专注于亚二次架构和上下文学习任务。

JRT-Prompt 虽然由于重复而增加了上下文长度,但是其使用的亚二次循环架构仍比使用二次 Transformer 模型更高效。研究者发现,在序列长度 N = 32768、批大小为 16 时,使用 JRT-Prompt(序列长度 2N)在英伟达 H100 上提供的吞吐量是 FlashAttention-2(序列长度 N)的 11.9 倍。

JRT-RNN:编码器 - 解码器循环架构

JRT-RNN 的灵感来自于 Prefix-LMs,但侧重于扩展质量 - 效率权衡空间的帕累托边界(Pareto frontier)。为了提高质量,JRT-RNN 在编码器端使用了单独的 k_e 和 v_e 映射,在解码器端使用了 k_d 和 v_d 映射。虽然 Prefix LM 模型对编码器和解码器区域使用了共享映射权重,但研究者发现使用两组映射可以提高质量。

为了提高效率,JRT-RNN 为编码器使用了非因果线性注意力,而为解码器使用标准因果线性注意力。研究者称为 Prefix Linear Attention(PLA)(图 1 右),公式如下:

JRT-RNN 训练目标。Prefix LMs 通常不计算非因果区域的损失,而 JRT-RNN 将下一个 token 预测与掩码语言建模(MLM)目标进行了结合。并且对于添加的 MLM 目标,研究者用一个 [MASK] token 替换了来自编码器区域 {u_1, ..., u_M} 的比例为 P 的 tokens,并在预测原始 token 时测量了交叉熵损失。

损失如下:

实验结果

在实验中,研究者评估了 JRT-RNN 在以下三个指标上的质量和效率:

  • 上下文学习质量
  • 整体语言建模
  • 生成

上下文学习质量

如下表 2 所示,研究者发现,JRT-RNN 在参数为 360M(30B tokens)时比仅解码器的基线(Based)平均高出 13.7 个百分点,在参数为 1.3B(50B tokens)时平均高出 6.9 个百分点。

同时,JRT-RNN 在参数为 360M 和 1.3B 时与 Transformer++ 的差距分别缩小到了 0.5 个百分点和 1.9 个百分点之内。

在下表 3 中,研究者比较了当 prefill 长度 l 小于编码器长度 M 时,JRT-RNN 与同类推理策略的表现。

整体自然语言理解

根据以往研究,研究者进一步将困惑度分为了两组:联想记忆「AR slice」包括了被称为「AR hits」的 tokens,它们需要模型按照顺序执行记忆以正确地预测下一个 token;而「Other slice」包含剩余的 tokens(如记忆的知识)。

对于记忆频率,JRT-RNN 在「AR slice」表现出色。对于训练期间不常见的二元组(即不太可能在模型参数中被记住的),JRT-RNN 的困惑度相对于 Based 和 Mamba 这两个强大的因果循环基线有所改善。

对于记忆距离,在「AR slice」中,JRT-RNN 与仅解码器基线之间的差距随着上下文中重复二元组的增加而扩大。这也进一步证明了 JRT-RNN 可以帮助完成更长的上下文记忆任务。

非记忆频率。对于训练期间很少见到的二元组的非记忆「Other slice」,JRT-RNN 的困惑度比仅解码器的 LM 更差。这是意料之中的结果,因为 JRT-RNN 计算了仅解码器 LM 的 65% tokens 的损失。

我们预计这一差距会随着规模和训练时间的延长而缩小(随着二元语法频率的增加而增加)(图 3,左上角)。

生成吞吐量

生成可以分解为提示「prefill 处理」和解码「下一个 token 预测」两步。相较于标准的仅解码器循环模型,JRT-RNN 不会修改解码步骤,因此讨论重点在 prefill 阶段。

使用 Simran Arora 等人论文《Simple linear attention language models balance the recall-throughput tradeof》中提出的 Based CUDAn 内核,JRT-Prompt 在处理 prefill 时吞吐量分别是 FlashAttention-2 和 FLA Triton 内核的 11.9 和 13.7 倍,如下表 5 所示。

当研究者将批大小增加到 64 时,JRT-Prompt 吞吐量分别是 FlashAttention-2 和 FLA Triton 内核的 6.1 倍和 7.2 倍。

接下来他们扩展了 Based 内核以支持 JRT-RNN,并且证明了当将序列长度增加到 32768 时,吞吐量分别是 FlashAttention-2 和 FLA 的 19.2 倍和 22.0 倍。当将批大小增加到 64 时,JRT-RNN 分别又提供了 9.7 倍和 11.5 倍的吞吐量提升。JRT-RNN 所需的时间是 Based prefill 的 1.24 倍,比 JRT-Prompt 更加高效。



#延迟交互模型

为什么是下一代RAG的标配?

张颖峰:英飞流联合创始人,多年搜索、AI、Infra基础设施开发经历,目前正致力于下一代 RAG 核心产品建设。

在 RAG 系统开发中,良好的 Reranker 模型处于必不可少的环节,也总是被拿来放到各类评测当中,这是因为以向量搜索为代表的查询,会面临命中率低的问题,因此需要高级的 Reranker 模型来补救,这样就构成了以向量搜索为粗筛,以 Reranker 模型作精排的两阶段排序架构。

目前排序模型的架构主要有两类:

1. 双编码器。以 BERT 模型为例,它针对查询和文档分别编码,最后再经过一个 Pooling 层,使得输出仅包含一个向量。在查询时的 Ranking 阶段,只需要计算两个向量相似度即可,如下图所示。双编码器既可以用于 Ranking 也可以用于 Reranking 阶段,向量搜索实际上就是这种排序模型。由于双编码器针对查询和文档分别编码,因此无法捕获查询和文档的 Token 之间的复杂交互关系,在语义上会有很多损耗,但由于只需要向量搜索即可完成排序打分计算,因此执行效率非常高。

51c大模型~合集23_大模型

2. 交叉编码器(Cross Encoder)。Cross-Encoder 使用单编码器模型来同时编码查询和文档,它能够捕捉查询和文档之间的复杂交互关系,因此能够提供更精准的搜索排序结果。Cross-Encoder 并不输出查询和文档的 Token 所对应的向量,而是再添加一个分类器直接输出查询和文档的相似度得分。它的缺点在于,由于需要在查询时对每个文档和查询共同编码,这使得排序的速度非常慢,因此 Cross-Encoder 只能用于最终结果的重排序。例如针对初筛结果的 Top 10 做重排序,仍然需要耗时秒级才可以完成。

51c大模型~合集23_大模型_02

今年以来,另一类以 ColBERT【参考文献1】 为代表的工作,在 RAG 开发社区引起了广泛关注,如下图所示,它具备一些显著区分于以上两类排序模型的特点:

其一是相比于 Cross Encoder,ColBERT 仍采用双编码器策略,将查询和文档分别采用独立的编码器编码,因此查询的 Token 和文档的 Token 在编码时互不影响,这种分离使得文档编码可以离线处理,查询时仅针对 Query 编码,因此处理的速度大大高于 Cross Encoder;

其二是相比于双编码器,ColBERT 输出的是多向量而非单向量,这是从 Transformer 的最后输出层直接获得的,而双编码器则通过一个 Pooling 层把多个向量转成一个向量输出,因此丢失了部分语义。

在排序计算时,ColBERT 引入了延迟交互计算相似度函数,并将其命名为最大相似性(MaxSim),计算方法如下:对于每个查询 Token 的向量都要与所有文档 Token 对应的向量进行相似度计算,并跟踪每个查询 Token 的最大得分。查询和文档的总分就是这些最大余弦分数的总和。例如对于一个有 32 个 Token 向量的查询(最大查询长度为 32)和一个有 128 个 Token 的文档,需要执行 32*128 次相似性操作,如下图所示。

因此相比之下, Cross Encoder 可以称作早期交互模型 (Early Interaction Model),而以 ColBERT 为代表的工作可称为延迟交互模型(Late Interaction Model)。

51c大模型~合集23_大模型_03

下图从性能和排序质量上,分别对以上排序模型进行对比。由于延迟交互模型满足了对排序过程中查询和文档之间复杂交互的捕获,同时也避免了对文档 Token 编码的开销,因此既能保证良好的排序效果,也能实现较快的排序性能 —— 相同数据规模下, ColBERT 的效率可达 Cross Encoder 的 100 倍以上。因此延迟交互模型是一种非常有前景的排序模型,一个天然的想法是:能否在 RAG 中直接采用延迟交互模型替代向量搜索 + 精排这样的两阶段排序架构?

51c大模型~合集23_大模型_04

为此,我们需要考虑 ColBERT 工程化的一些问题:

1. ColBERT 的 MaxSim 延迟交互相似度函数,计算效率大大高于 Cross Encoder,但相比普通向量搜索,计算开销仍然很大:因为查询和文档之间的相似度,是多向量计算,因此 MaxSim 的开销是普通向量相似度计算的 M * N 倍 (M 为查询的 Token 数, N 为 文档的 Token 数)。针对这些,ColBERT 作者在 2021 年推出了 ColBERT v2 【参考文献 2】,通过 Cross Encoder 和模型蒸馏,改进了生成的 Embedding 质量,并且采用压缩技术,对生成的文档向量进行量化,从而改善 MaxSim 的计算性能。基于 ColBERT v2 包装的项目 RAGatouille 【参考文献 3】成为高质量 RAG 排序的解决方案。然而,ColBERT v2 只是一个算法库,端到端的让它在企业级 RAG 系统使用,仍然是一件困难的事情。

2. 由于 ColBERT 是预训练模型,而训练数据来自于搜索引擎的查询和返回结果,这些文本数据并不大,例如查询 Token 数 32 , 文档 Token 数 128 是典型的长度限制。因此将 ColBERT 用于真实数据时, 超过限制的长度会被截断,这对于长文档检索并不友好。

基于以上问题, 开源 AI 原生数据库 Infinity 在最新版本中提供了 Tensor 数据类型,并原生地提供端到端的 ColBERT 方案。当 Tensor 作为一种数据类型,ColBERT 编码输出的多个向量,就可以直接用一个 Tensor 来存放,因此 Tensor 之间的相似度就可以直接得出 MaxSim 打分。针对 MaxSim 计算量大的问题,Infinity 给出了 2 个方案来优化:其一种是 binary 量化,它可以让原始 Tensor 的空间只需原始尺寸的 1/32 , 但并不改变 MaxSim 计算的相对排序结果。这种方案主要用于 Reranker,因为需要根据前一阶段粗筛的结果取出对应的 Tensor 。另一种是 Tensor Index,ColBERTv2 实际上就是 ColBERT 作者推出的 Tensor Index 实现,Infinity 采用的则是 EMVB【参考文献 4】,它可以看作是 ColBERT v2 的改进,主要通过量化和预过滤技术,并在关键操作上引入 SIMD 指令来加速实现。Tensor Index 只能用来服务 Ranker 而非 Reranker。此外,针对超过 Token 限制的长文本,Infinity 引入了 Tensor Array 类型:

51c大模型~合集23_大模型_05

一篇超过 ColBERT 限制的文档,会被切分成多个段落,分别编码生成 Tensor 后,都跟原始文档保存在一行。计算 MaxSim 的时候,查询跟这些段落分别计算,然后取最大值作为整个文档的打分。如下图所示:

51c大模型~合集23_大模型_06

因此,采用 Infinity,可以端到端地引入延迟交互模型高质量地服务 RAG。那么,应该是采用 ColBERT 作为 Ranker ,还是 Reranker 呢?下边我们采用 Infinity 来在真实数据集上进行评测。由于 Infinity 的最新版本实现了有史以来最全的混合搜索方案,召回手段包含向量搜索、全文搜索、稀疏向量搜索,上文所述的 Tensor ,以及这些手段的任意组合,并且提供了多种 Reranker 手段,如 RRF,以及 ColBERT Reranker 等,因此我们在评测中包含了各种混合搜索和 Reranker 的组合。

我们采用 MLDR 数据集进行评测。MLDR 是 MTEB 【参考文献 5】用来评测 Embedding 模型质量的 benchmark 集,其中 MLDR 是其中一个数据集,全称为 Multi Long Document Retrieval,一共包含 20 万长文本数据。评测采用 BGE-M3【参考文献 6】作为 Embedding 模型,采用 Jina-ColBERT 【参考文献 7】来生成 Tensor,评测脚本也放到了 Infinity 仓库【参考文献 8】

评测一:ColBERT 作为 Reranker 是否有效。将 20 万 MLDR 数据分别用 BGE-M3 生成稠密向量和稀疏向量,并插入到 Infinity 数据库中,数据库包含 4 列,分别保存原始文本,向量,稀疏向量,以及 Tensor,并分别构建相应全文索引、向量索引、稀疏向量索引。评测包含所有的召回组合,包含单路召回、双路召回,以及三路召回,如下所示:

51c大模型~合集23_大模型_07

评测指标采用 nDCG@10。其他参数:采用 RRF Reranker 时粗筛返回的 Top N = 1000 ,查询累计共有 800 条,平均每条查询长度在 10 个 token 左右。

51c大模型~合集23_大模型_08

从图中看到,所有的召回方案,在采用了 ColBERT Reranker 之后,都有明显的效果提升。ColBERT 作为一种延迟交互模型,它可以提供跟在 MTEB 的 Reranker 排行榜上位居前列相提并论的排序质量,但是性能却是它们的 100 倍,所以可以在更大的范围内进行重排序。图中给出的结果是针对 Top 100 进行 Reranker,而采用 Top 1000 进行 ColBERT 重排序,数值没有明显变化,性能还有明显下降,因此不推荐采用。传统上采用基于 Cross Encoder 的外部 Reranker ,Top 10 就会有秒级的延迟,而 Infinity 内部实现了高性能的 ColBERT Reranker,即使针对 Top 100 甚至 Top 1000 做重排序,也不会影响用户体验,而召回的范围却大大增加,因此可以显著改进最终的排序效果。此外,这种 ColBERT Reranker 计算只需在纯 CPU 架构上即可运行,这也大大降低了部署的成本。

评测二:对比基于 ColBERT 作为 Ranker 而不是 Reranker。因此,这时需要针对 Tensor 这列数据构建 Tensor Index。同时,为了评估 Tensor Index 引入的精度损耗,还进行了暴力搜索。

51c大模型~合集23_大模型_09

可以看到,相比 Reranker ,即使是采用没有精度损失的暴力搜索,也没有显著的提升,而采用基于 Tensor Index 的排序质量甚至低于采用 Reranker。然而,作为 Ranker 的查询时间却要慢得多:MLDR 数据集包含 20 万文档数据,大约 2GB 左右,采用 Jina-ColBERT 转成 Tensor 数据后,高达 320 G,这是因为 Tensor 数据类型是把一篇文档的每个 Token 对应的向量都要保存下来, ColBERT 模型的维度是 128 维,因此默认数据量会膨胀 2 个数量级,即使构建了 Tensor Index,在查询这么多数据的时候,也需要平均 7s 才能返回一个查询,但得到的结果却并没有更好。

因此,很显然,ColBERT 作为 Reranker 的收益比作为 Ranker 要高得多。当前最佳的 RAG 检索方案,是在 3 路混合搜索(全文搜索 + 向量 + 稀疏向量)的基础上加 ColBERT Reranker。有伙伴可能会问了,为了采用 ColBERT Reranker,就需要增加单独的 Tensor 列,并且该列会相比原始数据集膨胀 2 个数量级,这样做是否值得?首先:Infinity 针对 Tensor 提供了 Binary 量化手段,作为 Reranker,它并不影响排序结果很多,但却可以让最终的数据仅有原始 Tensor 大小的 1/32。其次,即便如此,也会有人认为这样的开销过高。然而站在使用者的视角,用更多的存储,来换取更高的排序质量和更廉价的成本(排序过程无需 GPU),这样做依然是非常值得的。最后,相信很快就可以推出效果上略有下降,但存储开销大大降低的 Late Interaction 模型,作为一款 Data Infra 基础设施, 对这些变化保持透明,把这些 Trade Off 交给用户是明智的选择。

以上是基于 Infinity 在 MLDR 数据集上的多路召回评测,在其他数据集的评测结果,可能会有所不同,但整体上结论不会变 —— 3 路混合搜索 + 基于 Tensor 的重排序,是当前搜索结果质量最高的召回手段。

由此可以看到,ColBERT 及其延迟交互模型,在 RAG 场景具有很大的应用价值,以上是在文本对话内容生成的相关工作,近期,延迟交互模型在多模态场景,也得到了 SOTA 的结果。这就是 ColPali【参考文献 9】,它改变了 RAG 的工作流程,如下图所示:

51c大模型~合集23_大模型_10

RAG 在面临复杂格式文档时,当下的 SOTA ,是采用文档识别模型,对文档的布局做识别,并针对识别出的部分结构,例如图表,图片等,再分别调用相应的模型,将它们转化为对应的文字,再用各种格式保存到 RAG 配套的数据库中。而 ColPali 则省掉了这些步骤,它直接采用多模态模型生成 Embedding 内容。提问的时候,可以直接针对文档中的图表进行回答:

51c大模型~合集23_大模型_11

ColPali 模型的训练跟 ColBERT 类似,也是采用查询 - 文档页面对的形式,从而捕获查询和文档多模态数据之间的语义关联,只是采用 PaliGemma 【参考文献 10】用来生成多模态 Embedding 。相比没有采用 Late Interaction 机制但同样采用 PaliGemma 生成 Embedding 的方案 BiPali,在 nDCG@5 的评测指标对比是 81.3 vs 58.8,这种差距是就是 “极好” 和 “压根不能工作” 的区别。

51c大模型~合集23_大模型_12

因此,尽管 ColBERT 出现至今已有 4 年时间,可是 Late Interaction 模型在 RAG 的应用才刚刚开始,它必将扩大 RAG 的使用场景,在包含多模态在内的复杂 RAG 场景提供高质量的语义召回。而 Infinity 已经为它的端到端应用做好了准备,欢迎关注和 Star Infinity,https://github.com/infiniflow/infinity, 致力于成为最好的 AI 原生数据库!



#LLM可解释性的未来希望

稀疏自编码器是如何工作的,这里有一份直观说明

简而言之:矩阵 → ReLU 激活 → 矩阵

在解释机器学习模型方面,稀疏自编码器(SAE)是一种越来越常用的工具(虽然 SAE 在 1997 年左右就已经问世了)。

机器学习模型和 LLM 正变得越来越强大、越来越有用,但它们仍旧是黑箱,我们并不理解它们完成任务的方式。理解它们的工作方式应当大有助益。

SAE 可帮助我们将模型的计算分解成可以理解的组件。近日,LLM 可解释性研究者 Adam Karvonen 发布了一篇博客文章,直观地解释了 SAE 的工作方式。

可解释性的难题

神经网络最自然的组件是各个神经元。不幸的是,单个神经元并不能便捷地与单个概念相对应,比如学术引用、英语对话、HTTP 请求和韩语文本。在神经网络中,概念是通过神经元的组合表示的,这被称为叠加(superposition)。

之所以会这样,是因为世界上很多变量天然就是稀疏的。

举个例子,某位名人的出生地可能出现在不到十亿分之一的训练 token 中,但现代 LLM 依然能学到这一事实以及有关这个世界的大量其它知识。训练数据中单个事实和概念的数量多于模型中神经元的数量,这可能就是叠加出现的原因。

近段时间,稀疏自编码器(SAE)技术越来越常被用于将神经网络分解成可理解的组件。SAE 的设计灵感来自神经科学领域的稀疏编码假设。现在,SAE 已成为解读人工神经网络方面最有潜力的工具之一。SAE 与标准自编码器类似。

常规自编码器是一种用于压缩并重建输入数据的神经网络。

举个例子,如果输入是一个 100 维的向量(包含 100 个数值的列表);自编码器首先会让该输入通过一个编码器层,让其被压缩成一个 50 维的向量,然后将这个压缩后的编码表示馈送给解码器,得到 100 维的输出向量。其重建过程通常并不完美,因为压缩过程会让重建任务变得非常困难。

51c大模型~合集23_大模型_13

一个标准自编码器的示意图,其有 1x4 的输入向量、1x2 的中间状态向量和 1x4 的输出向量。单元格的颜色表示激活值。输出是输入的不完美重建结果。

解释稀疏自编码器

稀疏自编码器的工作方式

稀疏自编码器会将输入向量转换成中间向量,该中间向量的维度可能高于、等于或低于输入的维度。在用于 LLM 时,中间向量的维度通常高于输入。在这种情况下,如果不加额外的约束条件,那么该任务就很简单,SAE 可以使用单位矩阵来完美地重建出输入,不会出现任何意料之外的东西。但我们会添加约束条件,其中之一是为训练损失添加稀疏度惩罚,这会促使 SAE 创建稀疏的中间向量。

举个例子,我们可以将 100 维的输入扩展成 200 维的已编码表征向量,并且我们可以训练 SAE 使其在已编码表征中仅有大约 20 个非零元素。

51c大模型~合集23_大模型_14

稀疏自编码器示意图。请注意,中间激活是稀疏的,仅有 2 个非零值。

我们将 SAE 用于神经网络内的中间激活,而神经网络可能包含许多层。在前向通过过程中,每一层中和每一层之间都有中间激活。

举个例子,GPT-3 有 96 层。在前向通过过程中,输入中的每个 token 都有一个 12,288 维向量(一个包含 12,288 个数值的列表)。此向量会累积模型在每一层处理时用于预测下一 token 的所有信息,但它并不透明,让人难以理解其中究竟包含什么信息。

我们可以使用 SAE 来理解这种中间激活。SAE 基本上就是「矩阵 → ReLU 激活 → 矩阵」。

举个例子,如果 GPT-3 SAE 的扩展因子为 4,其输入激活有 12,288 维,则其 SAE 编码的表征有 49,512 维(12,288 x 4)。第一个矩阵是形状为 (12,288, 49,512) 的编码器矩阵,第二个矩阵是形状为 (49,512, 12,288) 的解码器矩阵。通过让 GPT 的激活与编码器相乘并使用 ReLU,可以得到 49,512 维的 SAE 编码的稀疏表征,因为 SAE 的损失函数会促使实现稀疏性。

通常来说,我们的目标让 SAE 的表征中非零值的数量少于 100 个。通过将 SAE 的表征与解码器相乘,可得到一个 12,288 维的重建的模型激活。这个重建结果并不能与原始的 GPT 激活完美匹配,因为稀疏性约束条件会让完美匹配难以实现。

一般来说,一个 SAE 仅用于模型中的一个位置举个例子,我们可以在 26 和 27 层之间的中间激活上训练一个 SAE。为了分析 GPT-3 的全部 96 层的输出中包含的信息,可以训练 96 个分立的 SAE—— 每层的输出都有一个。如果我们也想分析每一层内各种不同的中间激活,那就需要数百个 SAE。为了获取这些 SAE 的训练数据,需要向这个 GPT 模型输入大量不同的文本,然后收集每个选定位置的中间激活。

下面提供了一个 SAE 的 PyTorch 参考实现。其中的变量带有形状注释,这个点子来自 Noam Shazeer,参见:https://medium.com/@NoamShazeer/shape-suffixes-good-coding-style-f836e72e24fd 。请注意,为了尽可能地提升性能,不同的 SAE 实现往往会有不同的偏置项、归一化方案或初始化方案。最常见的一种附加项是某种对解码器向量范数的约束。更多细节请访问以下实现:

  • OpenAI:https://github.com/openai/sparse_autoencoder/blob/main/sparse_autoencoder/model.py#L16
  • SAELens:https://github.com/jbloomAus/SAELens/blob/main/sae_lens/sae.py#L97
  • dictionary_learning:https://github.com/saprmarks/dictionary_learning/blob/main/dictionary.py#L30
import torch
import torch.nn as nn


# D = d_model, F = dictionary_size
# e.g. if d_model = 12288 and dictionary_size = 49152
# then model_activations_D.shape = (12288,) and encoder_DF.weight.shape = (12288, 49152)


class SparseAutoEncoder (nn.Module):
    """
    A one-layer autoencoder.
    """
    def __init__(self, activation_dim: int, dict_size: int):
        super ().__init__()
        self.activation_dim = activation_dim
        self.dict_size = dict_size




        self.encoder_DF = nn.Linear (activation_dim, dict_size, bias=True)
        self.decoder_FD = nn.Linear (dict_size, activation_dim, bias=True)




    def encode (self, model_activations_D: torch.Tensor) -> torch.Tensor:
        return nn.ReLU ()(self.encoder_DF (model_activations_D))


    def decode (self, encoded_representation_F: torch.Tensor) -> torch.Tensor:
        return self.decoder_FD (encoded_representation_F)


    def forward_pass (self, model_activations_D: torch.Tensor) -> tuple [torch.Tensor, torch.Tensor]:
        encoded_representation_F = self.encode (model_activations_D)
        reconstructed_model_activations_D = self.decode (encoded_representation_F)
        return reconstructed_model_activations_D, encoded_representation_F

标准自编码器的损失函数基于输入重建结果的准确度。为了引入稀疏性,最直接的方法是向 SAE 的损失函数添加一个稀疏度惩罚项。对于这个惩罚项,最常见的计算方式是取这个 SAE 的已编码表征(而非 SAE 权重)的 L1 损失并将其乘以一个 L1 系数。这个 L1 系数是 SAE 训练中的一个关键超参数,因为它可确定实现稀疏度与维持重建准确度之间的权衡。

请注意,这里并没有针对可解释性进行优化。相反,可解释的 SAE 特征是优化稀疏度和重建的一个附带效果。下面是一个参考损失函数。

# B = batch size, D = d_model, F = dictionary_size
def calculate_loss (autoencoder: SparseAutoEncoder, model_activations_BD: torch.Tensor, l1_coeffient: float) -> torch.Tensor:
    reconstructed_model_activations_BD, encoded_representation_BF = autoencoder.forward_pass (model_activations_BD)
    reconstruction_error_BD = (reconstructed_model_activations_BD - model_activations_BD).pow (2)
    reconstruction_error_B = einops.reduce (reconstruction_error_BD, 'B D -> B', 'sum')
    l2_loss = reconstruction_error_B.mean ()


    l1_loss = l1_coefficient * encoded_representation_BF.sum ()
    loss = l2_loss + l1_loss
    return loss


51c大模型~合集23_大模型_15

稀疏自编码器的前向通过示意图。

这是稀疏自编码器的单次前向通过过程。首先是 1x4 大小的模型向量。然后将其乘以一个 4x8 的编码器矩阵,得到一个 1x8 的已编码向量,然后应用 ReLU 将负值变成零。这个编码后的向量就是稀疏的。之后,再让其乘以一个 8x4 的解码器矩阵,得到一个 1x4 的不完美重建的模型激活。

假想的 SAE 特征演示

理想情况下,SAE 表征中的每个有效数值都对应于某个可理解的组件。

这里假设一个案例进行说明。假设一个 12,288 维向量 [1.5, 0.2, -1.2, ...] 在 GPT-3 看来是表示「Golden Retriever」(金毛犬)。SAE 是一个形状为 (49,512, 12,288) 的矩阵,但我们也可以将其看作是 49,512 个向量的集合,其中每个向量的形状都是 (1, 12,288)。如果该 SAE 解码器的 317 向量学习到了与 GPT-3 那一样的「Golden Retriever」概念,那么该解码器向量大致也等于 [1.5, 0.2, -1.2, ...]。

无论何时 SAE 的激活的 317 元素是非零的,那么对应于「Golden Retriever」的向量(并根据 317 元素的幅度)会被添加到重建激活中。用机械可解释性的术语来说,这可以简洁地描述为「解码器向量对应于残差流空间中特征的线性表征」。

也可以说有 49,512 维的已编码表征的 SAE 有 49,512 个特征。特征由对应的编码器和解码器向量构成。编码器向量的作用是检测模型的内部概念,同时最小化其它概念的干扰,尽管解码器向量的作用是表示「真实的」特征方向。研究者的实验发现,每个特征的编码器和解码器特征是不一样的,并且余弦相似度的中位数为 0.5。在下图中,三个红框对应于单个特征。

51c大模型~合集23_大模型_16

稀疏自编码器示意图,其中三个红框对应于 SAE 特征 1,绿框对应于特征 4。每个特征都有一个 1x4 的编码器向量、1x1 的特征激活和 1x4 的解码器向量。重建的激活的构建仅使用了来自 SAE 特征 1 和 4 的解码器向量。如果红框表示「红颜色」,绿框表示「球」,那么该模型可能表示「红球」。

那么我们该如何得知假设的特征 317 表示什么呢?目前而言,人们的实践方法是寻找能最大程度激活特征并对它们的可解释性给出直觉反应的输入。能让每个特征激活的输入通常是可解释的。

举个例子,Anthropic 在 Claude Sonnet 上训练了 SAE,结果发现:与金门大桥、神经科学和热门旅游景点相关的文本和图像会激活不同的 SAE 特征。其它一些特征会被并不显而易见的概念激活,比如在 Pythia 上训练的一个 SAE 的一个特征会被这样的概念激活,即「用于修饰句子主语的关系从句或介词短语的最终 token」。

由于 SAE 解码器向量的形状与 LLM 的中间激活一样,因此可简单地通过将解码器向量加入到模型激活来执行因果干预。通过让该解码器向量乘以一个扩展因子,可以调整这种干预的强度。当 Anthropic 研究者将「金门大桥」SAE 解码器向量添加到 Claude 的激活时,Claude 会被迫在每个响应中都提及「金门大桥」。

下面是使用假设的特征 317 得到的因果干预的参考实现。类似于「金门大桥」Claude,这种非常简单的干预会迫使 GPT-3 模型在每个响应中都提及「金毛犬」。

def perform_intervention (model_activations_D: torch.Tensor, decoder_FD: torch.Tensor, scale: float) -> torch.Tensor:
    intervention_vector_D = decoder_FD [317, :]
    scaled_intervention_vector_D = intervention_vector_D * scale
    modified_model_activations_D = model_activations_D + scaled_intervention_vector_D
    return modified_model_activations_D

稀疏自编码器的评估难题

使用 SAE 的一大主要难题是评估。我们可以训练稀疏自编码器来解释语言模型,但我们没有自然语言表示的可度量的底层 ground truth。目前而言,评估都很主观,基本也就是「我们研究一系列特征的激活输入,然后凭直觉阐述这些特征的可解释性。」这是可解释性领域的主要限制。

研究者已经发现了一些似乎与特征可解释性相对应的常见代理指标。最常用的是 L0 和 Loss Recovered。L0 是 SAE 的已编码中间表征中非零元素的平均数量。Loss Recovered 是使用重建的激活替换 GPT 的原始激活,并测量不完美重建结果的额外损失。这两个指标通常需要权衡考虑,因为 SAE 可能会为了提升稀疏性而选择一个会导致重建准确度下降的解。

在比较 SAE 时,一种常用方法是绘制这两个变量的图表,然后检查它们之间的权衡。为了实现更好的权衡,许多新的 SAE 方法(如 DeepMind 的 Gated SAE 和 OpenAI 的 TopK SAE)对稀疏度惩罚做了修改。下图来自 DeepMind 的 Gated SAE 论文。Gated SAE 由红线表示,位于图中左上方,这表明其在这种权衡上表现更好。

51c大模型~合集23_大模型_17

Gated SAE L0 与 Loss Recovered

SAE 的度量存在多个难度层级。L0 和 Loss Recovered 是两个代理指标。但是,在训练时我们并不会使用它们,因为 L0 不可微分,而在 SAE 训练期间计算 Loss Recovered 的计算成本非常高。相反,我们的训练损失由一个 L1 惩罚项和重建内部激活的准确度决定,而非其对下游损失的影响。

训练损失函数并不与代理指标直接对应,并且代理指标只是对特征可解释性的主观评估的代理。由于我们的真正目标是「了解模型的工作方式」,主观可解释性评估只是代理,因此还会有另一层不匹配。LLM 中的一些重要概念可能并不容易解释,而且我们可能会在盲目优化可解释性时忽视这些概念。

总结

可解释性领域还有很长的路要走,但 SAE 是真正的进步。SAE 能实现有趣的新应用,比如一种用于查找「金门大桥」导向向量(steering vector)这样的导向向量的无监督方法。SAE 也能帮助我们更轻松地查找语言模型中的回路,这或可用于移除模型内部不必要的偏置。

SAE 能找到可解释的特征(即便目标仅仅是识别激活中的模式),这一事实说明它们能够揭示一些有意义的东西。还有证据表明 LLM 确实能学习到一些有意义的东西,而不仅仅是记忆表层的统计规律。

SAE 也能代表 Anthropic 等公司曾引以为目标的早期里程碑,即「用于机器学习模型的 MRI(磁共振成像)」。SAE 目前还不能提供完美的理解能力,但却可用于检测不良行为。SAE 和 SAE 评估的主要挑战并非不可克服,并且现在已有很多研究者在攻坚这一课题。

有关稀疏自编码器的进一步介绍,可参阅 Callum McDougal 的 Colab 笔记本:https://www.lesswrong.com/posts/LnHowHgmrMbWtpkxx/intro-to-superposition-and-sparse-autoencoders-colab

参考链接:

https://www.reddit.com/r/MachineLearning/comments/1eeihdl/d_an_intuitive_explanation_of_sparse_autoencoders/

https://adamkarvonen.github.io/machine_learning/2024/06/11/sae-intuitions.html