用 AI 平衡 Sinkhorn 传输:每行都归一了,为什么两列仍然分得不对
在特征匹配或分布比较中,一行权重常表示某个来源分给各目标的质量。逐行softmax能保证每个来源分完自己的份额,却不保证目标收到的总量合适。最优传输同时约束两端,Sinkhorn迭代通过交替缩放行与列来满足这两套配额。
AI模型生成的概念插图:来源质量可以拆分流向多个目标;线条不是精确传输量、匹配结果或软件截图。
两边都只分一半
原创例子有两个来源与两个目标,每个来源提供0.5,每个目标也必须收到0.5,总质量为1。传输矩阵P的每一项非负,行和与列和都应为0.5。成本矩阵两行是[0,0]和[0,ln(9)],表示只有第二来源到第二目标的通道有额外成本。
采用目标“总运输成本+εΣPᵢⱼ(ln Pᵢⱼ-1)”,取ε=1,使用自然对数。这一熵正则形式鼓励分散传输。对应核矩阵K逐项取exp(-成本/ε),得到[[1,1],[1,1/9]];K本身还不满足质量约束。
修完行,列未必跟着正确
先将K每行缩放到和为0.5,得到[[0.25,0.25],[0.45,0.05]]。两个来源各自都用完配额,可两列收到0.7和0.3,分别超出与少了0.2。把行归一称为“已经配平”,就漏掉另一端的约束。
再把两列分别乘0.5/0.7与0.5/0.3,列和回到0.5。但此时两行的和约为0.595238与0.404762,又偏离原配额。一次行缩放加一次列缩放通常不够,需要继续交替,并检查两套边际误差都足够小。
这道小题可以独立求出答案
因为四个边际都相同,任何可行矩阵都能写为[[a,0.5-a],[0.5-a,a]]。对该一元目标求导,得到ln(9)+2ln[a/(0.5-a)]。令它为0,可得a/(0.5-a)=1/3,所以a=0.125。
最终矩阵为[[0.125,0.375],[0.375,0.125]]。行列和确实都是0.5,且a位于合法范围内;一元目标的二阶导数为正,因此它是唯一最小值。本次程序同时做交替缩放与独立的一元导数检查,二者一致。
在本次直接缩放实现中,21轮后行列和的最大绝对误差低于10的负13次方。这个轮数只属于该小矩阵和停止条件,不能当作所有Sinkhorn问题的推荐迭代数。实现应报告残差,不能仅以循环已经跑完判断约束满足。
配平与低成本,需要一起看
结果仍给高成本通道分了0.125质量,因为目标中还包含熵项。若完全取消正则,本例可选[[0,0.5],[0.5,0]]取得零运输成本。不能只比较运输成本,就宣布带正则的解算错;二者优化的目标不同。
这里质量允许分割,不是必须一人配一个位置的硬指派。实际AI匹配还需设计成本、边际和正则强度;当核元素因极端成本下溢到0时,直接缩放也可能不稳,需要对数域等数值方法。这份计算卡适合先验收边际与目标定义,不代表真实匹配质量。
资料核对日期:2026年10月2日。算例为原创教学设定,已用独立程序复核,未进行真实模型训练或效果测试。
参考资料
Cuturi:Sinkhorn Distances: Lightspeed Computation of Optimal Transport,第4节


