Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
quantum-kittens
GitHub Repository: quantum-kittens/platypus
Path: blob/main/translations/ja/quantum-hardware/randomized-benchmarking.ipynb
3858 views
Kernel: Python 3

ランダマイズド・ベンチマーキング

はじめに

量子情報プロセッサーを構築する上での主な課題の1つは、プロセストモグラフィーを介して発生する量子系へのノイズの完全な特徴評価はスケールできないことです。さらに、プロセストモグラフィーは、回転前および回転後のゲートノイズと測定ノイズ(SPAMエラー)に敏感です。ゲートセットトモグラフィーはこれらのエラーを考慮できますが、プロセストモグラフィーよりも更にスケールできません。完全なノイズの特徴評価ができると、適切なエラー訂正スキームの決定や、信頼できる量子情報伝送の可能性に繋がるので有用です。

大規模な系では完全なプロセストモグラフィーは不可能であるため、量子系に影響を与えるノイズを部分的に特徴づけるスケーラブルな手法への関心が高まっています。ランダム化技術を利用した単一のパラメータでクリフォードゲートのフルセットをベンチマークするための、(システムを構成する量子ビットの数nnで)スケーラブルで強固なアルゴリズムが[1]で発表されました。量子ゲートのベンチマークにランダム化手法を用いる概念は、一般に ランダマイズド・ベンチマーキング(RB) と呼ばれます。

ランダマイズド・ベンチマーキングのプロトコル

まず、デモのために関連するqiskitクラスをインポートします。

#Import general libraries (needed for functions) import numpy as np import matplotlib.pyplot as plt from IPython import display #Import the RB Functions import qiskit.ignis.verification.randomized_benchmarking as rb #Import Qiskit classes import qiskit from qiskit.providers.aer.noise import NoiseModel from qiskit.providers.aer.noise.errors.standard_errors import depolarizing_error, thermal_relaxation_error

RBプロトコル([1,2]参照)は、以下のステップで構成されています。

ステップ1:RB配列の生成

RB配列は、nn量子ビット上のクリフォード群から一様に選ばれたランダムなクリフォード要素で構成されています。 これには量子ビットを初期状態に戻す反転要素を含みます。

より正確には、それぞれの長さ mm に対して、KmK_m のRB配列を選びます。 このような配列は、それぞれ nn 量子ビット上のクリフォード群から一様に選ばれた mm のランダム要素 CijC_{i_j} を含み、m+1m+1 の要素は次のように定義されます。Cim+1=(Ci1...Cim)1C_{i_{m+1}} = (C_{i_1}\cdot ... \cdot C_{i_m})^{-1}. これはGottesmann-Knillの定理で効率よく求めることができます。

例えば、2量子ビットのクリフォード回路の配列を以下に複数示します。

#Generate RB circuits (2Q RB) #number of qubits nQ=2 rb_opts = {} #Number of Cliffords in the sequence rb_opts['length_vector'] = [1, 10, 20, 50, 75, 100, 125, 150, 175, 200] #Number of seeds (random sequences) rb_opts['nseeds'] = 5 #Default pattern rb_opts['rb_pattern'] = [[0, 1]] rb_circs, xdata = rb.randomized_benchmarking_seq(**rb_opts)

一例として、1つ目のRB配列に対応する回路を表示します。

rb_circs[0][0].draw()
Image in a Jupyter notebook

各RB回路を表すユニタリー行列が(グローバル位相を含めて)恒等変換であることを確認できます。 これをAerユニタリーシミュレータを用いて再現します。

# Create a new circuit without the measurement qregs = rb_circs[0][-1].qregs cregs = rb_circs[0][-1].cregs qc = qiskit.QuantumCircuit(*qregs, *cregs) for i in rb_circs[0][-1][0:-nQ]: qc.data.append(i)
# The Unitary is an identity (with a global phase) backend = qiskit.Aer.get_backend('unitary_simulator') basis_gates = ['u1','u2','u3','cx'] # use U,CX for now job = qiskit.execute(qc, backend=backend, basis_gates=basis_gates) from qiskit_textbook.tools import array_to_latex array_to_latex(np.around(job.result().get_unitary(),3), pretext="\\text{Unitary} = ")

Unitary=[1000010000100001]\displaystyle \text{Unitary} = \begin{bmatrix} 1 & 0 & 0 & 0 \\ 0 & 1 & 0 & 0 \\ 0 & 0 & 1 & 0 \\ 0 & 0 & 0 & 1 \\ \end{bmatrix} LaTeX\LaTeX

