0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

谷歌DeepMind發(fā)現(xiàn)更快排序算法,已集成到C++庫

jf_WZTOguxH ? 來源:AI前線 ? 2023-06-09 17:11 ? 次閱讀

接觸過基礎(chǔ)計(jì)算機(jī)科學(xué)課程的朋友們,肯定都曾親自動(dòng)手設(shè)計(jì)排序算法——也就是借助代碼將無序列表中的各個(gè)條目按升序或降序方式重新排列。這是個(gè)有趣的挑戰(zhàn),可行的操作方法也多種多樣。人們?cè)度氪罅繒r(shí)間探索如何更高效地完成排序任務(wù)。

作為一項(xiàng)基礎(chǔ)操作,大多數(shù)編程語言的標(biāo)準(zhǔn)庫中都內(nèi)置有排序算法。世界各地的代碼庫中使用了許多不同的排序技術(shù)和算法來在線組織大量數(shù)據(jù),但至少就與 LLVM 編譯器配套使用的 C++ 庫而言,排序代碼已經(jīng)有十多年沒有任何變化了。

近日,谷歌 DeepMind AI 小組如今開發(fā)出一種強(qiáng)化學(xué)習(xí)工具 AlphaDev,能夠在無需通過人類代碼示例做預(yù)訓(xùn)練的情況下,開發(fā)出極限優(yōu)化的算法。如今,這些算法已經(jīng)集成到 LLVM 標(biāo)準(zhǔn) C++ 排序庫中,這是十多年來排序庫部分第一次發(fā)生變化,也是第一次將通過強(qiáng)化學(xué)習(xí)設(shè)計(jì)的算法添加到該庫中。

編程過程視為“游戲”

由于不必預(yù)先接觸任何人類游戲策略,DeepMind 系統(tǒng)往往能發(fā)現(xiàn)人類從未設(shè)想過的攻關(guān)思路。當(dāng)然,由于完全依靠自我對(duì)抗來學(xué)習(xí)經(jīng)驗(yàn),DeepMind 在某些情況下也會(huì)形成可被人類利用的盲點(diǎn)。

這種方法跟編程其實(shí)非常相似。大語言模型之所以能夠編寫出有效代碼,就是因?yàn)樗鼈兛吹竭^大量人類代碼示例。但也正因?yàn)槿绱?,語言模型很難產(chǎn)出人類之前沒做過的東西。如果我們希望對(duì)普遍存在的現(xiàn)有算法(例如排序函數(shù))做進(jìn)一步優(yōu)化,那么繼續(xù)依賴現(xiàn)有人類代碼將很難突破固有思路的束縛。那么,如何才能讓 AI 找到真正的新方向?

DeepMind 的研究人員采用了與國際象棋和圍棋相同的方法:把代碼優(yōu)化任務(wù)轉(zhuǎn)化成單人“組裝游戲”。AlphaDev 系統(tǒng)開發(fā)出一種 x86 匯編算法,會(huì)將代碼的運(yùn)行延遲視為一個(gè)分?jǐn)?shù),在努力將該分?jǐn)?shù)最小化的同時(shí)確保代碼能夠順暢跑通。通過強(qiáng)化學(xué)習(xí),AlphaDev 逐漸具備了編寫緊湊、高效代碼的能力。

AlphaDev 基于 AlphaZero。DeepMind 向來以開發(fā)能自學(xué)游戲規(guī)則的 AI 軟件而聞名。這種思路被證明效果拔群,也先后攻克了國際象棋、圍棋和《星際爭霸》等諸多游戲難題。雖然具體細(xì)節(jié)因所玩游戲而異,但 DeepMind 軟件確實(shí)能在重復(fù)游玩中不斷學(xué)習(xí),持續(xù)探索能令得分最大化的辦法。

AlphaDev 的兩個(gè)核心組件是學(xué)習(xí)算法和表示函數(shù)。

AlphaDev 學(xué)習(xí)算法可以結(jié)合 DRL 和隨機(jī)搜索優(yōu)化算法來玩組裝游戲。AlphaDev 中的主要學(xué)習(xí)算法是 AlphaZero 33 的擴(kuò)展,AlphaZero 33 是一種著名的 DRL 算法,其中訓(xùn)練神經(jīng)網(wǎng)絡(luò)以指導(dǎo)搜索完成游戲。

