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

アンザッツと変分形式

すべての変分アルゴリズムの核心にあるのは、状態間の差異を分析するという重要なアイデアです。これらの状態は、パラメータや変数の集合からの、適切に振る舞うマッピング(例えば、連続的、微分可能)を通じて便利に関連付けられています — これが名前の由来です。

まず、パラメータ化された Circuit を手動で構築する方法を探ります。これらの Circuit を使って、変分アルゴリズムが探索するパラメータ化された状態の集合を表す 変分形式 を定義します。次に、この変分形式を参照状態に適用することで アンザッツ を構築します。

また、この探索空間を探索する際の速度と精度のトレードオフについても検討します。

アンザッツの議論の主要なコンポーネント(ヒューリスティックなアンザッツと問題固有のアンザッツを含む)を示す図。

パラメータ化された量子 Circuit

変分アルゴリズムは、有限の kk 個のパラメータ θ=(θ0,,θk1)\vec{\theta} = (\theta^0, \ldots, \theta^{k-1}) に依存する量子状態 ψ(θ)|\psi(\vec{\theta})\rangle の範囲を探索・比較することで動作します。これらの状態は、チューニング可能なパラメータでゲートが定義されたパラメータ化された量子 Circuit を使って準備できます。特定の角度をバインドせずにこのパラメータ化された Circuit を作成することが可能です。

# Added by doQumentation — required packages for this notebook
!pip install -q qiskit rustworkx
from qiskit.circuit import QuantumCircuit, Parameter

theta = Parameter("θ")

qc = QuantumCircuit(3)
qc.rx(theta, 0)
qc.cx(0, 1)
qc.x(2)

qc.draw("mpl")

前のコードセルの出力

from math import pi

angle_list = [pi / 3, pi / 2]
circuits = [qc.assign_parameters({theta: angle}) for angle in angle_list]

for circuit in circuits:
display(circuit.draw("mpl"))

前のコードセルの出力

前のコードセルの出力

変分形式とアンザッツ

参照状態 ρ|\rho\rangle から目標状態 ψ(θ)|\psi(\vec\theta)\rangle へと反復的に最適化するには、変分アルゴリズムが探索するパラメータ化された状態の集合を表す変分形式 UV(θ)U_V(\vec{\theta}) を定義する必要があります。

0URUR0=ρUV(θ)UA(θ)0=UV(θ)UR0=UV(θ)ρ=ψ(θ)\begin{aligned} |0\rangle \xrightarrow{U_R} U_R|0\rangle & = |\rho\rangle \xrightarrow{U_V(\vec{\theta})} U_A(\vec{\theta})|0\rangle \\[1mm] & = U_V(\vec{\theta})U_R|0\rangle \\[1mm] & = U_V(\vec{\theta})|\rho\rangle \\[1mm] & = |\psi(\vec{\theta})\rangle \\[1mm] \end{aligned}

パラメータ化された状態は、いかなるパラメータにも依存しない参照状態 ρ|\rho\rangle と、常にパラメータに依存する変分形式 UV(θ)U_V(\vec{\theta}) の両方に依存することに注意してください。これら2つの部分の組み合わせをアンザッツと呼びます: UA(θ):=UV(θ)URU_A(\vec\theta) := U_V(\vec\theta)U_R

変分アルゴリズムが探索するパラメータ化された状態の集合を表すアンザッツを構築する際、重要な問題に気づきます: 次元数です。nn Qubit システム(すなわちヒルベルト空間)の配置空間には膨大な数の異なる量子状態が存在します。それを完全に探索するには膨大な数のパラメータが必要になります。定量的には、その次元数は D=22nD = 2^{2n} です。さらに悪いことに、探索アルゴリズムやその類似のアルゴリズムの実行時間の複雑さはこの次元数と共に指数的に増大します。この現象は文献では「次元の呪い」としてよく知られています。

この問題に対処するために、最も関連性の高い状態のみが探索されるよう、変分形式にいくつかの合理的な制約を課すことが一般的な手法です。効率的な切り捨てアンザッツを見つけることは活発な研究分野ですが、ここでは2つの一般的な設計を取り上げます。

ヒューリスティックなアンザッツとトレードオフ

特定の問題について次元数を制限するのに役立つ情報がない場合は、22n2^{2n} より少ないパラメータを持つ任意のパラメータ化 Circuit のファミリーを試みることができます。ただし、いくつかのトレードオフを考慮する必要があります。

  • 速度: 探索空間を縮小することで、アルゴリズムをより速く実行できます。
  • 精度: 空間を縮小すると、問題の実際の解が除外されるリスクがあり、最適でない解につながる可能性があります。
  • ノイズ: 深い Circuit はノイズの影響を受けやすいため、アンザッツの接続性、ゲート、およびゲートの忠実度を実験的に検討する必要があります。

