說你想幹什麼,AI就能自動寫代碼。
現在,我們離這個目標又近了一步。
近日,MIT的一個研究團隊放出了新的研究成果。
他們提出了一種靈活組合模式識別和推理的方法,在無監督學習的情況下, 來解決AI自動編程遇到的問題。
先給你看幾個例子:
任務要求:
給定一個數組,計算數字翻轉過來之後的中位數。
AI會給出代碼:
(reduce(reverse(digits(deref (sort a)(/ (len a) 2)))) 0 (lambda2 (+(* arg1 10) arg2)))
任務要求:
輸入: 1, [-101, 63, 64, 79, 119, 91, -56, 47, -74, -33] 4, [-6, -96, -45, 17, 26, -38, 17, -18, -112, -48] 輸出: 39 8
AI會給出的代碼:
(MAXIMUM (MAP DIV3 (DROP input0 input1)))
這是怎麼做到的?
給人類程序員一個任務,在開始寫代碼之前,會根據自己的經驗來判斷代碼架構是什麼樣的。如果沒有經驗,就要採取推理的方式,來完善代碼架構。
這個AI系統,就是模仿了人類結合模式識別和推理寫代碼的方式。
模型分爲兩個模塊,分別是概要生成器(sketch generator)和代碼合成器( program synthesizer)。
輸入任務要求之後,先經過概要生成器,生成滿足任務要求概率比較高的代碼概要,即可能滿足任務要求的初始代碼,細節並不豐富。然後,代碼概要進入代碼合成器模塊,找到滿足任務要求的模塊。
概要生成器,是一個帶有注意力機制的seq2seq循環神經網絡(RNN),在給定任務之後,通過LSTM編碼器對其進行編碼,然後再逐token解碼。
代碼合成器,有兩個組成部分:廣度優先概率枚舉器和神經網絡識別器。前者根據可能性從大到小枚舉代碼sketch, 後者根據任務要求來指導這一過程。
具體效果怎麼樣?
爲了驗證模型的性能,研究團隊選擇了兩個模型與其進行對比。
分別是隻有合成器的模型(Synthesizer only)和只有生成器的模型(Generator only)。
只有合成器的模型,相當於研究中代碼合成器模塊,進行模式識別之後,從頭開始枚舉所有可能的編碼。與微軟研究院研究團隊2016年提出的“Deepcoder”模型媲美。
只有生成器的模型,相當於研究中概要生成器模塊,用來預測完整的代碼。與微軟研究院和MIT團隊在2017年提出的“RobustFill”模型媲美。
進行對比的任務是數組列表、字符串轉換和自然語言要求。
在數組列表任務中,與其他兩項研究相比,研究中的模型可以在簡單的程序中呈現很好的性能。
在字符串轉換任務中,表現要比只有合成器的模型要好,並且在一定情況下,會好於只有生成器的模型。
真正展現模型能力的,是在AlgoLisp數據集中進行的測試,這一數據集中,不僅有數組列表和字符串相關的輸入輸出示例,還有相應的自然語言描述。
在這個數據集上,研究者檢驗了模型在非結構化數據情況下的性能。
測試結果表明,模型的表現完全超過了先前學者的研究。
而且,在包含“Even”和“Odd”要求的情況下,性能更加突出了,表明了模型的通用性更強。
如果你對這個研究感興趣,可以閱讀論文,來獲取更多的研究細節。
傳送門:
Learning to Infer Program Sketches
https://arxiv.org/abs/1902.06349