786 views
この記事は最終更新から 372日 が経過しています。
CvR-10000の問題点
最初から分かっていたことですが…
時間がかかる・・・
1回の CvR計測に要する時間は、モデルの規模にもよるが 8秒から 20秒ほど。
これを 1つのモデルについて DQN学習中に数十回から数百回繰り返す。
↓↓↓
一つのモデルを DQN学習中に CvR計測時間が 10分から 30分もかかっている。
超パラメータの組合せを変えて何セットも比較実験したい場合に、この時間が無視できないのだ・・・
そもそも 10,000回も計測する必要があるのか?
過去記事 (50)【Othello AI】DQNで CvR 9000に到達 に書いた通り、
10,000回にした理由は、8,000や 9,000等の大きな数字を見ると達成感を感じるから
というモデルの評価指標としての性能とは関係ない理由だった。
CvR-500にした理由
そこで・・・
計測精度と計測時間のバランスを考慮し、10,000回から 500回に減らすことにした。
100回、300回、500回で迷ったが、500回を選んだのはこんな理由だ。
| 対戦回数 | 考察 |
|---|---|
| 100回 | 偶然勝利が続いた場合など、性能評価指標としてノイズに弱い気がする。 |
| 300回 | 計測結果の数値に対して、直感的に高い/低いがわかりにくい。 |
| 500回 | ノイズ低減且つ、中学生時代の中間・期末テストで 500点満点には馴染みがある。→ 直感的にGood/Badがわかる。 |
実際にやってみると、420, 430, 440, …
450やったぁ!
と、数十年前の懐かしい感情が蘇ってきた。
確か、中学生時代に初めて学年一位を取ったときは 476点、今でもその数値を記憶しているのだからよほど嬉しかったのだろう。
その後、阿部くんが 495点とかいう信じられない数値を出し「努力じゃ埋まらない何かがある・・・」と現実の厳しさを学んだ記憶もはっきりと…
既存のモデルファイル名を書き換える。
学習済みパラメータファイルのファイル名に CvR値を埋め込んでいるので、この値を 1/20 に変更したい。
Bashスクリプトで一気にファイル名を変更してしまおう。
例:
変更前: ./model/00080_othello_dqn_model_20250522_150813_6_8000_CvR_8762.pth
↓
変更後: ./model/00080_othello_dqn_model_20250522_150813_6_8000_CvR_438.pth
#!/bin/bash
# 第一引数でディレクトリを指定(指定がなければカレントディレクトリ)
TARGET_DIR="${1:-.}"
# 指定ディレクトリ以下の .pth ファイルを再帰的に検索
for FILE in `find "$TARGET_DIR" -type f -name "*othello_dqn_model_*.pth"`; do
CvR=`echo "$FILE" | sed -n 's/.*CvR_\([0-9]\+\)\.pth/\1/p'`
if [[ -n "$CvR" ]]; then
# CvRを 1/20にして整数に(小数点切り捨て)
CvR_New=$(( CvR / 20 ))
# 新しいファイル名を生成(CvR_{CvR} を CvR_{CvR_New} に置換)
NEW_FILE=$(echo "$FILE" | sed "s/CvR_${CvR}/CvR_${CvR_New}/")
# リネーム(上書きに注意)
echo "Renaming:"
echo " $FILE"
echo "→ $NEW_FILE"
mv "$FILE" "$NEW_FILE"
fi
done
現時点で、CvR-500値が 450点を超えているモデルだけを表示してみる。
#!/bin/bash
TARGET_DIR="${1:-.}"
for FILE in `find "$TARGET_DIR" -type f -name "*othello_dqn_model_*.pth"`; do
CvR=`echo "$FILE" | sed -n 's/.*CvR_\([0-9]\+\)\.pth/\1/p'`
if [[ -n "$CvR" && "$CvR" -ge 450 ]]; then
echo "$(basename "$FILE")"
fi
done
さらに CvR-500値の降順で並び替えた。
対ランダムで 勝率 90%超え の猛者(?)たちが、現時点で 22体ある。 ※過去記事に記述の通り、実際に対戦してみると弱い…
othello_dqn_model_CNN_02_20250606_051621_E0004_0002400020_CvR_459.pth othello_dqn_model_CNN_02_20250606_071543_E0007_0004300072_CvR_458.pth othello_dqn_model_CNN_04_20250606_073215_E0004_0002300052_CvR_457.pth othello_dqn_model_CNN_02_20250606_071737_E0010_0006200124_CvR_455.pth othello_dqn_model_CNN_02_20250606_051603_E0004_0002100116_CvR_453.pth othello_dqn_model_20250605_184501_CNN_02_6_10000_R0.61_CvR_453.pth othello_dqn_model_20250605_162524_CNN_02_75_97000_R0.68_CvR_452.pth othello_dqn_model_CNN_02_20250605_042717_E0009_0002700016_CvR_452.pth othello_dqn_model_CNN_02_20250606_093406_E00008000_CvR_452.pth 00372_othello_dqn_model_CNN_02_20250605_042717_E0009_0002700016_CvR_452.pth othello_dqn_model_DUE_01_20250606_092000_E00005000_CvR_452.pth othello_dqn_model_CNN_02_20250605_042635_E0008_0002300034_CvR_451.pth othello_dqn_model_CNN_02_20250606_071607_E0008_0004700036_CvR_451.pth othello_dqn_model_CNN_03_20250606_072322_E0006_0003400012_CvR_451.pth 00368_othello_dqn_model_CNN_02_20250605_042635_E0008_0002300034_CvR_451.pth othello_dqn_model_CNN_04_20250606_073235_E0005_0002600048_CvR_450.pth othello_dqn_model_CNN_03_20250606_072512_E0008_0004800004_CvR_450.pth othello_dqn_model_20250605_162542_CNN_02_76_98000_R0.69_CvR_450.pth othello_dqn_model_20250605_160440_CNN_02_16_20000_R0.65_CvR_450.pth 00188_othello_dqn_model_20250525_170514_7_13000_★9K_vs0_R0.85_CvR_450.pth TTT_othello_dqn_model_20250605_081939_10_13000_R0.62_CvR_450.pth othello_dqn_model_DUE_01_20250606_092043_E00009000_CvR_450.pth
ちなみに・・・
モンテカルロ探索モデル(MCTS agent)の CvR-500値を再計測した結果は以下の通り。
| 探索数 | CvR-500 |
|---|---|
| 100 | 478 (95.6%) |
| 200 | 490 (98.0%) |
| 300 | 493 (98.6%) |
| 500 | 493 (98.6%) |
| 1000 | 497 (99.4%) |
| 3000 | 498 (99.6%) |
| 5000 | 498 (99.6%) |
強い・・・
DQN強化学習で、少しでもここに近付きたい。
CvT値が 450点超えのモデル 22体と、上表の中で最弱の MCTS-100 の合計全 23体で総当たり戦をしてみた。
結果は以下の通り。

