車?yán)踝?發(fā)自 凹非寺 量子位 出品 | 公眾號 QbitAI△ 訓(xùn)練前
要了解機器學(xué)習(xí)、了解神經(jīng)網(wǎng)絡(luò),一種非常有趣的方式,就是找個小游戲,自己實現(xiàn)一下。 游戲里的每一位AI玩家 (智能體) ,都是一個小小的神經(jīng)網(wǎng)絡(luò)。 一開始,它們什么都不懂,剛開局就GG。但有了進化算法 (Evolution) ,AI可以在一代一代更迭中,掌握強大的游戲技能。 △ 成效顯著
比如,在這個賽車游戲里,萌新車手跑出去不久便撞上了馬路牙子。不過,用不了幾代進化,就有AI車手可以毫發(fā)無損地跑完一周。
進化的賽車手AI賽車手如何快速煉成? 首先,要有一個龐大的車隊。 賽車AI的開發(fā)者,是一位叫做Johan Eliasson的程序猿。他的訓(xùn)練計劃里,有650輛車同時訓(xùn)練。 第二,AI開車需要一些空間信息。 這5條黃線代表5個距離,指示離馬路牙子還有多遠(yuǎn);
除此之外,AI還需要知道自己當(dāng)前的速率,以及方向。 這樣算來,神經(jīng)網(wǎng)絡(luò)一共會接受7個輸入。 第三,就是讓神經(jīng)網(wǎng)絡(luò)不斷進化。 輸入七個值,處理一下,輸出兩個值: 一個代表方向盤,按照數(shù)值大小,分為左轉(zhuǎn)、右轉(zhuǎn)、方向不變三種操作; 一個代表油門/剎車,按照數(shù)值大小,分成加速、減速、速率不變三種操作。
最開始,誰不知道游戲規(guī)則,輸出值很隨機。 △ 第一代,死得快
650輛車沖出去沒多久,路邊就出現(xiàn)了大批車輛的尸體。 但重要的是,依然有碩果僅存的汽車,不止通過了第一次的右轉(zhuǎn)考驗,也機智地發(fā)現(xiàn)下一處彎道應(yīng)該猛烈左轉(zhuǎn)。 雖然,它并沒有成功掉頭,但依然是下一代的希望:進化算法就是要在每一代里,選出最優(yōu)秀的一只或者幾只智能體,繁育出色的后代。
(這里,程序猿沒有找到一種很好的方法,讓系統(tǒng)自動選擇出優(yōu)質(zhì)的個體,于是就手動馬克了,反正也沒有訓(xùn)練很多代。) 所以,第二代的650輛車,全是這一只智能體的子嗣,各自有些輕微的變異:神經(jīng)網(wǎng)絡(luò)的權(quán)重發(fā)生小小的變化。 變異是為了保持車隊的多樣性,期待從中生產(chǎn)出更加優(yōu)秀的個體,繁育下一代。 △ 第二代,馬克三只
由于繼承了優(yōu)良傳統(tǒng),第二代汽車大部分都完成了第一次右轉(zhuǎn),還有一小部分掉頭成功。 這一次,把沖到最前面的3輛車馬克一下,它們差一點就能達成兩次連續(xù)掉頭的S形操作。 既然,第三代的父母有3位,那么繁育過程中除了變異之外,還涉及雜交:就是把不同的神經(jīng)網(wǎng)絡(luò)揉到一起: 第三代的表現(xiàn)更加精進,有的智能體完成了多次連續(xù)轉(zhuǎn)彎,勝利在望。 第四代,便有智能體跑完一周,值得紀(jì)念: 程序猿說:這效果比想象的好多了,之前我還有點懷疑,現(xiàn)在只能說機器學(xué)習(xí)好厲害。
第四代車隊中的佼佼者,已經(jīng)不太撞到路肩,只是速度還很慢,就像一大波僵尸。 車隊的主人表示,后面的主要任務(wù)就是訓(xùn)練速度。畢竟,這是賽車。 到了第十代,速度已經(jīng)有了明顯的提升,不過依然不算快: △ 第十代
不知訓(xùn)練了多少代,現(xiàn)在把每一代的優(yōu)質(zhì)選手放在一起跑。你看,好快: △ 這才是賽車
成果斐然之余,程序猿還請大家注意一個重點: AI不知道自己在開車,不知道有跑道。它只接收七個輸入的數(shù)值,不了解它們代表什么意思,也不知道自己輸出的每一個決策,產(chǎn)生了怎樣的效果。 就算這樣,它還是學(xué)會了怎樣在游戲世界里更好地生存。 不想開車?還有其他游戲雖然,賽車游戲的視頻,沒有講到程序猿用了怎樣簡單的神經(jīng)網(wǎng)絡(luò)。不過,可以通過另一個簡單的游戲,來感受一下: Flappy Bird這個HTML 5實現(xiàn), 也是進化算法和神經(jīng)網(wǎng)絡(luò)共同的結(jié)晶。而且開源了。
它的作者ssusnic說,神經(jīng)網(wǎng)絡(luò)部分,用的是突觸神經(jīng)網(wǎng)絡(luò) (Synaptic Neural Network) 庫。 沒有650輛車那么多,種群里只有10只小鳥。每一只,都是一個三層的神經(jīng)網(wǎng)絡(luò): 輸入層:兩個神經(jīng)元 隱藏層:六個神經(jīng)元 輸出層:一個神經(jīng)元
輸入兩個值,代表小鳥當(dāng)前距離下一個障礙物的相對位置,分成水平距離 (x) 和豎直距離 (y) 。
經(jīng)過隱藏層的處理,輸出一個0-1之間的數(shù)值,決定下一步要不要扇翅膀: 如果大于0.5,就扇翅膀,反之就不操作。 △ 第一代
第一代的小鳥,都是隨機神經(jīng)網(wǎng)絡(luò) (Random Neural Networks) ,集體見光死。
全部陣亡之后,要選出四只最優(yōu)質(zhì)的小鳥去繁殖。問題來了,肉眼看去相差無幾,要選哪幾只? 并不需要手動選擇,而是用一個適應(yīng)度函數(shù) (Fitness Function) : 適應(yīng)度 = 小鳥存活的最遠(yuǎn)距離 - 小鳥到下一個障礙物的距離
△ 這里,討論水平距離
適應(yīng)度分?jǐn)?shù)排名前四的小鳥,按下面的規(guī)則繁殖10個后代: · 前兩名,雜交出一個后代 · 4只中隨機選兩只,雜交出三個后代 · 4只中隨機選兩只,分別直接復(fù)制,生成兩個 (和上代一樣的) 后代 · 給每個后代加入一些變異
就這樣,來到第11代,已經(jīng)有小鳥飛出很遠(yuǎn)且毫發(fā)無傷: 第23代,完全碾壓,可以換個游戲了:
吃豆豆
當(dāng)然,不是所有游戲都像小鳥扇翅膀這樣簡單。 吃豆人 (Pacman) 就是個更復(fù)雜的栗子。比如,前面要躲避的障礙物都是靜止的,Pacman的敵人是移動的,窮追不舍。 重點是,為了抓到Pacman,四個敵人還有各自不同的運動規(guī)則: 紅色鬼,直接瞄準(zhǔn)Pacman的位置進發(fā); 粉色鬼,瞄準(zhǔn)Pacman前方的第四格; 藍(lán)色鬼,利用Pacman和紅色鬼的位置來搞伏擊; 橙色鬼,原本和紅色鬼一樣,但當(dāng)它和Pacman的距離近到8格以內(nèi),就會朝一個角落退縮,那是它出發(fā)的地方。
并且,Pacman吃到無敵大豆豆的時候,敵人還會從追擊模式轉(zhuǎn)成逃跑模式。
復(fù)雜的游戲,自然也需要更加精密的算法,來幫智能體進化。 名叫Code Bullet的程序猿,就用了一種叫做NEAT的神經(jīng)進化算法。 這種方法很特別,神經(jīng)網(wǎng)絡(luò)在迭代過程中,不止權(quán)重會變化,網(wǎng)絡(luò)結(jié)構(gòu)也會變復(fù)雜。 而網(wǎng)絡(luò)結(jié)構(gòu)越復(fù)雜,就可以支持越復(fù)雜的行為,讓Pacman在險惡的世界里存活。
雖有強大的算法,訓(xùn)練還是要由淺入深。 先不加無敵大豆豆,也不加敵人,給AI一個簡單的世界。 這樣它就能吃光所有豆豆?不存在的。 第一代最優(yōu)秀的智能體,也只會右轉(zhuǎn)不會左轉(zhuǎn),還把自己困在一處,永遠(yuǎn)走不出去。
第二代,有的選手學(xué)會了左轉(zhuǎn),但依然會困住。 …… 第十八代,眼看快要吃光豆豆,AI還是困死了自己。 在平靜中訓(xùn)練20代之后,趁AI不注意把敵人放出來,又要從手忙腳亂開始重新適應(yīng):
不過好在,智能體學(xué)以很快便學(xué)會了躲避敵人:
又過了40代,是時候加入無敵大豆豆了。
這一層防護令A(yù)I如有神助,就像在經(jīng)歷了40代臥薪嘗膽之后,開啟了復(fù)仇模式,瘋狂追擊。 終于,有智能體在第七十三代通關(guān)成功: 視頻的畫外音里,程序猿的聲音都激昂了起來,這場戰(zhàn)役的勝利他期待已久。
除了發(fā)表獲獎感言,謝過各路親友的支持,他也沒忘在GitHub上分享代碼 (傳送門見文底) 。 動手吧,少年同學(xué),你也去搭個神經(jīng)網(wǎng)絡(luò)打游戲吧,呆萌的游戲也能打出熱血的氣質(zhì)。 以后,神經(jīng)網(wǎng)絡(luò)可能就是你女朋友了。 (友情提示:雖然賽車游戲沒有開源代碼,但OpenAI Gym里面有賽車場,也可以去試試。) 賽車游戲視頻傳送門: https://www./watch?v=wL7tSgUpy8w OpenAI Gym賽車場: https://gym./envs/CarRacing-v0/ Flappy Bird代碼傳送門: https://github.com/ssusnic/Machine-Learning-Flappy-Bird Pacman代碼傳送門: https://github.com/Code-Bullet/PacNeat (NEAT算法) https://github.com/Code-Bullet/PacmanGame (搭建游戲環(huán)境) 為給AI從業(yè)者提供更好的交流平臺,量子位現(xiàn)開放「AI+行業(yè)」社群,將會不定期邀請AI大咖、知名企業(yè)家、技術(shù)大牛進群分享,福利多多,歡迎小伙伴入群交流。
面向人群:AI相關(guān)從業(yè)者,技術(shù)、產(chǎn)品等人員,根據(jù)所在行業(yè)可選擇相應(yīng)行業(yè)社群;
|