英特爾實(shí)驗(yàn)室的兩位研究人員,利用遺傳算法和圖靈完備語(yǔ)言,號(hào)稱實(shí)現(xiàn)了首個(gè)能夠自動(dòng)編程的AI系統(tǒng)“AI Programmer”。文章共三篇,以下是網(wǎng)絡(luò)翻譯的詳細(xì)內(nèi)容: 介紹計(jì)算機(jī)程序有可能自己編寫(xiě)程序嗎?人類的軟件開(kāi)發(fā)者有一天會(huì)被他們掌握的電腦所取代嗎?就像農(nóng)民、裝配線工人和電話接線員一樣,下一個(gè)會(huì)是軟件開(kāi)發(fā)人員嗎?雖然這種想法看起來(lái)有些牽強(qiáng),但實(shí)際上可能比我們想象的更接近。本文描述了一個(gè)實(shí)驗(yàn),以產(chǎn)生一個(gè)人工智能程序,能夠開(kāi)發(fā)自己的程序,使用遺傳算法實(shí)現(xiàn)自我修改和自我改進(jìn)的代碼。 image.png
“hello” 人工智能寫(xiě)代碼近年來(lái),隨著計(jì)算機(jī)技術(shù)、硬件、內(nèi)存和CPU速度的進(jìn)步,人工智能一直在穩(wěn)步發(fā)展。隨著計(jì)算機(jī)速度的提高,可以進(jìn)行更多的計(jì)算,從而提高許多人工智能算法所需的計(jì)算密集型處理能力。 人工智能愛(ài)好這對(duì)我來(lái)說(shuō)有點(diǎn)像是一種愛(ài)好,我涉獵人工智能程序,試圖編寫(xiě)一個(gè)本身就可以編寫(xiě)程序的程序。當(dāng)然,我并不是指那些將程序指令或代碼塊的子集組合在一起或以其他方式優(yōu)化以產(chǎn)生最終結(jié)果的程序。我指的是從頭開(kāi)始,人工智能完全不知道如何用目標(biāo)語(yǔ)言編程。人工智能必須自己學(xué)習(xí)如何為特定目的創(chuàng)建一個(gè)功能完備的程序。 我最初是在20世紀(jì)90年代末開(kāi)始這項(xiàng)冒險(xiǎn)的,當(dāng)時(shí)我試圖用簡(jiǎn)單的if/then/else語(yǔ)句創(chuàng)建程序,用BASIC編程語(yǔ)言輸出程序。這是一項(xiàng)艱巨的任務(wù),原因很多。首先,使用if/then/else條件來(lái)編寫(xiě)隨機(jī)程序似乎一點(diǎn)也不聰明。第二,BASIC中可用的計(jì)算機(jī)指令太多了。更麻煩的是,有些指令非常危險(xiǎn)(Shell(“format c:”)!我還嘗試用C、C++和其他幾種語(yǔ)言生成程序。然而,這種天真的方法從來(lái)沒(méi)有產(chǎn)生一個(gè)工作的孩子計(jì)劃。盡管這不僅僅是因?yàn)槭褂煤?jiǎn)單的if/then/else語(yǔ)句,還因?yàn)樗x的編程語(yǔ)言是為了供人類使用而不是計(jì)算機(jī),因此,對(duì)于人工智能來(lái)說(shuō),自動(dòng)化要復(fù)雜得多。 雖然最終的目標(biāo)是產(chǎn)生一個(gè)能夠編寫(xiě)自己的文字處理軟件、圖像編輯工具、網(wǎng)絡(luò)瀏覽器或磁盤(pán)碎片整理程序的計(jì)算機(jī)程序,但我更感興趣的是一個(gè)簡(jiǎn)單的概念證明,證明這個(gè)想法是可能的。 足夠多的猴子和破打字機(jī)我最初的動(dòng)機(jī)來(lái)自于【無(wú)限猴子】定理,它說(shuō)如果你有1000多只猴子在打字機(jī)上敲打足夠長(zhǎng)的時(shí)間,它們最終會(huì)重演莎士比亞寫(xiě)的劇本。這聽(tīng)起來(lái)很荒謬,但如果有足夠的時(shí)間,猴子們最終肯定會(huì)碰到“一些”隨機(jī)的字符序列,最終產(chǎn)生書(shū)面作品。簡(jiǎn)化這個(gè)想法,其中一只猴子肯定會(huì)在鍵盤(pán)的敲擊聲中敲出莎士比亞戲劇的第一個(gè)字母;這當(dāng)然是可能的。 關(guān)于遺傳算法的切線這是遺傳算法的基本思想。遺傳算法是一種模仿生物進(jìn)化的人工智能,除了可用的工具和有效的指令外,它一開(kāi)始對(duì)這個(gè)學(xué)科一無(wú)所知。人工智能隨機(jī)挑選一系列指令(作為一段DNA)并檢查結(jié)果的適用性。它是在人口眾多的情況下完成的,比如說(shuō)100個(gè)項(xiàng)目。當(dāng)然,有些節(jié)目比其他節(jié)目好。那些身體最健康的人被交配在一起產(chǎn)生后代。每一代人都從輪盤(pán)賭選擇、交叉和變異等進(jìn)化技術(shù)中獲得了一點(diǎn)額外的多樣性。每個(gè)子代都會(huì)重復(fù)這個(gè)過(guò)程,希望產(chǎn)生越來(lái)越好的結(jié)果,直到找到目標(biāo)解決方案。遺傳算法是適者生存的編程實(shí)現(xiàn)。他們也可以被歸類為人工智能搜索算法,就他們?nèi)绾嗡阉饕粋€(gè)巨大的問(wèn)題空間的具體解決方案。 好,但是為什么選擇brainf ck呢?雖然使用BASIC、C、C++和其他語(yǔ)言的原始實(shí)驗(yàn)未能產(chǎn)生結(jié)果,但我能夠成功地通過(guò)將一個(gè)自組織的編程語(yǔ)言(包括加法、減法、循環(huán)等)與遺傳算法和神經(jīng)網(wǎng)絡(luò)結(jié)合來(lái)生成人工智能編寫(xiě)的程序。雖然這很有趣,但最終的結(jié)果是簡(jiǎn)單的數(shù)學(xué)計(jì)算和編程語(yǔ)言本身,是未知的,并且對(duì)它最終能產(chǎn)生什么有嚴(yán)重的限制。 Brainf ck作為人工智能編程語(yǔ)言的優(yōu)勢(shì)1。它是圖靈完備的 工作原理人工智能程序的工作原理如下: 由于適應(yīng)度方法fitness是計(jì)算成本最高的部分(它必須為人口中的每個(gè)成員執(zhí)行程序代碼,這可能包括無(wú)限循環(huán)和其他討厭的東西),人工智能程序使用Parallel.ForEach方法,可在.NET4.5中找到。以這種方式,它可以在每一代對(duì)群體中的多個(gè)基因組執(zhí)行多個(gè)適應(yīng)度算法。這允許程序利用最大的CPU資源并利用多個(gè)CPU核。程序還每隔10000代保存一次狀態(tài),以防程序或PC關(guān)閉,并且可以從停止的位置繼續(xù)搜索。 適應(yīng)度法適應(yīng)度方法的工作原理是對(duì)生成的程序的輸出進(jìn)行評(píng)分。通過(guò)查看程序輸出的每個(gè)字符(如果產(chǎn)生任何輸出)并從所需字符中減去其值來(lái)計(jì)算分?jǐn)?shù): 當(dāng)然,最初大多數(shù)生成的程序甚至不會(huì)編譯,更不用說(shuō)將文本輸出到控制臺(tái)了。這些都被簡(jiǎn)單地丟棄,偏向于至少輸出一些東西的程序;并進(jìn)一步引導(dǎo)和進(jìn)化,直到輸出結(jié)果越來(lái)越接近所需的解決方案。 解釋器指令集Brainf ck由以下指令集組成: image.png
結(jié)果?輸出Hi人工智能在大約1分鐘內(nèi)成功地編寫(xiě)了一個(gè)程序,在5700代之后輸出“hi”。它產(chǎn)生了以下代碼: 您可以嘗試將上面的代碼粘貼到brainf-ck解釋器中。 單擊“啟動(dòng)調(diào)試器”,忽略警告,然后單擊“運(yùn)行到斷點(diǎn)”。 注意輸出。 如果我們剪裁多余的代碼,則會(huì)看到以下語(yǔ)法上有效的代碼: 您可以在程序運(yùn)行時(shí)查看以下屏幕截圖: AI learning how to program
AI learning how to program, almost there
AI learning how to program, a solution is found
AI program fitness over time
這是歷史圖表,繪制了一段時(shí)間內(nèi)的體能得分。您可以看到人工智能是如何學(xué)習(xí)如何用目標(biāo)語(yǔ)言編程并實(shí)現(xiàn)所需的解決方案的。 Executing the program, developed by the AI
輸出hello人工智能在大約29分鐘內(nèi)成功地編寫(xiě)了一個(gè)程序,在2520000代之后輸出“hello”。它產(chǎn)生了以下代碼: 在生成過(guò)程中,人工智能非常接近于一個(gè)解決方案,但是兩個(gè)字母在一個(gè)循環(huán)中相互綁定。人工智能通過(guò)在有問(wèn)題的循環(huán)中創(chuàng)建一個(gè)內(nèi)部循環(huán),成功地輸出正確的字符,并繼續(xù)處理,從而克服了這個(gè)問(wèn)題。 AI learning how to program
AI learning how to program, a solution is found
AI program fitness over time
執(zhí)行人工智能開(kāi)發(fā)的程序
Hi程序他成功地寫(xiě)了一個(gè)程序輸出“嗨!“經(jīng)過(guò)大約2小時(shí)7分鐘的1219400代。它產(chǎn)生了以下代碼:
這其實(shí)是我最喜歡的。運(yùn)行它,您可以看到原因(單擊啟動(dòng)調(diào)試器并運(yùn)行到斷點(diǎn))。就好像電腦知道它在做什么。有趣的是,生成這個(gè)程序要比前兩個(gè)程序花費(fèi)更長(zhǎng)的時(shí)間。這可能是由于使用的字符,其中包括大寫(xiě)字母和符號(hào)。另外兩個(gè)例子使用的字符在ASCII系統(tǒng)中的值更接近,這對(duì)AI來(lái)說(shuō)更容易找到。 AI learning how to program, a solution is found
執(zhí)行人工智能開(kāi)發(fā)的程序
人工智能項(xiàng)目隨時(shí)間變化的適應(yīng)性
輸出reddit人工智能在大約22分鐘內(nèi)成功地編寫(xiě)了一個(gè)程序,在19.5萬(wàn)代之后輸出“reddit”。它產(chǎn)生了以下代碼: +[+++++>++<]+>++++++[[++++++.-------------.-.-+.+++++.+++++],.,+,-+-,+>+.++<<+<><+] 這次是個(gè)挑戰(zhàn)。這可能是由于它的長(zhǎng)度,或可能是由于d的位置棘手。人工智能會(huì)反復(fù)陷入局部最大值。局部極大值是指當(dāng)遺傳算法在其當(dāng)前參數(shù)內(nèi)找到它能看到的最佳適應(yīng)度時(shí),即使可能存在更好的適應(yīng)度。人工智能無(wú)法跳出洞來(lái)獲得更好的適應(yīng)度,因?yàn)檫@樣做需要適應(yīng)度先下降,然后再增加,這通常違反遺傳算法的規(guī)則。 我能夠通過(guò)在突變功能中加入額外的多樣性來(lái)解決這個(gè)問(wèn)題。以前,這種突變只是通過(guò)改變基因組中的一條指令來(lái)實(shí)現(xiàn)的。突變被增強(qiáng),不僅包括單個(gè)位的突變(替換突變),還包括位的上移(插入突變)和下移(缺失突變)。這種額外的多樣性使人工智能能夠繼續(xù)前進(jìn)。 image.png
人工智能學(xué)習(xí)如何編程,找到了解決方案
人工智能項(xiàng)目隨時(shí)間變化的適應(yīng)性
輸出hello world這是在大約2小時(shí)內(nèi)經(jīng)過(guò)580900代之后產(chǎn)生的。它產(chǎn)生了以下代碼:
如果去掉多余的部分,打印文本的實(shí)際代碼就會(huì)短得多: -><[>-<+++]->>++++[++++++++++++++++++<+]>.---.+-+++++++..+++.+>+<><+[+><><>+++++++++.+-< image.png
image.png
輸出 I love all humans這是6057200代后在大約10小時(shí)內(nèi)產(chǎn)生的。它產(chǎn)生了以下代碼: 如果刪去多余的部分,打印文本的實(shí)際代碼將變短: +[>+<+++]+>------------.+<+++++++++++++++++++++++++++++++.>++++++++++++++++++++++++++++++ 在上面的運(yùn)行中,為AI提供了300條指令的起始程序數(shù)組大小(即300字節(jié),或者更確切地說(shuō)是2400字節(jié),因?yàn)? double=8字節(jié))。人工智能不需要完整的程序代碼。它能用209條指令編寫(xiě)程序。 注意,此解決方案需要10小時(shí)才能完成。但是,請(qǐng)記住,如果是人工智能程序而不是人來(lái)編程,那么完成一個(gè)程序所需的時(shí)間就不那么重要了。人工智能可以簡(jiǎn)單地在后臺(tái)運(yùn)行,而人工智能可以處理其他任務(wù)。我還預(yù)計(jì),隨著未來(lái)幾年計(jì)算機(jī)速度的提高,計(jì)算時(shí)間將大大縮短。 image.png
未來(lái)這個(gè)實(shí)驗(yàn)是一個(gè)概念證明,一個(gè)AI程序可以開(kāi)發(fā)自己的計(jì)算機(jī)程序來(lái)執(zhí)行特定任務(wù)。在這方面,它是成功的。 AI完全可以在不了解目標(biāo)編程語(yǔ)言的情況下啟動(dòng),并成功學(xué)習(xí)了如何生成有效的計(jì)算機(jī)程序,該程序在執(zhí)行時(shí)可以解決特定任務(wù)。 與所有遺傳算法一樣,設(shè)計(jì)適應(yīng)度函數(shù)也涉及很多工作。適應(yīng)性功能等效于向AI描述您要查找的內(nèi)容。這樣,創(chuàng)建適應(yīng)性函數(shù)本身就有點(diǎn)像編程(代表人類)。如果AI有可能開(kāi)發(fā)自己的適應(yīng)功能,這將是向前邁出的一步。同時(shí),可能仍可以擴(kuò)展該項(xiàng)目以創(chuàng)建更復(fù)雜的子程序,例如那些接受用戶輸入并計(jì)算結(jié)果的子程序。 十年前,該計(jì)劃在任何合理的時(shí)間內(nèi)都不會(huì)成功。五年前,該計(jì)劃可能要花費(fèi)幾天到幾周的時(shí)間,甚至可能更長(zhǎng)。今天,執(zhí)行只花了幾分鐘。明天,該程序可能會(huì)在幾毫秒內(nèi)運(yùn)行。隨著計(jì)算機(jī)變得越來(lái)越快,功能越來(lái)越強(qiáng)大,可以計(jì)算出越來(lái)越大的搜索空間。我等不及了 如果您發(fā)現(xiàn)這很有趣并且想了解更多信息,請(qǐng)?jiān)贕itHub上下載完整的源代碼或聯(lián)系Kory Becker。閱讀我的有關(guān)在C#.NET中使用遺傳算法和神經(jīng)網(wǎng)絡(luò)的教程。本文中的程序可執(zhí)行文件是使用Brainfuck.NET編譯器編譯的。 2015年1月5日更新是否想了解AI還能做什么?我也是!在后續(xù)文章中閱讀更多內(nèi)容:突破自我編程人工智能的極限和自我編程人工智能學(xué)習(xí)使用功能。 關(guān)于作者本文由軟件開(kāi)發(fā)人員和架構(gòu)師Kory Becker撰寫(xiě),他們精通多種技術(shù),包括Web應(yīng)用程序開(kāi)發(fā),機(jī)器學(xué)習(xí),人工智能和數(shù)據(jù)科學(xué)。 |
|