9  Step 3: メトロポリス更新の実装

このステップは講義の概念的な中心である。

9.1 目的

メトロポリス更新を1ステップ実装し、AI との対話を通じて新しいアルゴリズムを理解する。

9.2 到達目標

このステップの終わりまでに、以下ができていること:

  • 動作するメトロポリス更新がある
  • 基本的なシミュレーションループがある
  • 受容規則がなぜそのような形をしているかの言葉での説明ができる
  • ヒートバス更新との違いの大まかな理解がある

9.3 なぜこのステップが重要か

メトロポリス法は、AI に手伝ってもらうべきことの好例である。

主な価値は、AI がコードを素早く生成できることではない。主な価値は、AI が以下を理解する手助けをしてくれることにある:

  • システムの状態とは何か
  • 1回の更新試行で何が変わるか
  • なぜエネルギー差 ΔE を計算するのか
  • なぜエネルギーが下がる提案は常に受容されるのか
  • なぜエネルギーが上がる提案は確率的にしか受容されないのか
  • コードのどの部分がアルゴリズムの核心か

9.4 実行スペル

Julia での 2次元イジングモデルのメトロポリス更新を学んでいる。

コードを書く前に、初学者向けにアルゴリズムを説明せよ。
以下を明確に区別せよ:

- システムの状態
- 1回の更新試行が何をするか
- なぜエネルギー差 ΔE を計算するのか
- なぜエネルギーが下がる動きは即座に受容されるのか
- なぜエネルギーが上がる動きは確率 exp(-beta * ΔE) で受容されるのか
- コードのどの部分がアルゴリズムの核心か

次にメトロポリス法とヒートバス法を比較せよ。

以下を説明せよ:
- メトロポリスが何を提案するか
- 何を受容または棄却するか
- ヒートバスが何を直接サンプルするか
- コードの構造がどう異なるか
- 両方の方法が何を達成しようとしているか

数学は軽めにせよ。直感とアルゴリズムの意味に焦点を当てよ。
その後、完全な解答を一度に出すのではなく、1つずつ小さな実装ステップを示せ。

9.5 説明スペル

今やったことを説明せよ。メトロポリス更新の各ステップが
何をしているか、受容規則がなぜそのような形か、
ヒートバス法との違い、コードのどの部分がアルゴリズムの
核心かを説明せよ。

9.6 習得する概念

  • 提案と受容
  • エネルギー差 ΔE
  • 1モンテカルロスイープ
  • 確率的受容
  • メトロポリス vs ヒートバス

9.7 最小限のバージョン

前のステップと同様に、このコードは J = 1 の慣習を使っているため、dE は結合定数なしで書かれている。

function metropolis_step!(spins, beta)
    L = size(spins, 1)
    for _ in 1:(L * L)
        i = rand(1:L)
        j = rand(1:L)
        nn = spins[mod1(i + 1, L), j] + spins[mod1(i - 1, L), j] +
             spins[i, mod1(j + 1, L)] + spins[i, mod1(j - 1, L)]
        dE = 2 * spins[i, j] * nn
        if dE <= 0 || rand() < exp(-beta * dE)
            spins[i, j] *= -1
        end
    end
end
ノートdE = 2 * spins[i,j] * nn の意味

スピン \(s_i\) を反転すると \(s_i \to -s_i\) になるため、そのスピンと近接スピンとの相互作用エネルギーの符号が反転する。エネルギー変化は \(\Delta E = 2 s_i \sum_{\text{nn}} s_j\) となる。nn は4つの近接スピンの和なので、dE = 2 * spins[i,j] * nn はまさにこの式を計算している。

9.8 更新規則の比較

AI に以下の2つのアイデアの違いを説明させるとよい:

  • メトロポリス: 反転を提案し、受容するか棄却する
  • ヒートバス: 局所的な条件付き分布から新しいスピンの値を直接サンプルする

この講義で両方を完全に実装する必要はない。更新ロジックの違いを理解する必要がある。

9.9 コードリーディング確認

以下のコード断片を読め:

dE = 2 * spins[i, j] * nn
if dE <= 0 || rand() < exp(-beta * dE)
    spins[i, j] *= -1
end

以下の質問に答えよ:

  1. dE は何を表しているか?
  2. なぜ一部の動きは確率1未満で受容されるのか?
  3. メトロポリスの受容ロジックの本質を含む行はどれか?

9.10 追加テスト生成プロンプト

2次元イジングモデルのメトロポリス法について、
短いコードリーディング問題を3つ作成せよ。

条件:
- 1問はアルゴリズムの意味を問う
- 1問は受容規則を問う
- 1問はコードのバグや改善点を問う
- まだ答えは出すな
- 私が答えた後、回答を採点し、フォローアップ質問を1つ出せ

次に、メトロポリスとヒートバス更新を比較する短い概念的な質問を
2つ追加で作成せよ。
更新ロジックの違いに焦点を当て、長い計算は不要である。

9.11 スキップ条件

以下がすでにできるなら、このステップはスキップできる:

  • メトロポリス更新を言葉で説明できる
  • コード中の受容規則を特定できる
  • 提案・棄却方式と直接的な条件付きサンプリングの主な違いを説明できる