把 DQN 放進瀏覽器後,還能像訓練時一樣玩嗎?

模型進入瀏覽器後,畫面整理、動作和遊戲流程都可能改變。本文說明怎麼檢查它真的在玩同一款打磚塊,以及展示能代表什麼。

3 分鐘閱讀
文章目錄

把模型檔案放進網頁,和讓模型在瀏覽器裡玩好打磚塊,是兩回事。模型每次需要四張小型灰階畫面,並替四種動作估分;如果瀏覽器提供的畫面、分數或動作意思不同,它就不是在原本學習過的遊戲裡做決策。

因此,搬進瀏覽器後要問的不只是「網頁能不能載入模型」,而是「它看到同一種畫面時,是否仍選出同一個動作;接上遊戲後,規則是否也相同?」

先載入模型,再接上遊戲

最初的瀏覽器展示讓模型對固定畫面計算四種動作的分數,完成模型載入與運算後,再接上 Atari 遊戲,讓每次選出的動作推進下一張畫面。

瀏覽器中模型對固定畫面計算動作分數的畫面

後來,模型和 Atari 遊戲都能在瀏覽器中執行。瀏覽器可使用 WebAssembly 在一般處理器上計算,也能透過 WebGPU 使用顯示卡;展示介面會顯示當前使用的執行方式。

瀏覽器要看見同一種畫面,才能沿用模型

訓練好的模型不是直接讀取任意圖片。它會收到最近幾張畫面,並依照固定順序估計不動、發球、往右和往左。瀏覽器必須用相同方式縮小和整理畫面,也要把模型選出的動作轉成遊戲真正能執行的動作。

遊戲開始與掉命後,由網頁處理重新發球。部署時也固定每次操作推進的畫面數與掉命後的接續方式,讓模型收到相同規則下的遊戲輸入。

我先將 60 張相同畫面交給 Python 與瀏覽器中的模型,這批畫面上的動作選擇全部相同,接著再進行完整遊戲測試。

能玩一整局,和每一步都相同是兩回事

遊戲中一次動作就會改變下一張畫面。如果兩種環境在某一步出現小差異,後續遊戲可能一路分岔,最後得分也不同。因此,逐步走出完全相同路線,和模型是否能正常遊玩,是兩個不同的問題。

瀏覽器能載入模型並完成實際遊戲。接上遊戲後,我也檢查畫面整理、發球與動作更新,觀察模型在連續操作中的表現。

人類玩家和模型是在同一場比賽嗎?

目前的頁面把人類與 Agent 放在同一畫面,但兩邊各自有一場獨立的打磚塊。人類用鍵盤或滑鼠控制自己的遊戲;Agent 看自己的畫面,由模型選擇動作。兩邊可以一起開始或暫停,球、磚塊、生命和分數卻不共用。

瀏覽器中人類玩家與 DQN 各自進行遊戲的畫面

你可以直接遊玩打磚塊網頁版,並排觀察人類玩家與模型各自的操作和得分。

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

這篇檢查的是模型有沒有被搬壞。但這個專案最後留下的問題不是「模型有沒有搬壞」,而是「這件事到底需不需要學」。

打磚塊的畫面很單純:球和球拍顏色分明,球在兩次反彈之間幾乎走直線。後來我寫了一支追蹤程式,它看同一批畫面,但完全不訓練:找出球與球拍、從前後幾格估出球速、把撞牆反彈算進去、預測落點,每一格只算幾行算式。把兩邊放在同一套「每格都決定」的規則下、各玩同樣的 15 局,追蹤程式平均 721.8 分,同樣規則下另外訓練的神經網路是 6.93 分;15 局裡有 4 局打光兩面牆(滿分 864 分)。

「打光」也不能靠眼睛判定:打完第一面牆時畫面同樣會短暫全空。判定器讀的是遊戲記憶體裡的計分板,而且它自己先用三種真實軌跡校正,再用 6 種故意改壞的方式確認測試每種都抓得到。

這段轉折的完整版——追蹤程式每一步怎麼算、六種改壞判定器的方式、逐局分數與每個數字的來源——在打磚塊的完整案例研究。