MCTS-100が圧勝するかと予想していたが 33勝 9敗 2引分 勝率 78.6%で準優勝 だった。
先手+後手の直接対決で vs MCTS戦 2連勝しているモデルもあり、少しは今後に期待が持てる結果 だ。
しかし、DQN歴代最高スコアの CvT 459のモデルにはもう少し頑張ってほしかった。
期待された彼は 18勝 12敗 14引分 勝率 60.0%で第 5位 の結果だった。
今回 MCTS-100 から優勝を奪取したモデルが現れたことに驚いた が、MCTS-100 との直接対決の結果は 0勝2敗で、その内の一戦は ●2-34〇 で大敗している…
でも、少しずつ距離を縮められているようで、DQNモデルの成長が少し嬉しいかも。
それにしても 10位以降は引き分けが多い な・・・
バグを疑って動作確認してみたが、再試合の結果も確かに引き分けが多かった。
学習方法が同じ、NNも CNN_02, CNN_03, CNN_04と似ているので、学習結果が似てしまうのだろう。
マシン負荷が心配・・・
上記の MCTSモデルの CvR-500計測を 7プロセス並列実行した時に、パソコンの全ファンが轟音を発して回転していた。
気になったので CPU温度を見てみた。
$ sensors coretemp-isa-0000 Adapter: ISA adapter Package id 0: +86.0°C (high = +85.0°C, crit = +105.0°C) Core 0: +76.0°C (high = +85.0°C, crit = +105.0°C) Core 4: +78.0°C (high = +85.0°C, crit = +105.0°C) Core 12: +58.0°C (high = +85.0°C, crit = +105.0°C) Core 13: +58.0°C (high = +85.0°C, crit = +105.0°C) Core 14: +58.0°C (high = +85.0°C, crit = +105.0°C) Core 15: +56.0°C (high = +85.0°C, crit = +105.0°C) Core 16: +60.0°C (high = +85.0°C, crit = +105.0°C) Core 20: +78.0°C (high = +85.0°C, crit = +105.0°C) Core 24: +86.0°C (high = +85.0°C, crit = +105.0°C) Core 28: +82.0°C (high = +85.0°C, crit = +105.0°C) Core 32: +58.0°C (high = +85.0°C, crit = +105.0°C) Core 33: +58.0°C (high = +85.0°C, crit = +105.0°C) Core 34: +58.0°C (high = +85.0°C, crit = +105.0°C) Core 35: +58.0°C (high = +85.0°C, crit = +105.0°C) Core 36: +60.0°C (high = +85.0°C, crit = +105.0°C) Core 37: +56.0°C (high = +85.0°C, crit = +105.0°C) Core 38: +56.0°C (high = +85.0°C, crit = +105.0°C) Core 39: +56.0°C (high = +85.0°C, crit = +105.0°C) Core 40: +82.0°C (high = +85.0°C, crit = +105.0°C) Core 44: +80.0°C (high = +85.0°C, crit = +105.0°C)
いくつか 80℃を超えている が、問題なさそうだ。
Adobeツールでレンダリングを実行すると 90℃を超えることもしばしばある。
また、実行中に急にファン音が下がったので、
もしかして thermal throttling が発動して CPUクロックが落ちた?
と思ったのでこれも確認してみた。
$ sudo dmesg | grep -i "thermal\|throttle"
[ 0.242835] CPU0: Thermal monitoring enabled (TM1)
[ 0.274712] thermal_sys: Registered thermal governor 'fair_share'
[ 0.274712] thermal_sys: Registered thermal governor 'bang_bang'
[ 0.274712] thermal_sys: Registered thermal governor 'step_wise'
[ 0.274712] thermal_sys: Registered thermal governor 'user_space'
[ 0.274712] thermal_sys: Registered thermal governor 'power_allocator'
[ 0.702133] thermal LNXTHERM:00: registered as thermal_zone0
[ 0.702135] ACPI: thermal: Thermal Zone [TZ00] (28 C)
[ 3.115022] Consider using thermal netlink events interface
[ 3.136095] proc_thermal_pci 0000:00:04.0: enabling device (0000 -> 0002)
サーマルスロットリングが発生すると以下のような表示が現れるので、現時点では問題ない。
CPUX: Core temperature above threshold, cpu clock throttled
では、GPUは?
MCTSプログラムはデータ並列の恩恵を受けられないので CPU実行 している。
このため、GPUは無負荷のはず。
$ nvidia-smi Fri Jun 6 14:39:43 2025 +-----------------------------------------------------------------------------------------+ | NVIDIA-SMI 570.153.02 Driver Version: 570.153.02 CUDA Version: 12.8 | |-----------------------------------------+------------------------+----------------------+ | GPU Name Persistence-M | Bus-Id Disp.A | Volatile Uncorr. ECC | | Fan Temp Perf Pwr:Usage/Cap | Memory-Usage | GPU-Util Compute M. | | | | MIG M. | |=========================================+========================+======================| | 0 NVIDIA GeForce RTX 5070 Ti Off | 00000000:02:00.0 Off | N/A | | 0% 35C P8 11W / 300W | 83MiB / 16303MiB | 0% Default | | | | N/A | +-----------------------------------------+------------------------+----------------------+ +-----------------------------------------------------------------------------------------+ | Processes: | | GPU GI CI PID Type Process name GPU Memory | | ID ID Usage | |=========================================================================================| | 0 N/A N/A 1707 G /usr/lib/xorg/Xorg 43MiB | | 0 N/A N/A 1821 G /usr/bin/gnome-shell 11MiB | +-----------------------------------------------------------------------------------------+
35℃とのこと、まったく問題なし。
vs 人間(私)
過去記事に記載した通り、過去に何度か高 CvR値の DQN生成モデルと対戦したが、毎回がっかりさせられた。
今度はどうか?
以下の 3モデルと対戦してみることにした。
| # | 名前 | 説明 |
|---|---|---|
| 1 | othello_dqn_model_CNN_02_20250606_093406_E00008000_CvR_452.pth | 今回優勝したモデル |
| 2 | othello_dqn_model_DUE_01_20250606_092000_E00005000_CvR_452.pth | 今回第 4位のモデル、MCTS-100に先手・後手で 2勝している |
| 3 | MCTS-100 | 最大探索回数 100回の弱めの MCTSモデル(それでも対ランダム勝率95.6%の強豪?) |
#1: 今回優勝モデルとの対戦
やっぱりか・・・
弱くて悲しい・・・
角には大きな報酬を与えているのに、積極的に取ろうとしないのはなぜか?