ステップ2: RB配列を(ノイズを入れて)実行

RB配列は、Qiskit Aer Simulator(ノイズモデル版)かIBMQプロバイダを用いて実行し、結果のリストを得ることができます。

前提として、各演算CijC_{i_j} は、 Λij,j\Lambda_{i_j,j} で表されるエラーを持つことができ、各配列は以下の演算によってモデル化することができます。

Sim=j=1m+1(Λij,jCij)\textit{S}*{i_m} = \bigcirc*{j=1}^{m+1} (\Lambda_{i_j,j} \circ C_{i_j})

ここで im=(i1,...,im){i_m} = (i_1,...,i_m) で、 im+1i_{m+1}im{i_m} によって一意に決定されます。

# Run on a noisy simulator noise_model = NoiseModel() # Depolarizing error on the gates u2, u3 and cx (assuming the u1 is virtual-Z gate and no error) p1Q = 0.002 p2Q = 0.01 noise_model.add_all_qubit_quantum_error(depolarizing_error(p1Q, 1), 'u2') noise_model.add_all_qubit_quantum_error(depolarizing_error(2 * p1Q, 1), 'u3') noise_model.add_all_qubit_quantum_error(depolarizing_error(p2Q, 2), 'cx') backend = qiskit.Aer.get_backend('qasm_simulator')

ステップ3: 生存確率の統計を取る

各々の KmK_m 配列で生存確率 Tr[EψSim(ρψ)]Tr[E_\psi \textit{S}*{\textbf{i}*\textbf{m}}(\rho_\psi)] を測定します。 ここで、ρψ\rho_\psi は状態生成時のエラーを考慮した初期状態であり、 EψE_\psi は 測定エラーを考慮したPOVM要素です。 理想的(ノイズフリー)な場合には ρψ=Eψ=ψψ\rho_\psi = E_\psi = | \psi {\rangle} {\langle} \psi | となります。

実際には、正確な初期状態(全量子ビットが基底状態 00...0 {|} 00...0 {\rangle} にある状態)へ戻る確率、もしくはいずれか1つの量子ビットが基底状態に戻る確率を測定することができます。相関測定ができない場合は、独立して量子ビットを測定した方が便利です。両方の測定は、twirlの特性に応じて、同じ減衰パラメータでフィットされます。

Step 4: 配列のフィデリティー平均を求める

KmK_m の配列のランダムな再現度を平均して,配列の フィデリティー 平均を求めます。

Fseq(m,ψ)=Tr[EψSKm(ρψ)]F_{seq}(m,|\psi{\rangle}) = Tr[E_\psi \textit{S}*{K_m}(\rho*\psi)]

ここで

SKm=1KmimSim\textit{S}*{K_m} = \frac{1}{K_m} \sum*{\textbf{i}*\textbf{m}} \textit{S}*{\textbf{i}_\textbf{m}}

は配列の平均をとる演算です。

ステップ 5: 結果のフィッティング

様々な mm でステップ1から4を繰り返して、配列のフィデリティー平均の結果をモデルにフィットさせます。

Fseq(0)(m,ψ)=A0αm+B0\textit{F}_{seq}^{(0)} \big(m,{|}\psi {\rangle} \big) = A_0 \alpha^m +B_0

ここで、 A0A_0B0B_0 は、初期状態生成時のエラーと測定エラー、および 最終ゲートのエラーのエッジ効果を取り込みます。

α\alpha は、平均エラー率 rr を決定します。これは、 クリフォード単位エラー(EPC) とも呼ばれ、次の関係が成り立ちます。

r=1α1α2n=2n12n(1α)r = 1-\alpha-\frac{1-\alpha}{2^n} = \frac{2^n-1}{2^n}(1-\alpha)

(ここで、n=nQn=nQ は量子ビット数)。

一例として、RB配列のそれぞれについて配列のフィデリティー平均を計算し、その結果を指数関数曲線に当てはめ、パラメータ α\alpha とEPCを計算します。

# Create the RB fitter backend = qiskit.Aer.get_backend('qasm_simulator') basis_gates = ['u1','u2','u3','cx'] shots = 200 transpiled_circs_list = [] rb_fit = rb.RBFitter(None, xdata, rb_opts['rb_pattern']) for rb_seed, rb_circ_seed in enumerate(rb_circs): print('Compiling seed %d'%rb_seed) new_rb_circ_seed = qiskit.compiler.transpile(rb_circ_seed, basis_gates=basis_gates) transpiled_circs_list.append(new_rb_circ_seed) print('Simulating seed %d'%rb_seed) job = qiskit.execute(new_rb_circ_seed, backend, shots=shots, noise_model=noise_model, backend_options={'max_parallel_experiments': 0}) # Add data to the fitter rb_fit.add_data(job.result()) print('After seed %d, alpha: %f, EPC: %f'%(rb_seed,rb_fit.fit[0]['params'][1], rb_fit.fit[0]['epc']))

