メインコンテンツへスキップ

最適化ループ

このレッスンでは、オプティマイザーを使用してアンザッツのパラメータ化された量子状態を反復的に探索する方法を学びます。

  • 最適化ループのブートストラップ
  • ローカルオプティマイザーとグローバルオプティマイザーのトレードオフの理解
  • バレンプラトーとその回避方法の探索

大まかに言えば、オプティマイザーは探索空間を探索する上で中心的な役割を担います。オプティマイザーはコスト関数の評価を使用して、変分ループ内の次のパラメータセットを選択し、安定した状態に達するまでこのプロセスを繰り返します。この段階で、最適なパラメータ値のセット θ\vec\theta^* が返されます。

最適化における重要な要素の図。バレンプラトー、勾配ありおよび勾配なしオプティマイザー、ブートストラップが含まれています。

ローカルオプティマイザーとグローバルオプティマイザー

各オプティマイザークラスを探索する前に、まず問題をセットアップします。8つの変分パラメータを含むCircuitから始めます。

# Added by doQumentation — required packages for this notebook
!pip install -q numpy qiskit 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([("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")

前のコードセルの出力

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 cost
from qiskit.primitives import StatevectorEstimator

estimator = StatevectorEstimator()

ローカルオプティマイザー

ローカルオプティマイザーは、初期点 C(θ0)C(\vec{\theta_0}) からコスト関数を最小化する点を探索し、連続する反復において現在評価している領域で観察されるものに基づいて別の点に移動します。これにより、アルゴリズムの収束は通常速くなりますが、初期点に大きく依存する場合があります。ローカルオプティマイザーは評価している領域の外を見ることができず、局所的最小値に対して特に脆弱であり、局所的最小値を見つけると収束を報告し、より有利な評価を持つ他の状態を無視してしまいます。

# SciPy minimizer routine
from scipy.optimize import minimize

x0 = np.ones(8)

result = minimize(
cost_func_vqe, x0, args=(ansatz, observable, estimator), method="SLSQP"
)

result
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

グローバルオプティマイザー

グローバルオプティマイザーは、ドメインの複数の領域(つまり非局所的)にわたってコスト関数を最小化する点を探索し、オプティマイザーによって決定されたパラメータベクトルのセット Θi:=θi,jjJopti\Theta_i := \\{ {\vec\theta_{i,j} | j \in \mathcal{J}_\text{opt}^i} \\} に対して反復的(つまり反復 ii において)に評価します。これにより、局所的最小値の影響を受けにくく、初期化から独立していますが、提案された解への収束は大幅に遅くなります。

最適化のブートストラップ

ブートストラップ(事前の最適化に基づいてパラメータ θ\vec\theta の初期値を設定すること)は、オプティマイザーがより速く解に収束するのに役立ちます。これを初期点 θ0\vec\theta_0 と呼び、ψ(θ0)=UV(θ0)ρ|\psi(\vec\theta_0)\rangle = U_V(\vec\theta_0)|\rho\rangle を初期状態と呼びます。この初期状態は参照状態 ρ|\rho\rangle とは異なります。前者は最適化ループ中に設定される初期パラメータに焦点を当て、後者は既知の「参照」解を使用することに焦点を当てています。UV(θ0)IU_V(\vec\theta_0) \equiv I(つまり恒等演算)の場合、両者は一致することがあります。

ローカルオプティマイザーが最適でない局所的最小値に収束した場合、グローバルに最適化をブートストラップし、ローカルに収束を精緻化することを試みることができます。これには2つの変分ワークロードを設定する必要がありますが、ローカルオプティマイザー単独よりも最適な解を見つけることができます。

勾配ありオプティマイザーと勾配なしオプティマイザー

勾配あり

コスト関数 C(θ)C(\vec\theta) について、初期点から関数の勾配 C(θ)\vec{\nabla} C(\vec\theta) にアクセスできる場合、関数を最小化する最も簡単な方法は、関数の最急降下方向にパラメータを更新することです。つまり、パラメータを θn+1=θnηC(θ)\vec\theta_{n+1} = \vec\theta_n - \eta \vec{\nabla} C(\vec\theta) として更新します。ここで η\eta は学習率であり、更新のサイズを制御する小さな正の ハイパーパラメータ です。コスト関数の 局所的最小値 C(θ)C({\vec\theta^*}) に収束するまでこれを繰り返します。

このコスト関数とオプティマイザーを使用して最適なパラメータを計算できます。

# SciPy minimizer routine
from scipy.optimize import minimize

x0 = np.ones(8)

result = minimize(
cost_func_vqe, x0, args=(ansatz, observable, estimator), method="BFGS"
)

result
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

このタイプの最適化の主な欠点は、収束速度が非常に遅くなる可能性があることと、最適解を達成する保証がないことです。

f(theta) とシータのグラフ。複数の点が、勾配降下アルゴリズムが曲線の最小値を見つける異なる状態を示しています。

勾配なし

勾配なし最適化アルゴリズムは勾配情報を必要とせず、勾配の計算が困難、コストが高い、またはノイズが多すぎる状況で有用です。また、勾配ありの手法が局所的最適解に収束する傾向があるのに対し、グローバル最適解を見つけるうえでより堅牢である傾向があります。勾配なしオプティマイザーがバレンプラトーを回避するのに役立つ事例をいくつか探索します。ただし、勾配なし手法は、特に高次元の探索空間を持つ問題では、より多くの計算リソースを必要とします。

以下は 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"
)

result
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つが、グローバルな最小値ではなく、景観の局所的最小値に行き着いていることがわかります。

多くの峰と谷を持つ複雑な曲面の多様体。

使用される最適化手法の種類に関わらず、コスト景観が比較的平坦な場合、手法が適切な探索方向を決定することが困難になる可能性があります。このシナリオは バレンプラトー と呼ばれ、コスト景観が徐々に平坦になっていきます(そのため、最小値への方向を決定することがより困難になります)。広範なパラメータ化された量子Circuitにおいて、合理的な方向に沿った勾配が一定の精度でゼロにならない確率は、Qubitの数が増えるにつれて指数関数的に減少します。

勾配が最小値を見つけるのに役立つ理由と、プラトーが取り組みを妨げる理由を説明するために、地理的なプラトーと山の傾斜を比較した図。

この分野はまだ活発に研究されていますが、最適化性能を向上させるためのいくつかの推奨事項があります。

  • ブートストラップは、最適化ループが勾配が小さいパラメータ空間で行き詰まるのを避けるのに役立ちます。
  • ハードウェア効率の良いアンザッツの実験: ノイズの多い量子システムをブラックボックスオラクルとして使用しているため、それらの評価の品質がオプティマイザーの性能に影響を与える可能性があります。EfficientSU2 などのハードウェア効率の良いアンザッツを使用することで、指数関数的に小さな勾配の発生を回避できる場合があります。
  • エラー抑制とエラー緩和の実験: Qiskit Runtime Primitiveは、それぞれ optimization_level および resilience_setting のさまざまな値を試すシンプルなインターフェースを提供します。これにより、ノイズの影響を低減し、最適化プロセスをより効率的にすることができます。
  • 勾配なしオプティマイザーの実験: 勾配ありの最適化アルゴリズムとは異なり、COBYLA などのオプティマイザーはパラメータを最適化するために勾配情報に依存しないため、バレンプラトーの影響を受けにくいです。

まとめ

このレッスンでは、最適化ループを定義する方法を学びました。

  • 最適化ループのブートストラップ
  • ローカルオプティマイザーとグローバルオプティマイザーのトレードオフの理解
  • バレンプラトーとその回避方法の探索

高レベルの変分ワークロードが完成しました。

参照状態を準備するユニタリーと、変分パラメータを使用して状態を変化させる第2ユニタリーの両方を持つ量子Circuit。

次に、このフレームワークを念頭に置いて、具体的な変分アルゴリズムを探索します。