anison-lyrics-qwen35-4b-tpo
日本語の歌詞(アニソン / 電波 / エロゲ / ボカロ風)を条件から生成する Qwen3.5-4B。実歌詞で SFT したあと、 TPO 1・2周目まで学習済みです(1周 = 現在のモデルで学習条件 2,163件 × 4曲を生成 → 報酬モデルで最良・最悪を選び 実歌詞を gold にした3つ組 → TPO 1エポック)。報酬モデルは生成どうしの LLM ブラインド審査で学習したもの(swdq/anison-lyrics-rm-v1)。 3周目以降の自動学習は停止しています。商用品質は未達・未認定です。
- 既存の公開重み:
swdq/anison-lyrics-qwen35-4b-tpo-r2。下記の実歌詞比較に合格したモデルではありません。 - 生成設定(従来評価): temperature 1.0, top_p 0.95, top_k 50, repetition_penalty 1.08,
enable_thinking=False, 終了トークン<|im_end|>
周ごとの指標(評価用 20条件 × 16曲、学習に未使用の条件)
| 周 | RMスコア中央値 | 識別器スコア | 英語率 | タグ不足 | 丸写し | eval loss | 審査(対前周) |
|---|---|---|---|---|---|---|---|
| 0 | -2.047 | -18.914 | 0.1219 | 0.0469 | 0.0033 | 2.653 | - |
| 1 | 4.891 | 0.547 | 0.0094 | 0.1031 | 0.0034 | 2.7961 | - |
| 2 | 11.062 | 11.754 | 0.0125 | 0.0 | 0.0067 | 2.8462 | 85% (34/40) |
「審査(対前周)」は前の周とのブラインド一対比較の勝率(LLM 審査、A/B 順ランダム)。
実歌詞との比較
| モデル | 生の比較(生成勝 / 敗) | 日本語条件と適合する実歌詞のみ |
|---|---|---|
| SFT evalbest | 3 / 57 | 0 / 54 |
| TPO 1周目 | 3 / 57 | 0 / 54 |
| TPO 2周目 | 3 / 57 | 0 / 54 |
- 各60組は20曲 × 3候補。同じ実歌詞が3回登場するため60独立標本ではありません。
- 生成側の3勝は各モデルとも同じ英語のみの実歌詞に対する勝利でした。日本語文字率0.3未満の実歌詞2曲を除くと18曲 × 3候補で0勝です。
- 審査はLLMによる文章評価。公開曲の認知、繰り返し登場による出自推測、同一作者の相関を除去できていません。作詞家・聴取者・歌唱での検証は未実施です。
- この旧比較は完成候補だけを採っています。新しい
make_pairs.pyは未完候補も残し、採否集計では未完を失敗とします。 - 結果・審査文:
judge/real_vs_*/results.json。条件・候補IDと歌詞ハッシュは各key.json。集計:results/quality/*.json。学習・分割の監査:results/quality_audit.json。
生成設定の対照実験
2台でSFT・TPO 2周目をそれぞれ20条件 × 4候補生成。temperature 1.0、top_p 0.95、top_k 50、seed 11は固定し、 repetition_penaltyを1.08から1.0へ変更しました。従来出力は各条件16候補だったため、その先頭候補との比較であり、bitwiseに一致する乱数対照ではありません。
| モデル | 1.0対1.08 (1.0側の勝 / 敗 / 分) | 実歌詞との比較(適合18条件 × 4候補) |
|---|---|---|
| SFT evalbest | 18 / 19 / 3 | 0 / 72 |
| TPO 2周目 | 24 / 13 / 3 | 4 / 68 |
- TPO 2周目の対従来設定score(分を0.5): 0.6375、条件単位bootstrap 95%区間 [0.5125, 0.775]。改善の兆候はありますが、単一診断セットのLLM評価です。
- 実歌詞に対するTPOの4勝は2条件に集中。条件平均scoreは0.0556、bootstrap区間 [0, 0.1528]。商用歌詞相当の改善は確認できません。
- 同じ先頭4候補の範囲で、重複行率0.44超の曲数はSFTで3→27/80、TPOで1→4/80。未完はSFTで1→4/80、TPOで1→1/80。反復ペナルティ撤廃にも品質上の代償があります。
- デフォルト設定は変更しません。固定seedを全条件で共有しているため冒頭の相関もあり、次の比較では条件ごとの独立seedを固定して両群を新しく生成します。
- 設定と測定値:
results/decode_control_manifest.json。集計:results/decode_control_summary.json。審査文・判定:judge/control_*/results.json。生成:gen/eval_*_rp100.jsonl。
採否と再開
scripts/assess_quality.py は実歌詞をbaseにした審査を条件単位で集計します。候補数が多い条件に重みを偏らせません。
最低20適合条件、条件単位bootstrapの95%区間下端が0.5以上、未完なしを暫定スクリーニング基準とします。
これはLLMの代理指標であり、商用品質を認定する基準ではありません。現在の診断セットは適合18条件しかなく、最終採否には新しい凍結holdoutも必要です。
.venv/bin/python scripts/make_pairs.py gen/eval_real.jsonl gen/eval_tpo_r2.jsonl --per 3 --seed 21 --out judge/new_comparison
# 出自を隠した pairs_*.md を審査し、全ペアの判定を results.json の picks に保存する。
# picks = [{\"pair_id\": \"p000\", \"winner\": \"A\", \"confidence\": 3, \"judge\": \"...\"}, ...]
.venv/bin/python scripts/assess_quality.py --pairs judge/new_comparison --generated gen/eval_tpo_r2.jsonl --out results/quality/tpo_r2.json
.venv/bin/python scripts/loop_tpo.py --start 3 --end 14
loop_tpo.py は前周の対応する results/quality/tpo_rN.json が proxy_pass でなければ、生成・学習より前に終了コード2で停止します。
新しい周も審査未完・不合格なら公開・次周への移行を止めます。生成・実歌詞・キー・審査結果のハッシュで古い合格結果の使い回しを防ぎます。
審査後の公開は scripts/push_round.py を明示的に実行する工程です。このスクリプトも同じゲートを検査し、不合格ならHFへの接続・アップロードより前に終了コード2で停止します。
次の学習判断
- 反復ペナルティの対照実験は上記の通り完了。生成側同士の改善だけではデフォルト変更・追加TPOの根拠にしません。
- 報酬モデルの1024-token打切りはSFT評価4/320曲、TPO 2周目3/320曲。主な品質差をこれだけで説明できません。
- 現TPOは選好項が応答全tokenのlog確率和、実歌詞NLL項がtoken平均、参照方策へのKL制約なし。長さの影響と方策ドリフトのリスクがありますが、今回の原因と断定していません。
- 次の学習候補は、実歌詞のみを教師出力とし、曲固有の題材・視点・展開を入力に付けたSFT対照実験です。現在の学習2,163件にはテーマ指定がありません。追加情報が汎用化するかは未検証です。
- 実歌詞を報酬学習に使う場合はtrain曲だけを使い、審査済みのeval歌詞は報酬学習に入れません。作者・曲単位の重複を防いだ新holdoutを先に凍結します。
- 基準モデルより強い未調整モデルも同条件で比較して容量不足を切り分けます。α増量・識別器の再学習・14周の完走を、実歌詞品質の改善確認なしに実施しません。
- 実行順は、(1) 作者・曲で分離した十分な新holdoutを凍結、(2) 強い未調整モデルと現在のモデルを独立seedで比較、(3) 題材・視点・展開を加えた実歌詞SFTを単独実験、(4) 実歌詞側の品質差が縮まったときだけ選好学習、です。いずれも採否用歌詞を教師に流用しません。
- 最終条件は、作詞家による自然さ・固有性・フックの評価、メロディに載せた歌唱の検証、既存曲との近似・権利の確認です。現行の行完全一致率だけでは盗用の不存在も商用利用可も保証しません。
注意
- 報酬モデルの教師と審査員は同種の LLM 審査です。審査員の好みへの最適化を含みます。
- 学習データに第三者の歌詞を含みます。生成に学習データの行が出ることがあります(「丸写し」= 学習データの8文字以上の行との完全一致率)。