(二)突破自我編程人工智能的極限

介紹

計(jì)算機(jī)程序可以編寫自己的程序嗎媒吗? 在上一篇文章中刘急,使用人工智能創(chuàng)建了一個(gè)程序來(lái)回答這個(gè)問題淹仑,該程序可以編寫自己的程序來(lái)輸出“ Hello World”和其他簡(jiǎn)單字符串薪鹦。 AI計(jì)算機(jī)程序使用遺傳算法來(lái)編寫子程序,該程序使用Brainfuck編程語(yǔ)言(一種由8條指令組成的圖靈完整編程語(yǔ)言)編寫正卧。
+-+-+>-<[++++>+++++<+<>++]>[-[---.--[[-.++++[+++..].]]]]
“dlroW olleH” (“Hello World” backwards)

上面的程序代碼是由一個(gè)人工智能程序創(chuàng)建的蠢熄,旨在編寫具有自我修改和自我完善代碼的程序。程序在60秒內(nèi)創(chuàng)建了上述結(jié)果炉旷。上面的程序接受用戶輸入并打印反轉(zhuǎn)的文本签孔。

人工智能變得聰明,還是恰巧幸運(yùn)窘行?

有了輸出簡(jiǎn)單字符串的初始實(shí)驗(yàn)的成功饥追,我很好奇將AI程序的范圍推向生成更復(fù)雜的程序的方向。我認(rèn)為罐盔,也許讓AI編寫一個(gè)程序來(lái)輸出“ Hello World”太容易了但绕。也許只是運(yùn)氣?畢竟惶看,找出增量捏顺,減量和打印命令的組合以輸出字符串并不需要太多邏輯。真的沒有做任何有趣的事情纬黎。還是幅骄?

由于Brainfuck是一種經(jīng)過驗(yàn)證的圖靈完備語(yǔ)言,從理論上講能夠解決宇宙中的任何計(jì)算問題(這給我們的AI帶來(lái)了很大的潛力)本今,因此AI肯定會(huì)生成更多有趣的程序昌执,這些程序?qū)嶋H上可以執(zhí)行有用的任務(wù)。

自編程人工智能和可能性的個(gè)人觀點(diǎn)

當(dāng)我看到文件的原始字節(jié)顯示時(shí)诈泼,例如從可執(zhí)行文件的十六進(jìn)制編輯視圖中懂拾,我看到了軟件。我可以將0和1的任意組合可視化為同一軟件铐达。如果計(jì)算機(jī)程序以空白字節(jié)數(shù)組開始岖赋,并且運(yùn)行得足夠快且足夠長(zhǎng),則理論上它可以重新創(chuàng)建相同的軟件瓮孙。從數(shù)學(xué)上講唐断,計(jì)算機(jī)可能會(huì)在第一次嘗試時(shí)僅選擇一個(gè)隨機(jī)字節(jié)序列,然后偶然發(fā)現(xiàn)可執(zhí)行文件簽名(例如Starcraft II)杭抠,這在數(shù)學(xué)上是可能的脸甘。

好吧,也許這似乎太多了偏灿,甚至無(wú)法考慮丹诀。但是,最低限度的“ Hello World”可執(zhí)行文件怎么樣?有效的可執(zhí)行文件只有142個(gè)字節(jié)铆遭,因此計(jì)算機(jī)程序偶然發(fā)現(xiàn)此簽名并重新創(chuàng)建相同的可執(zhí)行文件顯然是合理的硝桩。如果摩爾定律成立,并且計(jì)算機(jī)的價(jià)格成倍增長(zhǎng)枚荣,并且價(jià)格大大降低碗脊,那么這將極大地減少明顯的無(wú)限時(shí)標(biāo),從而從進(jìn)化搜索算法中獲得此類結(jié)果橄妆。

Windows 8衙伶,Apple iOS,Street Fighter 2甚至DOS都是一系列的0和1害碾。如果人工智能程序能夠通過字節(jié)的隨機(jī)性引導(dǎo)自己矢劲,則可以通過搜索二進(jìn)制文件以找到正確的模式來(lái)重新創(chuàng)建每個(gè)計(jì)算機(jī)程序。計(jì)算機(jī)也有可能發(fā)現(xiàn)新的軟件蛮原,并在此過程中創(chuàng)建前所未有的新軟件卧须。

二進(jìn)制大爆炸

1和0的二進(jìn)制位就像組成宇宙中每個(gè)物理對(duì)象的原子一樣。如果可以操縱和排列原子儒陨,則從理論上講可以重新創(chuàng)建任何物理對(duì)象花嘶。我想到了《星際迷航》的復(fù)制者。當(dāng)然蹦漠,那只是科幻小說(shuō)椭员,對(duì)不對(duì)?但是笛园,排列零和一肯定在我們的能力范圍內(nèi)隘击。通過操縱和排列位,理論上我們可以創(chuàng)建任何類型的軟件-甚至還不存在研铆。而且與安排原子來(lái)制造金等過程不同埋同,該過程甚至不需要核反應(yīng)。

如果給出了足夠獨(dú)特的啟發(fā)棵红,甚至有可能描述強(qiáng)大的AI凶赁。盡管技術(shù)尚未能夠?qū)崿F(xiàn)這一目標(biāo),但從理論上講逆甜,人工智能程序有可能搜索二進(jìn)制的巨大空間以找到解決方案-甚至有可能虱肄。但是,讓我們從小步驟開始交煞。

