Fine-tuning the 421M Laya for real-time Tetris placements, with reproduction guide
The game enumerates placements with their holes, heights and clears; Laya picks one from text. The teacher is a board-evaluation formula, not Jev. Walkthrough video in Japanese.
1,200 training and 200 validation boards from fixed seeds.
# Laya Tetris Fine-Tuning
Fine-tuning a 421M decision model to select placements in a real-time falling-block simulator.
Jevのように「状態と選択肢を受け取り、判断を返す」役割を、公開モデル **Laya** で試した実験です。Jevの重みや内部実装を複製したものではありません。教師はJevではなく、下記の盤面評価式です。
紹介動画: https://youtu.be/SUyEc48b_HQ
## 何を学習するか
ゲーム側が置ける位置を列挙し、置いた後の穴・高さ・消去数などを計算します。モデルはテキストで渡された候補から1つを選びます。画面画像から操作を学習する実験ではありません。
LayaはModernBERT-largeのエンコーダーと2層のTransformer判断ヘッドを持つ約421Mパラメーターのモデルです。文章を逐次生成せず、候補の確率分布を1回の前向き計算で返します。
教師の評価式は次の通りです。
```text
score = 3 × 消去ライン数 − 穴の数 − 0.1 × 各列の高さの合計
− 0.3 × 隣接列の高さの差の絶対値の合計 − 50 × ゲームオーバー
教師分布 = softmax(score / 0.3)
```
- 学習盤面のseed: 1000–1099、検証盤面: 1200–1219。
- 候補データを生成後、固定乱数で学習1,200件・検証200件を抽出。
- 入力上限1,280トークン、ヘッド側896。候補を末尾まで扱えるよう入力も調整。
- RLCD系の学習ループで4つのノイズ付き分布を作り、グループ内の基準報酬を使う方策勾配と教師分布へのsoft cross entropy(係数1.0)を組み合わせます。4回の実ゲームを回す意味ではありません。
- エンコーダーと判断ヘッドを更新するフルファインチューニングです。LoRAではありません。
- 12 epochs、micro batch 8、gradient accumulation 2。学習率はencoder 5e-5、head 2e-4。
- 学習後の温度調整には同じ検証データを再利用しています。独立データでの較正性能を示すものではありません。
## 実験結果
RTX 3090 × 1、学習ループ約1,515秒(約25分、データ生成等は含まず)。検証200件で教師の最上位候補と一致した割合は84%。ゲームの勝率ではありません。
| 対局seed | 制限時間 | 消去ライン | スコア | 判断リクエスト | 判断処理の中央値 |
|---|---:|---:|---:|---:|---:|
| 423 | 180秒 | 22 | 9,100 | 64 | 約195ms |
| 424 | 180秒 | 23 | 9,100 | 65 | 約191ms |
両対局とも記録上の締切超過・古い判断の適用は0件でした。判断処理の時間はscorer呼び出しの区間で、候補を用意する処理全体は含みません。単発テストの約35msとは測定条件が異なります。
これは2つのseedでの実演です。学習と入力形式・入力予算を一緒に変更しているため、改善を学習だけの効果とは断定できません。過去のJev実演とも入力や実行環境が異なり、優劣を決める比較ではありません。
## 実行手順
Linux、Python 3.12、CUDA対応GPUを想定しています。元実験のPyTorchは2.14.0+cu126でした。使用するGPUとドライバーに合うCUDA版PyTorchを先に導入してください。学習はCUDA必須です。動画出力にはffmpegが必要です。
```bash
python3.12 -m venv .venv
source .venv/bin/activate
# 環境に適合するCUDA版PyTorchを導入後:
pip install -r requirements.txt
python download_model.py
python gen_tetris_data.py
python