表示函數(shù),負(fù)責(zé)跟蹤代碼開發(fā)時(shí)的整體性能,其中包括算法的常規(guī)結(jié)構(gòu)以及對(duì) x86 寄存器和內(nèi)存的使用。該系統(tǒng)會(huì)單獨(dú)添加匯編指令,通過蒙特卡洛樹搜索(同樣是一種從游戲系統(tǒng)中借用的方法)進(jìn)行選擇。樹狀結(jié)構(gòu)允許系統(tǒng)快速將搜索范圍縮小至包含大量潛在指令的有限區(qū)域,而蒙特卡洛方法則以一定程度的隨機(jī)性從這個(gè)分支區(qū)域內(nèi)選擇具體指令。(請(qǐng)注意,這里所說的“指令”是為創(chuàng)建有效、完整程序集而選擇特定寄存器等操作。)

之后,系統(tǒng)會(huì)評(píng)估匯編代碼的延遲和有效性狀態(tài),為其打分并與前一次得分進(jìn)行比較。而通過強(qiáng)化學(xué)習(xí),系統(tǒng)會(huì)在給定的程序狀態(tài)之下保留樹結(jié)構(gòu)中不同分支的工作信息。隨著時(shí)間推移,系統(tǒng)將逐漸“學(xué)會(huì)”如何以最高得分(代表最低延遲)獲得游戲勝利(成功完成排序)。AlphaDev 的主要表示函數(shù)基于 Transformer。

為了訓(xùn)練 AlphaDev 發(fā)現(xiàn)新算法,AlphaDev 在每輪中都會(huì)觀察它生成的算法和中央處理器 (CPU) 中包含的信息,然后通過選擇要添加到算法中的指令完成游戲。AlphaDev 必須有效地搜索大量可能的指令組合,以找到可以排序的算法,并且還要比當(dāng)前最好的算法更快,同時(shí)代理模型可以根據(jù)算法的正確性和延遲獲得獎(jiǎng)勵(lì)。

4093e6a4-0691-11ee-962d-dac502259ad0.png

圖 A:組裝游戲,圖 B:獎(jiǎng)勵(lì)計(jì)算

最終,AlphaDev 發(fā)現(xiàn)了新的排序算法,這些算法可以讓 LLVM libc++ 排序庫得到改進(jìn):對(duì)于較短的序列,排序庫的速度提高了 70%;對(duì)于超過 250,000 個(gè)元素的序列,速度提高了約 1.7%。

具體而言,該算法的創(chuàng)新主要在于兩種指令序列:AlphaDev Swap Move(交換移動(dòng))和 AlphaDev Copy Move(復(fù)制移動(dòng)),通過這兩個(gè)指令,AlphaDev 跳過了一個(gè)步驟,以一種看似錯(cuò)誤但實(shí)際上是捷徑的方式連接項(xiàng)目。

40ae4328-0691-11ee-962d-dac502259ad0.png

左圖:帶有 min(A,B,C) 的原始 sort3 實(shí)現(xiàn)。?

右圖:AlphaDev Swap Move - AlphaDev 發(fā)現(xiàn)你只需要 min(A,B)。

40ec3dc2-0691-11ee-962d-dac502259ad0.png

左:max (B, min (A, C)) 的原始實(shí)現(xiàn)用于對(duì)八個(gè)元素進(jìn)行排序的更大排序算法。

?右:AlphaDev 發(fā)現(xiàn)在使用其復(fù)制移動(dòng)時(shí)只需要 max (B, min (A, C))。

這套系統(tǒng)的主要優(yōu)勢在于,其訓(xùn)練過程不借助任何代碼示例。相反,系統(tǒng)會(huì)自主生成代碼示例,然后對(duì)其做出評(píng)估。過程當(dāng)中,它也就逐漸掌握了關(guān)于有效排序的指令組合信息。

從排序到散列

在發(fā)現(xiàn)更快的排序算法后,DeepMind 測試了 AlphaDev 是否可以概括和改進(jìn)不同的計(jì)算機(jī)科學(xué)算法:散列。

哈希是計(jì)算中用于檢索、存儲(chǔ)和壓縮數(shù)據(jù)的基本算法。就像使用分類系統(tǒng)來定位某本書的圖書管理員一樣,散列算法可以幫助用戶知道他們正在尋找什么以及在哪里可以找到它。這些算法獲取特定密鑰的數(shù)據(jù)(例如用戶名“Jane Doe”)并對(duì)其進(jìn)行哈希處理——這是一個(gè)將原始數(shù)據(jù)轉(zhuǎn)換為唯一字符串(例如 1234ghfty)的過程。計(jì)算機(jī)使用此散列來快速檢索與密鑰相關(guān)的數(shù)據(jù),而不是搜索所有數(shù)據(jù)。

