分数ゲートの入門
使用量の目安: Heron r2 プロセッサで30秒未満(注意: これは目安です。実際の実行時間は異なる場合があります。)
背景
IBM QPU における分数ゲート
分数ゲートは、パラメータ化された量子ゲートであり、任意の角度の回転(特定の範囲内)を直接実行することを可能にします。 これにより、 複数の基底ゲートへの分解が不要になります。 物理量子ビット間のネイティブな相互作用を活用することで、ハードウェア上でより効率的に特定のユニタリ演算を実装できます。
IBM Quantum® Heron QPU は以下の分数ゲートをサポートしています:
- for
- for any real value
これらのゲートは、量子回路の深さと実行時間の両方を大幅に削減できます。 特に と を多用するアプリケーションにおいて有利です。 例えば、ハミルトニアンシミュレーション、量子近似最適化アルゴリズム(QAOA)、量子カーネル法などが挙げられます。 本チュートリアルでは、実践的な例として量子カーネルに焦点を当てます。
制限事項
分数ゲートは現在実験的な機能であり、いくつかの制約があります:
- の角度は の範囲に制限されています。
- 分数ゲートの使用は、動的回路、パウリ・ツイリング、確率的エラーキャンセレーション(PEC)、およびゼロノイズ外挿(ZNE)(確率的エラー増幅(PEA)を使用する場合)ではサポートされていません。
分数ゲートは、標準的なアプローチとは異なるワークフローを必要とします。 本チュートリアルでは、実践的なアプリケーションを通じて分数ゲートの使い方を説明します。
分数ゲートの詳細については、以下を参照してください。
概要
分数ゲートを使用するワークフローは、一般的に Qiskit パターンのワークフローに従います。 主な違いは、すべての RZZ 角度が の制約を満たす必要があることです。 この条件を確保するためのアプローチは2つあります。 本チュートリアルでは、2番目のアプローチに焦点を当て、推奨します。
# Added by doQumentation — installs packages not in the Binder environment
%pip install -q qiskit-basis-constructor
1. RZZ 角度制約を満たすパラメータ値を生成する
すべての RZZ 角度が有効範囲内にあることが確実な場合、標準的な Qiskit パターンのワークフローに従うことができます。 この場合、パラメータ値を PUB の一部として送信するだけです。ワークフローは以下のように進みます。
pm = generate_preset_pass_manager(backend=backend, ...)
t_circuit = pm.run(circuit)
t_observable = observable.apply_layout(t_circuit.layout)
sampler.run([(t_circuit, parameter_values)])
estimator.run([(t_circuit, t_observable, parameter_values)])
有効範囲外の角度を持つ RZZ ゲートを含む PUB を送信しようとすると、以下のようなエラーメッセージが表示されます:
'The instruction rzz is supported only for angles in the range [0, pi/2], but an angle (20.0) outside of this range has been requested; via parameter value(s) γ[0]=10.0, substituted in parameter expression 2.0*γ[0].'
このエラー を回避するには、以下に説明する2番目のアプローチを検討してください。
2. トランスパイル前にパラメータ値を回路に割り当てる
qiskit-ibm-runtime パッケージは、FoldRzzAngle という専用のトランスパイラパスを提供しています。
このパスは、すべての RZZ 角度が RZZ 角度制約に準拠するように量子回路を変換します。
generate_preset_pass_manager または transpile にバックエンドを指定すると、Qiskit は自動的に FoldRzzAngle を量子回路に適用します。
この方法では、トランスパイル前にパラメータ値を量子回路に割り当てる必要があります。
ワークフローは以下のように進みます。
pm = generate_preset_pass_manager(backend=backend, ...)
b_circuit = circuit.assign_parameters(parameter_values)
t_circuit = pm.run(b_circuit)
t_observable = observable.apply_layout(t_circuit.layout)
sampler.run([(t_circuit,)])
estimator.run([(t_circuit, t_observable)])
このワークフローは、パラメータ値を量子回路に割り当て、パラメータが束縛された回路をローカルに保存する必要があるため、最初のアプローチよりも計算コストが高くなることに注意してください。 また、Qiskit には特定のシナリオで RZZ ゲートの変換が失敗する既知の問題があります。回避策については、トラブルシューティングセクションを参照してください。 本チュートリアルでは、量子カーネル法に着想を得た例を通じて、2番目のアプローチで分数ゲートを使用する方法を説明します。 量子カーネルが有用である可能性が高い場面をより深く理解するために、Liu, Arunachalam & Temme (2021) を読むことをお勧めします。
また、量子カーネルトレーニングチュートリアルや、IBM Quantum Learning の量子機械学習コースにおける量子カーネルレッスンも併せてご参照ください。
前提条件
本チュートリアルを始める前に、以下がインストールされていることを確認してください:
- Qiskit SDK v2.0 以降、可視化サポート付き
- Qiskit Runtime v0.37 以降(
pip install qiskit-ibm-runtime) - Qiskit Basis Constructor(
pip install qiskit_basis_constructor)
セットアップ
import matplotlib.pyplot as plt
import numpy as np
from qiskit import QuantumCircuit, generate_preset_pass_manager
from qiskit.circuit import ParameterVector
from qiskit.circuit.library import unitary_overlap
from qiskit_ibm_runtime import QiskitRuntimeService, SamplerV2
分数ゲートの有効化と基底ゲートの確認
分数ゲートを使用するには、use_fractional_gates=True オプションを設定して、分数ゲートをサポートするバックエンドを取得します。
バックエンドが分数ゲートをサポートしている場合、基底ゲートの一覧に rzz と rx が表示されます。
service = QiskitRuntimeService()
backend = service.least_busy(
operational=True, simulator=False, min_num_qubits=133
) # backend should be a heron device or later
backend_name = backend.name
backend_c = service.backend(backend_name) # w/o fractional gates
backend_f = service.backend(
backend_name, use_fractional_gates=True
) # w/ fractional gates
print(f"Backend: {backend_name}")
print(f"No fractional gates: {backend_c.basis_gates}")
print(f"With fractional gates: {backend_f.basis_gates}")
if "rzz" not in backend_f.basis_gates:
print(f"Backend {backend_name} does not support fractional gates")
Backend: ibm_fez
No fractional gates: ['cz', 'id', 'rz', 'sx', 'x']
With fractional gates: ['cz', 'id', 'rx', 'rz', 'rzz', 'sx', 'x']