iT邦幫忙

2024 iThome 鐵人賽

DAY 23
0

昨天帶到 gen8 左右。這時是八月底,再過一兩天就要開賽了的階段,也是沒頭沒腦的一邊亂試,一邊改良既有的工具。一個比較大型的改動是正視疫途的標準回合結構並非蒙地卡羅樹可以完整描述的事實。羅盤階段和棋盤階段,任何一個著手只要有所不同,就可以保證遊戲局面是不同的;然而,進到了標記階段之後,先 A 後 B 或是反過來,實際上並沒有差異,也就是說,這已經是應該實作成蒙地卡羅圖(圖,Graph,電腦科學中的令一個較複雜的資料結構,由節點和連線構成)的範疇。

但我不想做蒙地卡羅圖!我也認為標記階段的決策密度不高,雖然不能說不重要,但的確不高。所以我決定把這個部份攤平。因為做得急切,所以也欠了一些單元測試未更新。總之,這之後收集模擬對局著手的單位時間收集量就又更低了。

然後就開賽了。gen10 以來,調整了許多網路結構的超參數,慢慢理解到,7(層數)x100(每層的頻道數) 似乎收斂得還不錯,相比於其他嘗試過的 6~18 層以及 72~288 每層頻道數的組合。但是仍然可以看到,甚至有交叉驗證時就已經學得很差的現象。

https://ithelp.ithome.com.tw/upload/images/20240923/201035244VIUka4yXg.png

後來方法大致收斂,也比較少調整超參數,差異只在每一次收集到的 data 量或有不同。這樣頻繁的手動操作也導致腳本的規模稍微提昇,如第十七天的內容描述的那樣。但是整體來說手動的部份仍然不少,尤其是一些小規模的監控。

雖然不確定原因,但後來九月中之後導入更新的資料集處理方法之後,在 gen18 世代觀察到很不錯的效果。也不至於再看到連交叉驗證部份都讓 validation 的損失不斷提高的問題。再來當然,就是在這個區間,也導入了殘局譜生成器,奠定了 gen16 的優良表現。

gen16 之後才能夠算是真正的穩定期吧!很想這麼宣言,但中秋節加速趕工文稿的時刻,又開始震撼於 gen19 的結果,很不確定。

不過真的要說腳本跟方法,的確是穩定了沒有錯。gen20gen21 繼續前進,感覺上,把醫療方隨機猴子打到剩 40% 勝率,好像是一個隱形的天花板?這週末的 gen22 也沒有可取之處。

所以...

目前狀況

所以終於,目前狀況小節的進度已經趕上了本文的進度,不同的時間軸終於匯集在一起了。

訓練的部份已經提了幾天,過去一個多月沒能夠成功大致上以 AlphaZero 機器學習方法提昇棋力,也沒有能夠找出原因,但最後幾天我想就直接用全自動的腳本去執行,算起來約 10 個小時可以進行一個世代,所以大概還可以進行個 10x 代?還是回頭專心寫程式,把對弈網頁做好。

文稿的部份也是枯竭了,得開始進入每一天下班趕工的狀態。

技術點太少,補一下 gen23 開始加入的 main.sh


## 預計是在 host 上直接驅動,所以這裡用 realpath。
## 但之後對應到 container 內路徑,所以通常還會對這個 $GEN_ROOT 取個 basename,才能夠構成 container 內能夠存取的路徑。

## 雖然說是要自動化,但先前已經手動下了 trial1(包含收集與訓練的部份),接下來還沒有用迴圈兜起來,但總之只有前面這一段使用到 trial1 的東西(預計可以用類似 trial$(($ITER-1)) 的 shell 語法來表示),剩下的都是 trial2(trial$ITER),但且先看看這第二輪會不會成功跑完。跑完了再包成迴圈即可。

GEN_ROOT=$(realpath $(dirname $0))
mkdir $GEN_ROOT/simulation-trial2
cp $GEN_ROOT/simulation-trial1/driver.sh $GEN_ROOT/simulation-trial2/driver.sh
mkdir $GEN_ROOT/train-trial2
cp $GEN_ROOT/train-trial1/driver.sh $GEN_ROOT/train-trial2/driver.sh
cp $GEN_ROOT/train-trial1/game-trial1.pth.4 $GEN_ROOT/train-trial2/game-trial2.pth

## 再來的這兩個靜態迴圈是 ChatGPT 教的。可以用這種方法等待運行在背景的 docker container。

container_ids=()
for i in {1..3}; do
    container_id=$(docker run --rm -u alankao -w /home/alankao/PathogenEngine -v $GEN_ROOT/..:/mnt -d pathogen:base-cpu bash /mnt/$(basename $GEN_ROOT)/simulation-trial2/driver.sh 2)
    container_ids+=("$container_id")
    echo "Started container $container_id"
done

# Wait for all containers to stop
for container_id in "${container_ids[@]}"; do
    docker wait "$container_id"
    echo "Simulation Container $container_id has stopped."
done

## 這兩隻在 share/template 裡面都有得看,已經穩定好一陣子了。collect.py 可以收集所有的著手 dataset,而 dataset.py 將所收集的對弈紀錄拆分成訓練集與驗證集。

python simulation-trial2/collect.py simulation-trial2 simulation-trial2/game.bin
python simulation-trial2/dataset.py simulation-trial2/game.bin 

## 這是訓練用的 container。

container_id=$(docker run --rm -u alankao -w /home/alankao/PathogenEngine -v $GEN_ROOT/..:/mnt -d pathogen:base bash /mnt/$(basename $GEN_ROOT)/train-trial2/driver.sh 2)
echo "Started container $container_id"

docker wait "$container_id"
echo "Training Container $container_id has stopped."

另外,很高興在這個斷槁的時刻,得到兩位鐵人大大的勉勵。一個是今天 marsgoat 大大路過這篇系列文的留言!他的猴子也能懂的電腦對局 : 30天打造自己的對局AI看來是很有趣的切入點,也和 DeltaPathogen 會有點關係。另外則是昨天阿鵝大大的 feature request,理論上可行是因為,我應該可以開啟伺服器(純 Rust socket 程式),然後用 ActionClient 去接,目前它已經可以和伺服器對話,但還沒接 web。接上 web 之後,就是它自己會是一個網頁 HTTP server,讓使用者可以用瀏覽器連它應該就可以。

繼續加油囉。


上一篇
回顧訓練狀況 2/3
下一篇
對戰網頁實作:先詠唱再說
系列文
DeltaPathogen:國產雙人不對稱抽象棋「疫途」之桌遊 AI 實戰30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言