DeepMind 將 AlphaDev 應(yīng)用于數(shù)據(jù)結(jié)構(gòu)中最常用的散列算法之一,以嘗試發(fā)現(xiàn)更快的算法。當(dāng)將其應(yīng)用于散列函數(shù)的 9-16 字節(jié)范圍時(shí),AlphaDev 發(fā)現(xiàn)的算法速度提高了 30%。

今年,AlphaDev 的新哈希算法被發(fā)布到開源 Abseil 庫中,可供全球數(shù)百萬開發(fā)人員使用,該庫現(xiàn)在每天被數(shù)萬億次使用。

實(shí)際可用的代碼

復(fù)雜程序中的排序機(jī)制能夠處理大量任意條目的集合。但在標(biāo)準(zhǔn)庫層面來看,這種能力源自一系列高度限定的具體函數(shù)。這些函數(shù)各自只能處理一種或幾種情況。例如,某些單獨(dú)算法只能對(duì) 3、4 或 5 個(gè)條目做排序。我們也可以同時(shí)使用一組函數(shù)對(duì)任意數(shù)量的條目作排序,但原則上每一次函數(shù)調(diào)用最多只能對(duì) 4 個(gè)條目做排序。

DeepMind 在每個(gè)函數(shù)上都設(shè)置了 AlphaDev,其實(shí)際運(yùn)行方式有著很大區(qū)別。對(duì)于負(fù)責(zé)處理特定數(shù)量條目的函數(shù),可以編寫出不含任何分支的代碼,即根據(jù)變量狀態(tài)執(zhí)行不同的代碼。因此代碼性能往往與所涉及的指令數(shù)量成反比。

AlphaDev 已經(jīng)成功將 sort-3、sort-5 和 sort-8 的指令數(shù)量各減一,在 sort-6 和 sort-7 中的指令削減量甚至更多。只有 sort-4 上沒能找到改進(jìn)現(xiàn)有代碼的方法。而在實(shí)際系統(tǒng)上的重復(fù)運(yùn)行測試證明,更少的指令確實(shí)帶來了更好的性能。

至于對(duì)可變數(shù)量條目進(jìn)行排序,則要求代碼中包含分支,而不同處理器專用于處理這些分支的元件數(shù)量也有區(qū)別。

對(duì)于這類情況,研究人員在 100 臺(tái)不同的計(jì)算設(shè)備上對(duì)代碼性能做出了評(píng)估。AlphaDev 在這類場景下同樣找到了進(jìn)一步榨取性能的方法,下面我們以一次最多排序 4 個(gè)條目的函數(shù)為例,看看它到底是怎么操作的。

在 C++ 庫的現(xiàn)有實(shí)現(xiàn)中,代碼需要進(jìn)行一系列測試來確認(rèn)具體需要對(duì)多少個(gè)條目做排序,再根據(jù)條目數(shù)量調(diào)用相應(yīng)的排序函數(shù)。

而 AlphaDev 修改后的代碼則采取更加“神奇”的思路:它先測試是不是 2 個(gè)條目,如果是則調(diào)用相應(yīng)函數(shù)立即做排序。如果數(shù)量大于 2 個(gè),則代碼會(huì)先對(duì)前 3 個(gè)條目做排序。這樣如果確實(shí)只有 3 個(gè)條目,則返回排序結(jié)果。由于實(shí)際是有 4 個(gè)條目要做排序,所以 AlphaDev 會(huì)運(yùn)行專門代碼,以非常高效的方式將第 4 個(gè)條目插入到前 3 個(gè)已經(jīng)排序完成的條目中的適當(dāng)位置。

這種辦法聽起來有點(diǎn)怪異,但事實(shí)證明其性能確實(shí)始終優(yōu)于現(xiàn)有代碼。

由于 AlphaDev 確實(shí)生成了更高效的代碼,所以研究團(tuán)隊(duì)打算把這些成果重新合并到 LLVM 標(biāo)準(zhǔn) C++ 庫中。但問題是這些代碼為匯編格式,而非 C++。所以他們必須通過逆向計(jì)算找到能夠生成相同程序集的 C++ 代碼。

現(xiàn)如今,代碼成果已經(jīng)被合并至 LLVM 工具鏈內(nèi),成為十多年來這部分代碼的首次更新。研究人員估計(jì),AlphaDev 生成的新代碼正每天被執(zhí)行數(shù)萬億次。

結(jié)束語

