鱼羊 十三 发自 凹非寺
量子位 报道 | 公众号 QbitAI
快排堆排冒泡排。排序,在计算机中是再常见不过的算法。
在机器学习中,排序也经常用于统计数据、信息检索等领域。
那么问题来了,排序算法在函数角度上是分段线性的,也就是说,在几个分段的“节点”处是不可微的。这样,就给反向传播造成了困难。
现在,谷歌大脑针对这一问题,提出了一种快速可微分排序算法,并且,时间复杂度达到了O(nlogn),空间复杂度达为O(n)。
速度比现有方法快出一个数量级!

代码的PyTorch、TensorFlow和JAX版本即将开源。
快速可微分排序算法
现代深度学习架构通常是通过组合参数化功能块来构建,并使用梯度反向传播进行端到端的训练。
这也就激发了像LeCun提出的可微分编程 (differentiable programming)的概念。
虽然在经验上取得了较大的成功,但是许多操作仍旧存在不可微分的问题,这就限制了可以计算梯度的体系结构集。
诸如此类的操作就包括排序 (sorting)和排名 (ranking)。
从函数角度来看都是分段线性函数,排序的问题在于,它的向量包含许多不可微分的“节点”,而排名的秩要比排序还要麻烦。
首先将排序和排名操作转换为在排列多面体(permutahedron)上的线性过程,如下图所示。