追加ステップ: 結果のプロット

plt.figure(figsize=(8, 6)) ax = plt.subplot(1, 1, 1) # Plot the essence by calling plot_rb_data rb_fit.plot_rb_data(0, ax=ax, add_label=True, show_plt=False) # Add title and label ax.set_title('%d Qubit RB'%(nQ), fontsize=18) plt.show()
Image in a Jupyter notebook

RBの直観的理解

脱分極した量子チャンネルはパラメータ α\alpha を持っており、次のように動作します。確率 α\alpha で状態は以前と変わらず、確率 1α1-\alpha で状態は完全に混合状態になります。すなわち、

ρf=αρi+1α2nI\rho_f = \alpha \rho_i + \frac{1-\alpha}{2^n} * \mathbf{I}

クリフォードゲートとは限らず、 mm ゲートの配列があるとします。ここでゲートのエラーチャンネルはパラメータ α\alpha を持つ脱分極チャンネルです( α\alpha は全てのゲートで共通)。このとき、確率 αm\alpha^m で状態は最後の配列で正しく、確率 1αm1-\alpha^m で完全な混合状態になります。そのため、

ρfm=αmρi+1αm2nI\rho_f^m = \alpha^m \rho_i + \frac{1-\alpha^m}{2^n} * \mathbf{I}

今、我々は基底状態から始めることに加え以下を仮定します。 配列全体として恒等変換になるとします。 配列の最後の状態を標準基底で測定するとします。 このとき、配列の最後での成功確率は次のように求まります。

αm+1αm2n=2n12nαm+12n=A0αm+B0\alpha^m + \frac{1-\alpha^m}{2^n} = \frac{2^n-1}{2^n}\alpha^m + \frac{1}{2^n} = A_0\alpha^m + B_0

成功確率、言い換えるとフィデリティーは、 α\alpha を底として配列の長さに応じ指数関数的に減衰します。

直前の主張は、チャンネルが脱分極チャネル以外の場合には必ずしも正しいと言えません。しかし、ゲートが一様にランダム化されたクリフォードゲートである場合、チャネルから計算することができるいくつかのパラメータを用いると、各ゲートのノイズは脱分極チャネルであるかのように平均的に振る舞い、フィデリティーの指数関数的な減衰を得られるということが分かります。

形式的には、量子チャネル Λˉ\bar \Lambda の有限群 GG (クリフォード群など)の平均をとることは、twirlとも呼ばれます。

WG(Λˉ)1GuGUΛˉUW_G(\bar \Lambda) \frac{1}{|G|} \sum_{u \in G} U^{\dagger} \circ \bar \Lambda \circ U

ユニタリー群上をtwirlすると、クリフォード群と全く同じ結果が得られます。クリフォード群は、ユニタリー群の 2-design です。

同時ランダマイズド・ベンチマーキング

RBは、2つの方法で多量子ビット系のフィデリティー計算に対応できるように設計されています。第一に、 nn-量子ビット空間全体でのRBは、 nn 量子ビットクリフォード群から配列を構築することで実行できます。第二に、nn 量子ビット空間 は ni {n_i} 量子ビットの集合と細分化することができ、 nin_i量子ビットRBは各部分集合で同時に実行可能です[4]。 どちらの方法も、 nn 量子ビット空間におけるフィデリティーの指標を与えます。

例えば、他の量子ビットが使われていなくても、CNOTゲートを定義する2量子ビットの部分集合に対して2Q RBを実行するのが一般的です。[4]で説明したように、このRBデータは、他の量子部分空間をtwirlしていないため、必ずしも指数関数的に減衰するとは限りません。すべての量子ビットが活性であるので、一定レベルのクロストークエラーも測定する同時RBによって部分空間はより厳密に特徴づけられます。

同時RBの例(1量子RBと2量子RB)は以下にあります。: https://github.com/Qiskit/qiskit-tutorials/blob/master/tutorials/noise/4_randomized_benchmarking.ipynb

ゲートフィデリティーの予測

使用されているゲート(ゲートセット)のエラーがわかれば、RB実験を行わなくてもEPCを予測することができます。この計算は、RB実験に続いてフィッティングを行うと正しいEPC値が得られることを確認するものです。まず、クリフォードあたりのゲートの数を数える必要があります。

