目前的人工智慧離可以自己給自己寫代碼編程還有多遠?
問題描述有更新,望仔細閱讀,感謝
--------------------------------------比如說ALPHAGO可以自主學習編程語言,給自己升級。
----------------------------------
感覺大家糾結在寫代碼這個事情上了,或許將來的人工智慧不用代碼這種說法了,我也不知道將來叫啥,所以就這麼叫吧。
其實這裡主要指的是人工智慧對自己升級,先可以不談有意識的自主升級,我們可以討論下接收人類命令進行定向的升級。
比如,你家裡已經有個商用的人工智慧管家了,也能對話,控制一些電器,為你安排事務。有一天,你閑的蛋疼,你要跟它下象棋,它說它沒有下象棋的功能,你讓它自己去學會。那麼這個人工智慧可以基於互聯網的資源,自己學習象棋的規則,並且完成給自己升級。所以問題是,這種人工智慧離我們還有多久?
來談談我的看法:)
首先說人工智慧編程這件事情,很多答案都不約而同的提到了兩個項目:
- ICML上的DeepCoder: 論文地址(Learning to Write Programs)
- arXiv上最近的AI Programmer: 論文地址(Autonomously Creating Software Programs Using Genetic Algorithms)
雖然DeepCoder的技術水準和技術意義明顯高於AI Programmer,但從本質上來說現階段的人工智慧自動編程還是一個「在有限時間內搜索最優解」的優化問題,只是不同的項目採取了不同搜索方法,距離程序員失業還有很遠的距離。
現階段的演算法依賴使用者給出程序的期待輸入和輸出,甚至還需要給出評估方法,然後使用機器找到程序實現這個目標。舉例,我們需要一個加法計算器,那麼我們給出一系列輸入和期待的輸出:
- 輸入(2, 2),輸出2+2=4
- 輸入(1.5, 3),輸出1.5+3=4.5
- 輸入(1.25, 5),輸出 1.25+5=6.25
但我們很難完美定義所有的輸入輸出,這會造成學習中的歧義。舉例,上面的這3個輸出輸出也可以用乘法計算得到,大家可以試試。所以現階段的人工智慧自動編程演算法面臨的最大的困難就是需要大量的人工時間來完成簡單的任務,且隨著任務難度上升,需要的運算時間會以指數甚至更高的速度增長。以AI Programmer為例,正確輸出「hello world」所需要的時間是"hello"的5倍,而字元串長度僅上升1倍。
打個不恰當的比方,現階段的自動編程更像「猴子打字」,學術叫法是「無限猴子定理」:
讓一隻猴子在打字機上隨機地按鍵,當按鍵時間達到無窮時,幾乎必然能夠打出任何給定的文字,比如莎士比亞的全套著作。 --中文維基百科
所以現在的智能編程有一點像「隨機撞大運」,期待在有限時間中「撞到」正確的代碼符合我們期望的「輸入和輸出」,而智能的部分主要是降低搜索時間。換句話說,現在的演算法主要還是觀測和學習「輸入和輸出之間的關係」。上面提到的兩項工作只是用了不同的搜索方法,比如DeepCoder限制了搜索域並用神經網路來輔助搜索過程,而AI Programmer使用了遺傳演算法(Genetic Program)來搜索最優解。客觀的說,在這個階段,沒有人知道這個思路對不對。或許我們從一開始就不該期待用搜索來解決自動編程問題,甚至「自動編程」也可能是一個偽需求。
前兩天從技術角度分析了一下AI Programmer,感興趣的朋友可以看:如何評價arXiv上的最新論文:「可自動編程」的人工智慧程序員(AI Programmer)?
至於人工智慧是否可以獲得自我學習能力,自我進化。這其實是腦洞題:)
我贊同大部分答主的觀點,如果人工智慧需要自我學習的話,百分之九十九不是通過自我編程。程序語言是我們把人類語言轉為機器語言,給沒有推斷能力(Inference)的機器使用的。當機器有了自我學習能力的時候,那麼是不需要編程語言這個「代理人」的。
但從互聯網搜索資數據來自我更新,這似乎談不上是天方夜譚。如果允許我開個腦洞的話,我覺得初級的機器學習能力的關鍵是有數據整合能力(Data Integration)和初級的推理能力(Inference),這個或許不需要高級的人工智慧就可以實現。
腦洞是這樣的:有一天你告訴你的人工智慧助理,我想和你下象棋,它說:「好的,我現在就去學習。」於是它很快的連接到網路(信息庫)上,搜索象棋需要對應的輸入和輸出,比如棋局的復盤信息。在足夠的信息量下,它很快就可以成為一個厲害的棋手。
又比如有一天你女神說:「王二,生日的時候送給我這個口紅!」 說著還發來一張圖片。作為宅男的你連「斬男色」都沒聽說過,於是趕快問你的人工智慧助理這是什麼品牌多少錢,它說:「好的,我現在就去搜索。」 於是它從茫茫互聯網圖片中找到了那一隻口紅的色號原來是 YSL 218,順道還學會了口紅色號和顏色之間的推斷關係以及口紅之間的相似度。結果你發現這口紅價值你一個月的工資,當時就急了,問人工智慧助理:「有沒有顏色相近,但便宜點的?」 這時你的AI邪魅一笑,向你推薦了 DBT 945。
講這個段子的原因是,一步走到強人工智慧並不現實,但基於數據整合和推斷的弱人工智慧並非遙不可及,甚至正在發生。而我們生在這個時代最大的樂趣就是,每天都有新的科技發明出現。這些發明不僅衝擊著我們的世界觀,也刷新了我們對人類創新能力上限的認知。而讓人類與眾不同的就是好奇心,那對不可知世界的好奇心。
用一句我很喜歡的話結束這篇文章:
「第一隻猴子開始仰望星空時,人類誕生」。
?????
很遠。雖然現在很多機器學習、軟體工程、程序語言、形式化方法的人在做相關項目,各種應(xue)用(tou),比如program repair什麼的。。。各個方向側重 的應用有所不同。。
個人比較關注一個比賽,SyGuS (Syntax-Guided Synthesis Competition),相對偏向形式化。。PS:想用機器學習/深度學習玩的同學不妨跑跑上面的測試,而不是。。。
這是2016年結果的總結 https://arxiv.org/abs/1611.07627
人工智慧到達那個程度根本不需要 「寫代碼」。寫代碼是為了理解和執行新的需求,而那時的 AI 自身已經能應付或者理解所有需求。
不知道有多少人記得這個十幾年前流行過的張總系列:
不是,張總,您在家裡的電腦點擊了複製,再到公司的電腦點擊粘貼,是不行的!
「為什麼不行,要多少錢的電腦才行?」
~不是,張總,這不是多少錢的問題……
但是現在呢,張總在家裡的iMac上點了複製,到公司的iMac點了粘貼, It is there.
現在流行這樣的:
我是想做一個像淘寶那樣的網站,在哪裡能免費下載到那樣的程序!謝謝!
客服在回答張總問題的時候,應該是沒有想到剪貼板雲同步的,因為畢竟從那個時候到現在,也是十幾年過去了。同樣的,人工智慧現在的發展,距離寫工業代碼遠是有點遠,但是我反對 @henix 引用的王垠的觀點。因為不能用過去的框架去套未來的發展。
誠然現在編程的目的就是嚴格的告訴計算機做什麼,干說「我想要搞一個在線商城,像淘寶那樣就行」,是肯定不行的。所以我們才需要沿著:需求 -&> 模塊化 -&>編寫 -&>反饋 這個循環來最終得到一個可用的軟體產品。
為什麼會有這個流程?因為人肉寫代碼太慢了,然後改代碼更是一個大工程,甚至於比寫代碼更痛苦。所以要在事先儘可能精確的知道需求,然後進行相應的開發。盡量在後期只微調,不大改。不然工程量大,也無法按時交付。
但是機器不一樣,機器強大的地方就是在速度,人工智慧寫代碼可能模式就和現在有本質區別,我設想的人工智慧編程是這樣的:
我們再也不需要先確定需求,只要大概的說:「我想要一個淘寶那樣的網站,建一個給我看看」。然後系統就會先在後台用最標準化組件的組件搭建一個微型的淘寶的網站;
然後你瀏覽了機器給你編寫的成果,發現「這個搜索框是不是像Bing那樣好一些?」然後人工智慧就在後台開始添加刪除各種模塊並且編寫相應的程序,一小會又完成了;
隨著你不斷的試用機器給你編寫的產品,你不斷的發現自己的需求,提出自己的修改意見,然後人工智慧對人隱藏一切的技術細節,只對人們提出的需求做出反應,沒有需求的地方默認處理,只有當人們看到這個默認值不滿意的時候才進行修改。
其實現在所謂快速迭代,MVP方法(minimum viable product) 都是這樣的,只是現在我們寫程序還是以人為主導,而人力無論從時間還是金錢上都是很貴的,所以還需要很多前期的設計和規劃,以便於更好的利用人力。但是如果把所有的程序員都換成人工智慧,那麼可以從一開始就天馬行空的從一句話的需求就開始做MVP,然後等客戶看到MVP之後,隨著客戶一條一條的指令不斷的把產品修改成最終客戶所希望的那樣。
echo "echo hello world" &>&> sh
看,這是會自己編程的人工智慧
你學開車需要給自己「編程」嗎?對於任何智能體來說,要做什麼只管去做就行,不需要通過「給自己編程」來做這件事
引用一個博士的比喻:
如果說人工智慧是人類在智能時代的一個發明,那麼ta就相當於電器時代剛開始人類發明的第一件電器——電燈泡。(不是原話,我從母上大人的導師那裡聽來的,可能語言表述並不那麼好...大家應該可以理解吧qwq?)
任何一個負責的程序語言專家都會告訴你,自動生成程序是根本不可能的事情。因為「讀心術」是不可能實現的,所以要機器做事,人必須至少告訴機器自己「想要什麼」,然而表達這個「想要什麼」的難度,其實跟編程幾乎是一樣的。實際上程序員工作的本質,不就是在告訴電腦自己想要它幹什麼嗎?最困難的工作(數據結構,演算法,資料庫系統)已經被固化到了庫代碼裡面,然而表達「想要幹什麼」這個任務,是永遠無法自動完成的,因為只有程序員自己才知道他想要什麼,甚至他自己都要想很久,才知道自己想要什麼……
by 王垠
實名反對所有回答。
自動編程的AI 是有的, Microsoft 的Deepcoder 就是其中之一。
DeepCoder: Learning to Write Programs
然而根據描述, 寫toy code 的水平...
要我說,在有更好的演算法取代反向傳播之前,AI 離自己寫代碼還很遠呢。
很遠很遠,私以為現在研究這玩意基本是水熱度,歡迎打臉。
在某方面來說,好多年前就已經實現了。從另一方面來說,理論上不可能。
利用代碼來生成代碼這事,好多年前就已經有了,完全不是什麼新鮮玩意兒。如果你覺得那不「智能」,不「深度」,那麼,神經網路的進化過程也許就可以算是程序自動重新編程自己的過程。除此之外,利用彙編代碼動態修改程序自身的程序段(略拗口)是完全沒有任何問題的,除了實用性問題。
那麼,為何又說理論上不可行呢?因為無論用哪種方法,都無法避免編寫元程序。雞生蛋問題。
不過嘛,也可以枚舉出所有可能的二進位文件,在數學意義上裡面肯定包含了一些很牛逼的程序。但是,這真的可以算是機器在編程么233我們人類去編寫程序就是「自主」的嗎?
「自主」的準確定義是什麼?
如果有一天我們的技術發展到可以自己編輯自己的思維、修改自己的記憶、設定自己的性格,當我這麼做的時候,我是「自主」的嗎?
簡單的已經可以了,雖然現在AI程序員寫的代碼還很醜,也做不了什麼應用,但是說不定這就是萬里長征第一步呢。
9月17日,兩位科研人員,Kory Becker and Justin Gottschlich 提交了一篇論文,AI Programmer: Autonomously Creating Software Programs Using Genetic Algorithms(AI程序員:利用遺傳演算法自動生成程序)。
研究人員選擇了無類型編程語言,只包括了8種指令來驅動AIProgrammer生成軟體。
AIProgrammer使用的編程語言是圖靈完備的,如表1所示。理論上,在時間和內存不限的情況下,圖靈完備編程語言能夠處理任何編程任務。該AI程序員的核心是遺傳演算法,它通過模仿自然界的選擇與遺傳的機理來尋找最優解。像自然選擇一樣,在每一代的演算法中,好的部分會被保留下來,不好的都會被殺掉,所以演算法會一代一代進化的。具體請看專業人士講解,如何通俗易懂地解釋遺傳演算法?有什麼例子?
研究人員讓AIProgrammer生成了一個非常簡單的程序來輸出「hi」。經過5700代後,測試成功。生成代碼如圖9所示。
經過580,900代後,生成了「helloworld」,如圖10所示。
經過6,057,200代後,AIProgrammer成功生成了」Iloveallhumans」,如圖11所示。
AIProgrammer生成反轉字元串的程序。生成代碼如圖13所示。
AIProgrammer能在92,400代之後生成加法程序;在177,900代之後生成減法程序,如圖15所示。
Autonomously Creating Software Programs Using Genetic Algorithms
AI系統首次實現真正自主編程:利用遺傳演算法,完爆初級程序員
現在的演算法懂語義嗎? 現在的演算法真的理解語言嗎?
這倆都是否,讓電腦自行編程還很遠。
目前機器翻譯的成果,是大量數據和計算能力突破瓶頸後的結果,這給你一種機器懂語言的錯覺。但離理解還差很遠。 不理解語言,是沒辦法自我編程和自我迭代的。
就像人學開車,人不需要知道腦細胞是怎麼運作的。所以我認為人工智慧將來可以達到像人這樣學習寫編程,並且慢慢訓練來提高技巧。並最終能夠寫出相對正確的代碼。
也就是說先有足夠複雜的底層代碼讓它有了思維,然後再在思維層面學習應用層的寫代碼。
當然,這個過程理論上可以做到,但是極度複雜。
人工智慧沒有智能
但是自己寫代碼我覺得還是覺得很有希望的
等人工智慧會寫代碼了,看到你在寫代碼
Ai:「喲,又在寫bug呀」
反對這裡一切拍腦瓜的答案,對,大v的也不行。
做過一陣子類似研究。最後放棄了,因為這裡有個邏輯悖論。
這是一個很有意思的問題。
如果想讓電腦自動編程滿足人類的需求,那麼第一就要告知電腦你的需求是什麼。
告知電腦這個需求,就需要一種語言來讓電腦明白。
這個語言要合理定義,不能是自然語言。
為什麼不能是自然語言呢?
常見的,甲方會像你提類似以下的需求:
「我要登錄頁面上顯示一個動畫,簡單做做就可以」
如何定義這個「簡單」做做就是一件非常困難的事情。
有人說可以讓客戶反饋呀,那麼就要涉及到一個打分的系統給人工智慧以回饋來表示「做的怎麼樣」,然而這往往需要數千次的評價,修正工作,人工智慧才能找到一個合理的方案,也有可能永遠也碰不到。
好了,現在我們用一種形式化定義良好的語言來描述需求,想想這種語言是啥樣的吧。
是不是起碼要有分支呀?
是不是要有變數呀?
是不是要有循環呀?
可以試著把這些拿掉,然後試著用一種形式化的語言來詳細的描述如下的需求:
「我需要根據每一個用戶的數據列印一個列表」。
想想看,這裡其實是一個不清楚的需求,用戶的數據是什麼?都有什麼項?性別,年齡?還是什麼?列表裡要包含哪些項?列表要不要分頁?要分頁多少個一個分頁?分頁鏈接什麼樣式?列表什麼樣式?字體大小?顏色?寬窄?更具體的,列表要顯示在頁面的什麼地方?有沒有導航欄?這個頁面的數據從哪裡來?要不要登錄?要的話,登錄頁面什麼樣?要不要驗證碼?
回答完上述所有子問題,你是一定需要分支,循環,變數的。
所以你的「需求語言」就是一種編程語言罷了。
那麼你的「人工智慧」跟編譯器的差距在哪呢。
讀到這裡你可能就明白這個悖論在哪裡了,如果我都用一種編程語言詳細的描述了我的需求了,那麼根本不需要人工智慧,它只要編譯到目標代碼就可以了。如果有一種人工智慧可以生成任意需求的程序,那麼它必需要一種形式化的語言來提供詳細的需求信息。
簡單的說如果輸入包含了完整的需求信息,那麼它一定會是某種編程語言,因此不需要人工智慧來寫程序,這個輸入本身就是某種程序了。如果輸入不包含完整的需求信息,那麼人工智慧也一定生成不了符合需求的程序,因為需求信息並不完整。
是的,這就是目前的科技的天花板。若想實現這個任務,強人工智慧是必須的,它必須能夠自主的去詢問並理解客戶用自然語言描述的需求,當需求不清的時候,它要能夠發現,並且給出反饋,然後把需求細化再用客戶可以聽懂的自然語言進行描述,直到獲取了足夠完整的需求信息,這個時候其實代碼已經出來了。
我希望永遠不要有這麼一天。
以社會的關係觸發,我覺得人工智慧應該是以人類的輔助工具存在,意思就是由且只有人能駕馭。這是人工智慧的界限,也是紅線,一旦越界,人類社會的穩定就會難以預知。
為什麼這麼想呢,從題主的題設出發,假如人工智慧存在自己給自己寫代碼那一天,意義著什麼?寫代碼這個事僅僅是寫代碼嗎?不是哦!除了編碼,有規劃,有設計,有測試,有修復,還有持續集成!最要人命的就是後面兩點,如果人工智慧具備後面兩點,就意味著人工智慧已經可以自我完善,並且升級了!到了這個階段,人工智慧基本就不需要人類駕馭了,只要時間足夠,他們是可以趕上人類的文明的。到那個時候,人工智慧就與人類的關係平行,可社會食物鏈的塔頂只能有一個呀,怎麼辦?所以必須要有一個作為主宰的角色,誰,人類的社會當然只有人啦。
所以,人工智慧距離自己給自己寫代碼還有多遠,我希望永遠不要有這麼一天!
腦洞關閉,睡覺今天剛出了一個基於遺傳演算法的ai programmer,已經能寫出hello world了,後生可畏啊
推薦閱讀:
※為什麼 Siri 不能聯繫上下文跟你對話?
※未來 3~5 年內,哪個方向的機器學習人才最緊缺?
※Deep Learning 的專家如此急缺,它難在何處?
※如何看待人工智慧領域的很多專家認為「人工智慧將對人類存亡造成威脅」的觀點?
※如何評價《羅輯思維》第 115 期對謝熊貓君翻譯的關於人工智慧的文章的重新演繹?