最適化ループ
このレッスンでは、 オプティマイザを使って、アサッツのパラメータ化された量子状態を繰り返し探索する方法を学びます:
- 最適化ループのブートストラップ
- ローカル・オプティマイザとグローバル・オプティマイザを使用する際のトレードオフを理解する
- 不毛のプラトーとその回避法を探る
高レベルでは、オプティマイザーは探索空間を探索するための中心的存在だ。 オプティマイザは、コスト関数の評価を用いて変分ループの中で次のパラメータセットを選択し、安定した状態に達するまでそのプロセスを繰り返す。 この段階で、パラメータ値の最適セット が返される。
局所最適化と全局最適化
各オプティマイザー・クラスを調べる前に、まず問題を設定する。 まず、8つの変分パラメータを含む回路から始める:
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([("XX", 1), ("YY", -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")Output:
def cost_func_vqe(params, 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
"""
pub = (ansatz, hamiltonian, params)
cost = estimator.run([pub]).result()[0].data.evs
return costfrom 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="SLSQP"
)
resultOutput:
message: Optimization terminated successfully
success: True
status: 0
fun: -3.9999999964520634
x: [ 1.000e+00 1.000e+00 -1.571e+00 -4.556e-05 -1.207e+00
-1.935e+00 4.079e-01 -4.079e-01]
nit: 12
jac: [ 0.000e+00 0.000e+00 -7.957e-04 2.543e-04 1.381e-03
1.381e-03 5.430e-04 5.431e-04]
nfev: 112
njev: 12
グローバル最適化アルゴリズム
グローバル・オプティマイザは、オプティマイザによって決定されたパラメー タ・ベクトル( )のセットに対して、コスト関数を反復的 (すなわち、反復 )に評価しながら、その領域の複数の領域にわたって (すなわち、非局所的に)コスト関数を最小化する点を探索する。 このため、局所極小値の影響を受けにくく、初期化にもある程度依存しないが、提案された解に収束するまでの時間が大幅に遅くなる。
ブートストラップ最適化
ブートストラップ、つまり事前の最適化に基づいてパラメータ の初期値を設定することで、オプティマイザがより早く解に収束することができます。 これを初期点 、 を初期状態と呼ぶ。 この初期状態は、我々の参照状態 とは異なる。前者は最適化ループ中に設定された初期パラメータに焦点を当てるのに対し、後者は既知の「参照」解を使用することに焦点を当てるからである。 もし (つまり同一性演算)であれば、これらは一致するかもしれない。
ローカル・オプティマイザーが最適でないローカル・ミニマムに収束する場合、最適化をグローバルにブートストラップし、ローカルに収束を改善することができます。 これには2つの変分作業負荷を設定する必要があるが、オプティマイザはローカル・オプティマイザだけよりも最適解を見つけることができる。
勾配ベースおよび勾配フリー最適化アルゴリズム
勾配ベースの
私たちのコスト関数 、初期点から始まる関数 の勾配にアクセスできる場合、関数を最小化する最も簡単な方法は、関数の急降下方向に向かってパラメータを更新することです。 つまり、 としてパラメータを更新する。 は学習率で、更新の大きさを制御する小さな正の ハイパーパラメータとは、アルゴリズムを制御するためのパラメータである。 ハイパーという言葉は、我々のアルゴリズムが見つけようとしているパラメータ(θ)と区別するためのものである。 である。 コスト関数の 局所最小値とは、θの値の小さな範囲における関数の最低点のことである。 対照的に、グローバル・ミニマムとは、関数のどこにおいても(つまり、θのどの値においても)最低点である。 に収束するまでこれを続ける。
このコスト関数とオプティマイザを使って、最適なパラメータを計算することができる
# SciPy minimizer routine
from scipy.optimize import minimize
x0 = np.ones(8)
result = minimize(
cost_func_vqe, x0, args=(ansatz, observable, estimator), method="BFGS"
)
resultOutput:
message: Optimization terminated successfully.
success: True
status: 0
fun: -3.9999999999997025
x: [ 1.000e+00 1.000e+00 1.571e+00 3.220e-07 2.009e-01
-2.009e-01 6.342e-01 -6.342e-01]
nit: 14
jac: [-1.192e-07 -2.980e-08 8.345e-07 1.103e-06 5.960e-08
0.000e+00 -5.960e-08 2.980e-08]
hess_inv: [[ 1.000e+00 1.872e-10 ... 5.077e-05 3.847e-05]
[ 1.872e-10 1.000e+00 ... -5.208e-05 -4.060e-05]
...
[ 5.077e-05 -5.208e-05 ... 7.243e-01 -2.604e-01]
[ 3.847e-05 -4.060e-05 ... -2.604e-01 8.179e-01]]
nfev: 144
njev: 16
このタイプの最適化の主な欠点は、収束速度が非常に遅く、最適解が得られる保証がないことです。
勾配なし
勾配を必要としない最適化アルゴリズムは、勾配情報を必要としないため、勾配の計算が困難であったり、計算コストが高かったり、ノイズが多すぎたりする場合に有効です。 また、勾配ベースの手法が局所最適に収束する傾向があるのに対して、大域的な最適値を見つけるのに頑健な傾向がある。 ここでは、勾配のないオプティマイザが不毛な停滞を避けるのに役立つ例をいくつか紹介する。 しかし、勾配を用いない方法は、特に高次元の探索空間を持つ問題に対して、より高い計算資源を必要とする。
代わりに COBYLA オプティマイザを使用する例である:
# SciPy minimizer routine
from scipy.optimize import minimize
x0 = np.ones(8)
result = minimize(
cost_func_vqe, x0, args=(ansatz, observable, estimator), method="COBYLA"
)
resultOutput:
message: Optimization terminated successfully.
success: True
status: 1
fun: -3.999999973369678
x: [ 1.631e+00 1.492e+00 1.571e+00 3.142e+00 1.375e+00
-1.767e+00 1.484e+00 1.658e+00]
nfev: 137
maxcv: 0.0
不毛の高原
実際、下の例の山あり谷ありのように、コスト環境はかなり複雑になる。 最適化メソッドは、黒い点と線で示されるように、最小値を探しながらコストランドスケープをナビゲートする。 3つの探索のうち2つは、大局的な最小値ではなく、局所的な最小値で終わっていることがわかる。
使用される最適化手法の種類にかかわらず、コスト・ランドスケープが比較的平坦である場合、その手法が適切な探索方向を決定するのは困難な場合がある。 このシナリオは、 パラメトリック量子回路の勾配が量子ビット数に対して指数関数的に小さくなると、最適化が困難になり、不可能になる可能性がある。 と呼ばれ、コストのランドスケープが徐々に平坦になる(したがって、最小値への方向性を決定するのがより困難になる)。 パラメータ化された広範な量子回路において、合理的な方向に沿った勾配がある一定の精度でゼロでない確率は、量子ビット数が増加するにつれて指数関数的に減少する。
この分野ではまだ活発な研究が行われているが、最適化のパフォーマンスを向上させるための推奨事項がいくつかある:
- ブートストラップは、最適化ループが勾配が小さいパラメータ空間で立ち往生するのを避けるのに役立つ。
- ハードウェア的に効率的なansatzの実験 :ブラックボックスのオラクルとしてノイズの多い量子システムを使用しているため、これらの評価の質はオプティマイザのパフォーマンスに影響を与える可能性があります。 のようなハードウェア効率の良いansatzを使用することで、指数関数的に小さな勾配を生成することを避けることができる。
EfficientSU2のようなハードウェア効率に優れたアサッツを使用することで、指数関数的に小さな勾配が発生するのを避けることができる。 - エラー抑制とエラー軽減の実験 : IBM Quantum プリミティブは
resilience_setting、それぞれoptimization_levelとについてさまざまな値を試すためのシンプルなインターフェースを提供します。 これにより、ノイズの影響を軽減し、最適化プロセスの効率を高めることができます。 - 勾配のないオプティマイザを使った実験 :勾配ベースの最適化アルゴリズムとは異なり、
COBYLAのようなオプティマイザは、パラメータを最適化するために勾配情報に依存しないため、不毛のプラトーの影響を受けにくい。
サマリー
このレッスンでは、最適化ループを定義する方法を学びました:
- 最適化ループのブートストラップ
- ローカル・オプティマイザとグローバル・オプティマイザを使用する際のトレードオフを理解する
- 不毛のプラトーとその回避法を探る
高レベルの変分作業負荷は完了した:
次に、このフレームワークを念頭に置いて、具体的な変分アルゴリズムを探求する。