第2章 コスト関数とは何なのか

第2節 コスト関数の作り方

それでは一体どうやって式を立てるのかを、このサイトのデモアプリ「画像のノイズリダクション」の場合に照らして説明します(チュートリアルの「画像のノイズリダクション」のページ参照)。この問題は、とある画像にノイズ(画像データ上の不正確なドット)を、そのノイズを取り除くという問題を設定してアニーリングマシンに解かせています。この問題は、結果が元の画像に近ければ近いほど正解なので、この場合、解く前から正解をわかっているという前提で、アニーリングマシンの働きを確認するというデモアプリです。アニーリングマシンで解くための式を立てる(定式化)の試みは、以下のような根拠に基づいて行われています。

【式を立てる根拠】

(a), (b)の事情を考慮して式を作ることで、正解=後から入れたノイズが取り除かれた状態を導き出しています。

$\Sigma$のおさらい

さて、$\Sigma$という記号がなんだったかさっぱり思い出せない、という人に向けて説明していきたいと思います。(そんなのは不要、という方はここから先は飛ばして「コスト関数の作り方の続き」から読んでください。)コスト関数は、いくつかの項の足し算で表されています。ですが、白黒の点が膨大にあるので、足し算の式を全部書くのはものすごく大変だということは想像できると思います。そこで、足し算の式を全部書くのはやめて、$\Sigma$で表現しています。

ではノイズリダクションのデモアプリの式を作りながら確認していきます。ノイズリダクションのチュートリアルにある、式(1)を見てみましょう。これは前述の根拠(a)を表現した式です。

$$ \tag*{式(1)} - \sum_{i \in V}y_i s_i $$

$y_i$は入力画像(最適化処理前のノイズが入った画像)の$i$番目の点の値($+1$ or $-1$)で、$s_i$は出力画像(最適化されてノイズが除去された画像)の$i$番目の値($+1$ or $-1$)です。

$$ \sum y_i s_i $$

とは、$ys$つまり$y \times s$の計算を1番目から最後まですべて足しなさいという意味です。

$$ \sum_{i \in V}y_i s_i $$

$i \in V$とあるのは、この計算を行う範囲です。$i$は$V$の集合に含まれているという意味です。当然ながら画像の範囲にのみドットが存在しているので、$y_1s_1+y_2s_2+y_3s_3+……$は無限に計算する必要はなく、$V$の範囲(画像の範囲)内であることを数式上、定義しているという意味です。

コスト関数の作り方の続き

ここでチュートリアルに戻ってみます。以下のように記述されています。

つまり、ノイズの黒点を除く大多数の画素は入力前と出力後で同じ(黒か白)であるため、入力前後で掛け合わせると$(+1)\times(+1)$もしくは$(-1)\times(-1)$となり、一律正の値になるはずです。今回、求める最適解ではエネルギーが最小になるという前提で式を立てています。ですので、正の値をすべて足した和である$\Sigma$の前に$-$をつけることで、全体が最も小さい値になるようにしているのです。

次に、条件(b)を表した式(2)を見てみましょう。

根拠(b)を表した式(2)は「隣り合う画素は同じことが多い」ことを表しています。

$$ \tag*{式(2)} - \sum_{(ij) \in E}s_i s_i $$

$\Sigma$の中身は$s_is_j$、$\Sigma$の下には$(i,j)\in E$と添えられており、$E$とは「隣接画素ペアの集合」と説明されています。つまり、正しい画像では隣り合った点は同じ色であることが多いことを表しています。

最後に、(1)と(2)を足し合わせたのが以下の式で、これでコスト関数が完成となります。最後にもう一工夫されていることを確認します。

$$ \tag*{式(1)+(2)} - \sum_{(ij) \in E}s_i s_i - \eta \sum_{i \in V}y_i s_i $$

(1)と(2)を足し合わせただけでなく$\eta$という文字が登場していますね。これについては以下のように解説されています。

つまり、式(1)だけにすると画像が真っ黒あるいは真っ白になってしまいうまくいきません。また、式(2)だけになってしまうと入力前後が全く同じ画像になってしまうわけなのでノイズが全く消えず、これもうまくいきません。ちょうどうまくいくように、(2)の前に2か3をかけるとうまくノイズが除かれるということになります。
このように、アニーリングマシンに式を入れるためには、事実に寄り添うために、ユーザーのさじ加減により$\eta$を$2$か$3$に設定するというような調整が大切です。

いかがでしょうか?あの白黒画像からノイズを除去するという問題をエネルギーの最小化という問題にあてはめていくことがなんとなくわかって頂ければ嬉しいです。

コスト関数を作ったそのあと

$\Sigma$を使った式をアニーリングマシンに入れる時は、Pythonなどのプログラミング言語で簡単に書き表すことができます。そうするとアニーリングマシンの働きによってコスト関数をイジングモデルに当てはめ、最もエネルギーが小さくなる場合の式に入れた組合せを導き出すことができる、というような方式で問題を解くことができます。