打磚塊

訓練 AI 玩 Atari 打磚塊,從模型評估到瀏覽器對戰。

打磚塊瀏覽器展示中,人類玩家與 AI 各自進行一場遊戲的畫面
目錄

30 天工程專案 · Atari 打磚塊

從零訓練打磚塊 AI 的 30 天,以及一支不用訓練就贏過它的程式

目標是讓神經網路自己看畫面、自己學會打磚塊。30 天後它真的能在瀏覽器裡和人並肩開局;但把同一套規則交給一支只算球路的追蹤程式,它打得比練了兩百萬格畫面的神經網路好得多。

同一套規則下的平均分:追蹤程式 vs 神經網路
721.8 對 6.93
打光兩面牆的局數,每一局都由程式判定
4/15
搬進瀏覽器後,測試畫面上動作一致
60/60

30 天路線圖

三十天分成六段,外加「30 天之後」那一段。每一段完成一件事,也留下一個可以檢查的結果;完整的方法、圖表與逐局紀錄都在完整案例研究。

  1. Day 1–4 · 把遊戲接上程式:遊戲、畫面與計分規則固定下來,之後的比較才有同一個起點。
  2. Day 5–12 · 從零寫出 DQN:一個看得懂、也訓練得起來的網路。
  3. Day 13–15 · 第一次評估就抓到 bug:平均分贏了隨機亂按,卻有三分之二的局卡在等待發球;發球改由環境負責。
  4. Day 16–21 · 加速、比較、長訓練:選出 Dueling Double DQN,也發現「挑模型」本身會把分數挑高。
  5. Day 22–29 · 搬進瀏覽器:固定測試畫面上動作全部一致,同一個開局在三個環境打出同樣分數。
  6. Day 30 · 第一次總結:把三十天整理成核心系列文章。
  7. 30 天之後 · 追蹤程式與破關驗證:不用訓練的程式平均分遠高於神經網路,並由程式判定打光兩面牆。

後來的轉折:不用訓練,反而打得更好

三十天結束時,神經網路離打光兩面牆還很遠。但打磚塊的畫面很單純:球和球拍顏色分明,球在兩次反彈之間幾乎走直線。於是我寫了一支追蹤程式:看同樣的畫面,找出球與球拍、從前後幾格估出球速、把撞牆反彈算進去、預測落點,每一格只算幾行算式,每次決策約 2.03 毫秒。

公平比較要用同一套規則。神經網路一路是每 4 格畫面決定一次,追蹤程式需要每格都決定,所以我在「每格都決定」的規則下另外訓練了一個神經網路,兩邊各玩同樣的 15 局:追蹤程式平均 721.8 分,神經網路 6.93 分。15 局裡有 4 局打光兩面牆(滿分 864 分),而且判定不靠肉眼:判定器讀遊戲記憶體裡的計分板,先用自己的三種真實軌跡驗證,再用 6 種故意改壞的方式確認測試每一種都抓得到。這六種改壞方式與逐局紀錄都在完整案例研究裡。

為什麼神經網路只有 6.93 分?

一個假設是:變難的是規則,不只是模型。原本的模型每 4 格畫面才決定一次;改成每格都決定之後,同一段遊戲時間要連續做 4 倍的決策,每一次決策都得往後想得更遠——有效時間跨度變成 4 倍,學習目標裡的獎勵也退到更遠的地方。另一個限制是訓練量:這套規則下它只完整訓練過一次,約兩百萬格畫面,而且沒有留下第二次訓練可以對照。

所以下一步要做的,不是再挑一個最好看的分數,而是把這兩件事拆開:

  1. 對照組:把同一組網路放回「每 4 格決定一次」的規則,用同樣的 15 局測。這樣才分得清差別來自規則變難,還是模型不夠好。
  2. 實驗組:在「每格都決定」下做三次獨立訓練,各練五百萬格畫面,不讓單一次訓練定生死。
  3. 兩組都用同一批 15 局、同一個判定器,並沿用專案既有的採用門檻,同時看平均分與打光局數,而不是只看最高分。

在跑完之前,這裡只說一件事:在這個規模、這套規則、這次訓練下,算的比學的好;還不能推論神經網路學不會。

從哪裡開始看