@yuichirominato 2018.12.10更新 384views

Pause + Quenchで量子アニーリングの量子ボルツマンサンプリング

アニーリングスケジュール サンプリング シミュレーテッドアニーリング ボルツマンマシン 量子アニーリング 量子ボルツマンマシン

アニーリングスケジュールを操作して様々な量子状態をとりだそうという取り組みが主にD-Waveによって行われています。スピングラスシミュレータとして、アニーリングした途中の特定の熱平衡状態に落ち着かせて、最終的にquenchで状態を確定します。多分理想的にはquenchはなしでやりたいんでしょうけど、横磁場は0にして取り出さないといけないと思いますので、シミュレーションと違って、少し結果はずれそうです。

https://www.dwavesys.com/sites/default/files/14-1013A-A_WP_Performance_Advantage_in_Quantum_Boltzmann_Sampling.pdf

スピングラスシミュレータやボルツマンサンプリングに応用できそうです。下記の論文では、8*8*8の三次元イジングモデルをこのpause+quenchによってシミュレーションして再現できたということで、新しい量子アニーラの使い方を提案しています。

Phase transitions in a programmable quantum spin glass simulator
http://science.sciencemag.org/content/361/6398/162

ボルマンサンプリングをPause + Quenchでトライしてみる

量子アニーリングマシンはある横磁場内でのボルツマンサンプリングをしたくても、マシンの制約上必ず横磁場を下げなくてはいけません。ということである程度のところまでアニーリングがいったら、平衡状態にもっていき、そっから一気に横磁場を落としてなるべく平衡状態のサンプリングを取り出そうという試みです。

量子アニーリングでやる元気がないのでSAと温度TでPause+Quenchをやってみます。

簡単な例題でボルツマンサンプリングに関して学んでみたいと思います。
まずはD-Waveの例題でも載っている簡単な問題で。

より詳しく学びたい場合には下記からお願いします。

D-Waveの量子ボルツマンマシンの逆温度パラメータ最適化でPFNのOptunaつかってみた
http://blog.mdrft.com/post/717

Q=[[−1,2],[0,−1]]

このQUBOmatrixの場合、エネルギーコスト関数は、

E(x)=−x1−x2+2*x1x2

となります。xの場合の数でエネルギーを求めて見ると、

解析的にかんがえて見ると、ここではすべての場合の数が出せているので、まず規格化定数ZZを求めます。

Z=∑exp(E(x))=exp(0)+exp(1)+exp(1)+exp(0)=1+2.718+2.718+1=7.44

そして、

P=1/Z*exp(E)

より、確率は0.13と0.37がでます。

ということで、この分布をAnnealingのち、Pause+Quenchで考察してみます。Wildqatでやりたいところですが、アニーリングスケジュール調整の機能を入れてないので、手作業でやります。。。

早速実装

早速実装してみます。サンプリングをして分布を見てみますが、アニーリングスケジュールを変更したものをいくつか試してみます。まずは普通にアニーリングしてサンプリング。先ほど出てきたものに近いものを用意します。


import numpy as np
import matplotlib.pyplot as plt

def binarycount(binarr):  
     if(binarr[0] == -1 and binarr[1] == -1):   
         return 0   
     if(binarr[0] == -1 and binarr[1] == 1):   
         return 1   
     if(binarr[0] == 1 and binarr[1] == -1):    
         return 2   
     if(binarr[0] == 1 and binarr[1] == 1):    
         return 3 
         
J = np.array([[0,0.5],[0,0]])
Tmid = 0.2
Tmin = 0.02
count = []
repeat = 20
Tarr = []

for i in range(repeat):
    q = np.random.choice([-1,1],2)
    T = 5
    while(T > Tmid): 
        x_list = np.random.randint(0,2,1000) 
        for x in x_list: 
            q2 = np.ones(2)*q[x] 
            q2[x] = 1 
            dE = -2*sum(q*q2*J[:,x]) 

            if dE < 0 or np.exp(-dE/T) > np.random.random_sample(): 
                q[x] *= -1 
        T *= 0.95
        Tarr.append(T)
        
    for i in range(100):
        x_list = np.random.randint(0,2,1000)
        for x in x_list: 
            q2 = np.ones(2)*q[x]
            q2[x] = 1
            dE = -2*sum(q*q2*J[:,x])
                
            if dE < 0 or np.exp(-dE/T) > np.random.random_sample():
                q[x] *= -1
        Tarr.append(T)

    while(T > Tmin):
        x_list = np.random.randint(0,2,1000) 
        for x in x_list:
            q2 = np.ones(2)*q[x]
            q2[x] = 1
            dE = -2*sum(q*q2*J[:,x])

            if dE < 0 or np.exp(-dE/T) > np.random.random_sample():
                q[x] *= -1
        T *= 0.1
        Tarr.append(T)
        
    Tarr.append(T)
    count.append(binarycount(q))

fig = plt.figure()  
ax = fig.add_subplot(1,1,1)  
ax.hist(count,bins=8)
fig.show()

温度Tの変化としては、このように温度が下がり、途中で踊り場を作って最後落とすというのを何度か繰り返してサンプリングしています。

実際に得られた分布は、

普通にT=0.02まで落としてとった分布よりも理想的なサンプリングの分布になっています。

何度か試してみましたが、Pause + Quenchでいい感じで分布が取れます。温度が調整できなかったり、横磁場が調整できない時には逆温度パラメータβを調整していたことが多かったので、このようにPause+Quenchで実際に横磁場を制御してサンプリングをした方が量子性を残してサンプリングできるのでいいと思いました。シミュレータでしたら磁場や温度を止めてそのまま結果を取り出せばいいですが、実機を想定した上でのテクニックは今後に期待が持てます。以上です。

Recommended


CONTACT

info@mdrft.com

ブログトップへ Wikiへ移動

量子コンピュータ一般

量子ゲートアルゴリズム

量子アニーリング一般

量子アニーリングアルゴリズム

BlueqatSDKの使い方