Google新目標——讓計算機實現自我編程,自主機器時代不再遙遠

36氪 於 28/11/2016 發表 收藏文章

編者按:本文來自微信公眾號“新智元”(ID:AI_era),編輯: 胡祥傑、王楠,36氪經授權發佈。

多人對AI的想象都停留在應用層,而忽視了技術層AI也將產生顛覆——讓機器自己編程。Google大腦、DeepMind、Facebook甚至Viv 都在這一方向上努力,發表了一系列研究論文。Venture Beat 作者 Lucas Carlson認為,機器自我編程其實離我們並不遙遠,將很快實現。一旦機器做到這一步,在軟件發揮重大作用的所有領域,將會經歷一場顛覆性的變革。

想象AI 的未來是很有趣的:家庭服務機器人、亞馬遜的智能家庭中樞(Echo)等設備將走進每家每户,還有無人機快遞和更加精準的醫學診斷。這些吸人眼球的消費應用充斥着公眾的想象,以至於大家都忽視了AI對另一個領域的顛覆——軟件本身的發展。
想象一下,如果計算機自己能理解自己,它們可以做些什麼?用不了多久,計算機就能做到這件事。並且,我不是在描述遙遠的未來,我説的是觸手可及的現在,使用時下現有的技術就能達到。

迄今為止,機器學習的專家傾向於聚焦那些為特定任務開發的AI 應用,比如人臉識別、自動駕駛、語音識別甚至是搜索。但是,如果這些類似的算法能夠在不需要人為幫助、解釋或者干預的情況下,理解它們自身的代碼結構呢?正如他們理解人類的語言和圖像一樣。

如果代碼開始對自己進行分析、自我修正並提升,且速度比認為的更快,那麼技術的突破可能會來得更快。由此帶來的可能性是無止境的:醫學的進步、更加自然的機器人、更智能的手機、更少bug的軟件,更少的銀行欺詐等等。
人工智能具有解決軟件開發中的一個古老問題的潛力。代碼編寫或操縱其他代碼的能力的概念已經存在了很長時間,一般稱為元編程(它實際上起源於20世紀50年代末的Lisp)。它解決的難題,目前都還在人們的想象之中。

但是,現在人工智能讓改變發生了。

使用人工智能,計算機能夠理解一個軟件開發項目從無到有的發展歷史過程中的所有代碼,並立即改進或者刪除單獨一行代碼中的bug,不管是用什麼編程語言。即便是一個缺乏經驗的或者中等水平的程序員都能講清楚讓計算機自我編程的原理。由此,一個癌症項目的研究可能幾天或者幾個月就能完成,而不需要花費好幾年的時間,這將帶來顯著的進步。

今天,這項最終將會帶來顛覆性改變的技術尚處在萌芽時期,但是,它已經開始生長。比如,Google的TensorFlow機器學習軟件,讓每位程序員都能將神經網絡直接融入到所開發的APP中,讓APP擁有識別圖片中的人和物體的能力。要把這些想法變成現實,你將不再需要一個博士學位。讓業餘人士也可以修正程序,這可能會成為AI發展歷史上最大的突破。

Google的目標:大部分代碼都不需要人為編寫

國外著名科技記者 Steven Levy 今年 6 月在他刊於 BackChannel 的文章《Google如何將自己重塑為一家“AI 為先”的公司》(How Google Is Remaking Itself As A "Machine Learning First" Company)中提到,Google大腦負責人 Jeff Dean 表示,隨着他和團隊對機器學習了解得更多,他們利用機器學習的方法也更加大膽。“以前,我們可能在系統的幾個子組件中使用機器學習,”Jeff Dean 説:“現在我們實際上使用機器學習來替換整套系統,而不是試圖為每個部分製作一個更好的機器學習模型。”Levy 在文中寫道,如果現在讓 Jeff Dean 改寫Google的基礎設施,大部分代碼都不會由人編碼,而將由機器學習自動生成。

Google的代碼bug預測系統,使用一個得分算法,隨着commits變得越來越舊,它們的價值越來越小。

認為計算機自我編程離我們還很遠?如果我告訴你,一些大公司,比如Google,已經開始在內部的項目管理系統中嘗試使用這一概念,你可能會覺得震驚。但是,Google確實已經開發了一個 bug 預測程序,使用機器學習和統計分析,來判斷某一行代碼是否存在瑕疵。Google工程師、W3C的聯合主席 Ilya Grigorik 也開發了一個開源版本的 bug 預測工具,目前已被下載 2萬次。

開源地址:https://github.com/igrigorik/bugspots


Ilya Grigorik ,圖片來自twitter

另一個例子來自Siri 的繼承者——Viv。Wired 最近的一篇報道中寫道,Viv 不僅使用一系列的自然語言處理來實現語言識別, 還基於英語詞彙建立了複雜的自適應性計算機程序。代碼自己寫代碼(Code writing code)。由於被寫入的代碼是經過Viv的開發人員自己訓練和專門化的,所以這裏的“寫代碼”並不是我們通常所説的寫代碼的能力,但這確實是一個大的進步。


在這個方向上,另一個大的進步來自非專業領域。Emil Schutte 曾有過一句非常具有挑釁性的言論:厭倦了寫代碼?我也是!讓Stack Overflow來做這件事吧。他分享了一個例子來證明這一概念,從Stack Overflow 的大型編程數據庫中提取完整的工作代碼,來提供完整的功能代碼塊,但是,這樣得到的模塊還是基於已經寫好的代碼。

