AI Programmer--利用遺傳演算法實現AI Programmmer
本文是在讀完AI Programmer:Autnomously Creating Software Programs Using Genetic Algorithms一文之後寫的總結。
一、文章的任務
本文提出了一個可以自動完成程式設計任務的機器學習模型,即AI programmer。該模型使用遺傳演算法(Genetic Algorithm)進行優化搜尋,模型可以在大部分普通機器上執行且僅需要最低限度的人類指導。最終可以實現的自動化程式設計專案如下:
- 簡單程式,諸如:字串的輸出(如:“Hello World”、“Hi”等);
- 相對複雜的程式,比如:反轉字串、斐波那契數列等。
二、文章的方法
1、指令集的選取
作者使用的指令集是圖靈完備的(Turning Completeness)。在可計算理論領域,如果一個程式語言是圖靈完備的,那麼理論上這個語言可以在無線的時間和記憶體需求下完成任何計算機可完成的任務。作者採用的指令集如下:
2、AI Programmer的核心部分-遺傳演算法
(1)基因組(genome)的建立:AI Programmer的基因組編碼為浮點陣列,每個唯一指令的固定取值範圍在0和1之間,如上表(Table 1)所示。
(2)程式的生成:根據建立好的基因組,AI Programmer就將其轉換為相應的程式,執行,根據程式的輸出計算程式的適合度,生成的程式越靠近需要解決的任務,適應度越高,越有可能進行下一代的進化。在每一代,AI Programmer利用隨機選擇、交叉和變異來建立子程式,其中包含輕微的隨機擾動(避免區域性最優解)。遺傳演算法的過程如下:
以下圖片展示了從浮點陣列中構建基因組的例項:
突變的過程:
可執行程式根據其執行情況進行排名,其中特定程式會被立即從基因組池中刪除,成功的方案則被推進以產生新的後代:--選擇的過程
3、生成程式的結果展示
生成的諸多軟體程式,如下圖所示:
AI Programmer生成非常簡單的程式來輸出“Hi”,經過5700帶後,生成的程式碼如下圖所示:
三、文章相關的工作
提供了一個自動化程式設計框架,架構圖如下:
四、侷限性
AI Programmer中存在的問題:
- 極簡程式語言與遺傳演算法之間的“矛盾”
實現相對複雜的程式,若採用較少指令集的程式語言其代價是記憶體消耗和時間,若引入更多指令集則會影響遺傳演算法的表現。
2. 依然需要大量的人為干預
現階段模型依然需要大量人為干預。主要表現在以下方面:
(1)需要定義適應度函式;
(2)提供所有期待輸入輸出格式;
(3)提供所有邏輯順序,如if/else。
3. 程式的開銷與特例
隨著輸出結果的長度上升時,程式所需時間大幅上升,例如輸出“hello world”所需要的時間是“hello”的5倍;
存在一些陷阱,例如:死迴圈(目前通過人為限制最大執行次數來避免)等。