這是一個仍在演進的強化學習工程專案:問題不只是讓 Agent 在 Atari Breakout 裡得到分數,而是把環境語義、訓練、評估、模型交換與瀏覽器執行接成一條可以檢查的路徑。main 分支保留目前維護中的實作;原本 30 天鐵人賽的開發編年則留在獨立的歷史來源中。
這個 Project 的範圍
目前的系統從 Atari Breakout 與 DQN(Deep Q-Network)訓練開始,延伸到 Vanilla DQN、Double DQN 與 Dueling Double DQN 的比較、CUDA 加速的資料收集、固定條件評估、ONNX inference,以及瀏覽器中的 Atari environment 與 policy inference。這些部分屬於同一個長期 Project,而不是五個互不相關的作品。
專案的第一個重要邊界是評估條件。configs/eval/breakout_contract_v2.json 固定了 environment id、frame skip、frame stack、sticky actions、FIRE reset、life-loss 與 episode limit 等語義;如果這些條件改變,分數就不能直接當成同一種結果比較。這份 contract 是可追溯的評估參考,不是「所有訓練都已經得到相同結果」的保證。
已完成的 Milestones
- 從模型到工程流程:保留可重用的 Python package、training/evaluation CLI、active configs、regression tests,以及 CPU/GPU replay 系統,讓訓練與評估不必依賴單一 notebook。
- 從訓練到可交換的模型:以 PyTorch 訓練 policy,再匯出 ONNX,讓 ONNX Runtime 與 ONNX Runtime Web 能接手 inference。模型能被匯出不等於它在每個 runtime 都已經證明行為完全一致;parity 需要依照對應的測試與評估證據判讀。
- 從 Python 到瀏覽器:獨立部署的應用在瀏覽器裡執行 ALE WASM 的 Atari environment 與 ONNX policy,不需要 Python backend。瀏覽器會依能力選擇 WebGPU 或 WASM 路徑,這也是 runtime 行為與效能需要單獨驗證的地方。
- 保存原始證據:30 天 Ironman Series 是已關閉的歷史來源 corpus,保留當時的決策、失敗與取捨;它不會把後續 Project status 或新 Experiments 偽裝成 Day 31 之後的日記。
目前的 Experiments 與 Writing
Reward Shaping、Prioritized Experience Replay、Noisy Networks 等方向屬於這個長期 Project 的 post-series Experiments。Reward Shaping 現已整理成一篇獨立 Article,呈現失命扣分在三組訓練中的原始分數、跨訓練不確定性,以及尚未通過的完整晉級條件;它沒有取代目前基準,也不屬於五篇 Core Series。
閱讀路徑分成三層:先讀這個 portfolio-first Profile,再讀完整 Overview Article,需要技術細節時進入五篇 Core Series 的閱讀路徑。Core Series 會把原始素材依照環境契約、DQN 工程、公平比較、ONNX inference 與瀏覽器部署重新整理;它不是把最後一篇 Ironman 文章改名,也不是本頁面的延伸清單。
原始編年與後續程式證據仍可從 30 天 Ironman 文件分支、目前維護中的 repository 與 線上 Breakout demo 追溯。這個 Profile 的作用是說清楚 Project 現在是什麼、證據在哪裡,以及下一個讀者問題該往哪裡走;完整敘事留在 Overview,單一工程問題則留給 Core Articles。