坦克大戰最早是個機台遊戲,到了 1985 年,南夢宮正式在任天堂紅白機上推出Battle City,在台灣超過45歲以上的人,應該都玩過這個遊戲。任天堂的卡帶是日文的"バトルシティー",但台灣盜版中文並沒有如實翻譯成"戰鬥都市"而是根據遊戲內容叫做「坦克大戰」。對於小時候的我來說,這坦克大戰真的頗爲經典,他是可以和朋友一起合作而非互相廝殺的遊戲。(當然還有個魂抖羅也是)

總之,這次的實驗,是模擬完整果蠅腦,來跟人類打坦克大戰。
這隻果蠅目前不太行。訓練模擬999場之後,牠對上一個「會走、會在瞄準時開火」的簡單電腦對手,勝率大概只有兩成多,比隨便亂按亂開火的隨機玩家高不了多少。真人應該很容易就贏果蠅。反過來想想也合理,如果人連果蠅都打不贏的話,那也太奇怪。
但那是真實的果蠅腦,連接到坦克,真的動起來、真的開火、真的在瀏覽器裡跟你即時對戰,而且每次的對戰他都在學習。
果蠅腦是哪裡來的
2024 年, FlyWire計畫公布了他們的成果:他們把一隻成年雌果蠅的整顆腦,用電子顯微鏡切成薄片、一片一片掃描,再用人工智慧加上幾百位志工的手工校正,把每一個神經元的形狀、每一條突觸連到誰,全部畫出來。這是史上第一張「完整的成年昆蟲腦接線圖」。整份資料是公開的,任何人都可以下載。
緊接著,另一組科學家(Shiu 等人)把這張接線圖變成一個可以「開機執行」的電腦模型:每個神經元都是一個簡單的電路:電位會慢慢下降,但是收到別人放電就往上加、超過門檻就自己放電、然後沿著接線圖把訊號傳給下游。他們證明這個模型可以重現果蠅的一些真實行為,例如舌頭碰到糖水會伸出口器等等。
我在前幾個小實驗裡,已經把這個模型用 NumPy 重新複製一次(當然是在AI協助下)跟原作者的版本比對過,反應幾乎一模一樣(相關係數 0.99)。所以我手上有一顆「隨時可以使用」的果蠅腦。
如何接到遊戲
遊戲是仿 Battle City 第一關的格局(只借用格子的排列,圖是自己畫的,應該沒有版權問題吧?):紅色的磚牆可以被子彈打穿、灰色的鋼板打不穿。兩台坦克,一台黃色的是你,一台綠色的、上面停著一隻卡通果蠅的是牠。規則刻意簡化:不用保護基地,就是互相打;每秒最多開一發;子彈跟坦克一樣快;被打中一發就結束。
那「果蠅開坦克」到底是什麼意思?整個過程0.25秒重複一次,分成三步驟:
第一:把遊戲畫面翻譯成果蠅的感官訊號,打進牠腦中對應的真實感覺神經元。
第二:讓整顆腦「跑」五十毫秒。十三萬八千個神經元同時漏電、充電、放電,訊號沿著兩百七十萬條真實突觸運作。在我的電腦上,這一步大約要零點一秒。
第三:讀出腦中一小群神經元的放電,決定坦克要做什麼:前進、左轉、右轉、掉頭、開火,還是不動。
在這步中,讀取的是果蠅腦的「下行神經元」。這是果蠅腦真正的運動輸出:腦的指令要傳到身體的翅膀、腳,走的就是這幾百條神經。再加上視葉輸出區的「視覺投射神經元」。這七百五十一個神經元的放電,接到六個「動作單元」上,每個單元對應一個動作。哪個單元放電最多,坦克就傾向做那個動作。
所以嚴格說,「會學習」的地方是這751x6條連線的強度。果蠅腦本身當然是不會動的。
剛開始只想給牠眼睛:把坦克前方的畫面縮成三十二乘三十二的低解析度影像(果蠅複眼大概就這個解析度),投到牠視葉裡真實的視覺神經元上。然後我做了一個檢查:從牠腦中神經元的放電,能不能分辨「敵人在左邊還是右邊」、「我的砲口有沒有對準敵人」?
結果幾乎不能。只給眼睛,這顆腦對遊戲的理解接近瞎猜。這其實跟我前幾個專案的發現一致:坦克遊戲的畫面又暗又平,對一顆果蠅腦來說,沒什麼好看的。而且也跟實際上果蠅的人生是一樣的,果蠅主要並不靠眼睛處理環境的變化。
果蠅主要靠牠靠嗅覺器官、有觸角上的風感受器、有聽覺、有全身的觸覺、有味覺。這些感官在 FlyWire 的資料裡都有標好名字。把遊戲裡的資訊,一件一件「變成」成牠不同的感官刺激:
嗅覺:敵人在哪個方向。把牠兩千多個嗅覺受器神經元分成八組,對應八個方位;敵人在哪個方位,那組就放電,敵人越近放得越猛。對果蠅來說,敵人就是一顆越靠近、味道越濃的水果。
風感:果蠅觸角上有一群專門感受風和重力的神經元。敵人的砲彈飛過來時,離牠最近的那顆子彈的方位跟距離,就變成一陣風吹過去。
聽覺:果蠅的聽覺神經元分成兩組:一組在敵人開火那一瞬間響一下(聽到槍聲);另一組在「我的砲口正對著敵人、中間沒有鋼板」的時候持續響(表示可以打了)。
所以嚴格說,「會學習」的地方是這751x6條連線的強度。果蠅腦本身當然是不會動的。
果蠅腦用什麼「感官」感知你
剛開始只想給牠眼睛:把坦克前方的畫面縮成三十二乘三十二的低解析度影像(果蠅複眼大概就這個解析度),投到牠視葉裡真實的視覺神經元上。然後我做了一個檢查:從牠腦中神經元的放電,能不能分辨「敵人在左邊還是右邊」、「我的砲口有沒有對準敵人」?
結果幾乎不能。只給眼睛,這顆腦對遊戲的理解接近瞎猜。這其實跟我前幾個專案的發現一致:坦克遊戲的畫面又暗又平,對一顆果蠅腦來說,沒什麼好看的。而且也跟實際上果蠅的人生是一樣的,果蠅主要並不靠眼睛處理環境的變化。
果蠅主要靠牠靠嗅覺器官、有觸角上的風感受器、有聽覺、有全身的觸覺、有味覺。這些感官在 FlyWire 的資料裡都有標好名字。把遊戲裡的資訊,一件一件「變成」成牠不同的感官刺激:
嗅覺:敵人在哪個方向。把牠兩千多個嗅覺受器神經元分成八組,對應八個方位;敵人在哪個方位,那組就放電,敵人越近放得越猛。對果蠅來說,敵人就是一顆越靠近、味道越濃的水果。
風感:果蠅觸角上有一群專門感受風和重力的神經元。敵人的砲彈飛過來時,離牠最近的那顆子彈的方位跟距離,就變成一陣風吹過去。
聽覺:果蠅的聽覺神經元分成兩組:一組在敵人開火那一瞬間響一下(聽到槍聲);另一組在「我的砲口正對著敵人、中間沒有鋼板」的時候持續響(表示可以打了)。
觸覺:撞牆。頭上的剛毛神經元分成前、左、右三組;哪個方向被牆或水擋住,那組就放電模擬撞到東西。
味覺:砲彈裝好了沒。糖的受器放電代表砲可以開,苦的受器放電代表還在裝彈。
每一個感官都直接打在 FlyWire 接線圖裡真實存在、有各自的神經元上,然後訊號自己沿著真實的接線在腦裡跑。加上這五個感官之後,之後再做一次同樣的檢查:從那751個下行神經元的放電,敵人方位分別率很高、是否有瞄準也能分辨、子彈有沒有飛過來也大多能感知。這顆腦似乎是知道遊戲裡在發生什麼了。
如何怎訓練牠
果蠅學東西靠多巴胺。在真實的果蠅腦裡,當一個氣味跟糖水(獎勵)或電擊(懲罰)同時出現,多巴胺神經元會放電,把「剛剛活躍的那些突觸」加強或減弱。神經科學把這叫「三因子學習規則」:突觸前放電、突觸後放電、再加上多巴胺,三個因子同時到,突觸才改變。
在第一個專案裡就用這套規則,教這顆腦分辨圖片是不是字母 A,效果很好。這次就把它搬到遊戲裡:
獎勵:牠的砲彈打中你,加一分(最大獎勵);牠被打中,扣一分(最大懲罰);牠在砲口對準你、中間沒鋼板的時候開火,小加零點一分,這是一點「引導」,鼓勵牠往正確方向開槍,就算沒打中。
多巴胺怎麼作用:每一步,六個動作單元跟七百五十一個腦神經元之間的突觸,都會留下一條「資格痕跡」。記錄「剛剛誰跟誰一起活躍」。牠選了某個動作之後,這條痕跡會偏向那個動作的單元,並且慢慢衰減(大約一秒多)。等獎勵或懲罰真的來了,多巴胺就沿著還沒消退的痕跡,把突觸加強或減弱。這樣,兩秒前開的那一槍打中了,還來得及獎勵。
訓練流程:牠先跟「站著不動的對手」練240場,再跟「亂走但不開火的對手」練360場,最後跟「會亂走、砲口對準時會開火的對手」練習399場,總共九百九十九場。每一百多場,我讓牠關掉探索、認真打一百場,記錄勝率。我的Mac M4 Pro同時開十二場訓練,整個訓練大約一個半小時。
訓練資料不是下載來的,就是這999場牠自己打出來的比賽。
目前暫時的情況是:對「會開火的對手」,牠的勝率從一開始的14%,慢慢爬到最高28%,最後一次測是21%。一個隨機亂按的玩家對同一個對手的勝率是18%,所以老實說:有進步,但沒有進步很多,離原本設定的「三分之一勝率」目標還差一截。
以後可以怎麼變強
如果,不用果蠅腦,直接把「敵人在哪、有沒有瞄準、有沒有子彈飛過來」這些乾淨的數字餵給一個很小的普通神經網路,用一模一樣的獎勵去訓練,它在四百場之後就能打到七、八成勝率。所以遊戲跟獎勵的設計是可以學的,所以證明問題不是遊戲本身。如果,把果蠅腦那751個神經元的放電數,餵給一個用標準梯度下降訓練的線性模型。結果它也學不會,300場後勝率只有6%。這很有意思,代表問題不只是果蠅式的多巴胺學習規則不夠好,而是「從700多個雜訊很大的神經元放電數,在每場只有0.5次有用獎勵的情況下學會該做什麼」,本來就是很難的事。
如果,只給眼睛、不給其他感官的果蠅,訓練三百六十場,勝率一直在12%~16%之間 。說明其實其他感官是有用的。
目前,果蠅學到的不是「看到什麼就做什麼」,而是「整體上多開火、多掉頭」。不管砲口有沒有對準你、不管有沒有子彈飛過來,牠選各個動作的機率幾乎一模一樣。牠學到的是一種「習慣」,不是「反應」。但其實這和果蠅這個生物本身行為確實是一致的。
深究果蠅的腦部結構,那下行神經相對密集,因此,不管遊戲裡發生什麼,這幾百個神經元幾乎都在放電。多巴胺來的時候,加強的永遠是差不多同一批突觸,所以只能學到「整體多做某件事」,學不到「在什麼情況下做」。但老實說也跟這種極小型生物本身的情況一致。
要真的讓果蠅「變強」,大概只能朝「變蠅人」方向前進。因為果蠅的頭腦經過演化,本來就不是來處理大型環境,未來時間戰略思維,任何手段看起來都免不了改造頭腦結構。
所以網路上果蠅玩doom,果蠅炒股票,基本上還是一種有趣的專案。果蠅腦並不適合。反倒是前面兩篇文章:果蠅腦辨別A,果蠅腦處理同音錯別字,這類型果蠅腦可以處理的快速反應,單一任務更適合果蠅腦本身。
如何玩?
整個系統我打包成一個 Docker 映像檔,裡面就包含這顆果蠅腦(接線圖加上訓練好的連線)。兩行指令就能在自己電腦上跑起來,打開瀏覽器,畫面是仿紅白機的坦克大戰:紅磚牆、鋼板、一台黃色坦克是你,一台綠色坦克上停著一隻卡通果蠅是牠。方向鍵移動、空白鍵開火。畫面右邊有幾個小視窗:你可以看到「果蠅眼中的世界」——牠前方那張三十二乘三十二的模糊影像;可以看到牠六個動作單元每一步各放了幾個電,哪一個贏了就亮黃色;還可以看到牠這一步的腦模擬花了幾毫秒。你看到的每一個動作,都是十三萬八千個神經元真的跑完五十毫秒之後,從幾百條下行神經的放電裡讀出來的,不是隨機數、也不是寫死的規則。
而且,每一場你跟牠打,牠都在用同一套多巴胺規則學。打中你,牠的多巴胺加強剛剛那一槍相關的突觸;被你打中,就減弱。每一場結束都會存一個新的訓練結果版本。
* email 給我,可以取得docker檔案: consultant.3rd@gmail.com 你可以自己架起來玩
* 我放到Google GCP上 會讓大家玩一段時間 當然GCP host要費用啊 所以大概會放個幾個月吧: https://tankfly-497792128300.asia-east1.run.app/
請注意要縮小瀏覽器 不然看起來會太大。另外一次只能一個人跟他玩,所以第二個存取這個遊戲就要等60秒。
你作為人類,鐵定會贏牠。牠現在是一個會亂開槍、偶爾走位很怪的對手。但你會是在跟一顆真實果蠅腦對戰,而且你打的每一場,都成了牠的訓練資料。

沒有留言:
張貼留言
感謝你的留言,但我不是常常會看留言,也歡迎email與我聯絡: consultant.3rd@gmail.com