有這么一種算法,它會(huì)騙人、寫詩(shī),還會(huì)讓游戲里的機(jī)器人碾壓你
有一款非常魔性的小游戲叫《Boxcar2D》,游戲主要內(nèi)容是用幾何圖形和圓形的輪子組成小汽車,不斷走過(guò)一條有上下波動(dòng)的路,看什么形狀的小車可以走的更遠(yuǎn)。但和大部分游戲不一樣的是,不用玩家自己手動(dòng)拼裝小車,整個(gè)過(guò)程完全由算法自動(dòng)進(jìn)行,每次隨機(jī)生成小車,卡到路上了就重新來(lái)過(guò)。最后小車會(huì)越走越遠(yuǎn),整個(gè)過(guò)程中小車的形狀會(huì)越來(lái)越合適,一開始可能只是個(gè)獨(dú)輪車,到后期則會(huì)很接近我們生活中摩托車的樣子。
要問(wèn)有什么案例能簡(jiǎn)單明晰地體現(xiàn)出智能、自學(xué)習(xí)的概念,這款游戲一定是我的首選。而這款游戲中,應(yīng)用的就是遺傳算法。
什么是遺傳算法?
簡(jiǎn)單來(lái)說(shuō),遺傳算法是一種隨機(jī)搜索算法,主要目的是用來(lái)優(yōu)化。和自然界的遺傳一樣,遺傳算法秉持的是適者生存、優(yōu)勝劣汰。通過(guò)選擇、交叉和變異,不斷迭代出更優(yōu)秀的解法。
通過(guò)編碼,將解空間變成編碼空間,從中選擇當(dāng)前較為優(yōu)秀的解當(dāng)做父母,下一步則是將多種解的特征進(jìn)行交叉,誕生下一代,最后再經(jīng)過(guò)變異成為子嗣。如果子嗣還是不能符合要求,那就再進(jìn)行一次上述步驟,直到滿足要求。
過(guò)程中,工業(yè)機(jī)器人維修,較差的基因就會(huì)一步步被淘汰。最后再進(jìn)行解碼,就能得到我們想要的結(jié)果。總之,這是一個(gè)枚舉的過(guò)程。就像長(zhǎng)頸鹿的進(jìn)化一樣,樹葉長(zhǎng)在高處,每一只鹿都去嘗試吃樹葉,只有符合標(biāo)準(zhǔn)的長(zhǎng)頸鹿能夠吃到食物、生產(chǎn)下來(lái)并誕生后代。
但要注意的是,這種算法很多時(shí)候不會(huì)給出一個(gè)最優(yōu)解,而是給出一些較為接近的次優(yōu)解,從中矮子里面拔將軍。
在哪里能看到遺傳算法?
遺傳算法經(jīng)常被用來(lái)解決一些調(diào)度類的問(wèn)題,比如確定車間工程流程、飛機(jī)航線等等。工程、航行中所需要的資源消耗、時(shí)間等等權(quán)值看做染色體,幾種染色體排列組合,最終選擇其中的較優(yōu)方案。
此外,機(jī)器人中也會(huì)用到遺傳算法,尤其是快速定位、路徑規(guī)劃等。就像《Boxcar2D》這個(gè)游戲一樣,機(jī)器人在仿真環(huán)境中不斷嘗試接近目標(biāo),路線的優(yōu)越度隨著路線的長(zhǎng)度減少,結(jié)合機(jī)器人對(duì)自身位置的感知,最后得出較優(yōu)解。
同時(shí),遺傳算法也可以被應(yīng)用于幫助神經(jīng)網(wǎng)絡(luò)調(diào)參數(shù),只是這種方式需要的時(shí)間太長(zhǎng)、運(yùn)算量太大,屬于性價(jià)比較低的參數(shù)調(diào)整方式。
在游戲中,也能見(jiàn)到遺傳算法的影子。很多游戲會(huì)有在同一場(chǎng)景面對(duì)多輪敵人的生存模式,在這一模式中,敵人的屬性是會(huì)不斷增強(qiáng)的,有了遺傳算法,就可以根據(jù)你自身屬性的變化不斷改變敵人的屬性,以增強(qiáng)游戲的難度。你的法術(shù)強(qiáng)度高,敵人就會(huì)增加法術(shù)防御度,你的攻擊穿透性高,敵人就會(huì)增加血量。這樣一來(lái),相比直接的增加屬性,可以有更好的游戲體驗(yàn)。
從騙人到寫詩(shī),遺傳算法有什么好玩的應(yīng)用?
以上都是一些適用于實(shí)際場(chǎng)景的應(yīng)用,由于遺傳算法簡(jiǎn)單易用,我們可以看到很多娛樂(lè)化的、有趣的應(yīng)用。
比如說(shuō),模仿圖形。在一款程序中,我們可以看到遺傳算法通過(guò)幾何圖形的不斷組合,最終慢慢變成接近案例圖形的樣子。
同時(shí)你還可以親自調(diào)整變異的傾向,最終成果雖然和原圖相比還有很大差距,但也不乏自己的風(fēng)格。不過(guò)嘗試時(shí)就可以發(fā)現(xiàn),整個(gè)過(guò)程時(shí)間很長(zhǎng),某種程度上也體現(xiàn)了遺傳算法的低效。
基于上述的功能,遺傳算法還有一個(gè)非常有趣的玩法,庫(kù)卡機(jī)器人驅(qū)動(dòng)器維修,那就是欺騙深度學(xué)習(xí)模型。
2014年有一篇論文曾經(jīng)寫過(guò),深度神經(jīng)網(wǎng)絡(luò)(DNN)在圖片識(shí)別上有著很優(yōu)異的表現(xiàn)。可當(dāng)用遺傳算法模擬圖片時(shí),兩張圖片在人眼看來(lái)一模一樣,可深度神經(jīng)網(wǎng)絡(luò)卻完全識(shí)別不出來(lái);蛘哌z傳算法可以模擬出一張人眼看起來(lái)是亂碼的圖片,卻被深度神經(jīng)網(wǎng)絡(luò)識(shí)別成正常的圖片。
這一點(diǎn)讓人們注意到了機(jī)器視覺(jué)和人類視覺(jué)的區(qū)別,和人類不一樣,機(jī)器還是會(huì)把圖像轉(zhuǎn)化為數(shù)字,再進(jìn)行比對(duì)、識(shí)別。這也導(dǎo)致了,有時(shí)候深度神經(jīng)網(wǎng)絡(luò)會(huì)把一張?jiān)肼晥D識(shí)別成動(dòng)物、建筑等等。
除了生成圖片,遺傳算法還可以生成音樂(lè)、宋詞等等。將詞語(yǔ)和音符輸入,讓機(jī)器隨機(jī)組合,加入人類評(píng)分機(jī)制。整個(gè)過(guò)程幾乎和讓猴子在打字前坐幾十年可以寫出莎翁作品的假說(shuō)差不多;旧现荒苡糜趭蕵(lè),不太適合實(shí)操。
其實(shí),目前遺傳算法已經(jīng)慢慢淡出了主流舞臺(tái)。雖然主旨是為了避開局部最優(yōu)誤區(qū),為無(wú)限解集問(wèn)題尋找答案,可在實(shí)際應(yīng)用時(shí)相比梯度和蒙特卡羅算法都沒(méi)有明顯的差異和優(yōu)勢(shì),常常被視作玄學(xué)算法。比如計(jì)算結(jié)果的穩(wěn)定性差、求解過(guò)程沒(méi)有可復(fù)制性等等都是遺傳算法的缺點(diǎn)。很長(zhǎng)一段時(shí)間里,遺傳算法都被看做只能用來(lái)湊論文的算法。
不過(guò)理論也和技術(shù)一樣,KUKA機(jī)器人示教器維修,會(huì)隨著實(shí)踐和研究不斷發(fā)展,曾經(jīng)的神經(jīng)網(wǎng)絡(luò)也曾被打入冷宮。最近DeepMind還提出了把神經(jīng)網(wǎng)絡(luò)和遺傳算法結(jié)合,應(yīng)用到遷移學(xué)習(xí)中的案例;蛟S,有朝一日遺傳算法還會(huì)重新進(jìn)入我們的視野。