DeepMind 的嘗試

實際上更早之前,DeepMind 團隊開發了一個“神經編程解釋器”(NPI),能自己學習並且編輯簡單的程序,排序的泛化能力也比序列到序列的 LSTM 更高。描述這項研究的論文《神經程序解釋器》(Neural Programmer-Interpreters),被評選為 ICLR16 最佳論文。

NPI 是一種遞歸性的合成神經網絡,能學習對程序進行表徵和執行。NPI 的核心模塊是一個基於 LSTM 的序列模型,這個模型的輸入包括一個可學習的程序嵌入、由調用程序傳遞的程序參數和對環境的特徵表徵。這個核心模塊的輸出包括,一個能指示接下來將調用哪個程序的鍵、一個經典算法程序的參數,以及一個能指示該程序是否該停止的標記。除了遞歸性內核外,NPI 構架還包括一個內嵌的可學習程序的鍵值內存。這種程序-內存的結構對於程序的持續學習和重用是極其重要的。

圖 6:NPI 與 序列到序列 LSTM 對不同長度的序列進行排序的準確率對比,最長序列含有20個數組。

NPI 有三個擁有學習能力的部件:一是任務未知的遞歸內核,二是持續鍵值程序內存,三是基於特定領域的編碼器,這個編碼器能在多個感知上有差異的環境中讓單一的 NPI 提供截然不同的功能。通過合成低層程序表達高層程序,NPI 減少了樣本複雜性,同時比序列到序列的 LSTM 更容易泛化。通過在既有程序的基礎上進行建構,程序內存能高效學習額外的任務。NPI 也可以利用環境緩存計算的中間結果,從而減輕遞歸隱藏單元的長期存儲負擔。

不過,當時 DeepMind 團隊並未使用無監督學習的方法的訓練 NPI,其模型也只能學習合成若干種簡單的程序,包括加法、排序和對 3D 模型進行正則化轉換。不過,單一 NPI 能學會執行這些程序以及所有 21 個關聯子程序。

田淵棟對計算機自我編程的研究綜述

Facebook 人工智能實驗室研究員田淵棟在他提交 ICLR17 的文章中,就有一篇研究了這方面的問題。


論文摘要:構建能夠通過自動推斷(infer),將一組輸入映射到輸出的計算機程序仍是一個開放且極具挑戰性的問題。由於在可能的程序上存儲着巨大的搜索空間,並且需要處理高階邏輯(如 for循環或遞歸),所以程序進行歸納(induction)任務是很困難的。在本文中,我們使用 Hierarchical Generative Convolutional Neural Networks(HGCNN),自動根據輸入/輸出對生成程序。HGCNN 以層次式預測候選代碼串,由此可以使用標準的搜索技術來構造程序。應當注意,該模型僅使用隨機生成的程序進行訓練,因此可被視為一種無監督學習的方法。我們證明,文中所提出的方法可以生成程序,從簡單的 Swap 到更復雜的循環和分支(比如找到一串數組中的最大值)。我們還展示了使用該方法,在實現諸如 Bubble Sort 等嵌套循環程序時取得的不錯結果。將 LSTM 等作為比較的基礎,新方法的預測精度有了顯著的提高。

田淵棟在《深度學習沒有解決的理論問題》裏表示,這篇論文將算法的輸入輸出的結果抽取特徵後,送入卷積神經網絡文獻中,再層次式地生成圖像的經典框架,生成一張二維圖,每一行就是一行代碼,或者更確切地説,是代碼的概率分佈。有了好的分佈,就可以幫助啟發式搜索找到正確的程序。而神經網絡的訓練數據,則由大量的隨機代碼、隨機輸入及隨機代碼執行後得到的輸出來提供——基本不需要人工干預,算是一種非監督的辦法。

同時,田淵棟還在後面補充:“等到今年的 ICLR 的文章一公佈,隨便翻一翻就找到了七篇計算機自動生成(或者自動優化)代碼的文章。打開一看,引論裏全在描述同樣的動機。”

那這個動機就是什麼?
“讓計算機自己寫代碼”。

一旦機器可以理解自己,一場顛覆性變革將會發生

隨着越來越多的這類技術變得成熟,機器將會在各種各樣的任務上超越人類。那麼,機器為什麼不能理解自己呢?我想這只是時間的問題。並且,一旦機器做到這一步,你會發現,在軟件發揮重大作用的所有領域,將會經歷一場顛覆性的變革。

人工智能的核心挑戰之一便是教會機器學習新的程序、從既有程序中快速地編寫新程序,並自動在一定條件下執行這些程序以解決廣泛種類的任務。在各種人工智能問題中,程序以不同的面貌出現,包括運動行為、圖像轉換、強化學習策略、經典算法和符號關係等等。

現在,機器已經能夠自動執行越來越多的程序,而且現在開源代碼這麼多,如果把歷史上的代碼都學習一下,很多編程場景應該是可以自動化的,至少可以大大減少人工。人類程序員尤其是初級程序員的工作被取代的可能性,也越來越大。

來源:github,venturebeat 等


資料來源:36Kr

留言


請按此登錄後留言。未成為會員? 立即註冊
    快捷鍵:←
    快捷鍵:→