有沒有可能讓機器讀遍github上的開源代碼,然後學會編程?
rt.
阿法狗已經是一個機器自學習完成超複雜任務的很好範例,然而相比於Go,「編寫程序完成任務」這個task的難點貌似在於難以形式化的定義任務和目標函數,而且程序要實現的需求也非常的多樣、複雜。相比於狀態空間搜索,「編程」更具創造性和藝術性。然而,Neural Turing Machine[1]已經能實現很基本的排序,Karpathy已經展示了RNN經過char-level訓練就能寫出看起來還挺像樣子的文字和代碼[2],LSTM/RNN也已經在手寫、音樂生成方面有不少進步,各種Deep Art開始引起研究者們的關注和興趣[3]。這麼來看,貌似一定程度上,機器做藝術性的事情也未嘗不可?更何況,編程的藝術跟人文藝術相比,還有更強的輸入輸出約束。------ 我是腦洞分割線 ------ 腦洞大開的想一下,機器或許也可以先通過讀海量的代碼,學會基本的關鍵字、語法等基本單元。然後通過不斷自己寫程序、編譯、出錯、修改、反饋、經過無數次迭代後,我擦,誕生出一個編程高手?!Σ( ° △ °|||)︴當然,編程語言是給人用的,機器也可以直接從binary的cpu指令數據上學習。。。end-to-end,直接生成可執行文件Σ( ° △ °|||)︴------ 我是回歸嚴肅的分割線 ------ 那麼,從現在計算機科學和人工智慧的發展水平來看,能否設計一種目標函數或者學習方法,使得計算機能夠基於此為目標,在深度學習強化學習這個paradigm下,使用海量的開源代碼為輔助數據,同時進行自編程練習,進行學習,學會解決基本的編程任務,寫出可讀、可維護、可擴展的代碼、架構等。所以各種好奇的問題浮現出來撩
- 「單元測試」能提供多大程度上的監督作用嗎?
- 在可預見的未來,計算機能寫出多大複雜度的程序,多大程度上緩解人工寫代碼的工作量?
- 能否設計一種語義層形式化的任務的方法,然後可以自動生成代碼完成描述的任務?((或許,以後IDE里都帶這個功能?
- 實現這個任務是否需要設計新的計算模型?
- 機器從二進位可執行文件層數據(raw data)進行學習會不會比從源碼層數據(source code data)學習更加有效?
- 跟這個目標相關的研究有嗎,現狀如何?
望各位牛牪犇不吝腦洞
[1] Neural Turing Machines http://arxiv.org/pdf/1410.5401.pdf[2] The Unreasonable Effectiveness of Recurrent Neural Networks[3] Deep nets generating stuff相關問題:
- AI有可能代替人類從事數學研究嗎?
- 強化學習(RL)是否是人工智慧的關鍵之處,能夠給人工智慧帶來質變?
這個問題的難點不僅僅是讓機器自動生成一些可以編譯的代碼,更難的是機器讓理解人的需求,生成符合人要求的代碼。這個涉及到了自然語言理解和自然語言生成。這兩個任務,現在都沒有得到很好的解決. 用神經網路來解決這個問題,是很有希望的方向。有人做過類似的嘗試,就是把acm的題目描述當輸入,把代碼當輸出,取得了一些不錯的結果。論文如下:http://arxiv.org/pdf/1510.07211
還有一個更高大上的
http://arxiv.org/pdf/1603.06744v1你以為程序是程序員寫的,其實通常並不是。
絕大多數程序員只是把需求翻譯成機器能夠讀懂的意思(高級語言),」寫程序「是編譯器的工作。
如果有朝一日,計算機可以根據我的描述來編程了,那麼自然語言識別必然已經到了非常發達的程度。目前看來任重而道遠。如果我的描述還得按照格式來,那不叫機器學會了編程,那叫我學會了新的編程語言。強答一下,預見未來應該是可以的,因為程序都是一些 符號+規則 構成的。但是寫出符合需求的代碼和符合語法的代碼是完全不同的概念。
姿勢水平不夠,甩幾篇論文就跑。。o(╯□╰)o
除了題主提到的Neural Turning Machines,還有Neural Programmer[1],Neural Programmer-Interpreters[2][1]http://arxiv.org/abs/1511.04834[2]http://arxiv.org/abs/1511.06279
真正的問題在於「理解需求」這4個字上吧。
這個絕對可能。當前MIT已經開發了bug自動修復系統(通過大規模機器學習和訓練)。而機器實現代碼編寫方面, databricks的連城不是聲稱他們公司已經實現了在1萬台機器上的通過機器學習訓練而使得機器的編程能力超過大多數程序員?註: databricks這個消息是個april joke.這個我當前也在不斷學習機器學習相關的知識,我個人感覺是有一定危機感針對程序員。這個時代 計算機科學方面的技術發展還是很快,我只能說自己如果不迅速提高自己以後可能就面臨失業的風險。
為什麼要讓機器學源代碼?給機器喂機器語言會更好一點。源代碼中,改個字母這程序可能就崩了,但是機器語言與源代碼相比,改動個0或1仍能運行的概率要高一些。雖然這樣可能跑出來就不知道是什麼東西了。但是沒關係,你再把進化演算法加上去就好了,把無效的組合去掉。完全可以用深度學習訓練出讓機器自己找到能實現特定功能的「01串」,最後的結果未必是最優的,而且演算法很有可能是程序員無法理解的。
題主也提到了Karpathy,他實際上用char level RNN試圖訓練了各種類型的數據,其中就包括Linux源代碼(見The Unreasonable Effectiveness of Recurrent Neural Networks)。根據文中貼出的訓練結果以及RNN的工作原理來看,要想使用RNN寫出能夠被編譯執行的程序至少有這幾個難點:
1. 跨度大的變數/函數調用。Karpathy在博文中也提到了對Latex格式下的數學論文進行學習,但最後的結果需要經過人工調試才能正確編譯,其原因之一就是egin{proof}和end{proof}這樣需要一一對應的標籤之間相隔太多字元,以至於RNN無法捕捉它們之間的相關性,從而出現用end{lemma}代替end{proof}之類的錯誤。因此我們發現,char level RNN雖然理論上可以關聯相隔任意遠的輸入數據,但實際上難以處理跨度大的「前後呼應」的格式。如何保證RNN生成的程序當中聲明了所有被用到的變數/函數、或是使用了所有被聲明的變數/函數,恐怕會是一個不簡單的問題。
2. 對後文變數/函數的調用及循環調用。RNN的工作原理是分析最初的輸入數據、以及之前產生的結果,從而輸出下一個結果,那麼它該怎麼「參照」自己還未生成的「下文」呢?它該如何預測以及預防死循環呢?3. 對長變數/相似變數名的處理。根據Karpathy(以及自己)對莎士比亞戲劇的訓練結果,可以看出char level RNN對較長的連續無格式字元串處理得不是很順手,較短的辭彙,如that和they,可以被無誤地拼寫出來,而較長的詞語中間經常出現隨機的字元。對於英語來說,如果把marajuna拼成marejuna,至少後者可以被讀出來(看起來像是個合法的單詞),但對於程序來說,如果把doSomethingUseless()拼成doSamethingUseless(),那就會導致編譯錯誤。以上只提到了文本生成的syntax方面,也即生成「符合格式規範的文本」,這也是char level RNN所擅長的。至於semantics方面,也即生成「有意義」的程序,至少在Karpathy的博文中沒有任何進展,這將是個更加困難的問題。DeepMind最近在試圖根據爐石/萬智牌的牌面描述生成可以編譯執行的卡牌對象(用的當然不是char level……),就是朝著semantically correct的方向前進,但程序可比卡牌描述複雜多了,何時人類能做出自動編寫程序的AI,現在看來還是個未知數。以上僅是對char level RNN,或者說RNN,進行的分析,至於其他的機器學習方法,了解得沒有這麼詳細,也就不說了。和其他我回答過的AI相關問題一樣,答案區果然異彩紛呈,「機器寫出程序不難」這樣的話信手拈來,不得不說一句「忌強答」。【在等訓練結果的時候寫這樣的答案,不務正業的負罪感會小一些呢……】這不就是強人工智慧 AI 嗎編程是需求轉化為代碼的過程 又不是音樂那種圍棋那種可以遍歷完全的...但是比如說
AlphaGo 的和暴雪的爐石
通過卡片上的文字來自動編程實現...這個倒是有點意思也算是給了限定範圍內的需求轉化成代碼了....http://arxiv.org/abs/1603.06744給個鏈接吧 : Latent Predictor Networks for Code Generation有。 所謂機器自動編程就是指任意給出一個模塊的需求,製造過程不需要人參與,機器就能自動實現滿足需求的邏輯。
上面各答主的回答都不深刻,比如:不會需要「單元測試」,也不會存在軟體工程里需求分析和需求描述。
1. 什麼是軟體? 軟體的本質是什麼?
2. 實質上,我們要解決的問題是在沒有人參與的前提下,系統如何自動解決任何一個問題。機器自動編程是這命題下一個具體實現。
3. 開源代碼的作用是為了在初期訓練機器,這時人也要參與進來;然後就專門由人來訓練;然後就是環境來訓練機器。 軟體不再是一成不變而是隨時可變。軟體公司的價值就是在針對特定問題下這種訓練的積累上,簡單來說就是軟體的智能水平高低上體現出公司的價值。當機器自動編程普及後,開源代碼就沒有存在的意義,人一般不需要看機器寫的代碼也很難看得懂。
人類里程碑式的科技成果,已經在揭示著未來:
1. 蒸汽機的出現。 機器不需要靠人或動物,自己就會動。
2. 圖靈機的出現。 不用人,機器就能處理信息。
3. *****機的出現。 不靠人,機器就能自動解決問題。
4. *****機的出現。 機器情感的出現。 或許沒有這台機,因為3的出現+量子計算機,是有可能演化出機器情感。
5. *****機的出現。 不靠「上帝」,就能用其它材料製造出生命體。至於這時還有沒有人類或者現在結構的人類,很難說。
我相信,基本上當3出現,人類就會被機器遠遠地甩在後面。
-------------------------------------------------------------------------------------------------------
之所以說其他答主對這命題的理解不深刻,是因為大多數是從軟體工程角度去思考。
工程學始終圍繞成本與質量展開,簡單來說是一門成本與質量如何平衡的技術。所以它首先是訂立要達成的目標並量化,並把目標不斷細化,脫離目標(或者說脫離需求)談實現就是在瞎胡鬧。軟體工程有什麼弊端有不少書籍和文章述說,這裡就不多說,而軟體是人類至今為止最複雜的東西,個人認為它無法適應未來軟體製造的要求。
機器自動編程是一門跟軟體工程截然不同的技術體系。打個類比,在人類用騎馬來滿足出行的時代,怎麼去提目標(或者需求)? 然而為什麼馬能滿足人的出行需求? 因為馬在架構上滿足而且具有一定的適應能力,人和馬共同適應彼此配合從而達成目標。馬要人來製造嗎?不需要,而是根據實際情況選擇適當的馬。同樣,在機器自動編程體系里,軟體是不需要人來製造,所以不需要分析和設計不需要單元測試不需要象現在那樣做需求分析和描述,人要做的是選擇適合的軟體,軟體會根據實際情況不斷自主調整來適應,並能伴隨用戶的使用而不斷「成長」從而最大限度滿足特定用戶的需要。
困難在於對於程序功能的描述吧。目前的人工智慧最高成果都是針對簡單目標的回答,像圍棋要贏,玩遊戲得最高分,目標的定義都很簡單容易理解。也許對某個具體單一的演算法問題人工智慧可以給出最優代碼,但是大型複雜軟體?前面的路還有很長吧。
在網上看到一副很有意思的漫畫,一個單身漢對上帝說:「希望明年的今天不在是一個人吃飯」,結果上帝滿足了他的願望,把他變成了一隻狗,如果是按人類正常思維理解的話,大家都明白他是需要一個女朋友而已,但僅僅從字面意思理解,「上帝」對這句話的理解也是沒有錯的,那麼錯在哪裡呢?原因就在雙方沒有一個統一的理解標準,就如同計算機編程語言一樣,編程語言其實就是一種規範,讓計算機和人類可以溝通的一個標準,一個可以一一對應機器碼的語言標準。就如上所說一樣,上帝為什麼理解錯了單身漢的意思,就是因為他們之間沒有一個統一的溝通標準,所以要讓計算機理解人類的語言,其實就是站在計算機的角度,在計算機和人類語言之間搭建一個橋樑,制定一個標準。
現在的高級編程語言,已經很接近人類自然語言,已經算是計算機對人類語言,思維等的一種理解了,那麼現在所謂自然語言處理需要我們做什麼呢?在我個人看來,計算機對自然語言的處理,其本質就是:讓每個普通人,沒有學過計算機任何編程語言的人,僅使用人類自然的語言就能和計算機進行溝通,讓計算機實現自己想要的程序,比如我們現在的手機都有各種感測器:方向感測器,重力感測器等,那麼我們不需要任何程序員來幫我們搭建一個感測器軟體,我們就可以直接用一句人類自然語言:「幫我看一下現在的方位」,就能讓手機理解需要打開哪些感測器需要怎麼給用戶回復。如果以後真的有一種編程語言,直接就是人類自然語言,沒有經過任何的修飾限制,那麼計算機對人類自然語言的理解才算得上是真正的理解了。
————這是我從自己發過的文章中摘選的一部分來回答你這個問題
可以看一下這個故事
http://mp.weixin.qq.com/s?__biz=MzAxMzMxNDIyOA==mid=407242658idx=1sn=5e1fa32dc13435f0d140856627c5fb3escene=18#wechat_redirect
昨天剛好連載完結谷歌有阿爾法狗,然而腦洞大開的程序猿們已經創造出了,一個叫betacat(貝塔貓)的東東,他可以自己根據已有代碼自主學習,當然也能從github上自主獲取知識,進而創造出高質量的代碼。
這大大提高了編程效率,雖然betacat沒有思想,但是它只向著創造出它的程序猿們設定的編出更好的代碼這個目標努力。
直到有一天betacat被廣泛應用,然而問題來了……
想看betacat的完整故事,請戳《神秘的程序員們》的連載漫畫原文→_→
http://mp.weixin.qq.com/s?__biz=MzAxMzMxNDIyOA==mid=407242757idx=1sn=88030ec5aadd633c00c826f35914eba2scene=0#wechat_redirect
http://mp.weixin.qq.com/s?__biz=MzAxMzMxNDIyOA==mid=407324817idx=1sn=0d86b2c53fc63e8e92775c4b2594f902scene=0#wechat_redirect
http://mp.weixin.qq.com/s?__biz=MzAxMzMxNDIyOA==mid=407717480idx=1sn=e68ba537b09c37a16ba5d76598d2cb7dscene=0#rd
http://mp.weixin.qq.com/s?__biz=MzAxMzMxNDIyOA==mid=408059545idx=1sn=32a820ad8f669d7e19397420237f3e88scene=0#rd機器沒有審美,沒有強迫症,不偏執,沒有情懷。怎麼能寫好程序
這個問題(如果解決的標準是編程能力等於普通程序員的話)疑似屬於AI-Complete:
https://en.wikipedia.org/wiki/AI-complete#AI-complete_problems其實也就是AGI啦。從神經網路角度attack這個問題,不是不行,但是光用它肯定不行。
- 「單元測試」能提供多大程度上的監督作用嗎?
單元測試的格式本身就可以提供目標函數(或者至少是目標函數的採樣)
- 在可預見的未來,計算機能寫出多大複雜度的程序,多大程度上緩解人工寫代碼的工作量?
可預見的未來如果定義成5-10年,那麼我認為自動生成程序在這段時間內還不能提高任何生產力。而10-20年則一切皆有可能。
- 能否設計一種語義層形式化的任務的方法,然後可以自動生成代碼完成描述的任務?((或許,以後IDE里都帶這個功能?
語義層和語法層沒有本質區別,只是差一個解釋過程而已。真正困難的地方仍然是AI部分。
- 實現這個任務是否需要設計新的計算模型?
這個取決於對「新」如何定義,光從理論角度看的話,任何計算模型都是圖靈等價的。
- 機器從二進位可執行文件層數據(raw data)進行學習會不會比從源碼層數據(source code data)學習更加有效?
從直覺上看,學習的有效性應該只有常數係數項的差別
- 跟這個目標相關的研究有嗎,現狀如何?
請搜索inductive programming以及program synthesis。
AI要實現某些目的,應該直接控制機器就可以實現了,不需要像人類指揮機器那樣需要「編程」。
現在的技術肯定不行。就是過幾年能學會編程,但是要編什麼還是要用戶決定,說白了AI只會執行命令,沒有靈魂。
讓我說的話,肯定是可能的。現在讓機器斷網做高考數學都能做個100來分,連著網編程肯定會稍微容易一點。
讓機器讀代碼,然後自動添加註釋,這個也蠻好玩兒。比如利用auto encoder-decoder來搞一搞~
補充一下:訓練語料可以直接來自於github上的開源項目,或者大型的開源項目,比如Linux源代碼,不需特別標註,簡便快捷數據多!進化演算法編程已經有近三十年歷史了,genetic programming.
推薦閱讀:
※梯度下降法的神經網路容易收斂到局部最優,為什麼應用廣泛?
※深度學習晶元?
※有沒有介紹神經網路、蟻群、遺傳、退火、魚群等等演算法的書籍?
※怎樣看待地平線機器人以深度強化學習演算法為切入點?
※同價位的專業卡與遊戲卡誰更適合跑深度學習相關程序?
TAG:編程 | 機器學習 | 深度學習DeepLearning | AlphaGo | 強化學習ReinforcementLearning |