Japanese
言語
English
Japanese
German
Korean
Portuguese, Brazilian
French
Shortcuts

注釈

このページは tutorials/simulators/5_noise_transformation.ipynb から生成されました。

IBM Quantum lab でインタラクティブに実行します。

ノイズ変換

はじめに

このノートブックは、量子ノイズチャネルを、他のより適切なノイズチャネルに変換するために Qiskit Aer ユーティリティ関数 approximate_quantum_errorapproximate_noise_model を使用する方法を示します。

私たちのガイド例はCliffordシミュレーションです。 Cliffordシミュレーターは、制限された非普遍的なゲート (Cliffordゲート) からのみゲートを含む量子計算を効率的にシミュレートすることができます。 すべての量子ノイズをシミュレーションに追加できるわけではありません。 そこで、Cliffordシミュレーターでシミュレーションできる「近い」ノイズチャネルを見つけることを目指しています。

まず、Aer プロバイダーユーティリティから変換関数をインポートします。

[1]:
from qiskit.providers.aer.utils import approximate_quantum_error
from qiskit.providers.aer.utils import approximate_noise_model

“approximate” という名前は、これらの関数が与えられた関数に最も近い (Hilbert-Schmidtメトリックで) エラーを生成することを示唆しています。

Qiskitで定義された、いくつかの標準エラーチャネルを使用した近似値を示します。

[2]:
import numpy as np

# Import Aer QuantumError functions that will be used
from qiskit.providers.aer.noise import amplitude_damping_error
from qiskit.providers.aer.noise import reset_error
from qiskit.providers.aer.noise import pauli_error

概要

1量子ビットの量子チャネルは関数 \(\mathcal{C}:\mathbb{C}^{2\times2}\to\mathbb{C}^{2\times2}\) 密度演算子を密度演算子にマッピングします (像が密度演算子 \(\mathcal{C}\) であるためには、完全正値でトレース保存である必要があります。 CPTP).

量子チャネル \(\mathcal{E}_{1},\dots,\mathcal{E}_{r}\) と、 \(0\le p_i \le 1\)\(p_1+\dots +p_r = 1\) である確率 \(p_1, p_2, \dots, p_r\) に対して、\(\mathcal{C}_\mathcal{E}(\rho)\) がチャネル \(\mathcal{E}_i\) を確率 \(p_i\) で選択し状態 \(\rho\) に適用するのと同じ効果をもつような新しい量子チャネル \(\mathcal{C}_\mathcal{E}\) を構成することができます。

ノイズ変換関数は次の最適化問題を解決します: チャネル \(\mathcal{C}\) (“ゴール”) とチャネル \(\mathcal{E}_{1}, dots,\mathcal{E}_{r}\) のリストが与えられている時、 \(p_1, p_2, \dots, p_r\) の確率を発見し、距離メトリック \(D\) に従って \(D(\mathcal{C}, \mathcal{C}_\mathcal{E})\) を最小化します (ヒルベルト-シュミットメトリックが現在使用されています) 。

近似が Honest であること、つまりおおよそのエラーチャネルが実際のエラーチャネルの「上限」として機能するように、追加の honesty 制約を加えます

\[\text{F}(I,\mathcal{C})\ge F(I,\mathcal{C}_\mathcal{E})\]

\(\text{F}\) が忠実度の尺度で、 \(I\) がアイデンティティチャネルです。

例: リセットノイズを用いた振幅減衰ノイズの近似

振幅減衰 ノイズは \(0\le \gamma \le 1\) で記述され、Kraus演算子によって与えられます。

\[\begin{split}\left(\begin{array}{cc} 1 & 0\\ 0 & \sqrt{1-\gamma} \end{array}\right),\left(\begin{array}{cc} 0 & \sqrt{\gamma}\\ 0 & 0 \end{array}\right)\end{split}\]

リセット エラーは、 \(0\le p, q\le 1\) によって記述されています。これは \(p+q\le 1\) と Kraus 演算子によって与えられます。

\[\begin{split}\left(\begin{array}{cc} \sqrt{p} & 0\\ 0 & 0 \end{array}\right),\left(\begin{array}{cc} 0 & \sqrt{p}\\ 0 & 0 \end{array}\right),\left(\begin{array}{cc} 0 & 0\\ \sqrt{q} & 0 \end{array}\right),\left(\begin{array}{cc} 0 & 0\\ 0 & \sqrt{q} \end{array}\right)\end{split}\]

これは影響を受けた量子ビットの量子状態を確率 \(p\)\(\left|0\right\rangle\) に、確率 \(q\)\(\left|1\right\rangle\) に、確率 \(1-(p+q)\) で何もしないという「リセット」だと思うことができます。

