Table of contents
  1. Quantum annealing for you 05
    1. ブラックボックス最適化
    2. スクリプト

Quantum annealing for you 05

ブラックボックス最適化

x=(x1,x2,,xN),xn={0,1}のバイナリ変数列があるとき、コスト関数E(x)を最小化(最大化)するようなバイナリ変数列を求めることが量子アニーリングでできるのでした。ただし、このコスト関数は

E(x)=xTQx=i=1Nj=1NQijxixj

のような形にする必要があり、現実の問題をこの定式化に落とし込む必要があります。
ではそもそもこの形で書けるかどうかわからない場合はどのように量子アニーリングで解けば良いでしょうか。それをなんとかする方法がブラックボックス最適化です。

今、E(x)は未知(知ることができない)としましょう。すなわち、バイナリ変数列xをこの関数に入れたときに、どのような値が出力されるかその関数系はわからないものとします。

y=E(x)

我々にはQUBO行列を作ることしかできないので、この関数を真似するようなE(x)ijQijxixjを求めましょう。このとき何もヒントがなくては真似しようがないため「xを入れるとyは教えてくれる」、すなわちヒントとなるデータセット(xd,yd) d=1Dが与えられ、それを手掛かりにQijを推定します。ここでは

minQ{d(ydijQijxidxjd)2+λi,jQij2}

のような最小2乗法を考えます。最後の項、データ(手掛かり)が少ないのに対してパラメータが多い場合を考えるため、過学習を防ぐためのものL2ノルム(の2乗)正則化項です。このようにすると、これはQijの2次関数であるため、この関数の微分が0となるところを探せばそこが最小値になることから、簡単な形であるからです。
例えばN=10だとすると、Qijの数は100個です。これに対してD=5だとしましょう。するとこの5個のデータに対して100個のパラメータ数は大き過ぎます。5個のデータを100個のパラメータを調整すると、それらのデータに合わせ過ぎてしまうことがあります。すると6個目のヒントデータが出てきた時に、その合わせ過ぎてしまったQijでは対処できないことがあります。よって不測の事態へのズレに対処するために、よそ見をさせる効果を持つものを正則化項と呼びます。
L1ノルムをつけても良いですが、その場合には近接勾配法を用いる必要があります。

ijQijxixj$をそのまま使うのは効率が悪いので書き換えを行いましょう。

x=(x1,x2,,xN)  x=(1,x1,x2,,xN,x1x2,x1x3,,xN1xN)

のように1とクロスタームも含めた形に書き直しましょう。また

a=(Q0,Q11,Q22,,QNN,Q12,Q13,QN1,N)

のように対角項と非対角項を並べたベクトルを作ります。ここでQ0E(x)Qijxixj+Q0のように、xiの項で表現できない定数項です。
例えばQ11Q11x1x1=Q11x1のように書けるため、上のxの成分の並びと対応していることがわかります。このようなものを定義しておくと

ijQijxixj=kakxk

のようにベクトルの内積で表現されることがわかります。xの中にx2x1がないのは、QUBO行列が対称行列であるため、考える必要がないからです。
このような手続きによってQijを求める問題がakを求める問題に変換されました。この形にしておけば線形回帰(xの1次)として問題を解くことができます。
よって

(1)mina{(ydkakxkd)2+λkak2}

のようになり、微分が0の場所もしくは平方完成することで最小値を求めることができます。

akで微分してみましょう。すると

2d(ydaxd)xkd+2λak=0  dxdxkda+λak=dydxkd

ここでxkdを行列だと考えて、X=(xkd)のように書くと

XXTa+λa=Xy  (XXT+λIN)a=Xy

逆行列を用いることで

(2)a=(XXT+λIN)1Xy

のように、既知の量からaを求めることができます。
λはL2ノルム正則化のために導入したパラメータです。λを大きくすると、(1)式から()2部分をあまり信用しない(データを信用しない)結果を導くことができます。またλを小さくするとデータを信用するような解き方になります。
まずデータセットからa(QUBO行列)を計算します。それを元にD-Wave計算をすると最適解の候補が求められます。その最適解の候補をブラックボックスとなっているE(x)に入力すると、コスト関数の値が求まり、それが本当に最適解かどうかがわかります。これを繰り返すことでaを洗練し、E(x)の関数を近似したものを求めます。
ブラックボックス最適化はx,yの両方が必要で、それらが良いか悪いかを判断する必要があります。ボルツマンマシンはxのみを用いて、xの傾向のみが必要です。
E(x)がQUBO行列で書かれるかどうかもわからないので、上述の議論で推定された結果が正しいかどうかは定かではありません。しかし限られたヒントから最適解の候補を見つけることができるというのが、ブラックボックス最適化の素晴らしい点です。ただしQUBOよりも複雑な形をしている場合には、近似がうまくいきません。

ちなみに平方完成では

(3)d(ydkakxkd)2+λkak2=dyd22k,dakxkdyd+d,k,akxkdxda+λkak2=dyd22kak(dxkdyd)+k,ak(XXT+λIN)ka

のようになります。2次関数の頂点部分は今までのデータが一番良く説明できる箇所に当たります。ではその推定がどれくらい正しいと言えるでしょうか。それはこの下に凸の2次関数の鋭さからわかります。

  • 鋭いならば、その推定から少しずれただけでデータを説明できなくなることを意味する。よってこの場合はその推定は自信がある。
  • 鈍いと、その推定から少しずれてもデータをまあまあ説明することができる。よってその推定には自信がない。

(3)式から、その鋭さがXXT+λINであることがわかります。

スクリプト

P = 1 + N + N * (N-1) // 2

のように//2を用いると、Pがfloatではなくintになります。キャストする必要がないので便利です。

この計算のボトルネックは逆行列の計算です。またデータが多くなると、その通信量が大きくなります。

2次関数の鋭さと解の発見パターンには、関係があります。

var = 0.5 * XXinv

において係数を0にしてしまうと、極小解にハマりやすくなります。逆にこの係数を大きくすると、手がかりを信用せずにあてもなく探索をするため、良い解が求まりません。

最初に用意するデータはできるだけ似ていないものを選んだ方が、QUBOを推定しやすくなります。これは大局的な振る舞いを知るためです。ただし集められてきたデータがあまりにもバラバラだと、そこから得られるヒントもバラバラなので、上手く探索を深堀りできないことがあります。よってデータが集まってきたら、ある程度そのQUBO推定結果を信じる方が良いです(アニーリングのようにvarを小さくした方が良い?)。


Copyright © github-nakasho