自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

快速可微分排序算法包,自定義C ++和CUDA,性能更好

新聞 前端 算法
近日,有人在 GitHub 上開源了一個項目,通過軟件包的形式實現(xiàn)了快速可微分排序和排名,上線幾天,收獲 300 + 星。

 [[390293]]

谷歌去年年初在論文《Fast Differentiable Sorting and Ranking》中,重磅推出了首個具有 O(nlogn) 時間復(fù)雜度、O(n) 空間復(fù)雜度可微分排序算法,速度比現(xiàn)有方法快出一個數(shù)量級!

近日,有人在 GitHub 上開源了一個項目,通過軟件包的形式實現(xiàn)了快速可微分排序和排名,上線幾天,收獲 300 + 星。

快速可微分排序算法包,自定義C ++和CUDA,性能更好
  • 項目地址:https://github.com/teddykoker/torchsort
  • 《Fast Differentiable Sorting and Ranking》論文地址:https://arxiv.org/pdf/2002.08871.pdf

Torchsort

Torchsort 實現(xiàn)了 Blondel 等人提出的快速可微分排序和排名(Fast Differentiable Sorting and Ranking),是基于純 PyTorch 實現(xiàn)的。大部分代碼是在項目「google-research/fast-soft-sort」中的原始 Numpy 實現(xiàn)復(fù)制而來,并配有自定義 C ++ 和 CUDA 內(nèi)核以實現(xiàn)快速性能。

Torchsort 安裝方式非常簡單,采用常用的 pip 安裝即可,安裝代碼如下:

  1. pip install torchsort 

如果你想構(gòu)建 CUDA 擴展,你需要安裝 CUDA 工具鏈。如果你想在沒有 CUDA 運行環(huán)境中構(gòu)建如 docker 的應(yīng)用,在安裝前需要導(dǎo)出環(huán)境變量「TORCH_CUDA_ARCH_LIST="Pascal;Volta;Turing"」。

使用方法

torchsort 有兩個函數(shù):soft_rank 和 soft_sort,每個函數(shù)都有參數(shù) regularization (l2 或 kl) (正則化函數(shù))和 regularization_strength(標量值)。每個都將對二維張量的最后一個維度進行排序,準確率取決于正則化強度:

  1. import torch 
  2. import torchsort 
  3. x = torch.tensor([[805321679]]) 
  4. torchsort.soft_sort(x, regularization_strength=1.0
  5. # tensor([[0.55561.55562.55563.55564.55565.55566.55567.55568.5556]]) 
  6. torchsort.soft_sort(x, regularization_strength=0.1
  7. # tensor([[-0., 1., 2., 3., 5., 6., 7., 8., 9.]]) 
  8. torchsort.soft_rank(x) 
  9. # tensor([[8., 1., 5., 4., 3., 2., 6., 7., 9.]]) 

這兩個操作都是完全可微的,在 CPU 或 GPU 的實現(xiàn)方式如下:

  1. x = torch.tensor([[8., 0., 5., 3., 2., 1., 6., 7., 9.]], requires_grad=True).cuda() 
  2. y = torchsort.soft_sort(x) 
  3. torch.autograd.grad(y[00], x) 
  4. # (tensor([[0.11110.11110.11110.11110.11110.11110.11110.11110.1111]], 
  5. #         device='cuda:0'),) 

示例展示

斯皮爾曼等級系數(shù)是用于測量兩個變量之間單調(diào)相關(guān)性的非常有用的指標。我們可以使用 Torchsort 來創(chuàng)建可微的斯皮爾曼等級系數(shù)函數(shù),以便可以直接針對該指標優(yōu)化模型:

  1. import torch 
  2. import torchsort 
  3.  
  4.  
  5. def spearmanr(pred, target, **kw): 
  6.     pred = torchsort.soft_rank(pred, **kw) 
  7.     target = torchsort.soft_rank(target, **kw) 
  8.     pred = pred - pred.mean() 
  9.     pred = pred / pred.norm() 
  10.     target = target - target.mean() 
  11.     target = target / target.norm() 
  12.     return (pred * target).sum() 
  13.  
  14.  
  15. pred = torch.tensor([[1., 2., 3., 4., 5.]], requires_grad=True) 
  16. target = torch.tensor([[5., 6., 7., 8., 7.]]) 
  17. spearman = spearmanr(pred, target) 
  18. # tensor(0.8321
  19. torch.autograd.grad(spearman, pred) 
  20. # (tensor([[-5.5470e-02,  2.9802e-09,  5.5470e-02,  1.1094e-01, -1.1094e-01]]),) 

基準

快速可微分排序算法包,自定義C ++和CUDA,性能更好

torchsort 和 fast_soft_sort 這兩個操作的時間復(fù)雜度為 O(n log n),與內(nèi)置 torch.sort 相比,每個操作都具有一些額外的開銷。Numba JIT 的批處理大小為 1(請參見左圖),fast_soft_sort 的前向傳遞與 Torchsort CPU 內(nèi)核的性能大致相同,但是其后向傳遞仍然依賴于某些 Python 代碼,這極大地降低了其性能。

此外,torchsort 內(nèi)核支持批處理,隨著批處理大小的增加,會產(chǎn)生比 fast_soft_sort 更好的性能。

快速可微分排序算法包,自定義C ++和CUDA,性能更好

torchsort CUDA 內(nèi)核在序列長度低于 2000 時表現(xiàn)出色,并且可以擴展到非常大的 batch。在未來,CUDA 內(nèi)核可能會進一步優(yōu)化,以達到接近內(nèi)置的 torch.sort 的性能。

 

責任編輯:張燕妮 來源: 機器之心Pro
相關(guān)推薦

2020-02-25 07:00:54

谷歌Android技術(shù)

2022-10-09 08:35:06

SQL自定義排序

2009-08-04 09:56:46

C#事件處理自定義事件

2009-08-03 14:46:12

C#自定義控件

2009-08-03 13:34:06

自定義C#控件

2009-08-28 17:45:19

C#自定義數(shù)據(jù)

2009-08-03 13:39:46

C#自定義用戶控件

2009-08-04 08:58:01

C#自定義特性

2014-12-30 11:51:35

ListViewItem View

2015-07-29 10:31:16

Java緩存算法

2011-04-06 10:03:08

Cacti遠程監(jiān)控

2011-03-31 16:03:20

cacti性能計數(shù)器

2009-11-09 16:06:53

WCF自定義集合

2009-08-04 12:40:34

c#自定義事件

2009-08-12 14:53:50

C#類型轉(zhuǎn)換函數(shù)

2024-09-11 14:46:48

C#旋轉(zhuǎn)按鈕

2011-03-21 09:16:52

2014-10-30 15:14:54

快速排序編程算法

2018-03-16 08:41:16

Oracle存儲函數(shù)

2009-09-03 15:46:57

C#自定義事件
點贊
收藏

51CTO技術(shù)棧公眾號