一个提议服务所有边际:给二元矩阵采样找到一劳永逸的解法
(来源:科技行者)
你可能没听说过"边际固定的二元矩阵"这个词,但你很可能见过它的应用场景。
生态学家想知道,某片森林里几种动物在不同地点的分布,到底是巧合还是真的存在某种生态规律。心理测量学家想验证一份智力测验的作答模式,是不是符合某个理论模型。社交网络分析师想搞清楚,一份好友关系表现出的聚集特征,是不是纯粹随机产生的。
这些问题的共同点是,研究者手里有一张由0和1组成的表格,行代表个体(比如物种、受试者、用户),列代表属性(比如站点、题目、好友),每一行的1的个数(行和)和每一列的1的个数(列和)都是观测到的、固定不变的数字。研究者想知道:在保持这些行和列的总数不变的前提下,随机生成的表格会长什么样?我观测到的这张表,是不是比随机生成的更特殊?
这个问题看似简单,做起来却极其棘手。
一张表,两个难题
假设你固定了行和列的总数,符合条件的0-1矩阵可能有几个、几十个,也可能有天文数字那么多个。这构成了一个数学对象,专业上叫做
边际固定的二元矩阵空间:给定行和数向量 r 和列和数向量 c,所有满足这两个条件的0-1矩阵构成的集合,记作 Ω(r,c)。
围绕这个空间,有两个基础问题需要解决。第一是数清楚这个空间里到底有多少个矩阵,这个数字叫做计数 Z。第二是从这个空间里均匀随机地抽一个矩阵出来,也就是让每个矩阵被抽中的概率完全相等。
这两个问题乍看是数学游戏,实际上决定了前面那些科学问题能不能被严谨地回答。你想知道观测数据是否特殊,就得知道"随机情况"长什么样,而随机情况就是这个空间里均匀分布的矩阵。
精确解法是有的,用动态规划一行一行地构建矩阵,同时把计数和均匀采样都做出来。问题是,这个方法的计算复杂度随着列数增长会爆炸式上升,稍微大一点的表格就算不动了。这就好比你想数清楚一个巨大迷宫里所有能从起点走到终点的路径,理论上你可以一条一条枚举,但当迷宫稍微复杂一点,枚举的时间就会超过宇宙的年龄。
马尔可夫链方法是另一条路,通过不断微调矩阵中的0和1来生成样本,理论上最终会趋近均匀分布。但这种方法生成的样本前后相关,不独立,而且完全不能告诉你这个空间到底有多大。
于是就有了本文要讲的主角:序贯重要性采样。
序贯重要性采样:一边造表一边打分
序贯重要性采样,简称SIS,是一种同时解决计数和采样两个问题的方法。它的思路是这样的:不去均匀地随机生成矩阵,而是按照某个"建议分布"一行一行地构造矩阵,每完成一行就检查剩下的行能不能凑出满足列约束的表格。构造完成后,给这个矩阵打一个权重,权重是建议分布给出该矩阵概率的倒数。
序贯重要性采样*:一种通过逐行构造矩阵、并用权重修正偏差的采样方法,能同时给出独立的加权样本和一个无偏的计数估计量。
这个方法的巧妙之处在于,无论你用的建议分布多烂,只要它给每个可行的行都留了正概率,最终权重的平均值就是对Z的无偏估计。听起来像是免费的午餐,但代价藏在"效率"这个词里。
如果建议分布选得不好,大部分权重会集中在极少数几个样本上,其他样本的权重几乎为零。这时候你抽了一万个样本,实际上等效于只抽了几个样本的信息量,估计的方差极大,甚至可能严重低估真实的计数。学界用一个指标衡量这种效率,叫做
有效样本比例:ESS/N,取值在0到100%之间,越接近100%说明建议分布越好,越接近0说明大部分抽样都在做无用功。
这就好比你想统计一个班级的平均身高,如果你抽样时总是倾向于抽到最高的那几个人,那么你抽再多次,得到的平均值都会偏高,而且样本之间的信息高度冗余,浪费了大量抽样机会。
那么,有没有一个理想的建议分布,能让每次抽样都恰到好处?
答案是有的,而且形式极其优雅:每一步选择下一行时,按照"这一行剩下能完成多少种表格"的比例来选。如果某一行选完之后,后面还有100种方法能凑成完整的表格,而另一行选完后只剩10种,那么前者应该以更大的概率被选中。
这个理想分布有个性质,它会让每一个最终生成的矩阵获得完全相同的权重,权重恰好就是Z本身。方差降到零,效率达到100%。
问题是,这个理想分布几乎没法直接计算。因为计算"剩下能完成多少种表格"本身,就是在问一个和Z同样难的计数问题。你为了解决计数问题去构造一个依赖计数的分布,这是个死循环。
正因为如此,几十年来所有的经典方法都是分析家们绞尽脑汁设计出来的近似公式,用一些数学近似(比如渐近展开)去逼近这个理想分布,效果因矩阵形状而异,有时候好,有时候会差到需要指数级多的样本才能不严重低估计数。
这篇论文的作者们换了个角度想这个问题:既然理想分布算不出来,能不能让一个神经网络自己学出来?
生成流网络:让"计数"变成一个可训练的目标
要理解这篇论文的核心创新,得先认识一个叫做
生成流网络(GFlowNet):一类通过多步骤构建对象、并让最终生成每个对象的概率正比于该对象奖励值的生成模型。它把"从初始状态到终态"的整个构造过程看成一张有向无环图上的流动。
的框架。GFlowNet最初是用来解决"我想让生成的样本按照某种奖励比例出现"这类问题的,比如在药物分子设计里,奖励越高的分子应该被生成得越频繁。
作者们发现了一个漂亮的对应关系:如果你把"每个满足边际条件的矩阵"都设定为奖励恰好等于1,那么这个GFlowNet的最优策略,正好就是前面提到的那个理想的、零方差的SIS建议分布。
换句话说,理想建议分布不是别的,正是一个特定GFlowNet的策略。而GFlowNet的策略是可以通过训练学出来的,训练过程只需要用到采样本身产生的数据,完全不需要提前知道Z是多少。
这个发现的意义在于,它把一个"分析家凭经验设计公式"的问题,转化成了一个"用数据训练模型"的问题。以前是靠数学家精妙的渐近分析去猜近似公式,现在是让网络在采样过程中自己纠正自己,逐渐逼近那个理想分布。
打个比方,这就像以前你想知道去某个陌生城市该怎么走最省时间,只能靠老司机凭经验估计的路线图,路线图画得好不好完全取决于这位老司机对这座城市的熟悉程度,换一座城市可能就完全失灵。而现在你有了一个导航系统,它会根据你每次实际开车走过的路况数据,不断修正对最优路线的判断,理论上只要数据够多,它总能收敛到真正的最优路径,而且这套系统换到任何城市都能用同样的逻辑重新学习。
训练这个GFlowNet用的是一种叫做
对数方差目标(VarGrad):一种训练目标,衡量的是同一批样本的对数权重之间的方差有多大,方差越小说明策略越接近理想分布。
的损失函数,配合另一个理论工具
轨迹平衡:GFlowNet训练中常用的一致性条件,要求每条完整轨迹的流量平衡关系成立。
的推导,作者证明了:这个损失函数的期望梯度,恰好等于让采样分布逼近均匀分布这个目标的梯度。也就是说,训练这个损失函数,本质上就是在让网络生成的样本分布越来越接近真正想要的均匀分布,即使训练过程中Z本身从未被显式计算过。
这里有个细节值得展开说说。训练GFlowNet通常还会顺带学出一个总流量的估计值,看起来像是白送的计数估计。但作者证明了,这个附带估计其实是有偏的,它会比真实的log Z小一个"没训练干净"的差距。所以论文里明确说:计数任务还是交给SIS本身的权重平均来做,GFlowNet只负责学策略。这是一个很清醒的取舍,没有贪图训练过程里那个看似免费的计数值。
一个网络,服务所有矩阵
如果故事讲到这里就结束了,那么MarginFlow顶多算是"给GFlowNet找到了一个新应用场景",价值有限,因为给每一种边际条件都单独训练一个网络,其实比手工设计的建议分布还要昂贵。
真正让这篇论文变得有意思的,是接下来这一步。
作者们观察到一个关键的自相似性:当你已经填好了矩阵的前几行,剩下没填的部分,其实就是一个规模更小、边际条件也相应缩减了的新问题实例。
MarginFlow*:本文提出的框架,核心思想是训练一个统一的神经网络,让它读取"剩余的边际条件"作为输入,输出下一行该怎么选,从而让一个网络能够服务于所有不同的边际条件问题,无需针对每个新问题重新训练。
这就好比你在玩一个越来越小的俄罗斯套娃,每打开一层,里面还是同样结构的套娃,只是尺寸变小了。既然结构完全一样,你不需要为每个尺寸的套娃单独学一套打开方法,只需要学会"看到套娃的当前尺寸,判断下一步怎么拆"这一件事就够了。如果不这样做,会发生什么?你就得为3行3列的小矩阵、870行6列的大矩阵、各种密度和形状的矩阵,各训练一个专属网络,这个成本比手工设计的公式还高得多,那这套方法就完全没有实用价值。
具体来说,网络读取的输入是"剩余的行和"以及"剩余的列和",输出是对每一种可能的下一行的打分。这里有个精细化处理:不同的具体行如果在"剩余列和"相同的列上放的1的个数是一样的,那么理论上它们被选中的概率必须完全相等。作者证明了这一点(对应论文中的命题3.6),并利用这个对称性把网络需要打分的对象从"具体的行"压缩成了"行的类型",大大减少了计算量。
网络架构选用的是
集合变换器(Set Transformer):一种专门处理集合输入(即元素间没有固定顺序)的注意力神经网络架构,天然具备置换不变性。
这个选择本身就呼应了前面说的对称性要求,因为矩阵的列之间原本就没有天然的顺序,用一个对顺序不敏感的网络去处理,正好和数学结构对上了号。
训练时,网络的打分输出被设计成三部分之和:一部分是纯组合数学算出来的、某个类型下有多少种具体的行排列方式;一部分是照搬经典的Harrison和Miller方法给出的解析近似值,作为一个强先验,让网络从一个不错的起点开始学习,而不是从零摸索;最后一部分才是网络真正学到的修正项,初始化为零,意味着训练刚开始时网络的行为和经典方法完全一致,之后再逐渐学出比经典方法更好的策略。
这个设计其实藏着一个很实际的工程智慧:不是让网络从零开始学一个从未见过的任务,而是让网络站在巨人的肩膀上,只学习巨人没做好的那部分修正。如果不这样做,直接让网络从随机初始化开始学习整个建议分布,会发生什么?论文里的消融实验(附录C.1)给出了答案:去掉这个解析先验项之后,网络在最难的那批矩阵上,三次独立训练的结果之间波动会大五倍,说明没有先验支撑的时候,训练变得不稳定,收敛路径充满不确定性。
训练数据来自一个包含1904种边际条件的"训练池",涵盖了六种人工合成的矩阵家族(改变形状、密度、不均匀程度)以及真实世界的生态学、互惠网络和心理测量数据表。每次训练迭代,随机抽一种边际条件,让当前网络采样若干矩阵,计算这些矩阵对数权重的方差作为损失,然后更新网络参数。因为采样过程中经过的每一个中间状态本身又是一个新的边际实例,所以一次采样轨迹就能给网络在多个不同"缩小版问题"上提供训练信号。
训练完成后,这个网络被拿去测试1190个从未见过的边际条件,涵盖从3行3列到870行6列的各种规模。注意,这里的"从未见过"是严格意义上的,无论是随机种子还是数据来源都做了隔离,测试集和训练池没有重叠。
结果如何:一个数字胜过31种配置
作者拿MarginFlow去对比的基准,不是随便挑一个经典方法,而是31种不同的经典方法配置(5种解析建议分布,每种配6个不同的指数参数,再加均匀分布)里,事后(post hoc)挑出来在每个具体测试矩阵上表现最好的那一个。
这个基准设计得非常"公平到近乎苛刻",因为现实中没有任何用户能提前知道该给某个矩阵用哪种配置,这个"事后最优"其实是一个理论上限,比任何实际可用的经典方法都强。
即便如此,MarginFlow在1190个测试矩阵中的1187个上,打平或超过了这个事后最优基准。全体测试矩阵的有效样本比例中位数达到99.8%,意味着一半以上的矩阵上,MarginFlow几乎做到了零方差的理想水平。
更值得注意的是那些"事后最优"表现也很差的困难矩阵。在56个"事后最优"的有效样本比例低于37%(也就是损失超过1个nat,一个信息论单位)的矩阵上,MarginFlow全部胜出,有效样本比例中位数从10.3%直接提升到94.1%。
这56个矩阵大多是又高又密的表格,行数最多达到840,来自幂律分布、极端和分布、双峰分布这些人工合成家族,也包括真实的生态学和互惠网络数据。在这些矩阵上,经典方法几乎失效,就算你事后挑最好的配置也无济于事,MarginFlow却依然稳稳保持在94%左右。
这个数字差距意味着什么?意味着如果你想用经典方法在这类困难矩阵上得到一个可靠的计数估计,你可能需要抽取比MarginFlow多几十倍甚至上百倍的样本才能达到同样的精度,而计算资源和时间都是有限的。
误差是怎么随着行数累积的
论文里有一段分析特别值得展开讲讲,因为它解释了为什么MarginFlow在"高个子"矩阵(行数很多)上优势格外明显。
一个矩阵的总权重是每一行选择概率的连乘积。这意味着,只要每一行的建议分布和理想分布之间有一点点偏差,这个偏差就会随着行数的增加不断累积,而且是以平方的方式累积,作者给出了理论上界:如果每行的误差大约是δ个nat,累积m行之后总误差上界大约是mδ的平方。
这就像一场接力跑,如果每一棒选手都比理想速度慢一点点,跑的棒数越多,累积下来的总延迟就越夸张,而且这个延迟增长比你想象的更快,因为每一棒的偏差是叠加相乘而不是简单相加的效应。
论文用实验验证了这个理论:固定矩阵的家族、宽度和密度,只改变行数从6行涨到840行,经典的Harrison-Miller方法损失的nat数几乎呈线性增长(在对数坐标下斜率接近1),有效样本比例从6行时的98.7%一路跌到840行时的0.6%。而MarginFlow同样会随行数增加损失一些效率,但曲线的斜率小得多,840行时依然保持在99.9%以上(损失低于0.1个nat)。
这说明了一个很本质的道理:经典方法的每行误差是一个"固定值",因为它是靠一个固定公式算出来的,公式不会因为矩阵变大而自动变准。而MarginFlow学到的是一个动态调整的策略,每一行的误差本身就更小,所以行数越多,MarginFlow相对经典方法的优势反而越明显。
论文还专门做了一个"压力测试",用Bezáková等人2012年构造的一类矩阵家族。这类矩阵有个特殊之处:数学上已经被证明,经典的条件泊松方法在这上面需要指数级多的样本才能不严重低估计数。作者让MarginFlow在这个家族中最多84行的矩阵上训练,然后测试它在最多376行(是训练规模的近5倍)的矩阵上表现如何。结果是,经典方法在376行时每个有效样本要付出e的63次方(一个天文数字)个抽样的代价,而MarginFlow的代价只有1.2左右,几乎不需要额外抽样就能拿到一个有效样本。这意味着MarginFlow不仅在见过的规模上表现好,还具备了某种"外推"到更大规模的能力。
训练过程中到底发生了什么
为了验证前面理论推导的正确性,作者还做了一个单矩阵的追踪实验,选了一个88行6列的真实生态网络数据(来自Web of Life数据库),这是测试集里网络训练前表现最差的一个矩阵,专门用三个随机种子在这一个矩阵上单独训练,每隔一段时间就抽样并计算精确的理论指标。
结果显示,训练损失(也就是对数权重的方差)从最初的1.1个nat一路降到0.01,几乎降了两个数量级。与此同时,另外两个理论上应该和它同步变化的量,两倍的KL散度和真实的Rényi散度,也跟着一起下降,训练大约1000步之后,三条曲线基本重合,正如理论所预言的那样。
而在计数估计这一侧,用SIS方式(权重平均后取对数)估计出来的log Z,从训练一开始就稳定在真实值的0.02个nat以内,即便此时策略离均匀分布还差得很远。反倒是GFlowNet训练过程里附带产生的那个log Z估计值,一开始比真实值低了0.9个nat,而且要等到策略几乎训练收敛才慢慢追上来,训练结束时依然差了0.005个nat。这个细节印证了作者的判断:计数这件事,交给SIS的权重平均去做,比依赖GFlowNet自己训练出来的那个附带估计值靠谱得多。
代价与边界
任何方法都有成本,MarginFlow也不例外。
论文里给出了实测的耗时对比,在13个不同规模的矩阵上,MarginFlow每次抽样在GPU上运行,Harrison-Miller方法在CPU上跑。多数情况下MarginFlow的有效抽样速度是Harrison-Miller方法的1.2到9.2倍,差距最大的两个案例分别达到9.2倍和6.2倍,恰好就是那些经典方法损失最严重的矩阵。当然,训练这个网络本身需要成本,三个种子每个训练了大约25小时,用了8块A100显卡,但这个成本是一次性的,之后可以反复用在任意新的边际条件上,不需要为每个新矩阵重新训练。
网络能处理多大规模的矩阵,取决于它读取状态时遇到的"可行行类型"数量。这个数字会随着列和取值的多样性增长,作者训练时把这个数字限制在2万以内,评测时放宽到10万以内。如果类型数远超这个范围,论文里提到了一个替代方案:把一行的1逐组填入而不是一次性决定整行,理论上依然精确,只是训练每一步的代价会高出九倍左右,作者把它留作了下一步的工作方向。
写在后面
读完这篇论文,最触动我的其实不是那个99.8%的中位数,那个数字固然亮眼,但真正让人愿意多想一层的是那个"困境矩阵"实验:56个连事后诸葛亮式的最优选择都救不了的矩阵,MarginFlow却能把有效样本比例从10.3%拉到94.1%。这说明的不是MarginFlow比某个具体方法强,而是"用固定公式去逼近一个动态变化的目标"这件事,本身就存在一个天花板,无论你怎么调参数、怎么事后择优,都跳不出这个天花板。而学习方法能打破天花板,靠的不是更聪明的公式,是换了一种从数据里自我修正的机制。
另一个让我反复咀嚼的细节,是论文里那个关于"GFlowNet附带估计的log Z为什么不能直接用"的讨论。这其实是一个容易被忽略的陷阱:一个模型训练过程中顺带产出的某个数值,看起来像是免费的副产品,但它的准确性其实依赖于训练是否已经收敛。如果你没有意识到这一点,直接拿这个"半成品"数值当结果用,得到的答案会系统性地偏小,而且偏小的幅度还取决于你训练到了哪一步,这是一种很隐蔽的错误来源。作者选择老老实实用SIS的权重平均去做计数,而不是偷懒用那个看起来更方便的附带值,这个取舍本身值得记一笔。
论文结尾处提到,这套"逐行构造、剩余部分又是同类新问题"的思路,不只适用于0-1矩阵,还能推广到整数值的列联表、指定度数的图、甚至完美匹配和拉丁矩形这些组合数学对象。这让我忍不住想,这种"自相似性可以被一个共享网络利用"的思路,会不会在更多"手工设计公式已经卡了几十年瓶颈"的领域里,重新掀起一轮"能不能换成学出来"的浪潮?
Q&A
Q1:MarginFlow是什么?
A:MarginFlow是一种用于二元矩阵采样和计数的框架,它训练一个集合变换器网络来读取矩阵剩余的行和列约束条件,输出下一行的选择概率,从而用一个网络服务所有不同的边际条件问题,无需为每个新矩阵重新训练。
Q2:MarginFlow和经典的序贯重要性采样方法比效果如何?
A:在1190个测试矩阵中的1187个上,MarginFlow打平或超过了31种经典配置里事后挑选出的最优表现,中位有效样本比例达到99.8%。在56个经典方法表现最差的困难矩阵上,MarginFlow全部胜出,中位有效样本比例从10.3%提升到94.1%。
Q3:为什么理想的采样建议分布算不出来?
A:因为理想分布要求按照"剩余能完成多少种表格"的比例来选择下一行,而计算这个数字本身就等同于求解和原问题一样难的计数问题,属于自我循环依赖,所以经典方法只能用近似公式去逼近它,而MarginFlow选择用神经网络从采样数据中直接学习这个分布。