#2: 今回 4位、MCTSに2連勝のモデルとの対戦
あれっつ・・・
角を易々と渡し過ぎだろ・・・
どうやら私が作った DQNモデルは、角を貪欲に取ろうとする意志が弱いな・・・

#3: 今回準優勝、MCTS(最大探索回数100回)との対戦
100回じゃこんなものか・・・
終盤は「おっ!」と思わせてくれたが、全般的に甘いな。

つまり・・・
MCTS-100に余裕で勝てるぐらいの DQNモデルに育たなければ、人間の相手にはならない。
目標を高く持たなければ・・・
でも、まずは MCTS-100に楽勝できる DQNモデルを作らなければ。
参考: MCTS-100とはこちらで対戦出来ます。
※共用サーバに設置しているため、高負荷になるとアカウントBANされるリスクがあり、対戦できるのは 100, 200だけです。

今後の予定
訓練プログラム内部でモデルの性能評価を実行している個所を CvR-10000計測から CvR-500計測に変更すること。
CvR計測時間が短縮したことでチューニングし易くなった。
ネットワーク構成を色々と変えて試したいのです。
参考:
ChatGPT o3によるオセロAI性能評価指標に関する説明
https://chatgpt.com/share/68423ada-acdc-8007-9a52-f97b67d1d4a6
まだ早いが、いずれは試してみよう。