“太棒了!將我們程序員很早就學(xué)會(huì)的這種基本排序任務(wù)的速度提高了 70%??吹?AI 在我們都依賴的算法和庫中提供重大加速,真是令人興奮?!庇?a target="_blank">開發(fā)者對(duì)谷歌 DeepMind 的成果表示振奮。

但也有開發(fā)者并不買賬:“相當(dāng)令人失望……1.7% 的改善?5 個(gè)元素的序列 70%?可能是最不受歡迎、最不切實(shí)際的應(yīng)用研究……”也有開發(fā)者表示:“說發(fā)現(xiàn)了新算法是不是有點(diǎn)誤導(dǎo)人?似乎更像是算法優(yōu)化。無論如何這仍然很酷?!?/p>

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 算法
    +關(guān)注

    關(guān)注

    23

    文章

    4577

    瀏覽量

    92354
  • 編程語言
    +關(guān)注

    關(guān)注

    10

    文章

    1921

    瀏覽量

    34507
  • C++
    C++
    +關(guān)注

    關(guān)注

    21

    文章

    2090

    瀏覽量

    73408
  • 強(qiáng)化學(xué)習(xí)

    關(guān)注

    4

    文章

    264

    瀏覽量

    11183

原文標(biāo)題:AI幫助人類打破十年算法瓶頸:谷歌 DeepMind 發(fā)現(xiàn)更快排序算法,已集成到C++庫

