D-WaveのQPU Solverには22個のパラメータがあります。 それぞれのパラメータについてD-Wave Solver Properties and Parameters Referenceに説明がありますが、 ここでは先進的なパラメータを中心に具体例を含めて説明をします。
基本的なパラメータ #
num_reads #
1度に取得するサンプル数(1から10,000までの整数)を設定できます。 デフォルトでは1です。
postprocess #
ポストプロセスの設定を行うパラメータです。デフォルトではNoneになっています。
(empty string)
:ポストプロセスを行わない設定です。純粋にマシンから出力された結果を知りたい場合に設定します。optimization
:最適化問題用。得られた結果からさらに局所探索を行い、局所最適解に行き着いたときの結果が出力されます。sampling
:ボルツマンサンプリング用。得られた結果を初期状態として、Markov-chain Monte Carlo (MCMC)を行います。
MCMCにおけるターゲットの逆温度はパラメータのbeta
で設定できます。
ポストプロセスの詳細については、Postprocessing Methods on D-Wave Systemsに書いてあります。
answer_mode #
solverからの結果のフォーマットを設定できます。デフォルトではhistogram
になっています。
histogram
:エネルギーが大きくなる順(最初が最低値)のヒストグラムで結果が出力されます。 同一の結果はマージされ、そのカウント数がnum_occurrences
でわかります。raw
:得られたサンプルの順(時系列順)に結果が出力されます。同一の結果も別々に出力されます。
スケジュールに関係するパラメータ #
アニーリングを行うときの横磁場項とIsing項の動かし方を調節することができます。この動かし方のことをアニーリング・スケジュールと呼びます。
D-Waveでのアニーリング・スケジュールには制限があり、少し複雑なので以下でアニーリング・スケジュールについて詳しく説明します。
D-WaveマシンのHamiltonianは
\[ H_{\mathrm{DW}}= -\frac{A}{2}\left(\sum_{i\in\mathcal{V}}\hat{\sigma}_i^x\right) + \frac{B}{2}\left(\sum_{i\in\mathcal{V}}h_{i}\hat{\sigma}_{i}^z+\sum_{(ij)\in\mathcal{E}}J_{ij}\hat{\sigma}_i^z\hat{\sigma}_j^z\right) \]です。ここで \(\hat{\sigma}_i^{x,z}\) はサイト \(i\) 上のqubitに作用するPauli演算子です。 \((\mathcal{V},\mathcal{E})\) はD-Waveマシンのキメラグラフを表しています。
右辺の前半部分がqubitを乱すための横磁場を表し、後半部分が最適化問題に対応したIsing模型です。 それぞれの強度(エネルギー)を表しているのが前についている係数の \(A\) と \(B\) です。D-Wave QPUでは、この係数 \(A\) と \(B\) を変化させる、つまり横磁場とIsing模型の強度を変化させることで量子アニーリングを行っています。 \(A\) と \(B\) の強度を調整する量はanneal fractionと呼ばれ、 \(s\) で表されます。 \(s\) はアニーリングの進行度合いを表す量です。
\(s\) は \(s=0\) のときアニーリングの開始を表し、 \(s=1\) のときがアニーリングの終了を表しています。この \(s\) と係数 \(A\) と \(B\) の関係はTechnical Description of the D-Wave Quantum Processing UnitのFigure 2.1に載っています。以下にグラフを載せておきます。 青いカーブが横磁場の強さで、緑色のカーブがIsingの強度を表しています。 \(s\) と \(A\) と \(B\) の関係については、このグラフの形で固定されており変更することはできません。
D-Wave QPUで変更できるのは、アニーリングの進行度合い
\(s\)
と実時間の関係です。
つまり横磁場項とIsing項の動かし方(時間依存性)は
\(s\)
の時間依存性を通して、間接的に変更することになります。
デフォルトでは
\(s\)
と実時間は比例関係になっています。つまりデフォルトのスケジュールでは、全体の時間の30%の時刻の時には
\(s=0.3\)
となります。現在のD-Wave QPUで設定できるスケジュールは
区分的に線形な関数のみで、区分点は最大4つ、区分区間は3つまでになっています。
\(s\)
と実時間との関係を調整するパラメータがannealing_time
とanneal_schedule
です。
ただしこれらを同時に設定することはできません。
annealing_time #
1つのサンプルを得るためにかける時間です。つまりannealing_time
が小さいときはアニーリングを素早く行い、
annealing_time
が大きいときはアニーリングをゆっくり行うことに対応しています。
単位はマイクロ秒で、正の整数値で設定できます。
設定できる値の範囲は、solver propertyのannealing_time_range
で確認できます。またデフォルトの設定値はsolver propertyのdefault_annealing_time
で確認できます。annealing_time
を設定するときはスケジュールは必ずデフォルトの線形になります。
anneal_schedule
と同時に設定することはできません。
annealing_timeを変更したときの結果例 #
D-Wave QPUのannealing_timeを変更して、ランダムに生成した問題を解かせてみました。このときの計算結果のエネルギーの平均値をannealing_timeごとのグラフにすると次のようになりました。
anneal_schedule #
アニーリングのスケジュールを調整するパラメータで、スケジュールの区分点(時間
\(t\)
,
\(s\)
の値)を設定できます。アニーリングのスケジュールは指定した区分点を直線で結んだ区分線形関数になります。
デフォルトでは[(0,0), (annealing_time,1)]です。設定できる区分点の数はsolver propertyのmax_anneal_schedule_points
で確認できます。また設定できる区分点には以下の条件があります。
- 時間は各点で増加していかなければならない。したがって各区分点の間は1マイクロ秒は空くことになります。
- 最初の点はフォワード・アニーリング(通常のアニーリング)では(0,0)、リバース・アニーリングでは(0,1)とする。
- 最後の点では
\(s=1\)
で、時間はsolver propertyの
annealing_time_range
を超えてはいけない。
anneal_scheduleの設定例 #
anneal_scheduleの設定の例を紹介します。
アニール・ポーズ(一時停止) #
アニーリングの途中でアニーリングを一時停止させることができます。
例えば[(0,0), (10,0.5), (110,0.5), (120,1)]と設定した場合には、次のようになります。
アニール・クエンチ(急冷) #
アニーリングの途中で急激に \(s\) の値を変えることができます。このような急激な操作はクエンチ(急冷)と呼ばれます。クエンチにより、途中の \(s\) での分布で固めることができます。
例えば[(0,0), (19,0.5), (20,1)]と設定した場合には、次のようになります。
リバース・アニーリングに関係するパラメータ #
リバース・アニーリングはその名の通り、アニーリングで得られた結果から再び横磁場を加えて乱すというが逆向きのアニーリングを行った後に、横磁場を弱めていくアニーリング操作を行う方法です。 現在のD-WaveのQPUで実行できるようになっています。
リバース・アニーリングをすることで通常のアニーリング(フォワード・アニーリング)で得られた解よりも、よい局所最適解を得ることを目的としています。
具体的には次のような操作になります。
- 初期状態を用意する(例えばフォワード・アニーリングの結果)。
- \(s=1\) に設定し、 \(s\) の値を徐々に減らしていく。
- \(s\) がある値(例えば \(s=0.25\) )になったら、逆に \(s\) を増やす方向に動かし、フォワード・アニーリングと同様に \(s=1\) までアニーリングさせる。
- \(s=1\) のときに結果を読み出す。
- 得られた結果を使って再び2から4の操作を行う。
リバース・アニーリングを行うときのanneal_schedule
をグラフで表すとつぎのようになります。
フォワード・アニーリングに転換させる
\(s\)
の値は、Reverse Quantum Annealing for Local Refinement of Solutionsをみると、
\(s=0.2\sim 0.3\)
程度がよさそうです。D-Waveのトポロジカル現象(KT転移)を観測したというNature論文では実際にリバース・アニーリングをマシンで行ってサンプルをとったと報告されています。
リバース・アニーリングを行うためのパラメータが以下で説明するreverse_anneal
,initial_state
,reinitialize_state
の3つです。
reverse_anneal #
sapi_ReverseAnneal
へのポインター。initial_state
とreinitialize_state
を与えるためのものです。
デフォルトではNULLです。
initial_state #
リバース・アニーリングを行う開始するときの初期状態を設定するパラメータです。初期状態として設定できるのは古典的な状態で、重ね合わせ状態は設定できません。すなわち \(|\uparrow\downarrow\cdots\uparrow\downarrow\rangle\) (QUBO表現では \(|01\cdots01\rangle\) )のような状態で、各qubitの値は死んでいるqubit以外は自由に設定することができます。
各qubitの値は
- イジング表現で問題を解く場合には、+1か-1
- QUBO表現で問題を解く場合には、0か1
- 使わないqubit、死んでいるqubitには、3
で設定します。2048個すべてのqubitに値は設定しておかなければなりません。例えば始めの6つのqubitだけが使い、それらすべてを1で設定するときには \(\mathrm{initial\_state}=[1,1,1,1,1,1,3,3,...,3]\) のような形になります。
reinitialize_state #
複数のサンプルをとるリバース・アニーリングを行う場合に、各サンプリングでの初期状態をinitial_state
で設定した初期状態に初期化する(reinitialize)か、それとも1回前のアニーリングでの結果を初期状態として選ぶのか(reinitializeしない)を決めるパラメータです。
true
-このときは毎回のアニーリングでinitial_state
で設定した初期状態に初期化されます。 この初期化には毎回400マイクロ秒程度かかります。false
-このときはinitial_state
への初期化は一番最初のアニーリングでのみ行われます。
2回目以降のアニーリングでは前回の結果が初期状態として使用されます。
デフォルトではtrue
になっていますが、false
に設定したほうが計算時間も短くなるので良いでしょう。
アニール・オフセット(横磁場の個別制御)のパラメータ #
アニール・オフセットの機能を使うことで、アニーリングのスケジュールを個々のqubitごとに変更することができます。ただし現在のD-Wave QPUで実現できているのはそれぞれのqubitに対するオフセット(どれだけ全体のスケジュール \(A(s), B(s)\) から遅らせるか)です。
アニール・オフセットを行う場合のマシンのHamiltonianを書くと \[ H_{\mathrm{DW}}= -\frac{1}{2}\left(\sum_{i\in\mathcal{V}}A_i(s)\hat{\sigma}_i^x\right)+ \frac{1}{2}\left(\sum_{i\in\mathcal{V}}B_i(s)h_i\hat{\sigma}_i^z+\sum_{(ij)\in\mathcal{E}}\sqrt{B_i(s)B_j(s)}J_{ij}\hat{\sigma}_i^z\hat{\sigma}_j^z\right) \]
となり、個々のスピンごとに設定された強度 \(A_i(s), B_i(s)\) により個々のqubitごとのスケジュールを決めることができます。D-Wave QPUにおけるグローバルなスケジュール \(A(s), B(s)\) は共通のシグナル関数 \(c(s)\) により支配されています。
アニール・オフセットとは、個々のスピンにおいてシグナル関数を \(c\left(s\right)\) から少しだけ変化させる \(c_i\left(s\right)=c\left(s\right)\to c_i\left(s\right)=c\left(s\right)+\delta c_i\) ことを意味しています。
\(\delta c_i>;0\) のときには \(i\) 番目のqubitのスケジュールはグローバルなスケジュールよりも早められ、 \(\delta c_i<0\) のときには遅くなります。
以上の話をグラフとして描くと以下のようになります。(Boosting integer factoring performance via quantum annealing offsetsより) グローバルなスケジュールが青い曲線で描かれており、青い曲線を \(s\) が小さくなる方向に変化させたのが緑色のグラフ( \(\delta c_i>;0\) )で、 \(s\) が大きくなる方向に変化させたのが赤色のグラフ( \(\delta c_i<0\) )です。
anneal_offsets #
個々のqubitに対するアニール・オフセット
\(\delta c_i\)
を決めるパラメータがanneal_offsets
です。qubitごとに設定できるオフセットの範囲には制限があり、solver propertyのanneal_offset_ranges
で確認できます。