インスタンスと拡張
この章では、以下を含むいくつかの量子変分アルゴリズムを取り上げます。
これらのアルゴリズムを用いることで、重み付け、ペナルティ、過剰サンプリング、過少サンプリングなど、カスタム変分アルゴリズムに組み込むことができる設計アイデアについて学びます。これらの概念を実際に試し、発見した内容をコミュニティと共有することをお勧めします。
Qiskit パターンフレームワークはこれらすべてのアルゴリズムに適用されますが、最初の例でのみステップを明示的に示します。
変分量子固有値ソルバー (VQE)
VQE は最も広く使用されている変分量子アルゴリズムの一つであり、他のアルゴリズムが構築するためのテンプレートを提供しています。
ステップ 1: 古典的な入力を量子問題にマッピングする
理論的な構成
VQE の構成はシンプルです。
- 参照演算子 を準備する
- 状態 から参照状態 へ移行します
- 変分形式 を適用してアンザッツ を作成する
- 状態 から へ移行します
- 類似の問題がある場合は でブートストラップする(通常は古典シミュレーションまたはサンプリングによって得られる)
- 各オプティマイザーはそれぞれ異なる方法でブートストラップされ、初期パラメーターベクトルの集合 が生成されます(例えば、初期点 から)。
- 量子コンピューター上で準備されたすべての状態についてコスト関数 を評価する。
- 古典オプティマイザーを使用して次のパラメーターセット を選択する。
- 収束するまでこのプロセスを繰り返す。
これはコスト関数を評価するシンプルな古典最適化ループです。一部のオプティマイザーでは、勾配の計算、次の反復の決定、または収束の評価のために複数の評価が必要になる場合がありま す。
以下の観測可能量に対する例を示します。
実装
# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit qiskit-ibm-runtime scipy
from qiskit import QuantumCircuit
from qiskit.quantum_info import SparsePauliOp
from qiskit.circuit.library import TwoLocal
import numpy as np
theta_list = (2 * np.pi * np.random.rand(1, 8)).tolist()
observable = SparsePauliOp.from_list([("II", 2), ("XX", -2), ("YY", 3), ("ZZ", -3)])
reference_circuit = QuantumCircuit(2)
reference_circuit.x(0)
variational_form = TwoLocal(
2,
rotation_blocks=["rz", "ry"],
entanglement_blocks="cx",
entanglement="linear",
reps=1,
)
ansatz = reference_circuit.compose(variational_form)
ansatz.decompose().draw("mpl")
def cost_func_vqe(parameters, ansatz, hamiltonian, estimator):
"""Return estimate of energy from estimator
Parameters:
params (ndarray): Array of ansatz parameters
ansatz (QuantumCircuit): Parameterized ansatz circuit
hamiltonian (SparsePauliOp): Operator representation of Hamiltonian
estimator (Estimator): Estimator primitive instance
Returns:
float: Energy estimate
"""
estimator_job = estimator.run([(ansatz, hamiltonian, [parameters])])
estimator_result = estimator_job.result()[0]
cost = estimator_result.data.evs[0]
return cost
from qiskit.primitives import StatevectorEstimator
estimator = StatevectorEstimator()
このコスト関数を使用して最適なパラメーターを計算することができます。
# SciPy minimizer routine
from scipy.optimize import minimize
x0 = np.ones(8)
result = minimize(
cost_func_vqe, x0, args=(ansatz, observable, estimator), method="COBYLA"
)
result
message: Optimization terminated successfully.
success: True
status: 1
fun: -5.999999982445723
x: [ 1.741e+00 9.606e-01 1.571e+00 2.115e-05 1.899e+00
1.243e+00 6.063e-01 6.063e-01]
nfev: 136
maxcv: 0.0
ステップ 2: 量子実行のために問題を最適化する
最も空いている Backend を選択し、qiskit_ibm_runtime から必要なコンポーネントをインポートします。
from qiskit_ibm_runtime import SamplerV2 as Sampler
from qiskit_ibm_runtime import EstimatorV2 as Estimator
from qiskit_ibm_runtime import Session, EstimatorOptions
from qiskit_ibm_runtime import QiskitRuntimeService
service = QiskitRuntimeService()
backend = service.least_busy(operational=True, simulator=False)
print(backend)
<IBMBackend('ibm_brisbane')>
最適化レベル 3 のプリセットパスマネージャーを使用して Circuit をトランスパイルし、対応するレイアウトを観測可能量に適用します。
from qiskit.transpiler.preset_passmanagers import generate_preset_pass_manager
pm = generate_preset_pass_manager(backend=backend, optimization_level=3)
isa_ansatz = pm.run(ansatz)
isa_observable = observable.apply_layout(layout=isa_ansatz.layout)
ステップ 3: Qiskit Runtime プリミティブを使用して実行する
IBM Quantum® ハードウェア上での計算を実行する準備が整いました。コスト関数の最小化は非常に反復的なプロセスであるため、Runtime セッションを開始します。こうすることで、キューで待機するのは一度だけで済みます。ジョブの実行が開始されると、パラメーターを更新した各反復が直ちに実行されます。
x0 = np.ones(8)
estimator_options = EstimatorOptions(resilience_level=1, default_shots=10_000)
with Session(backend=backend) as session:
estimator = Estimator(mode=session, options=estimator_options)
result = minimize(
cost_func_vqe,
x0,
args=(isa_ansatz, isa_observable, estimator),
method="COBYLA",
options={"maxiter": 200, "disp": True},
)
session.close()
print(result)
ステップ 4: 後処理を行い、結果を古典的な形式で返す
最小化ルーティンが正常に終了したことが確認できます。これは、COBYLA 古典オプティマイザーのデフォルト許容誤差に達したことを意味します。より精度の高い結果が必要な場合は、より小さい許容誤差を指定することができます。上記のシミュレーターで得られた結果と比較して数パーセントの誤差があるため、実際にその対応が必要になることがあります。
得られた x の値は、コスト関数を最小化するパラメーターに対する現在の最良推定値です。より高い精度を求めてさらに反復する場合は、最初に使用した x0(すべて 1 のベクトル)の代わりにその値を使用してください。
最後に、最適化のプロセスにおいて関数が 96 回評価されたことに注目します。これは最適化ステップの回数と異なる場合があります。例えば、勾配を推定する際など、一部のオプティマイザーでは 1 ステップに複数の関数評価が必要になるためです。
部分空間探索 VQE (SSVQE)
SSVQE は VQE の派生手法であり、固有値 を持つ観測可能量 の最初の 個の固有値()を取得することができます。一般性を失わずに、 と仮定します。SSVQE は、最大の重みを持つ項の最適化を優先するために重みを加えるという新しいアイデアを導入しています。