品質(または解決可能性)と速度の間には根本的なトレードオフがあります: パラメータが多いほど精確な結果が得られる可能性が高まりますが、アルゴリズムの実行時間が長くなります。

N-local 回路

ヒューリスティックなアンザッツの中で最も広く使われる例の一つが N-local 回路 です。その理由はいくつかあります。

  • 効率的な実装: N-local アンザッツは、少数の物理 Qubit を使用して量子コンピュータ上で効率的に実装できる、シンプルなローカルゲートで構成されます。これにより、量子 Circuit の構築と最適化が容易になります。
  • 重要な相関の捕捉: N-local アンザッツは、少数のゲートでも量子システム内の Qubit 間の重要な相関を捕捉できます。これは、ローカルゲートが隣接する Qubit に作用してそれらの間にエンタングルメントを生成できるためで、複雑な量子システムのシミュレーションにおいて重要です。

これらの Circuit は、回転層とエンタングルメント層が1回以上交互に繰り返されることで構成されます。

  • 各層は、最大で NN サイズのゲートで形成されます。ここで NN は Qubit 数より小さくなければなりません。
  • 回転層では、ゲートが重なり合うように配置されます。RXCRZ などの標準的な回転演算を使用できます。
  • エンタングルメント層では、Toffoli ゲートCX をエンタングルメント戦略と組み合わせて使用できます。
  • 両種類の層はパラメータ化されていてもいなくてもよいですが、少なくとも一方にはパラメータが含まれている必要があります。パラメータが全くない場合、変分の要素がなくなってしまいます!
  • オプションで、Circuit の末尾に追加の回転層を加えることができます。

例として、RX および CRZ ゲートで形成される回転ブロックと、[0,1,2][0,1,2][0,2,3][0,2,3][4,2,1][4,2,1][3,1,0][3,1,0] の Qubit に作用する Toffoli ゲート で形成されるエンタングルメントブロックを持ち、各層を 22 回繰り返す5 Qubit の NLocal Circuit を作成してみましょう。

from qiskit.circuit.library import NLocal, CCXGate, CRZGate, RXGate
from qiskit.circuit import Parameter

theta = Parameter("θ")
ansatz = NLocal(
num_qubits=5,
rotation_blocks=[RXGate(theta), CRZGate(theta)],
entanglement_blocks=CCXGate(),
entanglement=[[0, 1, 2], [0, 2, 3], [4, 2, 1], [3, 1, 0]],
reps=2,
insert_barriers=True,
)
ansatz.decompose().draw("mpl")

前のコードセルの出力

上記の例では、最大のゲートは3つの Qubit に作用する Toffoli ゲートであり、これによってこの Circuit は 33-local となります。最も一般的に使用される NN-local Circuit のタイプは、単一 Qubit 回転ゲートと 22 Qubit エンタングルメントゲートを持つ 22-local Circuit です。

Qiskit の TwoLocal クラスを使って 22-local Circuit を作成しましょう。構文は NLocal と同じですが、いくつかの違いがあります。例えば、RXRZCNOT などのほとんどのゲートは、ゲートをインポートしたり Parameter インスタンスを作成したりせずに文字列として渡すことができます。

from qiskit.circuit.library import TwoLocal

ansatz = TwoLocal(
num_qubits=5,
rotation_blocks=["rx", "rz"],
entanglement_blocks="cx",
entanglement="linear",
reps=2,
insert_barriers=True,
)
ansatz.decompose().draw("mpl")

前のコードセルの出力

この例では線形エンタングルメント分布を使用しており、各 Qubit が次の Qubit とエンタングルされます。他の戦略については、TwoLocal のドキュメント を参照してください。

Efficient SU2

efficient_su2 は、SU(2) にまたがる単一 Qubit 演算と CX エンタングルメントの層で構成されるハードウェア効率の高い Circuit です。これは変分量子アルゴリズムのトライアル波動関数の準備や、機械学習の分類 Circuit として使用できるヒューリスティックなパターンです。

from qiskit.circuit.library import efficient_su2

ansatz = efficient_su2(4, su2_gates=["rx", "y"], entanglement="linear", reps=1)
ansatz.decompose().draw("mpl")

前のコードセルの出力

問題固有のアンザッツ