文章出處:【微信號(hào):AI前線,微信公眾號(hào):AI前線】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    時(shí)間復(fù)雜度為 O(n^2) 的排序算法

    作者:京東保險(xiǎn) 王奕龍 對(duì)于小規(guī)模數(shù)據(jù),我們可以選用時(shí)間復(fù)雜度為 O(n2) 的排序算法。因?yàn)闀r(shí)間復(fù)雜度并不代表實(shí)際代碼的執(zhí)行時(shí)間,它省去了低階、系數(shù)和常數(shù),僅代表的增長趨勢,所以在小規(guī)模數(shù)據(jù)情況下
    的頭像 發(fā)表于 10-19 16:31 ?705次閱讀
    時(shí)間復(fù)雜度為 O(n^2) 的<b class='flag-5'>排序</b><b class='flag-5'>算法</b>

    OpenHarmony標(biāo)準(zhǔn)系統(tǒng)C++公共基礎(chǔ)類案例:HelloWorld

    1、程序簡介該程序是基于凌蒙派OpenHarmony-v3.2.1標(biāo)準(zhǔn)系統(tǒng)C++公共基礎(chǔ)類的簡單案例:HelloWorld。主要講解C++公共基礎(chǔ)類案例如何搭建和編譯。2、程序解析
    的頭像 發(fā)表于 08-13 08:23 ?368次閱讀
    OpenHarmony標(biāo)準(zhǔn)系統(tǒng)<b class='flag-5'>C++</b>公共基礎(chǔ)類<b class='flag-5'>庫</b>案例:HelloWorld

    ESP32+Eclipse如何添加C++生成的靜態(tài)?

    ESP32+Eclipse如何添加C++生成的靜態(tài)?
    發(fā)表于 06-21 08:20

    手把手教你排序算法怎么寫

    今天以直接插入排序算法,給大家分享一下排序算法的實(shí)現(xiàn)思路,主要包含以下部分內(nèi)容:插入排序介紹插入排序
    的頭像 發(fā)表于 06-04 08:03 ?594次閱讀
    手把手教你<b class='flag-5'>排序</b><b class='flag-5'>算法</b>怎么寫

    谷歌DeepMind發(fā)布人工智能模型AlphaFold最新版本

    谷歌DeepMind近日發(fā)布了人工智能模型AlphaFold的最新版本——AlphaFold 3,這一革命性的工具將在藥物發(fā)現(xiàn)和疾病治療領(lǐng)域發(fā)揮巨大作用。
    的頭像 發(fā)表于 05-10 11:26 ?515次閱讀

    鴻蒙OS開發(fā)實(shí)例:【Native C++

    使用DevEco Studio創(chuàng)建一個(gè)Native C++應(yīng)用。應(yīng)用采用Native C++模板,實(shí)現(xiàn)使用NAPI調(diào)用C標(biāo)準(zhǔn)的功能。使用C
    的頭像 發(fā)表于 04-14 11:43 ?2372次閱讀
    鴻蒙OS開發(fā)實(shí)例:【Native <b class='flag-5'>C++</b>】

    FPGA實(shí)現(xiàn)雙調(diào)排序算法的探索與實(shí)踐

    雙調(diào)排序(BitonicSort)是數(shù)據(jù)獨(dú)立(Data-independent)的排序算法,即比較順序與數(shù)據(jù)無關(guān),特別適合并行執(zhí)行。在了解雙調(diào)排序
    發(fā)表于 03-14 09:50 ?459次閱讀
    FPGA實(shí)現(xiàn)雙調(diào)<b class='flag-5'>排序</b><b class='flag-5'>算法</b>的探索與實(shí)踐

    C語言實(shí)現(xiàn)經(jīng)典排序算法概覽

    冒泡排序(英語:Bubble Sort)是一種簡單的排序算法。它重復(fù)地走訪過要排序的數(shù)列,一次比較兩個(gè)元素,如果他們的順序(如從大小、首字
    的頭像 發(fā)表于 02-25 12:27 ?394次閱讀
    <b class='flag-5'>C</b>語言實(shí)現(xiàn)經(jīng)典<b class='flag-5'>排序</b><b class='flag-5'>算法</b>概覽

    谷歌捐款100萬美元給Rust基金會(huì),以增強(qiáng)C++與Rust的交互性

    如今,谷歌多項(xiàng)核心業(yè)務(wù)仍以 C++為主要編程語言,雖然無法直接使用Rust替代現(xiàn)有的C++程序,但谷歌依然選擇支持Rust基金會(huì)的“Interop Initiative”計(jì)劃,幫助那些
    的頭像 發(fā)表于 02-19 15:41 ?541次閱讀

    谷歌DeepMind資深A(yù)I研究員創(chuàng)辦AI Agent創(chuàng)企

    近日,剛從谷歌DeepMind離職的資深A(yù)I研究員Ioannis Antonoglou宣布創(chuàng)辦了一家名為“AI Agent”的創(chuàng)企。Ioannis Antonoglou常駐倫敦,此前曾擔(dān)任谷歌
    的頭像 發(fā)表于 02-04 10:02 ?682次閱讀

    C++簡史:C++是如何開始的

    MISRA C++:2023,MISRA? C++ 標(biāo)準(zhǔn)的下一個(gè)版本,來了!為了幫助您做好準(zhǔn)備,我們介紹了 Perforce 首席技術(shù)支持工程師 Frank van den Beuken 博士撰寫
    的頭像 發(fā)表于 01-11 09:00 ?492次閱讀
    <b class='flag-5'>C++</b>簡史:<b class='flag-5'>C++</b>是如何開始的

    十大排序算法總結(jié)

    排序算法是最經(jīng)典的算法知識(shí)。因?yàn)槠鋵?shí)現(xiàn)代碼短,應(yīng)該廣,在面試中經(jīng)常會(huì)問到排序算法及其相關(guān)的問題。一般在面試中最??嫉氖强焖?/div>
    的頭像 發(fā)表于 12-20 10:39 ?1048次閱讀

    OpenHarmony C++公共基礎(chǔ)類應(yīng)用案例:HelloWorld

    1、程序簡介該程序是基于OpenHarmony的C++公共基礎(chǔ)類的簡單案例:HelloWorld。該應(yīng)用案例已在OpenHarmony凌蒙派-RK3568開發(fā)板(即
    的頭像 發(fā)表于 11-23 08:22 ?650次閱讀
    OpenHarmony <b class='flag-5'>C++</b>公共基礎(chǔ)類<b class='flag-5'>庫</b>應(yīng)用案例:HelloWorld

    OpenHarmony C++公共基礎(chǔ)類應(yīng)用案例:Thread

    1、程序簡介該程序是基于OpenHarmony的C++公共基礎(chǔ)類的線程處理:Thread。該應(yīng)用案例已在OpenHarmony凌蒙派-RK3568開發(fā)板(即
    的頭像 發(fā)表于 11-23 08:22 ?815次閱讀
    OpenHarmony <b class='flag-5'>C++</b>公共基礎(chǔ)類<b class='flag-5'>庫</b>應(yīng)用案例:Thread

    C++之父新作帶你勾勒現(xiàn)代C++地圖

    為了幫助大家解決這些痛點(diǎn)問題,讓大家領(lǐng)略現(xiàn)代C++之美,掌握其中的精髓,更好地使用C++C++之父Bjarne Stroustrup坐不住了,他親自操刀寫就了這本《C++之旅》!
    的頭像 發(fā)表于 10-30 16:35 ?751次閱讀
    <b class='flag-5'>C++</b>之父新作帶你勾勒現(xiàn)代<b class='flag-5'>C++</b>地圖