世界を動かす技術を、日本語で。

自分だけの意思決定モデルを構築する

2026年10月11日原文(nishtahir.com)

概要

  • System one型意思決定モデル の仕組みと利点を解説
  • 出力制約 による高速な選択肢推論プロセスを紹介
  • Qwen/Qwen3-1.7B を用いた実装例と精度検証を提示
  • キャリブレーション(温度スケーリング) による信頼度の調整手法を説明
  • GitHubリポジトリ での実践的な実装案内

System one型意思決定モデルの概要

  • System one は、あらかじめ決められた選択肢から 確率的に即座に回答 を選ぶモデル
  • 通常の言語モデル では、JSONなど構造化出力のためにトークンごとに逐次生成が必要
    • 例:11トークンの出力なら 11回の推論パス が必要
  • System one型 では、 選択肢(A,B,C,D,Eなど) に出力を制約
    • 語彙をマスキング し、他のトークンは選択不可
    • 最も確率の高い選択肢 を一回の推論で決定
  • 出力が 制約内 に限定されるため、 高速化 とシンプルな信頼度推定が可能
  • ただし、 正解保証はなく、確率は「次のトークンの自信度」に過ぎない場合が多い

Qwen/Qwen3-1.7Bによる実装例

  • Python + HuggingFace Transformers で簡易実装可能
    • モデル名: Qwen/Qwen3-1.7B
    • 選択肢:["A", "B", "C", "D", "E"]
  • 選択肢ごとにトークンID を取得し、 logits から該当部分のみ抽出
  • softmax で確率化し、最も高いものを予測結果とする
  • 入力例:
    • 質問:「What color is the sky?」
    • 選択肢:A:Red, B:Blue, C:Green, D:Purple, E:I don't know
    • 出力例:B(Blue)が0.9988で最も高い確率

コード例(抜粋)

  • トークンID取得
    • option_token_ids = [tokenizer.encode(opt, add_special_tokens=False)[0] for opt in options]
  • 出力確率計算
    • probs = torch.softmax(logits[option_token_ids].float(), dim=-1)

精度評価とファインチューニング

  • CommonsenseQA データセットで精度評価
    • サンプル精度:約0.594(1.7Bモデル)
    • ファインチューニング後、精度やF1スコアが向上
  • 各選択肢ごとのprecision/recall/f1 を測定し、全体の マクロF1スコア も算出

信頼度キャリブレーションの問題

  • 曖昧な問題 では、モデルが 過剰な自信 を持つ傾向
    • 例:「Where would you most likely find a bat?」のような複数解釈が可能な設問
  • 生の出力確率 と実際の正答率が乖離
    • 例:0.9~1.0の確率帯で正答率70%程度に留まる
  • 温度スケーリング で分布を平坦化し、 信頼度と実際の精度を整合
    • 最適温度(例:3.797...)を設定し、 キャリブレーション を実施
    • 各信頼度帯での正答率がより一致するように調整

実践・応用

  • GitHubリポジトリ にて
    • データセット作成
    • 評価・ファインチューニング
    • キャリブレーション手順を公開
  • 他の大型モデル でも同様の手法を試行可能
  • 選択肢制約型推論 と 信頼度キャリブレーション の組み合わせによる高効率な意思決定AIの構築が可能

Hackerたちの意見

MLEとして、何年もクラスifierに興味を持ってもらえなかったから、Jevの盛り上がりには内心叫びたくなるよ。ゼロショットのクラスifierが従来のものより便利なのはわかるし、確かにクールだけど、でも普通のLLMもずっと前からゼロショットのクラスifierとして十分安くて使えるから、また内心叫びに戻っちゃう。

└

その怒りを共有したいな。何がそんなに叫びたくなるのか詳しく教えてくれない?

└

Jevが注目された理由の一部は、APIがif(...)やswitch文みたいだからだと思う。みんなチャットスタイルのAPIに慣れちゃってて、チャットモデルにたくさんの絵文字を送って、その文脈で最適なものを求めるなんて考えもしなかったんじゃないかな。しかも、同じ動作でもチャットモデルは高いし、拒否みたいなランダムな出力もするからね。でも皮肉なことに、2020年のGPT-3に関する初期のLLM論文では、複数選択式の質問のいくつかは特定の続きのトークン確率を比較して答えられてたんだよね、空欄を埋めるんじゃなくて。

└

でも普通のLLMもずっと前からゼロショットのクラスifierとして十分安くて使えるから、また内心叫びに戻っちゃう。 "完璧に安い"のスケールが違うんだよ。Jev(特に)はすごく安くて速いから、過去には正当化できなかったことにも投げられるし、ちょっとしたテスト以外はほとんど作業しなくて済むんだ。

└

MLEとして そうだけど、君が作ってたモデルはつまらなくて、一般の開発者が遊ぶにはアクセスしづらかったよね。同じAPIを使ってるからって、同じものを作ってたわけじゃないんだ。

└

叫ぶんじゃなくて、これをエンジニアリングのレベルアップのチャンスにしたらどう?優れたエンジニアは、アプローチをA == Bとか、AをBのように扱ったりしないんだ。アプリケーションの重要な部分が異なるときは特にね。ゼロショットは単に「便利」なだけじゃなくて、データが少ない状況では唯一の実行可能な解決策なんだ。もし計画に「BERT」って略語が含まれてるなら、なおさら100倍重要だよ(だって、あのモデルの中で一番大きいものでも、前提を引き出すための世界知識は屁みたいなもんだから)。より良いエルゴノミクスで、既存のものより速くて安いってだけで、有限なリソースと時間の中で新しいことをやったって呼ぶのに十分だよ。これを理解できない人が多いのが本当に叫びたくなる。

└

でも、普通のLLMはゼロショット分類器としてかなり安くて使える状態が続いてるよ。俺はプロンプトエンジニアじゃないけど、そういう使い方をしたいときはいつも遅すぎると感じてた。Jevは試したことないけど、どうやら速いらしいから、マーケティングによるとLLMが使えないところでも使えるようになるみたい。

└

Jevは普通の人向けの分類だね。見て、トレーニングなしでできるよ。

└

明るい面として、このゼロショット分類器の波が、もっと専門的な分類器の基盤になるかもしれないね(データとトレーニングの選定をもっと慎重に行えば)。

温度を変えて、モデルが特定のベンチマークでキャリブレーションされているように見せるのは「許可されてる」の?なんかp-hackingっぽい感じがする。

└

うまくいけばそれでいいよね!テストセットがそれなりに大きくて多様なら、何もないよりはマシだし。いろんなタイプの作業をぶつけて、どれくらい信頼度が変わるかでその頑健性を評価できるよ。

これを見るのは本当にクールだね。トークン生成を遊ぶことができたのは素晴らしかった。これらのモデルについて考える方法を分かりやすく説明してくれて、Jev/意思決定モデルのアイデアがすごく理解しやすくなったよ。モデルをキャリブレーションするアイデアも役に立ったし、これは素晴らしい概要だと思った。

Hacker Newsで議論の続きを見る