Appendix
全体像 ── 「検索 → 圧縮 → 生成」という 3 段ロケット
┌─────────────┐ ┌─────────────┐ ┌──────────────┐
│ Retriever │──►│ Refactorer │──►│ Generator │
└─────────────┘ └─────────────┘ └──────────────┘
▲ ▲
│ │
外部ナレッジベース クエリ q
(コード+自然文)
- Retriever が外部知識から “関連文書(コード)” を引っ張る
- Refactorer がその文書を 要約・再構成 して LLM が食べやすい形に圧縮
- Generator が最終的なターゲットコードを生成
以下,それぞれの役割と内部で起きている計算を順にかみ砕きます。
1. Retriever ―― 「似ているもの」を高速に探すエンジン
| 用語 | 直感的な意味 |
|---|---|
| コーパス (Corpus) | 外部ナレッジベースに保存されている すべての文書(ここではコード断片とその説明文) |
| クエリ (q) | ユーザの質問や要求 |
| エンコーダ | 文章 → n 次元ベクトルに変換するニューラルモデル |
| 類似度 S(q, d) | 「クエリ q と文書 d はどれだけ似ているか」を数値で表す指標 |
1‑A. 密 (Dense) 検索:ベクトル同士のドット積
-
コーパス中の各文書 𝐶ᵢ を コーパスエンコーダ で埋め込み
\mathbf{c}_i = E_{\text{corpus}}(C_i)\in\mathbb{R}^n -
クエリ q を クエリエンコーダ で埋め込み
\mathbf{q} = E_{\text{query}}(q)\in\mathbb{R}^n -
ドット積(またはコサイン類似度)でスコア
S(q,C_i)=\mathbf{c}_i\cdot\mathbf{q} -
スコアの高い順に Top‑K 文書を返す。
イメージ
- 300 次元空間に文章を「点」で置き,q に近い点を高速に拾う。
- 最近は BERT・MPNet などのモデルがエンコーダとして使われる。
1‑B. 疎 (Sparse) 検索:BM25 で再呼び出し
- 埋め込みは万能ではなく,言い換え・専門用語・綴り揺れで誤差が出る。
- そこで,まず Dense 検索で 候補集合 を絞り,
BM25(TF‑IDF を改良した単語頻度ベースの手法)で もう一度ランキング。 - 長所:キーワード一致に強く,曖昧さを補正できる。
2. Refactorer ―― 取り出した文書を 要約・整形 する中継ぎ
| 役割 | 具体的な処理 |
|---|---|
| コンプレッサ | Top‑K 文書を「本当に必要なコード片」に絞り込み,トークン数を削減 |
| アライナー | Retriever が好む “長い生コード” と,Generator が好む “短く要点が揃ったコード” の 嗜好ギャップ を埋める |
2‑A. なぜ必要?
- LLM の コンテキスト長には上限 がある(例: 8k, 32k トークン)。
- “とりあえず全部貼る” ではコストも精度も落ちる。
- そこで 抜粋・要約 して「短いが濃い」コンテキストを作る。
2‑B. 典型的な実装
- 抽出的要約 (extractive) : 重要行だけ残す
- 生成的要約 (abstractive) : コードの意図を自然文で要約
- ポインタネットワークや RL で「残す/捨てる」を学習
3. Generator ―― 最終コードを生成する LLM
-
入力:
- ユーザクエリ q
- Refactorer が整形した 精選コードスニペット
- 出力: ターゲットコード(関数・クラスなど)
- モデル例: Code‑T5, StarCoder, GPT‑4o などのエンコーダ‑デコーダ or デコーダ専用 LLM
4. 2 段階学習 (Two‑Stage Training)
| ステージ | 学習対象 | 目的 |
|---|---|---|
| Stage 1 | Refactorer | - Retriever の出力と 理想的コンテキスト の差を最小化 - 例: RL + 露骨な圧縮率ペナルティ |
| Stage 2 | Generator (+微調整した Refactorer) | - 上記 Refactorer が吐いたコンテキストを条件に 正解コード を生成できるようにする |
ポイント
- まず 圧縮器 をしっかり育て,その “圧縮スタイル” に合わせて Generator を訓練すると 両者の相性が良くなる。
- 一気にジョイント学習すると モジュールごとの責任範囲 が曖昧になりやすい。
まとめ
-
Retriever
- Dense ベクトルで「意味的に近い」文書を高速取得
- BM25 でキーワードの取りこぼしを救済
-
Refactorer
- コード片を要約・再構成し,LLM 向けに最適化
- Retriever と Generator の 嗜好ギャップ を橋渡し
-
Generator
- 圧縮済みコンテキスト+クエリから最終コードを生成
-
Two‑Stage Training で両モジュールを段階的に最適化し,
短い入力で高品質なコード生成 を実現する。
決定境界がどうなるのか詳しく教えて
決定境界の変化について
ユーザーが「ArcFaceのマージンによる決定境界の変化」について詳しく知りたいと言っています。ArcFaceの加法角度マージンの効果を説明するために、2クラスのケースで、帰納的解釈を加えて、決定境界の変化を説明する必要があります。マージンを加える前の決定境界は、cos(θ1) = cos(θ2) であり、マージンを加えた後は、cos(θ1 + m) = cos(θ2) で、境界が回転することを示すことができます。
思考時間: 8 秒
以下では、2クラス(クラス1とクラス2)を例にとって、ArcFace マージンを導入したときに決定境界がどのように移動するかを数式とジオメトリ両面から詳しく解説します。
1. マージン無しの決定境界
-
特徴ベクトル
は単位円(あるいは単位球面)上にあり、クラス重み\hat g も同じく単位円上の「プロトタイプ点」です。\hat w_1, \hat w_2 -
コサイン分類器では、どちらのクラスに分類するかは
\cos\theta_1 \;=\;\hat w_1^\top \hat g \quad\text{と}\quad \cos\theta_2 \;=\;\hat w_2^\top \hat g の大きい方で決まります。ここで
は\theta_i と\hat w_i のなす角度です。\hat g -
決定境界 はちょうど両者が等しくなる場所、すなわち
\cos\theta_1 = \cos\theta_2 \quad\Longleftrightarrow\quad \theta_1 = \theta_2 が成り立つ点の集合になります。
-
2クラスの場合、もし
と\hat w_1 の間の角度を\hat w_2 とすると、境界はちょうどその「中間角\alpha 」上に位置します。\alpha/2
2. ArcFace マージンありの決定境界
2.1 境界条件の書き換え
ArcFace では、正解クラス(ここでは仮にクラス1)に対して角度にマージン
境界は “等号” のところなので、
(角度の範囲を
2.2 新しい境界位置
これを上式に代入すると、
したがって、新しい決定境界は
という角度位置に移動し、もとの中間点
3. ジオメトリ的イメージ
-
単位円上のクラス重み
-
→ 角度 0\hat w_1 -
→ 角度\hat w_2 \alpha
-
-
マージン無しの境界
- 境界は角度
\alpha/2
- 境界は角度
-
ArcFace マージンありの境界
- 境界は角度
(\alpha-m)/2 - すなわち、
の方向から見て\hat w_1 の場所ではなく、さらに\alpha/2 だけ「クラス1側」にシフトm/2 - クラス1領域は角度
に縮小0\le \theta_1 \le (\alpha-m)/2 - クラス2領域は角度
へ拡大(\alpha-m)/2 \le \theta_1 \le \pi
- 境界は角度
4. なぜこのシフトが有効か
-
「ハードルを上げる」効果
同じ特徴ベクトルがもつ元の角度 でも、マージンを加えるとクラス1と認められる条件は\theta_1 \theta_1 \le \frac{\alpha-m}{2} \quad(\text{マージン無しなら }\theta_1 \le \tfrac{\alpha}{2}) とより厳しくなります。
-
学習圧力
正解サンプルを正しくクラス1に分類するには、角度をさらに小さく( により近づける)必要があるため、特徴空間上で同一クラスのサンプルがより密にまとまるよう誘導されます。\hat w_1 -
クラス間分離の向上
逆にクラス2領域は広がるため、異クラス間のギャップが大きく保たれ、誤分類が減少します。
まとめ
-
マージン無し:決定境界は
\theta_1 = \alpha/2 -
ArcFace:決定境界は
へシフト\theta_1 = (\alpha-m)/2 - シフト量は マージン
の半分m - 結果、クラス1領域はハードルが高く(狭く)なり、クラス分離性能が向上します。
このように、ArcFace の決定境界は「中間点」から「マージン分だけプロトタイプ寄り」に移動し、学習を通じて特徴ベクトルをより厳格にクラス重みに引き寄せる役割を果たします。
決定境界ってそもそも何?
図に関する考慮
デフォルトの色を選択することになるけど、特に手動で色を指定しなくても大丈夫そう。ガイドラインでは色の指定を避けるべきとは書いてあるけど、デフォルトのままで問題ない。図では、python_user_visibleを使うとユーザーが見れる図が生成されるので、それを使おう。コードでは散布図を作り、決定境界線を表示する予定。matplotlibのみ使用で、seabornは避けること。
決定境界の説明
決定境界とは機械学習の分類モデルにおいて、入力空間をクラスごとに分ける線や面のことです。直線や曲線などがあり、データがどちら側に位置するかでクラスを決定します。例えば、2クラスのデータを分ける直線が決定境界です。
図を用いて、直感的に理解しやすいように、これから実際のプロットを生成して説明します。
思考時間: 15 秒
決定境界とは何か?
-
定義
機械学習の分類モデルにおいて、入力空間(特徴空間)を各クラスに分ける境界線・境界面のことを「決定境界」(decision boundary)と呼びます。- 2次元なら「曲線や直線」
- 3次元以上なら「曲面」になります。
-
役割
モデルは新しいデータ を受け取ると、そのデータが決定境界のどちら側にあるかで「クラスA」「クラスB」…と分類します。\mathbf{x}

図で見るイメージ
上の図(Decision Boundary Example)は、2クラスのサンプルを2次元空間に示し、以下のようにプロットしています。
-
×マーク(赤色):クラス2のデータ点
-
○マーク(青色):クラス1のデータ点
-
オレンジの直線:決定境界
- 直線の左側(Feature 1 が小さい側)は「クラス1」
- 右側(Feature 1 が大きい側)は「クラス2」と分類
この直線(決定境界)に沿って、点がどちら側に位置するかでモデルが判断を下しています。
決定境界の要点
-
モデルによって形が変わる
- 線形モデル(例:ロジスティック回帰、線形SVM) → 直線や超平面
- 非線形モデル(例:カーネルSVM、決定木、ニューラルネットワーク) → 曲線や複雑な多次元曲面
-
境界が複雑=過学習リスクが高まる
- 境界線がデータに合わせて入り組むほどトレーニングデータにはフィットするが、未知データで誤分類しやすくなる場合があります。
-
マージンとの関係
- SVM や ArcFace(先ほど解説)のように、**クラス間の余白(マージン)**を意識した学習を行うと、決定境界が「より離れた位置」に引かれ、汎化性能が向上します。
まとめ
- 決定境界 は「どこでクラスを分けるか」を示す線/面
- 2次元であれば直線や曲線としてイメージしやすく、図のように「データ点の中間」を境界として引く
- モデルやマージンの有無によって境界の形や位置が大きく変化し、分類精度や汎化性能に影響を与える非常に重要な概念です。
以上が「決定境界」の概要と図を用いた直感的イメージです。追加のご質問があればお知らせください!
マージンを足すとなぜスコアが下がるのか初心者にも分かるように具体的かつ詳しく教えて
マージンとスコアについて
ユーザーが「マージンを足すとなぜスコアが下がるのか」についても詳しく説明を求めていますね。まず、cos(arccos(u) + m) < u の理由を解説したいと思います。具体的には、単位円を使った直感的な説明が効果的です。角度が大きくなると、cosine(コサイン)の値は小さくなるため、マージンを足すとさらに角度が広がり、その結果コサインが小さくなってスコアが下がります。
思考時間: 5 秒
ポイント: ArcFaceで行っている「マージンを足す」という操作は、特徴ベクトルとクラス重みのなす角度を
1. コサイン類似度と角度の関係
-
コサイン類似度の定義
正規化された特徴ベクトル とクラス重み\hat g の内積は\hat w u = \hat w^\top \hat g = \cos\theta と表せます。ここで
は両者のなす角度です。\theta -
角度が増えるとコサインは小さくなる
単位円(半径1の円)上をイメージしてください。- 角度
のとき\theta = 0 ⇒ 最大の類似度\cos0 = 1 - 角度が大きくなるほど
は 1 → 0 → -1 と減少していきます(\cos\theta の範囲)。0 \le \theta \le \pi
つまり、特徴がクラス重みから離れる(角度が大きくなる)ほど、コサイン類似度は下がる性質があります。
- 角度
2. ArcFaceマージンの操作
ArcFaceでは、正解クラスの場合に限り「元の角度
そして新しいスコアは
となります。
3. なぜ \cos(\theta + m) < \cos(\theta) か?
-
(\cos m < 1 のとき) →m>0 \cos\theta\cos m < \cos\theta - さらに
の項があるため、もとの-\sin\theta\sin m からさらに「引かれる」形になる\cos\theta
合わせて必ず
が成り立ちます。
4. 具体例
-
元のコサイン類似度
(角度u = 0.8 radian)\theta = \arccos(0.8)\approx 0.64 -
マージン
radian を足すとm = 0.2 \cos(0.64 + 0.2) \approx 0.74. -
もとの
と比べると0.8 で、スコアが下がっています。0.74 < 0.8
| 項目 | スコア |
|---|---|
| マージン無し | 0.80 |
| マージン |
0.74 |
5. 直感的なイメージ
-
単位円上の「点」
- 「クラス重み」を単位円上の基準点、
- 「特徴ベクトル」を同じ円上の別の点と見立てる。
-
角度を増やす=点を回転させる
- 回転させるほど基準点から離れる
- 離れるほどコサイン類似度(点と基準点の“水平距離”)は小さくなる
-
マージンを足す操作 は、わざと正解クラスの点を回転させて「厳しい条件」でしか高いスコアを取れないようにするイメージです。
まとめ:
- ArcFaceマージンは「角度を増やす」という操作
- 角度が増えればコサイン類似度は必ず下がる
- それによって“より近い位置”に特徴を押し込まないと高スコアが出ず、結果としてクラス内のばらつきが小さくなる
このように、マージンを足すからスコアが下がる、という仕組みになっています。
「複数エージェントのサンプリングを併用するケース」とは?
1. 基本イメージ
-
単一エージェント方式
- ひとつの LM(例: GPT-4)に固定のプロンプト/メモリ/方策を持たせ、すべてのステップを同じ “人格” で進行。
- SWE-agent はこのタイプ。
-
複数エージェントのサンプリング方式(いわゆる multi-agent sampling)
- 異なる設定や役割 を持つエージェントを 複数 用意し、
- ステップごと、あるいはサブタスクごとに「どのエージェントに次のアクションを出させるか」を確率的・ルールベースで切り替える。
- 1 回のタスク実行で A → B → C … と 異なるエージェント が順番に登場することがある。
2. 具体例
| システム例 | どう切り替えるか | 目的 |
|---|---|---|
|
役割分担型 (Planner / Coder / Tester …) |
「設計フェーズは Planner、実装は Coder、検証は Tester」のように ステージごとに固定 | 専門性を分けて精度を上げる |
| 温度 or プロンプト多様化型 | 同じ LM でも temp=0.2 や temp=1.0 など 設定違い を複数並列生成し、良さそうな案を選択 | 発散探索と収束探索を両立 |
| 多数決/自己強化型 | 同じタスクを N 個のエージェント に同時解かせ、テストを通った案を採用 | “Best-of-N” 効果で成功率を底上げ |
Wang et al. (2024d) 系では、タスクごとに “得点が高い” エージェントを次のステップに残すトーナメント型 の仕組みが採用されています。
3. なぜアブレーション(要因切り分け)が難しくなるか
-
誰の手柄か曖昧
- 途中でエージェントが入れ替わるため、「この成功は Planner の設計が良かったのか、それとも最後に選ばれた Coder の試行回数が効いたのか」が分かりにくい。
-
確率的ゆらぎが大きい
- サンプリングや選択ポリシーに乱数が絡む → 実験ごとに経路が変わり、再現性低下。
-
比較対象が膨らむ
- それぞれのエージェントに対して温度・プロンプト・ツール構成をアブレーションすると 組み合わせ爆発 が起きる。
4. まとめ
- 複数エージェントのサンプリング= 異なる「人格」や設定を持つ LM エージェント群 を、同じタスク内で動的に切り替えながら使う手法。
- 探索力やロバスト性は上がるが、「どの要素が効いたか」を厳密に検証しにくい という研究上のトレードオフがある──これが論文で「アブレーション研究を弱める」と指摘された理由です。
POMDP 型 LM エージェントとは?
1. まず “POMDP” とは
| 要素 | 記号 | 役割 |
|---|---|---|
| 状態 | 𝑠 ∈ S | 環境が本当に持つ内部状態(エージェントからは完全には見えない) |
| 行動 | 𝑎 ∈ A | エージェントが選択して環境に与える操作 |
| 遷移確率 | 𝑇(𝑠, 𝑎, 𝑠′) | 「状態𝑠で行動𝑎を取ると確率的に𝑠′へ遷移」というモデル |
| 観測 | 𝑜 ∈ O | エージェントが受け取れる情報(部分観測) |
| 観測確率 | 𝑍(𝑠′, 𝑎, 𝑜) | 新状態𝑠′に到達したあと、観測𝑜が得られる確率 |
| 報酬 | 𝑟 = 𝑅(𝑠, 𝑎) | 行動の良し悪しを数値化 |
| 方策 | π(𝑏)→𝑎 | “現在の信念状態𝑏” からどの行動を選ぶか |
- Partial:観測が完全ではない
- Observable:観測を手がかりに内部状態を 推測(belief state 𝑏) する
- MDP:Markov Decision Process(完全観測)の拡張版
2. これを Language-Model (LM) エージェント に当てはめると…
| POMDP コンポーネント | ソフトウェア/言語モデル環境での具体例 |
|---|---|
| 状態 𝑠 | ① リポジトリ内の全コード ② これまで適用したパッチ ③ 失敗/合格したテスト結果 … など“本当の” 開発状況 |
| 観測 𝑜 | 直近で開いたファイル内容、ユニットテストのログ、diff 出力、エラー Traceback など チャット経由で LLM に渡る情報 |
| 行動 𝑎 | - ファイルを編集する - テストを実行する - ビルドコマンドを走らせる - 別ツールを呼び出す |
| 報酬 𝑟 | - テスト合格 → +1 - テスト失敗 → 0 - 実行エラー → −1 … など |
| 方策 π | LLM(GPT-4 など)に プロンプト+履歴 を食わせて次のアクションを文字列で生成 |
部分観測になる理由
- LLM の コンテキスト長 は有限 → リポジトリ全体を一度に渡せない
- テストやビルドの結果も “抜粋” して送る必要がある
→ すべての情報が常に見えるわけではない=POMDP
信念状態(belief)
- エージェント側で「まとめメモ」「ツール呼び出し履歴」「内部 Chain-of-Thought」などを保持し、過去の観測列 から現在の状況を推定
- SWE-agent では JSON 形式のメモリ + LLM 内部要約プロンプトでこれを近似
3. 典型的なループ構造
While not done:
# 1) 観測を収集
prompt = build_prompt(last_obs, memory)
# 2) LLM に問い合わせ → 行動 a_t を文字列で取得
action = GPT4(prompt)
# 3) 行動を実行して環境更新
obs, reward = execute(action)
# 4) 観測と報酬をメモリに追加
memory.update(action, obs, reward)
- ReAct / RePlan / MRKL 系パターンはこの枠組みを具体化した実装
- 行動は自然言語‐to‐ツール呼び出しにマッピングされる
4. POMDP フォーマル化がもたらす利点
| 利点 | 説明 |
|---|---|
| 失敗分析が体系化 | どこで認識(観測→信念)が崩れたか、どの行動選択が誤ったかを段階的に追える |
| 強化学習を適用可 | 報酬定義さえ置けば RLHF/RLAIF/イミテーション等で方策最適化が可能 |
| メモリ機構の設計指針 | belief 更新=「何を覚え、何を要約するか」を数理的に議論しやすい |
5. まとめ
POMDP 型 LM エージェント =
「部分的にしか見えない ソフトウェア環境の状態を、
観測履歴から 推論 しつつ、LLM を方策として行動を決めるエージェント」
- SWE-agent や AutoGPT、ReAct 系はみな POMDP モデルで整理できる
- 「部分観測」「信念更新」「ツール呼び出し」という 3 点セットで動くのが特徴です