本記事は、当社オウンドメディア「Doors」に移転しました。
約5秒後に自動的にリダイレクトします。
こんにちは、A.I.開発部の太田です。
今回は量子アニーリングの簡単なシミュレータを作ってみたり、実際のD-Waveを使ってみた経験から、物理を専門としない人向けに量子アニーリングについて解説しようと思います。
(シミュレータのコードはgithubで公開しています。私自身、量子アニーリングについては最近勉強し始めたところなので、色々ご指摘いただけると幸いです。)
さて、私の所属する部署の役割として、機械学習・人工知能関連の技術調査や社内への展開を行っており、その一環として昨年12月に早稲田大学の田中先生をお呼びして開催した量子アニーリング勉強会が社内で大変好評でした。
昨年度は量子アニーリングに関する一般書籍が発売されたり、科学雑誌「Newton」でも特集されており、物理学者以外の一般の方にも、量子アニーリングが認知され始めているように感じます。また、今年の6月にはAQC2017(Adiabatic Quantum Computing Conference 2017)という量子アニーリング分野での最重要な国際会議1が日本で開催されることもあり、日本国内での盛り上がりは昨年以上になるのではないかと個人的には思っています。
「量子」という言葉を聞くと、何やら難しそうな印象を受けるかと思います。私も最近までは、「そもそもどうやって使うものなの?普通にプログラミングするの?何か物理的な操作をするの?物理の知識はどれくらい必要なの?」という状況でした。 そんな中、3月に運良く実際にD-Waveを操作できる機会2があり、その時に思ったのが
- シミュレータを使うのも実機を使うのも、使い方という観点からは大差がない(怖がらなくて良い)
- 量子アニーリングの理論に踏み込まないのであれば、物理の知識は必要ない(怖がらなくて良い)
ということでした。
せっかくシミュレータを書いたし、D-Waveの使い方もわかったし、使うだけなら物理がいらないこともわかったし、コツコツ勉強してきたことを物理を専門としない人向けに展開するのも意味があるかな、と思ったので、可能な限り物理用語を使わずに量子アニーリングについて解説してみようと思います。
- 対象読者
- (物理学の専門的な知識のない)エンジニア・分析官
- 必要な知識
- プログラミングの基礎的な知識
- 行列演算ができる程度の数学の知識
- この記事でわかること
- 量子アニーリングマシンの使い方がなんとなくわかる
- 量子アニーリングマシンを使う上で必要となるイジングモデルへのマッピングの仕方がわかる
- 量子アニーリングのシミュレーション(量子モンテカルロ法)についてなんとなくわかる
- この記事でわからないこと
- 量子アニーリングの理論的側面
目次
量子アニーリングとはなにか
近年注目を浴びている「量子コンピュータ」の作り方には、大きく分けて2つあります。
1つ目は「量子回路方式(ゲート式)」と呼ばれるもので、1980年代から研究が続けられてきました。
もう1つが「量子アニーリング方式」と呼ばれるもので、1998年に東京工業大学の西森教授たちが提案した手法です。
現在一般的に使われているコンピュータ(本記事では古典コンピュータと呼びます)やゲート式の量子コンピュータが汎用的な問題を対象としている一方で、量子アニーリング方式は組み合わせ最適化問題に特化しており3、
その代わりに、扱える変数の数4はゲート式よりも圧倒的に多くなっています。
古典コンピュータ | ゲート式 | 量子アニーリング | |
---|---|---|---|
動作温度 | 室温 | 極低温 | 極低温 |
扱える変数の数 | 非常に多い | 数個程度 | 〜2000個 |
対象とする問題 | 汎用 | 汎用 | 組み合わせ最適化問題 |
量子アニーリング方式は、できることが限られている反面、使い方はとてもシンプルです。
古典コンピュータやゲート式の量子コンピュータでは、自分のやりたいことを実現するには、まずプログラミングをしなければいけませんが、量子アニーリング方式の場合はパラメータを設定するだけです。一般のウェブサービスやウェブAPIを使うのと似た感覚です。
実際、世界唯一の商用量子アニーリングマシンであるD-Wave はインターネット経由でAPIをコールする形で利用可能です。D-Waveの実態を知るという意味で、以下の動画はとても面白いので興味のある方はぜひご覧ください。
イジングモデル
量子アニーリングを利用するにはパラメータさえ設定できれば良いのですが、具体的にどんなパラメータがあるのかについて説明します。少し数式が出てきますが、ご容赦ください。
量子アニーリングは、組み合わせ最適化問題を解くことができるという点は先程述べたとおりですが、具体的には以下の関数を最小化する2値パラメータ の組み合わせをみつけることができます。
ここで および は実数値のパラメータです。
このように、最小化したい関数が の2次までで記述できる問題のことをイジングモデルといい、 のことをスピンと呼びます。スピンのかわりに を使って
と書いた場合は QUBO (Quadratic unconstrained binary optimization)と呼ぶことが多いのですが、
とすればお互いに変換することができるので、QUBOとイジングモデルは等価です5。
は単なる定数なので、あってもなくてもよいのですが、 を解釈する上で便利なことがあるので残してあります。
ちなみに、上の式から 、 は明らかなのですが、手で変形しているとついつい忘れがちなので気をつけてください。
さて、数式だけ見てもイメージがつかないと思うので、簡単な例を見てみましょう。
例1: 最も簡単な例
最も簡単な例として、 の場合を考えてみます。 この場合、を展開すると
となり、全ての の組み合わせを書き下すと以下の表の通りになります。
-1 | -1 | -1 |
-1 | 1 | 1 |
1 | -1 | 1 |
1 | 1 | -1 |
を見てみると、 もしくは のとき、最小値 をとることがわかります。 量子アニーリングでできるのは、パラメータ 、 などを受け取って、この (もしくは )という の組み合わせを見つけることだけです。
このケースの場合は なので、全ての組み合わせを列挙しても 個だけでしたが、例えば のときの組み合わせの数は、 と膨大な数となります。この膨大な組み合わせパターンの中から最適なもの(正確には、 を最小とする組み合わせ)を選んでくれるのが量子アニーリングです。
例2: 画像の修復
上記の例だけだと、具体的な使い方やどんなことに使えそうかイメージがわかないと思うので、2つめの例として、画像の修復を紹介します。 ここでは2値画像を対象としますが、グレースケール画像やカラー画像にも適用可能です。
以下のような2値画像があったとします。もともとはきれいな「量子」という文字でしたが、様々な経緯でノイズが混じってしまったという設定です6。この画像からノイズを除去することを考えます。
量子アニーリングを使うには、この問題を という関数を最小化する問題に帰着させなければいけません。
まずはを画像をスピンで表す方法を考えます。 いろいろな方法が考えられますが、今回の場合は画像の各画素が2値なので、素直に各画素をスピンの値に対応させてみましょう。画素が1であれば、対応するスピンが+1、0であれば-1です。
次に や を決めていきたいのですが、ノイズの混じっている画像以外に使えるデータがないので、いわゆる外部知識として、以下の性質を仮定します。
- ノイズ除去後の画像はノイズ除去前の画像と似ている
- ある画素は、周辺の画素と同じ値をとりやすい
この2つの性質を満たすとき、 が小さくなるような と を設定することができれば、量子アニーリングによって を最小化し、その時のスピンを読み取ることで、上記の性質を満たすような画像を見つけることができます。
まず 1. については、 をノイズを含む画像の番目の画素の値(を になおしたもの)として、
という項を入れれば良さそうです。
( は2次元の座標 に対応することに注意してください)
実際、すべての の組み合わせを見てみると、
-1 | -1 | -1 |
-1 | 1 | 1 |
1 | -1 | 1 |
1 | 1 | -1 |
と書き下せます。 この表から、例1のときのように と が等しい時に が小さくなることが確認できます。
次に 2. についてです。こちらは、 をスピンの足 に依存しない正の定数として、
という項を考えます。ここで は隣接する とについてだけ和を取ることを意味します。
であれば、 と同様にして と が等しい場合に も小さくなることが簡単にわかります。 両方の条件を満たすには、 と を単純に足したもの
を小さくすれば、 も も小さくなりそうです。 の大きさをどうしたらよいか、という問題はありますが、それは結果をみながら調整します。
簡単ですが、 や を設定するコードを示します。
WEIGHT = 1 NOISED_IMAGE = plt.imread('noised.png') # 0-1の np.ndarray j = {} for x in range(1, NOISED_IMAGE.shape[0] - 1): for y in range(1, NOISED_IMAGE.shape[1] - 1): # 隣り合う j のみ WEIGHT を設定 j[x, y, x, y + 1] = WEIGHT j[x, y, x + 1, y] = WEIGHT h = NOISED_IMAGE*2 - 1 # 0-1 を ±1 に
この と を量子アニーリングマシンに投げれば、ノイズの除去された結果がかえってきます。
とはいえ量子アニーリングマシンの実機は使えないので、シミュレーションをしてみました。 上記の と をシミュレータに投げてみた結果が以下となります。
元画像ではなくランダムなスピンで初期化しているので、ランダムだったスピンが徐々にそろっていく様子がわかるかと思います(上記のコードで定式化すると、左端と上端にゴミが残ります)。
このように、量子アニーリングを使うには、適切なパラメータを探し出す作業(イジングモデルへのマッピング)が必要となります。 マッピングの方法は問題毎に違うので、解きたい問題毎に をどうするか考えなければいけません。 有名な問題についてはどうやったらよいかまとまっている論文 があるので、 より実践的な問題を解く場合は、この論文を参照しながら問題に合わせて を構成していくのが良さそうです。
例3: 巡回セールスマン問題
次に、もう少し複雑な例として、巡回セールスマン問題を紹介します。 巡回セールスマン問題は、「セールスマンが都市をまわるときに最小の移動距離で回りなさい」という問題です。この問題そのものをビジネスで応用する機会はあまりないかと思いますが、少し拡張することで配送計画の最適化など多彩な応用先があります。上述の論文にそって、下図のようにイジングモデルにマッピングします。
画像修復のときと違って、QUBO(変数が )であることに注意してください。
Aに0番目(=スタート)にいるので、対応する が でそれ以外が 、次にDに行くので、対応する が でそれ以外が 、... というようになっています。 AとDの距離を のように書くと、全都市を回ったときの総距離は
で表せます。ここで は順番を、、 は都市を表します。 について二次形式なので、量子アニーリングで最適化することができそうです。
制約の追加
実は上記の の最小値は自明です。実際、全ての が のとき、 は最小値の をとります。 が全て の状態というのは「どこにも行っていない(移動距離は )」に対応しています。
当然これは求めたかった解ではありません。セールスマンには、全ての都市を回ってもらわなければいけません。 もう一度問題を見つめ直してみると、以下の条件が必要であることがわかります。
同時刻にセールスマンはどこかの1都市にしかいない
全ての都市をちょうど1度ずつ通る
この2つの条件が満たされていれば、「セールスマンが全ての都市をまわること」を保証できます。 では、これらの制約をどうやってイジングモデルに取り込めばよいでしょうか?
シミュレーションするだけで良いのであれば、「そもそも制約を満たさない状態は探索しない」というアプローチ7がありますが、実際の量子アニーリングマシンを使いたい場合は、そういった制約を任意に追加することはできません。
そこで必要となるのが、の修正です。 量子アニーリングマシンができるのは、あくまで を最小にしてくれることだけです。 制約を満たしている場合にのみ、最小値をとるように を修正することで、自動的に制約を満たしてくれるようにする必要があります。
それでは具体例をみてみましょう。まず1.の制約を変形してみます。
この式は 全ての で成り立たないといけないので、左辺をまとめて と書くことにしましょう。
この が二乗の和の形になっているのがポイントで、どんな に対しても必ず で、すべての に対して制約を満たしている場合のみ、最小値の をとります。
のかわりに、以下の を考えます。
ここで は非常にに大きな数とします。
が大きいので、を小さくするには、とにかく を にしなければいけません。
よって、 を最小とするのは のなかで を最小にするもの、ということになります。
が制約1. を表していましたから、この状態が「制約1.を満たしていて、かつ が最小値をとる」状態になります。
制約2.についても同様の議論をすることができるので、結局 の代わりに
を最小化すればよいことがわかります。 この式を展開して、 と を求めるコードは以下のとおりです。 展開の際には、 なので、 であることを使っています。
coeff = 2.0 # A の値を 距離の最大値 * coeff とする n_cities = len(positions) # positions には都市の座標が入っている j = collections.defaultdict(int) max_dist = 0 # 第一項の部分を設定 for t in range(n_cities): for a in range(n_cities): for b in range(n_cities): d = dist(positions[a], positions[b]) # dist は距離を計算する関数 max_dist = d if max_dist < d else max_dist j[a, t, b, (t + 1)%n_cities] = -d # Aは十分に大きくなければならない A = max_dist * coeff # 第二項の2次の部分を設定 for t in range(n_cities): for a in range(n_cities): for b in range(n_cities): if a != b: j[a, t, b, t] -= 2*A # 第3項の2次の部分を設定 for a in range(n_cities): for t1 in range(n_cities): for t2 in range(n_cities): if t1 != t2: j[a, t1, a, t2] -= 2*A # 1次の部分をまとめて設定 h = np.zeros((n_cities, n_cities)) for t in range(n_cities): for a in range(n_cities): h[a, t] += 2*A # 定数部分 c = -2*A*n_cities
この と 、 を量子アニーリングマシンに投げれば、最適解を得ることができます。(cはあってもなくてもよいのですが、あると の値がそのまま距離になります) シミュレーションの結果はこちらをご覧ください。
シミュレーション
上述の通り、量子アニーリングを使って最適化問題を解くには、以下のステップを踏みます。
- 課題を整理し解くべき問題を用意する
- イジングモデルへのマッピングを行う
- (量子アニーリングマシンを利用して)イジングモデルの最適解を見つける
- 結果を解釈する
先程の例では、3. の量子アニーリングマシンの部分をシミュレータで済ませましたが、 せっかくですので、ちょっと深掘りして、シミュレーションの仕組みについて紹介したいと思います。
最適解を見つける仕組み
量子アニーリングのシミュレーションに進む前に、そのもととなったシミュレーティッドアニーリングについて、簡単に説明します。
上図の縦軸は 、横軸は (もしくは )を表していると思ってください。 ( は連続でないので、正確にはこのようななめらかな図にはなりませんが、イメージは伝わると思います。)
ここでやりたいのは、 を最小にする を見つけることです。 上述の通り、組み合わせの数は膨大で、全ての組み合わせを調べるわけにはいかないので、なるべく効率よく の小さい点を探していきます。
最も簡単で、さまざまなアルゴリズムのベースとなるものとして挙げられるのは、近傍探索法と呼ばれる以下のような方法です。
1. 適当に1点 を決めて の値を調べ、 とする 2. の近くの点 を適当に選び、 の値を調べ、 とする 3. と を比較して、 - のほうが小さかったら、なにもしない - のほうが小さかったら、 を新たに とする 4. 新たな で上記を繰り返す
「下り坂をおりられるだけおりれば は小さくなるよね」という発想です。 しかし、図のように凸凹がたくさんある場合は、山を超えることができずに局所的な最適解にトラップされてしまうため、そのような方法ではうまくいきません。
そこで、「適当な確率で山を飛び越えるようにしよう」というのがシミュレーティッドアニーリングです。
シミュレーティッドアニーリング
シミュレーティッドアニーリングでは、この山を飛び越える確率を、物理学でいうところの温度(の逆数)に対応するパラメータ で調整します。 具体的には、ある状態が実現される確率が
に比例するとして、 を小さい値から徐々に大きくしていきます。
(これは徐々に温度を下げていくことに対応します。)
の効果のおかげで、 が小さい時には大きな山を超えやすく、 が大きくなると、小さな山しか超えられないようになります。はじめは小さい で山を飛び越えられるようにして色々な場所を探索してみて、最終的に を大きくすることで、解を安定させます。
シミュレーティッドアニーリングのアルゴリズムは、以下のとおりです。
1. 適当に1点 を決めて の値を調べ、 とする 2. の近くの点 を適当に選び、 の値を調べ、 とする 3. と を比較して、 - のほうが小さかったら、確率 で、 を新たに とする - のほうが小さかったら、 を新たに とする 4. を少し大きくする 5. 新たな で上記を繰り返す
シミュレーティッドアニーリングは、温度を十分にゆっくりと下げていけば確実に最適解を得られることが理論的には知られていますが、温度の下げ方が速すぎると局所解にトラップされてしまう可能性があります。
シミュレータでは、確率的に s を選び直す部分と βを大きくする部分に分けて実装しています。 興味があればご確認ください。
量子アニーリング(量子モンテカルロシミュレーション)
シミュレーティッドアニーリングでは、1度に1つの点しか見ていないのに対して、量子アニーリングのシミュレーションでは、複数(ここでは 個とします)の地点で同時に探索を始めます。
(この のことをトロッタ数と言います。)
量子アニーリングで面白いのは、この 個の状態が互いに独立ではなく、お互いに干渉しながら最適な状態を探していくことです。これによって、山の向こう側を「覗き見」しながら最適解を探せることになります8。
干渉が強ければお互いに同じ状態になろうとして、小さければお互いを気にせずに(局所的な)最適解を探すことになります。 同じ状態になろうとするとき、 シミュレーティッドアニーリングと同様に が小さい方が実現されやすいようにしておくことで、徐々にエネルギーの低い状態に引き寄せられるように集まっていくようになります。
この干渉の強さを調整するパラメータを ( が小さいほど干渉が強い)と書くことが多いのですが、この は物理学では横磁場の強さと呼ばれているものです。 を磁石と見立てたときに、横から磁場をかけることに対応しています。
ちょっと話が抽象的なので、具体的な式で説明します。最適化したい関数 を
とします。量子モンテカルロ・シミュレーションでは、もともとの の代わりに
を最小化します。
一気に複雑になった感がありますが... 第一項
は、括弧の中がまさに と同じ形をしており、 個のシミュレーションを同時に走らすことを表しています。 第二項の
は、 と との干渉を表しています。 が小さくなると、 が大きくなり、干渉が強くなることがわかります。(干渉強ければ強いほど と は同じ値を取りやすくなります。)
シミュレータでは、 をここで定義していて、ここで を更新しています。ご参考まで。
D-Wave と頑張る日本勢
ここまでは、あたかもシミュレータのできることは量子アニーリングマシンの実機でもできるかのように書いてきましたが、実際にはいろいろな制約があります。
例えばD-Wave の最新版 D-Wave 2000Q であってもスピン数は高々2000個で、現実的な最適化問題を解くにはまだまだ足りません。また、スピン同士はキメラグラフと呼ばれる特殊な結合のしかたをしているため、 を任意に設定できたシミュレーションと違い、 の一部分しか設定することができません。このためイジングモデルへのマッピングがさらに難しくなっています。
こういった課題に対して、D-Wave の開発元である D-Wave Systems 社も無策ではありません。彼らは「2年ごとに量子ビット(スピン)の数を2倍にする」と公言して、実際にその公約を守り続けています。キメラグラフの話についても、彼ら自身がマッピング方法を解説していますし、大規模な問題を自動的に分割してD-Waveやシミュレーションで解いてくれるqbolvというソフトも公開していますので、今後は使いやすくなっていくものと思われます。
そもそも彼らは、「量子コンピューターなんて遠い未来の話」と言われていた時代から、冷ややかな視線も気にせず、自分たちの信念に基づいて研究を重ね、ついに商用の量子コンピュータを完成させた、アツい人たちですから、今後に期待せずにはいられません。
さて、D-Wave Systems 社が頑張っている一方で、実は日本勢もかなり頑張っています。
NEDO(国立研究開発法人新エネルギー・産業技術総合開発機構)「IoT推進のための横断技術開発プロジェクト」では、「組合せ最適化処理に向けた革新的アニーリングマシンの研究開発」というテーマが採択され、その中で量子アニーリングマシンの開発に取り組んでいます9。
量子アニーリングにこだわらず、イジングモデルを高速に解くという観点では、 例えば株式会社日立製作所は、従来のCMOS技術を使ったCMOSアニーリングという手法を開発し、産学連携で研究を進めていますし、株式会社富士通研究所はFPGAを使った技術を開発しています。内閣府主導のImPACTというプロジェクトでは、コヒーレントイジングマシンと呼ばれる方式の研究が進められており、その機能をクラウドで提供すると発表しています。
量子アニーリングを提唱した西森先生のお膝元である日本には、ぜひとも頑張ってもらいたいと思っています。
まとめ
せっかくシミュレータを作ってみたので、その経験をもとに量子アニーリングについて解説しました。
参考資料
- 量子コンピュータが人工知能を加速する
- 西森先生と大関先生による一般向けの本。一般向けにも関わらずかなり具体的なことまで書いてある。
- 量子アニーリング法とD-Waveマシン
- 西森先生によるD-Waveについての解説記事
- Software | D-Wave Systems
- D-Waveのソフトウェアアーキテクチャ
- An Introduction to Quantum Computing, D-Wave Style
- DWaveSystems によるD-Waveの入門資料
- 量子アニーリングの数理
- 西森先生による量子アニーリングの理論的な側面の講義資料
- 量子アニーリング法を用いたクラスタ分析
- 量子モンテカルロについてもまとまっている、田中先生による量子アニーリングのクラスタリングへの応用に関する論文。
- 次世代量子情報技術 量子アニーリングが拓く新時代 -- 情報処理と物理学のハーモニー
- 田中先生による量子アニーリングの解説スライド
- anneal
- 本記事に出てくるシミュレータのソースコード
- 本記事に出てくるシミュレータのソースコード
当社では、データサイエンティストやエンジニアの方を積極的に採用しています。ブログに興味を持った方はぜひご応募ください! 他にもコンサルをはじめさまざまな職種で募集をしていますので、データ分析や当社の取り組みに興味のある方もぜひご応募ください。 www.brainpad.co.jp
- 昨年のAQCではGoogleが独自に量子アニーリング方式の量子コンピューターを開発していることが明かされ、話題になりました。↩
- アジアで初めて開催されたD-Waveのセミナーに参加させていただきました!ありがたい限りです!↩
- 最近は、組み合わせ最適化問題だけでなく、機械学習でしばしば必要になるサンプリングにも利用しようという動きもあります。今後機会があれば、そちらについてもまとめたいと思います。↩
- 正確には量子ビット(qubit)という単位です。↩
- QUBOの に出てくる負号は、イジングモデルの慣習にあわせたものですが、負号なしで定義しても構いません。↩
- フリーフォントの青柳衡山フォントTを使わせていただきました。↩
- 例えば http://qiita.com/ab_t/items/8d52096ad0f578aa2224 はそのアプローチです。↩
- 詳しくは西森先生・大関先生の著書をご覧ください。↩
- http://www.nedo.go.jp/news/press/AA5_100602.html↩