下一代人工智能

由于第一個(gè)AI程序成功編寫了自己的“ Hello World”程序咏窿,因此下一個(gè)邏輯步驟是讓AI編寫一個(gè)接受用戶輸入的程序。一個(gè)簡(jiǎn)單的示例是編寫一個(gè)程序素征,要求用戶提供其姓名集嵌,然后打印“ Hello Kory”萝挤。出于這個(gè)最初的目標(biāo),我修改了AI程序的適應(yīng)性功能纸淮,以支持用戶輸入平斩。

AI引擎進(jìn)行了重大改進(jìn)亚享,以提高代碼生成速度咽块。特別是,用StringBuilder類替換字符串連接的簡(jiǎn)單更改大大增加了生成時(shí)間欺税。它特別改進(jìn)了對(duì)編碼和解碼Brainfuck指令的調(diào)用侈沪,從其數(shù)字表示形式的雙精度(0.0 .. 1.0)到相應(yīng)的字符表示形式。最初是通過簡(jiǎn)單地將下一個(gè)編程指令字符連接到程序字符串來(lái)完成的晚凿。但是亭罪,由于該方法在典型運(yùn)行過程中被調(diào)用數(shù)十萬(wàn)次,因此將其更改為使用StringBuilder可以帶來(lái)明顯的改進(jìn)歼秽。

另一個(gè)速度改進(jìn)是通過允許人工智能優(yōu)化其生成的代碼來(lái)實(shí)現(xiàn)的应役。它通過為執(zhí)行次數(shù)最少(也稱為滴答)的程序提供適合度獎(jiǎng)勵(lì)來(lái)實(shí)現(xiàn)此目的。

// Bonus for less operations to optimize the code.
countBonus += ((_maxIterationCount - _bf.m_Ticks) / 100.0);

自編譯為.exe

AI程序也已更新燥筷,包括將生成的子代碼編譯為物理可執(zhí)行文件(.exe)的功能箩祥。以這種方式,開發(fā)人員可以創(chuàng)建自己的規(guī)則集肆氓,以指示AI編寫程序袍祖。一旦AI成功,將保存一個(gè).exe文件谢揪,其中包含已編譯的Brainfuck程序蕉陋。

除了在AI編寫完程序后自動(dòng)生成可執(zhí)行文件之外,擁有自動(dòng)內(nèi)置編譯器的另一個(gè)好處是拨扶,我們可以包括對(duì)Brainfuck編程語(yǔ)言的擴(kuò)展凳鬓。我們可以添加新的說(shuō)明并提供其操作。生成可執(zhí)行文件時(shí)患民,我們的編譯器可以包含此支持缩举。內(nèi)置的編譯器實(shí)際上很容易通過使用CSharpCodeProvider來(lái)實(shí)現(xiàn),它使您可以傳遞字符串源代碼(其中嵌入了Brainfuck代碼)并生成一個(gè).exe文件酒奶。

傳統(tǒng)的 Brainf-ck

對(duì)于本文中的大部分實(shí)驗(yàn)蚁孔,都使用了傳統(tǒng)的Brainfuck編程指令集。這樣可以更輕松地證明AI創(chuàng)建的程序惋嚎。但是杠氢,隨著程序變得越來(lái)越復(fù)雜,通過擴(kuò)展帶有擴(kuò)展功能的指令集(包括Brainfuck Extended Type 3)來(lái)提高速度另伍,我們將在結(jié)果的最后進(jìn)行介紹鼻百。

來(lái)看看適合度f(wàn)itness

人工智能使用的大多數(shù)適應(yīng)度方法都依賴于一個(gè)簡(jiǎn)單的檢查來(lái)判斷程序的質(zhì)量绞旅,盡管它們包括相當(dāng)多的其他代碼,用于運(yùn)行brainfuck解釋器温艇、發(fā)送輸入因悲、收集輸出以進(jìn)行評(píng)分等。我定義了新實(shí)驗(yàn)中使用的適應(yīng)度函數(shù)如下:

Hello Name

for (int j = 0; j < targetStringName.Length; j++)
{
if (_console.Length > j)
{
Fitness += 256 - Math.Abs(_console[j] - targetStringName[j]);
}
}

這與最基礎(chǔ)的helloworld的適應(yīng)功能(fitness function)非常相似勺爱。我們只需對(duì)照輸出檢查完整的字符串晃琳。這種適應(yīng)度方法的關(guān)鍵在于接受用戶輸入,并在程序在不適當(dāng)?shù)臅r(shí)間要求輸入時(shí)提供懲罰琐鲁。

Reverse String 反轉(zhuǎn)字符串

for (int j = 0; j < name.Length; j++)
{
if (_console.Length > j)
{
Fitness += 256 - Math.Abs(_console[j] - name[name.Length - j - 1]);
}
}
對(duì)于反轉(zhuǎn)字符串卫旱,我們遵循與helloworld適應(yīng)度(fitness)方法相同的模式,除了檢查目標(biāo)字符串的反轉(zhuǎn)之外围段。請(qǐng)注意顾翼,在上面的代碼中,我們將從索引0開始的每個(gè)輸出字符與從索引長(zhǎng)度-1開始的目標(biāo)字符串進(jìn)行比較奈泪,并向后處理适贸。

加減法

// Adding
if (Int32.TryParse(_console.ToString(), out value))
{
Fitness += 256 - Math.Abs(value - (input1 + input2));
}