\(\gamma\) 振幅減衰チャネルを近似する最良の値 \(p,q\) を解析的に決めるのはそんなに難しくはありません。 詳細は こちら を見てください。最良の近似値は以下の通りです。

\[p=\frac{1}{2}\left(1+\gamma-\sqrt{1-\gamma}\right), q=0\]
[3]:
gamma = 0.23
error = amplitude_damping_error(gamma)
results = approximate_quantum_error(error, operator_string="reset")

実際の近似を実行するためには、上記のコードしか必要としませんでした。

[4]:
print(results)

p = (1 + gamma - np.sqrt(1 - gamma)) / 2
q = 0

print("")
print("Expected results:")
print("P(0) = {}".format(1-(p+q)))
print("P(1) = {}".format(p))
print("P(2) = {}".format(q))
QuantumError on 1 qubits. Noise circuits:
  P(0) = 0.8237482193044614, QasmQobjInstructions = [[{'name': 'id', 'qubits': [0]}]
  P(1) = 0.17625178069553862, QasmQobjInstructions = [[{'name': 'reset', 'qubits': [0]}]

Expected results:
P(0) = 0.8237482193696062
P(1) = 0.17625178063039387
P(2) = 0

分析的に予測された結果が得られました

異なる入力タイプ

近似関数には、次の 2 つの入力が与えられます: 近似するエラーチャネルと 近似を構築するのに使えるエラーチャネルの集まりです

近似する エラーチャネル は、QuantumError オブジェクトに変換できる任意の入力として与えることができます。

例として、振幅減衰のKraus行列を明示的に構築し、以前と同じ近似関数に渡します。

[5]:
gamma = 0.23
K0 = np.array([[1,0],[0,np.sqrt(1-gamma)]])
K1 = np.array([[0,np.sqrt(gamma)],[0,0]])
results = approximate_quantum_error((K0, K1), operator_string="reset")
print(results)
QuantumError on 1 qubits. Noise circuits:
  P(0) = 0.8237482193044617, QasmQobjInstructions = [[{'name': 'id', 'qubits': [0]}]
  P(1) = 0.1762517806955383, QasmQobjInstructions = [[{'name': 'reset', 'qubits': [0]}]

近似チャネルを構築するために使用される error operators はリスト、辞書またはハードコードされたチャネルを示す文字列として与えられます。

任意のチャネルは Kraus 演算子のリストまたは ‘QuantumError’ オブジェクトのいずれかになります。

ID チャンネルは直接渡す必要はありません。常に暗黙的に使用されます。

一例として、リセットノイズの明示的なKraus表現を使用して振幅減衰を近似します。

[6]:
reset_to_0 = [np.array([[1,0],[0,0]]), np.array([[0,1],[0,0]])]
reset_to_1 = [np.array([[0,0],[1,0]]), np.array([[0,0],[0,1]])]
reset_kraus = (reset_to_0, reset_to_1)

gamma = 0.23
error = amplitude_damping_error(gamma)
results = approximate_quantum_error(error, operator_list=reset_kraus)
print(results)
QuantumError on 1 qubits. Noise circuits:
  P(0) = 0.8237482193044614, QasmQobjInstructions = [[{'name': 'id', 'qubits': [0]}]
  P(1) = 0.17625178069553862, QasmQobjInstructions = [[{'name': 'kraus', 'qubits': [0], 'params': [array([[1, 0],
       [0, 0]]), array([[0, 1],
       [0, 0]])]}]

出力チャンネルの違いに注意してください: 確率は同じです。 しかし、入力KrausオペレータはCliffordシミュレータでは使用できない一般的なKrausチャンネルに変換されました。 したがって、可能な場合は、Kraus 行列の代わりに QuantumError オブジェクトを渡す方が良いでしょう。

[7]:
import qiskit.tools.jupyter
%qiskit_version_table
%qiskit_copyright

Version Information

Qiskit SoftwareVersion
QiskitNone
Terra0.14.0
Aer0.6.0
IgnisNone
AquaNone
IBM Q Provider0.6.1
System information
Python3.7.7 (default, Mar 26 2020, 10:32:53) [Clang 4.0.1 (tags/RELEASE_401/final)]
OSDarwin
CPUs4
Memory (Gb)16.0
Tue Apr 28 13:42:53 2020 EDT

This code is a part of Qiskit

© Copyright IBM 2017, 2020.

This code is licensed under the Apache License, Version 2.0. You may
obtain a copy of this license in the LICENSE.txt file in the root directory
of this source tree or at http://www.apache.org/licenses/LICENSE-2.0.

Any modifications or derivative works of this code must retain this
copyright notice, and modified files need to carry a notice indicating
that they have been altered from the originals.

[ ]: