Skip to main content
IBM Quantum Platform

アプローチと変分形式

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

まず、パラメータ化された回路を手作業で構築する方法を探る。 これらの回路を使って、変分アルゴリズムが探索するパラメータ化された状態のコレクションを表す パラメータ化されたゲートの層が一定回数繰り返され、ゲートのパラメータはコスト関数を最小化するためにアルゴリズム中に最適化される。。 次に、この変分形式を基準状態に適用して、 参照演算子と変分形式の組み合わせで、探索している探索空間を記述する。

また、この探索空間を探索する際に、スピードと正確さをどのようにトレードオフするかについても探求する。

ヒューリスティック・アンサゼッツと問題特異的アンサゼッツを含む、アンサゼッツ議論の主要な構成要素を示す図。

パラメータ化量子回路

変分アルゴリズムは、 ψ(θ)|\psi(\vec{\theta})\rangle の量子状態を探索し、比較することで動作する。 の量子状態は、 kk の有限パラメータセット θ=(θ0,,θk1)\vec{\theta} = (\theta^0, \ldots, \theta^{k-1}) に依存する。これらの状態は、パラメトライズされた量子回路を用いて準備することができ、ゲートは調整可能なパラメータで定義される。 このパラメトリックな回路は、特定の角度を縛ることなく作ることができる:

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")

Output:

Output of the previous code cell
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"))

Output:

Output of the previous code cell Output of the previous code cell

変分形式とアンザッツ

参照状態 ρ|\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} より少ないパラメータで、パラメータ化された回路の任意のファミリーを試すことができます。 しかし、考慮すべきトレードオフもある:

  • スピード :探索空間を縮小することで、アルゴリズムをより高速に実行できる。
  • 正確さ :スペースを小さくすると、問題の実際の解が除外され、最適な解が得られなくなる恐れがある。
  • ノイズ :より深い回路はノイズの影響を受けるので、アンサッツの接続性、ゲート、ゲートの忠実度を実験する必要がある。

パラメータが多ければ多いほど、正確な結果が得られる可能性は高くなるが、アルゴリズムの実行には時間がかかる。

N-局所回路

ヒューリスティック・アンセッツェの最も広く使われている例のひとつが Nローカル回路である:

  • 効率的な実装 :N-localアナザッツは、通常、少数の物理量子ビットを用いて量子コンピュータ上で効率的に実装できる単純なローカルゲートで構成される。 これにより、量子回路の構築と最適化が容易になる。
  • 重要な相関を捉える N-localアナザッツは、ゲート数が少なくても、量子系における量子ビット間の重要な相関を捉えることができる。 これは、ローカルゲートが隣接する量子ビットに作用し、量子ビット間にエンタングルメントを生じさせることができるためで、複雑な量子系をシミュレートする上で重要になる。

これらの回路は、以下のように交互に1回以上繰り返される回転層とエンタングルメント層で構成されている:

  • 各層は、最大でも NN のサイズのゲートで形成される。 NN は量子ビット数より小さくなければならない。
  • 回転レイヤーの場合、ゲートは互いに積み重ねられる。 のような標準的な回転操作を使うことができる。 RX または CRZ.
  • エンタングルメント層には、 Toffoli ゲートCX のようなゲートとエンタングルメント戦略を使うことができる。
  • どちらのタイプのレイヤーもパラメータ化することもしないこともできるが、少なくともどちらか一方はパラメータを含む必要がある。 そうでなければ、少なくとも1つのパラメータがなければ、バリエーションは生まれない!
  • オプションで、回路の最後に回転層を追加することもできる。

例えば、5量子ビットの回路を作ってみよう。 NLocalRXCRZ ゲート、量子ビットに作用する Toffoli ゲートで形成されるエンタングルメント・ブロック [0,1,2][0,1,2][0,2,3][0,2,3][4,2,1][4,2,1][3,1,0][3,1,0]22 の各層の繰り返し。

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")

Output:

Output of the previous code cell

上記の例では、最大のゲートはトッフォリ・ゲートで、これは3つの量子ビットに作用し、回路を 33 -localにする。 NN -ローカル回路の最も一般的なタイプは、シングルqubitローテーションゲートと 22 -qubitエンタングルメントゲートを持つ 22 -ローカル回路である。

Qiskitのクラスを使って 22 -local回路を作ってみよう。 TwoLocal クラスを使ってみましょう。 構文は 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")

Output:

Output of the previous code cell

この場合、それぞれの量子ビットが次の量子ビットとエンタングルされる線形エンタングルメント分布を用いた。 その他の戦略については、 TwoLocal のドキュメントを参照のこと。

効率的な SU2

efficient_su2 は、SU(2)と CX エンタングルメントにまたがる1量子ビット演算のレイヤーで構成されるハードウェア効率の高い回路である。 これは、変分量子アルゴリズムのための試行波動関数の準備や、機械学習のための分類回路として使用できる発見的パターンである。

from qiskit.circuit.library import efficient_su2

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

Output:

Output of the previous code cell

問題特異的なアプローチ

発見的でハードウェア的に効率的な解法は、素朴な方法で問題を解決するのに役立つが、問題固有の知識を利用することで、回路の探索空間を特定のタイプに限定することができる。 これにより、検索プロセスの精度を落とすことなく、スピードを上げることができる。

最適化

max-cut問題では、異なるグループのノード間の辺の数が最大になるようにグラフのノードを分割したい。 左の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"
)

Output:

Output of the previous code cell

QAOAアルゴリズムをマックスカット問題に利用するためには、オペレータの最小期待値が2つの異なるグループのノード間の最大エッジ数に対応するような方法でコストをエンコードするパウリ・ハミルトニアンが必要である。

この単純な例では、演算子はエッジで結ばれたノード上のZ演算子を持つ項の線形結合である(0番目の量子ビットが最も右にあることを思い出してほしい): ZZII+IZZI+ZIIZ+IZIZ+IIZZZZII + IZZI + ZIIZ + IZIZ + IIZZ.いったん演算子が構築されれば、QAOAアルゴリズムのansatzは、Qiskit回路ライブラリの QAOAAnsatz 回路を使うことで簡単に構築できます。

# 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")

Output:

Output of the previous code cell

前の画像は、わかりやすくするために、基本的なゲートのansatzを示している。 しかし、 reps の引数を変えるか、decompose メソッドを使わずに回路を描くことで、複数レベルの分解で表現することができる。 例えば、以下の表現は、デフォルトのレップス値( reps=1 )を持つQAOA構造を直接示している。

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

Output:

Output of the previous code cell

量子 Machine Learning

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

zz_feature_map を使ってパラメータ化された回路を作ることができる。 データ点を特徴マップに渡す ( 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")

Output:

Output of the previous code cell

サマリー

このレッスンでは、変分形式で探索空間を定義する方法を学んだ:

  • パラメトライズされた量子回路で状態を準備。ゲートは調整可能なパラメータで定義される
  • スピードと正確さをトレードオフにする解答の組み立て方
  • ヒューリスティック分析
  • 問題特有の解決策

高レベルの変分作業負荷は次のようになる:

参照状態を準備するユニタリーとアンサッツを準備するユニタリーの2つを示す回路図。

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

このページは役に立ちましたか?
バグや誤字の報告、またはコンテンツの要求はGitHubで行ってください。