// Subtracting
if (Int32.TryParse(_console.ToString(), out value))
{
Fitness += 256 - Math.Abs(value - (input1 - input2));
}
數(shù)學(xué)運(yùn)算使用相當(dāng)簡(jiǎn)單的適應(yīng)度檢查將輸出與目標(biāo)結(jié)果進(jìn)行比較。我們還將輸出轉(zhuǎn)換為整數(shù)(如果可能的話)涝桅,整數(shù)本身就是適應(yīng)度得分的一部分拜姿。有趣的是,我沒有成功地將同樣的適應(yīng)度應(yīng)用于乘法苹支。

If-Then條件

現(xiàn)在我們來(lái)看看更有趣更復(fù)雜的程序砾隅。下面的程序真的開始推動(dòng)人工智能生成復(fù)雜的編程邏輯,包括執(zhí)行if/then決策和操作的能力债蜜。如果人工智能能夠成功地制定出這種邏輯晴埂,那么就有可能開發(fā)出大量人工智能自動(dòng)生成的軟件。

你將要看到的程序不是我寫的

請(qǐng)記住寻定,當(dāng)您瀏覽下面的結(jié)果時(shí)儒洛,這些程序都不是我寫的。人工智能做到了狼速。事實(shí)上琅锻,我甚至不知道如何用brainfuck編程(誰(shuí)會(huì)呢?)向胡。我對(duì)指令集很熟悉恼蓬,但是如果你讓我用它來(lái)寫程序,我可能一點(diǎn)也做不到僵芹。有了免責(zé)聲明处硬,讓我們看看結(jié)果。