ヒューリスティックなアンザッツやハードウェア効率の高いアンザッツは、素朴な方法で問題を解くのに役立ちますが、問題固有の知識を使って Circuit の探索空間を特定のタイプに制限することができます。これにより、探索プロセスで精度を失わずに速度を向上させることができます。

最適化

最大カット問題では、異なるグループのノード間のエッジ数を最大化するようにグラフのノードを分割したいと考えます。以下のグラフの望ましい最大カット分割は明らかです: 左の0番目のノードは、カットによって右側の残りのノードから切り離される必要があります。

import rustworkx as rx
from rustworkx.visualization import mpl_draw

n = 4
G = rx.PyGraph()
G.add_nodes_from(range(n))
# The edge syntax is (start, end, weight)
edges = [(0, 1, 1.0), (0, 2, 1.0), (0, 3, 1.0), (1, 2, 1.0), (2, 3, 1.0)]
G.add_edges_from(edges)

mpl_draw(
G, pos=rx.shell_layout(G), with_labels=True, edge_labels=str, node_color="#1192E8"
)

前のコードセルの出力

最大カット問題に QAOA アルゴリズムを利用するには、演算子の最小期待値が2つの異なるグループのノード間のエッジ数の最大値に対応するような形でコストを符号化するパウリハミルトニアンが必要です。

この単純な例では、演算子はエッジで接続されたノードに Z 演算子を持つ項の線形結合です(0番目の Qubit が最も右にあることに注意してください): ZZII+IZZI+ZIIZ+IZIZ+IIZZZZII + IZZI + ZIIZ + IZIZ + IIZZ。演算子が構築されると、QAOA アルゴリズムのアンザッツは Qiskit Circuit ライブラリの QAOAAnsatz Circuit を使って簡単に構築できます。

# Pre-defined ansatz circuit, operator class and visualization tools
from qiskit.circuit.library import QAOAAnsatz
from qiskit.quantum_info import SparsePauliOp

# Problem to Hamiltonian operator
hamiltonian = SparsePauliOp.from_list(
[("ZZII", 1), ("IZZI", 1), ("ZIIZ", 1), ("IZIZ", 1), ("IIZZ", 1)]
)
# QAOA ansatz circuit
ansatz = QAOAAnsatz(hamiltonian, reps=2)
# Draw
ansatz.decompose(reps=3).draw("mpl")

前のコードセルの出力

前の図は、わかりやすさのために基本ゲートでアンザッツを示しています。ただし、reps 引数を変更したり、decompose メソッドなしで Circuit を描画したりすることで、複数のレベルの分解で表現することができます。例えば、以下の表現はデフォルトの reps 値(reps=1)で QAOA の構造を直接示しています。

ansatz.decompose(reps=2).draw("mpl")

前のコードセルの出力

量子機械学習

機械学習では、データを2つ以上のカテゴリに分類することが一般的な応用です。これには、データポイントを古典的な特徴ベクトルから量子ヒルベルト空間へとマッピングする特徴マップへ符号化することが含まれます。古典的にシミュレートすることが困難なパラメータ化された量子 Circuit に基づく量子特徴マップを構築することは、古典的な機械学習アプローチに対する潜在的な優位性を得るための重要なステップであり、現在も活発に研究されている分野です。

zz_feature_map を使ってパラメータ化された Circuit を作成することができます。データポイント (xx) を特徴マップに渡し、別の変分形式を使って重みをパラメータ (θ\theta) として渡すことができます。

from qiskit.circuit.library import zz_feature_map, TwoLocal

data = [0.1, 0.2]

zz_feature_map_reference = zz_feature_map(feature_dimension=2, reps=2)
zz_feature_map_reference = zz_feature_map_reference.assign_parameters(data)

variation_form = TwoLocal(2, ["ry", "rz"], "cz", reps=2)
vqc_ansatz = zz_feature_map_reference.compose(variation_form)
vqc_ansatz.decompose().draw("mpl")

前のコードセルの出力

まとめ

このレッスンでは、変分形式を使って探索空間を定義する方法を学びました。

  • チューニング可能なパラメータでゲートが定義された パラメータ化された 量子 Circuit で状態を準備する方法
  • 速度と精度をトレードオフするアンザッツを構築する方法
  • ヒューリスティックなアンザッツ
  • 問題固有のアンザッツ

高レベルの変分ワークロードは以下のようになります。

2つのユニタリを示す Circuit 図: 1つは参照状態を準備し、もう1つはアンザッツを準備します。

各変分パラメータ θ\vec\theta に対して、異なる量子状態が生成されます。最適なパラメータを見つけるには、アンザッツのパラメータを反復的に更新するための問題固有の コスト関数 を定義する必要があります。