手帳と試行

学んだことをアウトプットしていきます。 日々、ノートあるのみ。

シミュレーテッドアニーリング

MCMCを応用して確率的に最適化を行なう方法であるシミュレーテッドアニーリングを解説する。

確率分布と「温度」

MCMCで生成する対象となる乱数が従う確率分布が

P(x)=1Zexp(βE(x))\begin{aligned} P(\bm x) = \frac{1}{Z} \exp( -\beta E(\bm x)) \end{aligned}

で表されているとする。ここで ZZ は正規化定数である。β\beta逆温度 (inverse temperature)E(x)E(\bm x)エネルギー (energy) と呼ばれる。

この確率分布 P(x)P(\bm x) について、次の2つのことを指摘できる。

  1. エネルギー E(x)E(\bm x) が小さいほど P(x)P(\bm x) の値は大きくなる。
  2. 逆温度 β\beta が大きいほど、E(x)E(\bm x) の変化に関して P(x)P(\bm x) の値の変化は敏感になる。逆に言えば、逆温度が小さいほどエネルギー E(x)E(\bm x) に対して P(x)P(\bm x) は鈍感になる。

1つ目の「エネルギーが小さいほど確率分布の値が大きい」ということは、古典物理学において「座標や運動量が x\bm x であるような分子は、エネルギーが低いような状態を取りやすい」という現象に対応する。

2つ目の「逆温度が小さいほど確率分布の値の変化が鈍くなる」とは、「高温状態にある分子ほど、エネルギーが高いような状態を取る確率も高くなる」という現象を表している。すなわち

温度が高い    エネルギーが高くなりやすい\text{\small 温度が高い} \implies \text{\small エネルギーが高くなりやすい}

ということである。

MCMCと温度

ここで、P(x)P(\bm x) に従う乱数列 {x(i)}i=1n\{\bm x^{(i)}\}_{i=1}^n をMCMCで生成する状況を考えよう。MCMCで生成される乱数列はマルコフ連鎖の実現値であった。そのため、x(t+1)\bm x^{(t+1)} がどのような値であるかは x(t)\bm x^{(t)} にのみ依存し、その遷移のしやすさは、P(x(t+1))P(\bm x^{(t+1)})P(x(t))P(\bm x^{(t)}) に比べてどれほど大きいかに依存する。

より端的に表すと、提案された y\bm y について

  • 確率分布の値 P(y)P(\bm y)P(x(t))P(\bm x^{(t)}) よりも大きいのであれば、確実に受理 x(t+1)y\bm x^{(t+1)} \gets \bm y される
  • そうでなければ、P(y)P(\bm y)P(x(t))P(\bm x^{(t)}) よりも小さいほど受理されにくくなる

ということである。

ここに「逆温度」β\beta と「エネルギー」E(x)E(\bm x) を導入してみよう。先ほど確認したように、逆温度β\beta が大きいほど、E(x)E(\bm x) の変化に関して P(x)P(\bm x) の値の変化は敏感になる。すなわち、

  • 逆温度 β\beta が大きいほど、提案 y\bm y におけるエネルギー E(y)E(\bm y) が大きくても、それが受理されやすい
  • 逆に、逆温度が小さいほど、提案 y\bm y におけるエネルギー E(y)E(\bm y) が大きい場合に、それが受理されにくい

焼鈍法

ここでさらに、次のようなことを行なう。

まず乱数生成の初期では、逆温度 β\beta をできるだけ小さくしておく。そして漸次逆温度を大きくしていき、終期では十分に逆温度が大きいような状況を作る。

すると、初期では多少エネルギーが大きくなっても y\bm y が受理されて次々と遷移していくが、徐々にエネルギーが低い状態にとどまるようになる。終期では、常に1つ次の状態のほうがエネルギーが低くなるような振る舞いを見せるようになり、勾配法に似た挙動を示す。

こうすることにより、非常に広大な範囲 X\mathcal X から局所解 xXx^\ast \in \mathcal X を探索するようなアルゴリズムができあがる。このようなアルゴリズムを、シミュレーテッドアニーリング (simulated annealing, SA; 焼きなまし法) という。この名は、金属材料の加工工程で内部に発生した残留応力や加工硬化などを取り除くため、金属を一旦高温にしてから再び冷却することによって、金属にエネルギーの壁を乗り越えさせてより低エネルギーな状態に導くという処理 (焼きなまし) に由来する。

SAの基本的なアルゴリズムは以下の通りである。