結(jié)果拇派?
Hello Name
人工智能在大約30分鐘內(nèi)成功地編寫了一個(gè)程序荷辕,在42800代之后輸出“Hello[NAME]”凿跳。它產(chǎn)生了以下代碼:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[++++++++[++++.+++++++++++++++++++++
++++++++.+++++[++..<>+++.>+++++++++++++++++++++++++++++<>++++-.[,.,.,.,.]].].][.,]-,-]][+.--+><<
..>[+>[+.<+,]><<>]<><<.>.,--<>[<>-,,,><.>.<-,][-[-,-[.-[-+

如果我們?nèi)サ舳嘤嗟牟糠郑玫降拇a是:
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++[++++++++[++++.+++++++++++++++++++++
++++++++.+++++[++..<>+++.>+++++++++++++++++++++++++++++<>++++-.[,.,.,.,.]]]]

運(yùn)行時(shí)疮方,上面的代碼會(huì)提示用戶輸入控嗜。用戶可以輸入一個(gè)字符,程序會(huì)反復(fù)提示用戶輸入更多字符骡显,直到輸入0為止疆栏。程序打印“Hello”,后跟輸入的文本蟆盐。人工智能能夠編程一個(gè)循環(huán)來(lái)接受用戶的輸入承边,這是一個(gè)驚喜遭殉。
有趣的是石挂,大多數(shù)人類程序員可能會(huì)編寫這樣的程序,首先詢問用戶的姓名险污,然后打印全文痹愚。相反,AI首先打印單詞“Hello”蛔糯,然后請(qǐng)求輸入拯腮,然后打印剩余的文本。這樣做實(shí)際上是有意義的蚁飒,而且事實(shí)上动壤,這為最終用戶提供了更具響應(yīng)性的體驗(yàn)(立即顯示輸出,而不是排隊(duì))淮逻。
以下屏幕截圖顯示程序正在運(yùn)行:


AI learning how to program
AI result

反轉(zhuǎn)字符串

人工智能在大約60秒內(nèi)成功地編寫了一個(gè)程序琼懊,在2600代之后反轉(zhuǎn)一個(gè)字符串。它產(chǎn)生了以下代碼:
+->,>,[>+,],,,,-<[.+<].[>[,,<,>><,-+[]-[<[<>>+-<[,+]]>><[,[].-[]<[>]+[.->+.+,>-[<+-+]
->>,<>,>-+][,-.<--+<[[[,+>-+]-]>,><-[>,+<[<...[++[+.><<-..[,<[+<]-<>+-,,>,,,-.[,+,+]<

].+]]-,...[.<,,.],-[].]<[><,<.>>[+.-+--,++].+[]..]><.-][.,-,>][+][+,--,<--.<+]

如果我們?nèi)サ舳嘤嗟牟糠峙涝纾玫降拇a是:
+->,>,[>+,],,,,-<[.+<]
運(yùn)行時(shí)哼丈,上面的代碼會(huì)提示用戶輸入。用戶可以輸入一個(gè)字符筛严,程序會(huì)反復(fù)提示用戶輸入更多字符醉旦,直到輸入0為止。與Hello Name程序立即顯示output不同桨啃,這個(gè)程序首先將所有用戶輸入讀入內(nèi)存车胡,然后輸出反向字符串。仔細(xì)想想照瘾,程序必須首先讀取所有輸入匈棘,因?yàn)檩斎氲淖詈笠粋€(gè)字符必須是第一個(gè)字符輸出。人工智能自己解決了這個(gè)問題网杆。
以下屏幕截圖顯示程序正在運(yùn)行:


AI learning how to program
AI result

加法

人工智能在大約45分鐘內(nèi)成功地編寫了一個(gè)程序羹饰,在92400代之后將兩個(gè)數(shù)字相加伊滋。它產(chǎn)生了以下代碼:

,>,-[-<+>]<+.>][+<+[<>>,>]-->>.[.<,[[,>><<[,.+,<[>,,.--->.[[+<>,[[[+>,.[,-.,>.,--<
+<+,,.][+>++-[+++.+.+.[].-+,][<[].<]<][[,].<[[+..]].->-+-]+-+.-].]<,,]+<->.[][.[>.

]+[[<,>[.,,+-]+,+><,.,<-]-.]]+-++->,-.[-+->--]-.].>+.<.>.>,+<.+<..-],.+-,,,><[+-+.>[>

如果我們?nèi)サ舳嘤嗟牟糠郑玫降拇a是:
,>,-[-<+>]<+.

運(yùn)行時(shí)队秩,上面的代碼提示用戶輸入兩個(gè)輸入笑旺。輸入應(yīng)為數(shù)字格式(字節(jié)),而不是字符格式(ASCII)馍资。如果在基于web的brainfuck解釋器上運(yùn)行此命令筒主,則應(yīng)使用數(shù)字7的格式#7提供輸入,否則鸟蟹,如果僅鍵入7乌妙,則大多數(shù)基于web的解釋器將假定您的意思是字節(jié)值55,這是字符“7”的ASCII值建钥。
程序成功地將0到255之間的任意兩個(gè)數(shù)字相加藤韵,這是一個(gè)字節(jié)的最大大小,并包裝任何超過限制的值熊经。例如泽艘,30+50=80,210+20=230镐依,255+2=1匹涮。
記住,人工智能程序不知道如何做加法槐壳。事實(shí)上然低,它對(duì)數(shù)學(xué)的概念一無(wú)所知。通過進(jìn)化基于適應(yīng)度函數(shù)的子程序务唐,人工智能能夠成功地得到兩個(gè)數(shù)字相加的解決方案雳攘。當(dāng)我看到這個(gè)結(jié)果時(shí),我印象非常深刻绍哎。從簡(jiǎn)單地將字符串輸出到控制臺(tái)来农,這是一個(gè)很大的飛躍。
以下屏幕截圖顯示程序正在運(yùn)行:


AI learning addition

AI result

減法

人工智能在大約1小時(shí)內(nèi)成功地編寫了一個(gè)程序崇堰,在177900代之后減去兩個(gè)數(shù)字沃于。它產(chǎn)生了以下代碼:
,-->,-[-<->]<+.,[+-[,,]+[-.[[]],[+>--+,>->],<+[.<>.[,][,,><[.<,]][]+],>
[-+,[-+[+-[-[[--<>,>[[],---]+<[[,>].[,<[.,,[-.<.[-<[+]<>.-<<..+[<<+]-]<
]+<>,[].,,,.]<-[<>>[+[<><,[<>,+-],-,+]+>.<><--[.]<[,,<][,[

如果我們?nèi)サ舳嘤嗟牟糠郑玫降拇a是:

,-->,-[-<->]<+.

運(yùn)行時(shí)海诲,上面的代碼提示用戶輸入兩個(gè)輸入繁莹。與生成的加法程序一樣,輸入應(yīng)該是數(shù)字格式(字節(jié))特幔,而不是字符格式(ASCII)咨演。程序成功地從第一個(gè)數(shù)字中減去第二個(gè)數(shù)字并輸出結(jié)果。注意蚯斯,輸出是一個(gè)字節(jié)值薄风,因此大多數(shù)基于web的解釋器上顯示的字符將顯示為與數(shù)字不同的ASCII字符饵较。例如,如果兩個(gè)數(shù)字相減的結(jié)果是90遭赂,則基于web的解釋器可能會(huì)打印出“Z”(值90的ASCII表示形式)循诉。
以下屏幕截圖顯示程序正在運(yùn)行:


注意,第一個(gè)生成的程序成功地減去了兩位數(shù)撇他,但結(jié)果中包含了多余的零茄猫。雖然這在數(shù)學(xué)上仍然是正確的(0000008=8),也是人工智能選擇它作為解決方案的原因困肩,但我們可以做得更好划纽。下面的第二個(gè)結(jié)果顯示了AI程序再次運(yùn)行后的結(jié)果。


image.png

If-Then條件

現(xiàn)在我們來(lái)看看更有趣更復(fù)雜的程序锌畸。下面的程序真的開始推動(dòng)人工智能生成復(fù)雜的編程邏輯勇劣,包括執(zhí)行if/then決策和操作的能力。如果人工智能能夠成功地制定出這種邏輯蹋绽,那么就有可能開發(fā)出大量人工智能自動(dòng)生成的軟件芭毙。

Fitness 功能逐漸增強(qiáng)

不幸的是,隨著目標(biāo)程序復(fù)雜性的增加卸耘,適應(yīng)度函數(shù)也會(huì)隨之增加。畢竟粘咖,適應(yīng)度函數(shù)需要指導(dǎo)人工智能確定一個(gè)特定的子程序適合目標(biāo)解決方案的程度蚣抗。對(duì)于條件句,我最初使用用于先前程序的基本適應(yīng)度函數(shù)是不成功的瓮下。需要進(jìn)行額外的調(diào)整翰铡。
在fitness函數(shù)中添加了一個(gè)檢查,以查看解釋器的內(nèi)存寄存器(即讽坏,通過移位操作的當(dāng)前數(shù)據(jù)指針)锭魔。我們計(jì)算程序使用的不同內(nèi)存寄存器的數(shù)量,并給適合度一個(gè)額外的獎(jiǎng)勵(lì)路呜,支持更多的內(nèi)存寄存器而不是更少的內(nèi)存寄存器迷捧。這似乎有助于激發(fā)多樣性。
我們還記錄用于每個(gè)打印命令的指令指針胀葱。重復(fù)使用同一打印命令將受到懲罰漠秋。這似乎也有助于培養(yǎng)多樣性和實(shí)現(xiàn)成功的if/then結(jié)果。窺視解釋器的內(nèi)存寄存器和指令指針是否公平有待討論抵屿,但是對(duì)于本文中的測(cè)試用例庆锦,他們添加了所需的多樣性以獲得結(jié)果。

Hi Z Bye

人工智能成功地編寫了一個(gè)程序轧葛,要求用戶輸入(1-3)搂抒,并根據(jù)輸入的值輸出文本艇搀,類似于從菜單中選擇一個(gè)選項(xiàng)。例如求晶,輸入1打印文本“hi”中符,輸入2打印文本“z”,輸入3打印文本“bye”誉帅。人工智能在大約2小時(shí)內(nèi)成功地編寫了446200代程序淀散。它產(chǎn)生了以下代碼:

[[]]>++++>+<+++++++++++++++<--[+++++++++++++++++++++++++++++++++++++++++++++++++
++++++++++++++++++++++++++++++++++++++++++++++++++++++>]++++++++++++++++++++++++
++++++++++++>,-[--[>[][[,[]]]+[<<<<.]]<+++++++++++++++++++++++++++++++++++++++++
++++++++++++++<++++++++++++++>+++++++.<++-++.<<.<]++++++++++++++++++++++++++++++
++++++++++++++++++++++[+++++[+++++++++++++[++++++++++++++++++++++++++++++++++.>+
++++++++++[+++++><><++++++++++++++++<>++++++[++<>+++++++++++++++++++++++++++++++
+++++++++++++++++++++++++++++<>+++++.<<<<<<[[[,,,<<.+-[[+.[>[-]]-[+[<<,[<<[<[,]>
[<,]>[<><<.[+<,,]++-]--[+<-[-][..-<-------<>..<[]<[>[,>.>+[,<>][,],][+->[.]+[.[[
.]]<[...[+

這是一個(gè)非常有趣的結(jié)果。這也是人工智能編寫的最長(zhǎng)的程序蚜锨,包含650條指令(盡管并非所有指令都需要)档插。在上面的代碼中,AI已經(jīng)成功地編寫了一個(gè)程序亚再,根據(jù)給定的問題執(zhí)行if/then條件決策郭膛。然后,它繼續(xù)執(zhí)行三個(gè)獨(dú)立動(dòng)作之一氛悬,這取決于該決策则剃。所有這些都在上面自動(dòng)生成的源代碼中進(jìn)行編碼。這真的是一個(gè)巨大的進(jìn)步如捅,從人工智能的卑微的開端棍现。
如果您在基于web的解釋器上嘗試上述程序,則輸入應(yīng)以字節(jié)值(而非ASCII)的形式輸入镜遣,因此菜單選項(xiàng)1應(yīng)以#1的形式輸入己肮,菜單選項(xiàng)3應(yīng)以#3的形式輸入,依此類推悲关』哑В或者您可以下載并運(yùn)行生成的可執(zhí)行文件,該文件將自動(dòng)以數(shù)字格式接收您的輸入寓辱。
以下屏幕截圖顯示程序正在運(yùn)行:


image.png

image.png

image.png

輸出Cats Are Evil

人工智能現(xiàn)在將把更長(zhǎng)的字符串與條件邏輯結(jié)合起來(lái)艘绍。為了在合理的時(shí)間內(nèi)獲得結(jié)果,我們將使用brainfuck編程語(yǔ)言的略微擴(kuò)展版本brainfuck extended Type III秫筏。這個(gè)版本包括幾個(gè)新的指令诱鞠,特別是0-F,它通過允許AI快速到達(dá)所需的ASCII值范圍跳昼,顯著加快AI的速度般甲。雖然大多數(shù)基于web的brainfuck解釋器不實(shí)現(xiàn)擴(kuò)展類型3,但是我們的內(nèi)置編譯器實(shí)現(xiàn)了鹅颊。所以生成的可執(zhí)行文件仍然可以正確運(yùn)行敷存,使用的是人工智能編寫的源代碼。

人工智能成功地編寫了一個(gè)程序,要求用戶輸入(1-3)锚烦,并根據(jù)輸入的值輸出文本“cats”觅闽、“are”、“evil”涮俄。人工智能在大約3個(gè)小時(shí)的時(shí)間里成功地編寫了814400代程序蛉拙。它產(chǎn)生了以下代碼:

,--[-[7-------------.--.<7++++.-.<-]>>>>7-----------.>7++++++>6+++++++++<.,]
[.>7----.[<<<+]]6+.>6++++++++++++++++++.>6+++++.]-+.<+<.<+++],+[]+.[++[+[+[+
,+[+..<.]C+..<-][-+..,>,-+><,><].]<++>>+,]+-,[

首先,注意AI可以使用的新指令彻亲。字符0到F通過將給定內(nèi)存寄存器的值設(shè)置為相應(yīng)的值來(lái)加速ASCII范圍值的生成孕锄。這些指令是brainfuck擴(kuò)展類型3的一部分。一旦添加到可用指令池中苞尝,AI立即看到了使用這些指令的價(jià)值畸肆,并將它們散布到整個(gè)代碼中。結(jié)果是人工智能程序生成速度大大加快宙址,速度提高了30%以上轴脐。
還要注意,生成的代碼要短得多抡砂。實(shí)際上大咱,它是壓縮的。這與zip和rar等壓縮算法的工作原理類似注益。他們把重復(fù)的字符替換成更小的字符碴巾。解壓后,他們將單個(gè)字符擴(kuò)展為重復(fù)字符聊浅,恢復(fù)原始字符桶蛔。人工智能也在執(zhí)行同樣的想法衷模,用單個(gè)字符7(實(shí)際上對(duì)應(yīng)于112個(gè)“+”指令)替換一系列重復(fù)的+或-指令。
以下屏幕截圖顯示程序正在運(yùn)行:

首先避消,注意AI可以使用的新指令碳锈。字符0到F通過將給定內(nèi)存寄存器的值設(shè)置為相應(yīng)的值來(lái)加速ASCII范圍值的生成顽冶。這些指令是brainfuck擴(kuò)展類型3的一部分。一旦添加到可用指令池中售碳,AI立即看到了使用這些指令的價(jià)值强重,并將它們散布到整個(gè)代碼中。結(jié)果是人工智能程序生成速度大大加快贸人,速度提高了30%以上间景。

還要注意,生成的代碼要短得多艺智。實(shí)際上倘要,它是壓縮的。這與zip和rar等壓縮算法的工作原理類似十拣。他們把重復(fù)的字符替換成更小的字符封拧。解壓后志鹃,他們將單個(gè)字符擴(kuò)展為重復(fù)字符,恢復(fù)原始字符泽西。人工智能也在執(zhí)行同樣的想法曹铃,用單個(gè)字符7(實(shí)際上對(duì)應(yīng)于112個(gè)“+”指令)替換一系列重復(fù)的+或-指令。
以下屏幕截圖顯示程序正在運(yùn)行:


AI result

AI result
AI result

換到Brainfuck擴(kuò)展型III

正如上面的“貓是邪惡的”程序所示捧杉,brainfuck的一個(gè)擴(kuò)展版本被用來(lái)讓AI在更短的時(shí)間內(nèi)成功地編寫一個(gè)程序陕见。AI程序?qū)嶋H上包含選擇brainfuck應(yīng)該使用哪個(gè)版本的選項(xiàng),只需更改配置文件中的一個(gè)值味抖。
“貓是邪惡的”程序當(dāng)然可以用經(jīng)典的brainfuck生成评甜,但它需要比三個(gè)小時(shí)長(zhǎng)得多。雖然讓人工智能使用擴(kuò)展編程語(yǔ)言的明顯好處是速度提升和代碼壓縮非竿,但缺點(diǎn)是我們不能再在基于web的解釋器中測(cè)試結(jié)果蜕着。然而,如果我們希望AI編寫的程序包含更多有趣的功能红柱,比如文件I/O和網(wǎng)絡(luò)功能承匣,那么我們就不得不留下經(jīng)典的brainfuck。因此锤悄,我們不可避免地要從經(jīng)典版本遷移到更增強(qiáng)的版本韧骗,甚至可能更進(jìn)一步。事實(shí)上零聚,人工智能項(xiàng)目的內(nèi)置編譯器已經(jīng)將其修改后的版本稱為“BrainPlus”袍暴,以防萬(wàn)一。

威脅隶症,危險(xiǎn)和潛在危害

提供給AI的編程指令集就像一個(gè)由8個(gè)樂高玩具組成的玩具箱政模。僅用這8個(gè)樂高積木,您就可以建造各種房屋蚂会,城堡淋样,地牢和道路。但是胁住,最終趁猴,您將需要做更多的事情。同樣彪见,當(dāng)我們希望通過代碼壓縮來(lái)提高速度時(shí)儡司,我們給了AI一些額外的積木(編程指令)。同樣余指,如果我們希望AI編寫程序來(lái)訪問計(jì)算機(jī)的文件系統(tǒng)或通過Internet進(jìn)行通信捕犬,那么我們將需要新的說(shuō)明。提供這些指令相對(duì)簡(jiǎn)單。如何執(zhí)行新指令(即從網(wǎng)絡(luò)讀取字節(jié)或听,將字節(jié)存儲(chǔ)在文件流中等)取決于我們自己的解釋器和編譯器探孝。但是,讓我們考慮一下這種潛力可能產(chǎn)生的危險(xiǎn)副作用誉裆。

選擇Brainfuck作為我們AI的首選編程語(yǔ)言的原因之一是簡(jiǎn)單的指令集顿颅。這些說(shuō)明是對(duì)受控內(nèi)存的簡(jiǎn)單操作,不包含對(duì)主機(jī)文件系統(tǒng)或內(nèi)存的更改足丢,這也非常有幫助粱腻。在實(shí)驗(yàn)的早期,我嘗試使用BASIC斩跌,C和C ++生成程序绍些,并很快發(fā)現(xiàn)了損壞計(jì)算機(jī)的可能性。實(shí)際上耀鸦,大多數(shù)程序在執(zhí)行后立即失敗柬批。最壞的情況只是重啟了我的機(jī)器。

但是袖订,如果其中一個(gè)程序生成的代碼類似于硬盤驅(qū)動(dòng)器格式的命令簽名氮帐,該怎么辦?還是BIOS覆蓋命令洛姑?或者上沐,AI會(huì)生成一個(gè)無(wú)限循環(huán)的程序,以訪問網(wǎng)絡(luò)楞艾。

在將指令集添加到具有訪問主機(jī)系統(tǒng)或遠(yuǎn)程網(wǎng)絡(luò)功能的指令集時(shí)参咙,請(qǐng)記住這些潛在的有害副作用,這一點(diǎn)很重要硫眯。理想情況下蕴侧,應(yīng)在受控的模擬環(huán)境中運(yùn)行AI程序的生成,直到生成具有所需結(jié)果的成功程序?yàn)橹沽饺搿戈盈?梢耘c本地Web服務(wù)器甚至模擬服務(wù)器結(jié)合創(chuàng)建沙箱執(zhí)行環(huán)境。畢竟谆刨,字節(jié)不需要通過網(wǎng)絡(luò)進(jìn)行物理交換,以使AI生成具有網(wǎng)絡(luò)通信的程序归斤。這些指令可以簡(jiǎn)單地解釋為判斷正確性痊夭,并允許AI相應(yīng)地發(fā)展。

也有一些失敗

雖然AI的上述成果固然令人印象深刻脏里,但并非全部成功她我。也有一些失敗,主要是由于AI用遺傳算法達(dá)到了局部最大值。這些方法包括:乘法番舆,斐波那契數(shù)列和數(shù)字猜謎游戲的適用方法酝碳。

例如,對(duì)于數(shù)字猜謎游戲程序恨狈,目標(biāo)是讓AI生成一個(gè)可以從1-10之間選擇一個(gè)隨機(jī)數(shù)的程序疏哗。然后它將要求用戶進(jìn)行猜測(cè),并以更高或更低或獲勝的答案進(jìn)行響應(yīng)禾怠。理想情況下返奉,它還會(huì)計(jì)算用戶嘗試猜測(cè)正確次數(shù)的嘗試次數(shù)。在我最初的實(shí)驗(yàn)中吗氏,人工智能可以做的最好的事情就是匹配訓(xùn)練集中的猜測(cè)序列芽偏,并生成一個(gè)程序,簡(jiǎn)單地執(zhí)行較高弦讽,較低污尉,較低,獲勝等順序往产,以達(dá)到“所需”的結(jié)果被碗。如果輸入偏離了預(yù)期的順序,程序?qū)⒗^續(xù)打印相同的短語(yǔ)序列捂齐。也許蛮放,這是適應(yīng)性功能的缺陷,而不是AI本身奠宜。需要更多的實(shí)驗(yàn)包颁。

隨意下載源代碼并嘗試一下。

建設(shè)性的批評(píng)

最初的文章描述了AI編寫“ Hello World”程序的結(jié)果压真,在編程社區(qū)中引起了相當(dāng)多的對(duì)話娩嚼,尤其是在reddit上。盡管許多人對(duì)人工智能能夠通過遺傳算法編寫自己的計(jì)算機(jī)程序的想法著迷滴肿,但其他人對(duì)此想法卻持批評(píng)態(tài)度岳悟。這種類型的實(shí)現(xiàn)是否真的有用,還有待觀察泼差。但是贵少,它仍然令人興奮,因此堆缘,我在下面介紹了一些評(píng)論滔灶。

有人認(rèn)為由AI開發(fā)的“ Hello World”程序過于瑣碎。畢竟吼肥,其他人已經(jīng)寫過遺傳算法录平,以前使用隨機(jī)ASCII字符創(chuàng)建字符串麻车。此外,在其之上添加編程語(yǔ)言僅是一層斗这,實(shí)際上只是一種干擾动猬。他們指出,由于其位之一的單個(gè)突變會(huì)拋出整個(gè)程序表箭,從而使結(jié)果無(wú)用赁咙,因此,buckfuck本身特別不適合以這種方式生成AI燃逻。他們聲稱序目,使用Brainfuck作為目標(biāo)編程語(yǔ)言可能只是一個(gè)絕招。

對(duì)此伯襟,我希望以上更復(fù)雜的程序(您好猿涨,加,減姆怪,反向字符串叛赚,if / then等)的結(jié)果有助于消除這種疑慮。

另一個(gè)關(guān)鍵點(diǎn)是稽揭,人工智能使用了數(shù)萬(wàn)代的解決方案俺附,這一事實(shí)證明了它的局限性。他們提到如果AI需要兩個(gè)小時(shí)才能產(chǎn)生如果要在屏幕上顯示“ hello world”溪掀,將花費(fèi)不可接受的時(shí)間(也許超出了我們整個(gè)宇宙的壽命)來(lái)生成一頁(yè)甚至一段文字事镣。

確實(shí)如此,在AI程序的原始版本中肯定如此揪胃。但是璃哟,請(qǐng)注意,在此最新版本中喊递,已添加了一些修改以大大提高速度随闪。首先,對(duì)適應(yīng)性方法進(jìn)行了更改骚勘,以優(yōu)先于較短的程序而不是較長(zhǎng)的程序铐伴。這消除了多余的編程指令,使程序更簡(jiǎn)潔俏讹,更快当宴。這減少了生成時(shí)間,并允許程序可以輸出稍長(zhǎng)的字符串泽疆。其次即供,通過使用擴(kuò)展類型III,AI可以更快地生成程序于微,尤其是在輸出字符串方面逗嫡。擴(kuò)展版本包含用于將存儲(chǔ)器寄存器快速推入有效ASCII字符范圍的代碼。從那里開始株依,相對(duì)簡(jiǎn)單地倒數(shù)到目標(biāo)字符串驱证。可以進(jìn)行更多速度改進(jìn)(包括編程和硬件)恋腕,以限制生成時(shí)間抹锄。

當(dāng)然,AI編寫自己的程序的目的不是為了生產(chǎn)書籍荠藤。因此伙单,輸出文本只是最終結(jié)果的一部分。 AI捕獲邏輯的能力更為重要哈肖。上面的if / then示例對(duì)此進(jìn)行了演示(至少對(duì)于一個(gè)簡(jiǎn)單的案例)吻育。

結(jié)論

我相信,將進(jìn)化算法和自編程軟件相結(jié)合的潛力很大淤井。就像單細(xì)胞細(xì)菌進(jìn)化為復(fù)雜的生命形式一樣布疼,我仍然想相信軟件可以通過進(jìn)化技術(shù)轉(zhuǎn)化為更為復(fù)雜的副產(chǎn)品。

我真的不確定強(qiáng)AI的答案是否是建立一個(gè)越來(lái)越復(fù)雜的知識(shí)數(shù)據(jù)庫(kù)币狠,該數(shù)據(jù)庫(kù)最終似乎僅憑其對(duì)查詢的響應(yīng)就變得智能游两。或者漩绵,如果越來(lái)越多的知識(shí)基礎(chǔ)以某種方式整合到意識(shí)中贱案。我希望必須有一個(gè)更簡(jiǎn)單的框架才能實(shí)現(xiàn)這一最終結(jié)果。

上面討論的示例只是邁向自我編程AI潛力的第一步止吐。多年前宝踪,這種編程技術(shù)非常困難,這主要是由于計(jì)算機(jī)的速度較慢祟印。今天肴沫,這種技術(shù)是可行的。實(shí)際上蕴忆,我對(duì)已經(jīng)取得的成果感到驚訝颤芬。我原本以為AI將無(wú)法超越打印簡(jiǎn)單短語(yǔ)的過程。但是套鹅,這些實(shí)驗(yàn)的結(jié)果證明是相反的站蝠。

人工智能確實(shí)能夠產(chǎn)生具有日益復(fù)雜的程序邏輯的自己的計(jì)算機(jī)程序。運(yùn)氣好的話卓鹿,我們可以做得更好菱魔。

下載@ GitHub

喜歡你看到的嗎?該項(xiàng)目的所有源代碼都可以在GitHub上找到吟孙。這包括簡(jiǎn)化的適應(yīng)性框架澜倦,以簡(jiǎn)化AI程序的創(chuàng)建聚蝶。

關(guān)于作者

本文由軟件開發(fā)人員和架構(gòu)師Kory Becker撰寫,他們精通多種技術(shù)藻治,包括Web應(yīng)用程序開發(fā)碘勉,機(jī)器學(xué)習(xí),人工智能和數(shù)據(jù)科學(xué)桩卵。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末验靡,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子雏节,更是在濱河造成了極大的恐慌胜嗓,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,941評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件钩乍,死亡現(xiàn)場(chǎng)離奇詭異辞州,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)件蚕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,397評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門孙技,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人排作,你說(shuō)我怎么就攤上這事牵啦。” “怎么了妄痪?”我有些...
    開封第一講書人閱讀 165,345評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵哈雏,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我衫生,道長(zhǎng)裳瘪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,851評(píng)論 1 295
  • 正文 為了忘掉前任罪针,我火速辦了婚禮彭羹,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘泪酱。我一直安慰自己派殷,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,868評(píng)論 6 392
  • 文/花漫 我一把揭開白布墓阀。 她就那樣靜靜地躺著毡惜,像睡著了一般。 火紅的嫁衣襯著肌膚如雪斯撮。 梳的紋絲不亂的頭發(fā)上经伙,一...
    開封第一講書人閱讀 51,688評(píng)論 1 305
  • 那天,我揣著相機(jī)與錄音勿锅,去河邊找鬼帕膜。 笑死枣氧,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的泳叠。 我是一名探鬼主播作瞄,決...
    沈念sama閱讀 40,414評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼危纫!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起乌庶,我...
    開封第一講書人閱讀 39,319評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤种蝶,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后瞒大,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體螃征,經(jīng)...
    沈念sama閱讀 45,775評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年透敌,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了盯滚。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,096評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡酗电,死狀恐怖魄藕,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情撵术,我是刑警寧澤背率,帶...
    沈念sama閱讀 35,789評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站嫩与,受9級(jí)特大地震影響寝姿,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜划滋,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,437評(píng)論 3 331
  • 文/蒙蒙 一饵筑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧处坪,春花似錦根资、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,993評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至塞椎,卻和暖如春桨仿,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背案狠。 一陣腳步聲響...
    開封第一講書人閱讀 33,107評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工服傍, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留钱雷,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,308評(píng)論 3 372
  • 正文 我出身青樓吹零,卻偏偏與公主長(zhǎng)得像罩抗,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子灿椅,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,037評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容