AI系統(tǒng)首次實(shí)現(xiàn)真正自主編程:利用遺傳算法,完爆初級程序員
編者按:本文由微信公眾號“新智元”(ID:AI_era)編譯,來源:arXiv,編譯:聞菲,常佩琦,36氪經(jīng)授權(quán)發(fā)布。
讓AI自動編程是人工智能領(lǐng)域長久以來的夢想之一?,F(xiàn)在,來自彭博和英特爾實(shí)驗(yàn)室的兩位研究人員,號稱實(shí)現(xiàn)了首個能夠自動生成完整軟件程序的AI系統(tǒng)“AI Programmer”,這個“AI程序員”利用遺傳算法和圖靈完備語言,開發(fā)的程序理論上能夠完成任何類型的任務(wù)。AI自動編程的時(shí)代,大幕已開。
讓AI自動編程一直是計(jì)算機(jī)科學(xué)家的夢想。目前這個方面的成果還非常有限,比如讓AI自動補(bǔ)完編程語言,或者執(zhí)行簡單的加法程序。今天我們要介紹的這項(xiàng)工作,號稱是第一個能夠全自動生成完整軟件程序的機(jī)器學(xué)習(xí)系統(tǒng)“AI Programmer”。
研究人員表示,他們用這個系統(tǒng)證明了長久以來的假設(shè),那就是功能完備的程序確實(shí)能夠被自動生成。具體到這項(xiàng)工作,AI Programmer利用機(jī)器學(xué)習(xí)中的遺傳算法,模擬復(fù)雜的指令。雖然現(xiàn)在AI Programmer生成的程序,復(fù)雜程度與人類新手程序員編寫的結(jié)果相當(dāng)。但研究人員認(rèn)為,AI Programmer編寫的程序完全可以超越傳統(tǒng)范疇,不受人類時(shí)間和智慧的局限。
AI編寫的程序只是在測試復(fù)雜度和計(jì)算資源之間找得到最適合的點(diǎn)。換句話說,可能性無限。
研究人員還表示,我們需要重新思考,設(shè)計(jì)新的、面向機(jī)器的編程語言,因?yàn)楫?dāng)前的編程語言是面向人類的,不適用于基于ML的編程。“在考慮ML驅(qū)動程序生成的未來時(shí),我們需要放棄和重新考慮典型程序語言創(chuàng)建的方法。”
研究人員寫道,只有這樣做,我們才能開始設(shè)想一個由AI系統(tǒng)驅(qū)動,以人類創(chuàng)造力和設(shè)計(jì)為指導(dǎo)的計(jì)算機(jī)軟件開發(fā)的新未來。
AI Programmer的軟件架構(gòu)。從圖中可見,由人類驅(qū)動的部分非常少,只需要在開始輸入指令,最后接收適用于某項(xiàng)任務(wù)的函數(shù)即可,剩下部分全部由機(jī)器完成。
AI Programmer:利用遺傳算法自動生成程序,理論上能夠完成所有類型的任務(wù)
根據(jù)論文,研究人員選擇了無類型編程語言,只包括了8種指令來驅(qū)動AI Programmer生成軟件。
AI Programmer使用的編程語言是圖靈完備的,如表1所示。理論上,在時(shí)間和內(nèi)存不限的情況下,圖靈完備編程語言能夠處理任何編程任務(wù)。本質(zhì)上,任何一種具有這種特質(zhì)的編程語言都能夠解決海量編程問題。同樣,AI Programmer生成的軟件能夠完成所有任務(wù)。
有了這個保障,再來看AI Programmer的核心——遺傳算法。
要使用遺傳算法生成軟件程序,必須首先創(chuàng)建一個基因組(genome)。基因組是一組被組合在一起作為單個單元的基因。AI Programmer的基因組編碼為浮點(diǎn)數(shù)組,每個唯一指令的固定值范圍在0和1之間,如上面表1的基因范圍列所示。
創(chuàng)建好基因組后,AI Programmer就將其轉(zhuǎn)換為相應(yīng)的程序,執(zhí)行,并根據(jù)程序的輸出為結(jié)果程序分配適合度。生成的程序越靠近解決提供的任務(wù),適應(yīng)度就越高,越有可能繼續(xù)進(jìn)行下一代的進(jìn)化。在每一代,AI Programmer利用隨機(jī)選擇以及交叉和變異來創(chuàng)建子程序,其中包含輕微的隨機(jī)擾動,并且可能比其父母更好的基因組來解決目標(biāo)任務(wù)。
圖3展示了從浮點(diǎn)數(shù)組中構(gòu)建基因組的實(shí)例。每個值范圍映射到編程語言中的特定指令。最初,這些值是隨機(jī)的,導(dǎo)致生成的程序無法正常運(yùn)行。但是,其中必將有一兩個能夠運(yùn)行并執(zhí)行一些有效的指令。一個程序執(zhí)行得越成功,就越有可能繼續(xù)使用代碼,實(shí)現(xiàn)更成功的后代。
為了創(chuàng)建后代,父母將其基因的一部分交給孩子,這個過程如圖4所示。除了繼承父母的編程指令外,每個孩子也可能會遇到突變,也就是對特定基因增加受控但隨機(jī)的擾動。這導(dǎo)致特定基因的值發(fā)生修改,使所得到的編程指令發(fā)生變化,進(jìn)而改變整個程序。
可執(zhí)行程序根據(jù)其執(zhí)行情況進(jìn)行排名,如圖5所示。其中,特定程序會被立即從基因組池中刪除,成功的方案則被推進(jìn)以產(chǎn)生新的后代。
AI Programmer使用結(jié)果:輸出“Hello World”,反轉(zhuǎn)字符串,加減乘,輸出斐波那契數(shù)列……
AI Programmer由C#.NET設(shè)計(jì)的模塊化框架組成。包括運(yùn)行遺傳算法的引擎,基因組編碼器和解碼器,用于執(zhí)行模擬程序的沙箱解讀器,以及將代碼轉(zhuǎn)換為二進(jìn)制可執(zhí)行文件的編譯程序。雖然最初設(shè)計(jì)AI Programmer的時(shí)候使用C#,但需要注意的是,設(shè)計(jì)原則并不限于使用C#。
研究人員指出,AI Programmer的適應(yīng)性測試軟件框架具有延展性,并已被開發(fā)。用戶可以自己設(shè)計(jì)無數(shù)的定制化軟件,最終指導(dǎo)系統(tǒng)的遺傳算法(GA)生成和軟件程序演變。
如果目標(biāo)程序旨在生成一個字符串,如”Hello World”(見上圖),測試分?jǐn)?shù)可能是字符串中的數(shù)字。但由于AI Programmer是在字節(jié)級生成代碼,測試分?jǐn)?shù)應(yīng)將輸出字符的增量差考慮在內(nèi)。
研究人員表示i,他們能用AI Programmer生成很多軟件程序。表2是所生成程序的名單。
一開始,研究人員讓AI Programmer生成了一個非常簡單的程序來輸出“hi”。經(jīng)過5700代后,測試成功。生成代碼如圖9所示。
經(jīng)過580,900代后,生成了“hello world”,如圖10所示。
經(jīng)過6,057,200代后,AI Programmer成功生成了”I love all humans”,如圖11所示。
AI Programmer生成反轉(zhuǎn)字符串的程序。生成代碼如圖13所示。
AI Programmer能在92,400代之后生成加法程序;在177,900代之后生成減法程序,如圖15所示。
圖16所示的生成程序可以從兩個初始輸入值來輸出斐波納契序列。
論文:AI Programmer,使用遺傳算法自動創(chuàng)建軟件程序
摘要
在本文中,我們介紹了首個能夠自動生成完整軟件程序的機(jī)器學(xué)習(xí)(ML)系統(tǒng),全程只需最低限度的人類參與。這個系統(tǒng)名叫“AI Programmer”,以遺傳算法(GA)為核心,加上緊密約束的編程語言,將其ML搜索空間的開銷降到最低。AI Programmer的新穎部分源于(i)獨(dú)特的系統(tǒng)設(shè)計(jì),包括用于效率和安全性的嵌入式手工解釋器(hand-crafted interpreter),以及(ii)對遺傳算法的增強(qiáng),納入了指令基因(instruction-gene)隨機(jī)化綁定,以及編程語言特定的基因組構(gòu)建及消除技術(shù)。我們詳細(xì)介紹了AI Programmer的系統(tǒng)設(shè)計(jì),詳細(xì)介紹了系統(tǒng)的工作原理,以及使用主流CPU來演示其軟件生成功能和性能的實(shí)驗(yàn)數(shù)據(jù)。