
本文講的是<b>利用遺傳算法,完爆初級程式員,</b>讓AI自動程式設計一直是計算機科學家的夢想。目前這個方面的成果還非常有限,比如讓AI自動補完程式設計語言,或者執行簡單的加法程式。今天我們要介紹的這項工作,号稱是第一個能夠全自動生成完整軟體程式的機器學習系統“AI Programmer”。
研究人員表示,他們用這個系統證明了長久以來的假設,那就是功能完備的程式确實能夠被自動生成。具體到這項工作,AI Programmer利用機器學習中的遺傳算法,模拟複雜的指令。雖然現在AI Programmer生成的程式,複雜程度與人類新手程式員編寫的結果相當。但研究人員認為,AI Programmer編寫的程式完全可以超越傳統範疇,不受人類時間和智慧的局限。
AI編寫的程式隻是在測試複雜度和計算資源之間找得到最适合的點。換句話說,可能性無限。
研究人員還表示,我們需要重新思考,設計新的、面向機器的程式設計語言,因為目前的程式設計語言是面向人類的,不适用于基于ML的程式設計。“在考慮ML驅動程式生成的未來時,我們需要放棄和重新考慮典型程式語言建立的方法。”
研究人員寫道,隻有這樣做,我們才能開始設想一個由AI系統驅動,以人類創造力和設計為指導的計算機軟體開發的新未來。
AI Programmer的軟體架構。從圖中可見,由人類驅動的部分非常少,隻需要在開始輸入指令,最後接收适用于某項任務的函數即可,剩下部分全部由機器完成。
AI Programmer:利用遺傳算法自動生成程式,理論上能夠完成所有類型的任務
根據論文,研究人員選擇了無類型程式設計語言,隻包括了8種指令來驅動AI Programmer生成軟體。
AI Programmer使用的程式設計語言是圖靈完備的,如表1所示。理論上,在時間和記憶體不限的情況下,圖靈完備程式設計語言能夠處理任何程式設計任務。本質上,任何一種具有這種特質的程式設計語言都能夠解決海量程式設計問題。同樣,AI Programmer生成的軟體能夠完成所有任務。
有了這個保障,再來看AI Programmer的核心——遺傳算法。
要使用遺傳算法生成軟體程式,必須首先建立一個基因組(genome)。基因組是一組被組合在一起作為單個單元的基因。AI Programmer的基因組編碼為浮點數組,每個唯一指令的固定值範圍在0和1之間,如上面表1的基因範圍列所示。
建立好基因組後,AI Programmer就将其轉換為相應的程式,執行,并根據程式的輸出為結果程式配置設定适合度。生成的程式越靠近解決提供的任務,适應度就越高,越有可能繼續進行下一代的進化。在每一代,AI Programmer利用随機選擇以及交叉和變異來建立子程式,其中包含輕微的随機擾動,并且可能比其父母更好的基因組來解決目标任務。
圖3展示了從浮點數組中建構基因組的執行個體。每個值範圍映射到程式設計語言中的特定指令。最初,這些值是随機的,導緻生成的程式無法正常運作。但是,其中必将有一兩個能夠運作并執行一些有效的指令。一個程式執行得越成功,就越有可能繼續使用代碼,實作更成功的後代。
為了建立後代,父母将其基因的一部分交給孩子,這個過程如圖4所示。除了繼承父母的程式設計指令外,每個孩子也可能會遇到突變,也就是對特定基因增加受控但随機的擾動。這導緻特定基因的值發生修改,使所得到的程式設計指令發生變化,進而改變整個程式。
可執行程式根據其執行情況進行排名,如圖5所示。其中,特定程式會被立即從基因組池中删除,成功的方案則被推進以産生新的後代。
AI Programmer使用結果:輸出“Hello World”,反轉字元串,加減乘,輸出斐波那契數列……
AI Programmer由C#.NET設計的子產品化架構組成。包括運作遺傳算法的引擎,基因組編碼器和解碼器,用于執行模拟程式的沙箱解讀器,以及将代碼轉換為二進制可執行檔案的編譯程式。雖然最初設計AI Programmer的時候使用C#,但需要注意的是,設計原則并不限于使用C#。
研究人員指出,AI Programmer的适應性測試軟體架構具有延展性,并已被開發。使用者可以自己設計無數的定制化軟體,最終指導系統的遺傳算法(GA)生成和軟體程式演變。
如果目标程式旨在生成一個字元串,如”Hello World”(見上圖),測試分數可能是字元串中的數字。但由于AI Programmer是在位元組級生成代碼,測試分數應将輸出字元的增量差考慮在内。
研究人員表示i,他們能用AI Programmer生成很多軟體程式。表2是所生成程式的名單。
一開始,研究人員讓AI Programmer生成了一個非常簡單的程式來輸出“hi”。經過5700代後,測試成功。生成代碼如圖9所示。
經過580,900代後,生成了“hello world”,如圖10所示。
經過6,057,200代後,AI Programmer成功生成了”I love all humans”,如圖11所示。
AI Programmer生成反轉字元串的程式。生成代碼如圖13所示。
AI Programmer能在92,400代之後生成加法程式;在177,900代之後生成減法程式,如圖15所示。
圖16所示的生成程式可以從兩個初始輸入值來輸出斐波納契序列。
論文:AI Programmer,使用遺傳算法自動建立軟體程式
在本文中,我們介紹了首個能夠自動生成完整軟體程式的機器學習(ML)系統,全程隻需最低限度的人類參與。這個系統名叫“AI Programmer”,以遺傳算法(GA)為核心,加上緊密限制的程式設計語言,将其ML搜尋空間的開銷降到最低。AI Programmer的新穎部分源于(i)獨特的系統設計,包括用于效率和安全性的嵌入式手工解釋器(hand-crafted interpreter),以及(ii)對遺傳算法的增強,納入了指令基因(instruction-gene)随機化綁定,以及程式設計語言特定的基因組建構及消除技術。我們詳細介紹了AI Programmer的系統設計,詳細介紹了系統的工作原理,以及使用主流CPU來示範其軟體生成功能和性能的實驗資料。
原文釋出時間為:2017-09-20
編譯:聞菲,常佩琦
本文來自雲栖社群合作夥伴新智元,了解相關資訊可以關注“AI_era”微信公衆号
<a href="https://mp.weixin.qq.com/s/wvcpx41O2763OgA8uYSFHw">原文連結</a>