Algorithm: Simulated Annealing.
1.X{}2.for t{1,2,,n}:3.βtemperature(t)4.xMCMC(x,β)5.XX{x}6.return minxX\begin{darray}{rl} 1. & X \gets \{\} \\ 2. & \text{for } t \in \{1, 2, \dots, n\} : \\ 3. & \qquad \beta \gets \operatorname{temperature}(t) \\ 4. & \qquad \bm x \gets \operatorname{MCMC}(\bm x, \beta) \\ 5. & \qquad X \gets X \cap \{\bm x\} \\ 6. & \text{return } \min_{\bm x} X \\ \end{darray}

メトロポリス法による実装

温度を伴うMCMCとして、例えばメトロポリス法を使用してみよう。メトロポリス法は以下のようなアルゴリズムであった。

目標となる確率分布が P(x)=1Zexp(βE(x))P(\bm x) = \dfrac{1}{Z} \exp(-\beta E(\bm x)) で表されているなら、次のように書ける。

Algorithm: Metropolis algorithm.
1.X{}2.for t{1,2,,n}:3.for i{1,2,,N}:4.ΔxiU(Δxici,ci)5.ΔEE(x+Δx)E(x)6.rU(r0,1)7.if exp(βΔE)>r:8.xx+Δx9.XX{x}10.returnX\begin{darray}{rl} 1. & X \gets \{\} \\ 2. & \text{for } t \in \{1, 2, \dots, n\} : \\ 3. & \qquad \text{for } i \in \{1, 2, \dots, N\} : \\ 4. & \qquad \qquad \Delta x_i \sim {\cal U}(\Delta x_i | -c_i, c_i) \\ 5. & \qquad \Delta E \gets E(\bm x + \Delta \bm x) - E(\bm x) \\ 6. & \qquad r \sim {\cal U}(r | 0, 1) \\ 7. & \qquad \text{if } \exp(-\beta \Delta E) \gt r : \\ 8. & \qquad \qquad \bm x \gets \bm x + \Delta \bm x \\ 9. & \qquad X \gets X \cup \{\bm x\} \\ 10. & \operatorname{return} X \end{darray}

これを用いてSAを実装するには、単に途中に temperature(t)\mathop\mathrm{temperature}(t) を挟めばよい。

Algorithm: Simulated Annealing.
1.X{}2.for t{1,2,,n}:3.βtemperature(t)4.for i{1,2,,N}:5.ΔxiU(Δxici,ci)6.ΔEE(x+Δx)E(x)7.rU(r0,1)8.if exp(βΔE)>r:9.xx+Δx10.XX{x}11.returnX\begin{darray}{rl} 1. & X \gets \{\} \\ 2. & \text{for } t \in \{1, 2, \dots, n\} : \\ 3. & \qquad \beta \gets \operatorname{temperature}(t) \\ 4. & \qquad \text{for } i \in \{1, 2, \dots, N\} : \\ 5. & \qquad \qquad \Delta x_i \sim {\cal U}(\Delta x_i | -c_i, c_i) \\ 6. & \qquad \Delta E \gets E(\bm x + \Delta \bm x) - E(\bm x) \\ 7. & \qquad r \sim {\cal U}(r | 0, 1) \\ 8. & \qquad \text{if } \exp(-\beta \Delta E) \gt r : \\ 9. & \qquad \qquad \bm x \gets \bm x + \Delta \bm x \\ 10. & \qquad X \gets X \cup \{\bm x\} \\ 11. & \operatorname{return} X \end{darray}

アニーリングスケジュール

関数 temperature\mathop\mathrm{temperature} によって規定される逆温度の変化をアニーリングスケジュールという。SAをきちんと動かすには、アニーリングスケジュールの設計が重要である。

もっとも基本的なのは、温度 T=1βT = \dfrac{1}{\beta}1t\dfrac{1}{t} に比例するように設計する方法である。逆温度 β\beta は温度の逆数であるから、これはすなわち逆温度を線形的に増大させていくものと説明することができる。初期逆温度を βinit\beta_{\rm init}、終期逆温度を βend\beta_{\rm end}、時刻を t=1,2,,nt = 1, 2, \dots, n とすれば、次のように書ける。

temperature(t)=βinit+t1n1(βendβinit)\mathop\mathrm{temperature}(t) = \beta_\mathrm{init} + \frac{t-1}{n-1} (\beta_\mathrm{end} - \beta_\mathrm{init})

きちんと temperature(1)=βinit,temperature(n)=βend\mathop\mathrm{temperature}(1) = \beta_\mathrm{init}, \mathop\mathrm{temperature}(n) = \beta_\mathrm{end} となることを確認しておこう。

なお実際には各温度において 1010010 \sim 100 回程度MCMCを用いて遷移を繰り返したりする (num_sweeps_per_temperature) などの方法も用いられる。