まず、2量子ビットのクリフォードゲートエラー関数calculate_2q_epc が、2量子クリフォードあたりのエラーを与えます。この関数は、使用されているゲートのエラーが脱分極していることを前提としています。そしてこの関数は[5]の補足部分で導出されています。

# count the number of single and 2Q gates in the 2Q Cliffords qubits = rb_opts['rb_pattern'][0] gate_per_cliff = rb.rb_utils.gates_per_clifford( transpiled_circuits_list=transpiled_circs_list, clifford_lengths=xdata[0], basis=basis_gates, qubits=qubits) for basis_gate in basis_gates: print("Number of %s gates per Clifford: %f"%( basis_gate, np.mean([gate_per_cliff[qubit][basis_gate] for qubit in qubits])))
Number of u1 gates per Clifford: 0.120087 Number of u2 gates per Clifford: 1.656878 Number of u3 gates per Clifford: 0.158406 Number of cx gates per Clifford: 1.464847
# convert from depolarizing error to epg (1Q) epg_q0 = {'u1': 0, 'u2': p1Q/2, 'u3': 2 * p1Q/2} epg_q1 = {'u1': 0, 'u2': p1Q/2, 'u3': 2 * p1Q/2} # convert from depolarizing error to epg (2Q) epg_q01 = 3/4 * p2Q # calculate the predicted epc from underlying gate errors pred_epc = rb.rb_utils.calculate_2q_epc( gate_per_cliff=gate_per_cliff, epg_2q=epg_q01, qubit_pair=qubits, list_epgs_1q=[epg_q0, epg_q1]) print("Predicted 2Q Error per Clifford: %e (qasm simulator result: %e)" % (pred_epc, rb_fit.fit[0]['epc']))
Predicted 2Q Error per Clifford: 1.561771e-02 (qasm simulator result: 1.673676e-02)

一方、実験で得られたEPCから、使われたゲート(ゲートセット)のエラーを計算することができる。RB配列に含まれる各単一量子ビットゲートのエラーがわかっていることから、2量子ビットRB実験のEPCから2量子ビットゲートエラーを予測することができます。

2量子ビットゲートエラー関数 calculate_2q_epg gは、2量子ビットゲートあたりのエラーの推定値を与えます。ここでは、脱分極エラーモデルを用いて1量子ビットのエラーを用意します。エラーモデルが不明な場合、それらのゲートのEPG(例えば[u1, u2, u3] )はユーティリティ関数 calculate_1q_epg を用いて、別の1量子RB実験で推定することができます。

# use 2Q EPC from qasm simulator result and 1Q EPGs from depolarizing error model pred_epg = rb.rb_utils.calculate_2q_epg( gate_per_cliff=gate_per_cliff, epc_2q=rb_fit.fit[0]['epc'], qubit_pair=qubits, list_epgs_1q=[epg_q0, epg_q1]) print("Predicted 2Q Error per gate: %e (gate error model: %e)" % (pred_epg, epg_q01))
Predicted 2Q Error per gate: 8.251320e-03 (gate error model: 7.500000e-03)

参考文献

  1. Easwar Magesan, J. M. Gambetta, and Joseph Emerson, Robust randomized benchmarking of quantum processes, https://arxiv.org/pdf/1009.3639

  2. Easwar Magesan, Jay M. Gambetta, and Joseph Emerson, Characterizing Quantum Gates via Randomized Benchmarking, https://arxiv.org/pdf/1109.6887

  3. A. D. C'orcoles, Jay M. Gambetta, Jerry M. Chow, John A. Smolin, Matthew Ware, J. D. Strand, B. L. T. Plourde, and M. Steffen, Process verification of two-qubit quantum gates by randomized benchmarking, https://arxiv.org/pdf/1210.7011

  4. Jay M. Gambetta, A. D. C´orcoles, S. T. Merkel, B. R. Johnson, John A. Smolin, Jerry M. Chow, Colm A. Ryan, Chad Rigetti, S. Poletto, Thomas A. Ohki, Mark B. Ketchen, and M. Steffen, Characterization of addressability by simultaneous randomized benchmarking, https://arxiv.org/pdf/1204.6308

  5. David C. McKay, Sarah Sheldon, John A. Smolin, Jerry M. Chow, and Jay M. Gambetta, Three Qubit Randomized Benchmarking, https://arxiv.org/pdf/1712.06550

import qiskit qiskit.__qiskit_version__