で量子シミュレーション用のノイズ モデルを構築する方法 QDK

Microsoft Quantum Development Kit (QDK) には、量子コンピューターでのプログラムの実行方法をモデル化する量子シミュレーターのセットが含まれています。 量子コンピューターで実行するプログラムには、常に何らかの種類と程度のノイズが含まれます。 QDK Python パッケージを使用すると、NoiseConfig API を使用してシミュレーションで使用するカスタム ノイズ モデルを構築できます。

QDK シミュレーターをインストールして使用する方法については、「QDK量子シミュレーターをインストールして実行する方法」を参照してください。

ノイズの種類

量子プログラムの各操作または命令によってノイズが発生する可能性があります。 次の表に、ノイズを設定できるすべての操作と手順を示します。

ノイズ ソース ノイズ モデル パラメーター ソースの説明
$X$ゲート x 単一量子ビット パウリ ゲート、ビット フリップ
$Y$ゲート y シングル量子ビットパウリゲート、ビットフリップおよび位相フリップ
$Z$ ゲート z 単一量子ビットパウリゲート、位相反転
$H$ ゲート h 単一量子ビットのハダマールゲートは、等しい重ね合わせ状態を作成します
$S$ ゲート s 単一量子ビットゲート、半π位相フリップ
$S^\dagger$ ゲート s_adj 単一量子ビット ゲート、$S$ の隣接
$T$ゲート t 単一量子ビットゲート、π/4位相フリップ
$T^\dagger$ ゲート t_adj 単一量子ビット ゲート、$T$ の隣接
$S_X$ ゲート sx シングル量子ビット ゲート、ハーフ ビット フリップ
$S_X^\dagger$ゲート sx_adj $S_X$ の隣接する単一量子ビット ゲート
$R_X$ ゲート rx 単一量子ビット ゲート、$x$ 軸を中心とする一般的な位相回転
$R_Y$ ゲート ry 単一量子ビット ゲート、$y$ 軸を中心とする一般的な位相回転
$R_Z$ ゲート rz 単一量子ビット ゲート、$z$ 軸を中心とする一般的な位相回転
$CX$ ゲート cx 2 量子ビット ゲート、制御付き $X$ ゲート
$CY$ ゲート cy 2 量子ビット ゲート、制御付き $Y$ ゲート
$CZ$ ゲート cz 2量子ビットゲート、制御Zゲート
$R_{XX}$ ゲート rxx $R_X$ に似た 2 量子ビット ゲート
$R_{YY}$ ゲート ryy $R_Y$ に似た 2 量子ビット ゲート
$R_{ZZ}$ ゲート rzz $R_Z$ に似た 2 量子ビット ゲート
$SWAP$ゲート swap 2 量子ビット ゲートで、量子ビットの状態をスワップします
$CCX$ ゲート ccx 3量子ビットゲート、2量子ビットの制御$X$ゲート
量子ビット移動 mov デバイス ゾーン間の量子ビット移動 (中性原子デバイス シミュレーション用)
量子ビット測定 mz Pauli-$Z$ 単位での単一量子ビット測定
量子ビットの測定とリセット mresetz 単一量子ビット測定と 0 状態へのリセット

NoiseConfigでは、特定の確率で前の操作に 4 種類のノイズを適用できます。 次の表に、ノイズのないパラメーターを含め、 NoiseConfigで設定できるノイズの種類のパラメーターを示します。

ノイズの種類 ノイズ モデル パラメーター ノイズの説明 使用例 説明の例
パウリ $X$ ノイズ x ビット フリップ noise.z.x = 0.03 ビット フリップは、3% の $Z$ 演算で発生します
パウリ $Y$ ノイズ y ビットフリップと位相フリップ noise.sx.y = 0.01 ビット フリップと位相反転は、$S_X$ 演算の 1% で発生します
パウリ $Z$ ノイズ z 位相反転 noise.h.z = 0.02 $H$ 演算の 2% で位相反転が発生する
ノイズなし i ID 操作(影響なし) noise.cz.ix = 0.02 2% の $CZ$ 演算でターゲット量子ビットのみにビット フリップが発生する
量子ビット損失 l 量子ビットがデバイスから失われる noise.mov.l = 0.03 量子ビットは、中性原子量子コンピューター上のデバイス ゾーン間の移動の 3% で失われます

ノイズはソース操作の後に発生し、ソース操作の代わりに発生するのではありません。 たとえば、 noise.z.x は、プログラムが目的の$Z$ ゲートを量子ビットに適用し、意図しない$X$ ゲートを量子ビットに適用することを意味します。 ノイズはソースの後に適用されるため、ソースと同じ効果を持つノイズを構成できます。 たとえば、noise.x.x は、意図したビット反転の後に、意図しないビット反転を適用します。

Note

ニュートラル アトム デバイス シミュレーション API は、限られた数のソースからのノイズをサポートします。 詳細については、QDKでニュートラルアトムデバイスシミュレーション用のノイズモデルを構築する方法を参照してください

ノイズ モデルを構築する

シミュレーション用のノイズ モデルを構築し、そのノイズが量子プログラムの結果に与える影響を確認するには、次の手順に従います。

  1. VS Codeで、[表示] メニューを開き、[コマンド パレット] を選択します。

  2. 「新規作成」と入力します。 空の Jupyter Notebook ファイルが新しいタブで開きます。

  3. ノートブックの最初のセルで、必要な Python オブジェクトをインポートします。

    from qdk import init, TargetProfile
    from qdk.openqasm import compile
    from qdk.simulation import NoiseConfig, run_qir
    from qdk.widgets import Histogram
    
  4. 新しいセルで、デバイス QIR ターゲット プロファイルを設定し、OpenQASM 回線を QIR にコンパイルします。

    init(target_profile=TargetProfile.Base)
    
    qasm_src = """
    include "stdgates.inc";
    qubit[2] qs;
    bit[2] r;
    
    h qs[0];
    cx qs[0], qs[1];
    r = measure qs;
    """
    
    qir = compile(qasm_src)
    
  5. NoiseConfig オブジェクトを作成し、ノイズ モデルを構築します。

    noise = NoiseConfig()
    
    noise.h.x = 0.01
    noise.cx.zi = 0.02
    

    このコードでは、次のノイズ モデルが生成されます。ノイズ レートは、ソースによって対応する種類のノイズが発生する確率です。

    ノイズ ソース ノイズの種類 ノイズ レート
    $H$ ゲート ビット フリップ 1%
    $CX$ ゲート 制御量子ビットの位相反転 2%
  6. ノイズ モデルを使用してシミュレーターを実行し、測定結果のヒストグラムを表示します。 たとえば、次のコードを実行して、クリフォード シミュレーターでプログラムの 1,000 ショットをシミュレートします。

    results = run_qir(qir, shots=1000, noise=noise, type="clifford")
    Histogram(results, labels="kets")
    
  7. ノイズのないシミュレーションでノイズの多い結果を比較するには、ノイズ モデルなしでシミュレーションをもう一度実行します。

    results = run_qir(qir, shots=1000, type="clifford")
    Histogram(results, labels="kets")
    

同じソースに複数の種類のノイズを設定する

同じソースで異なる種類のノイズをモデル化でき、ノイズの種類ごとに確率が異なります。 たとえば、次のコードでは、アダマール ゲートの後にビット反転が発生する確率を 1%、位相反転が発生する確率を 3% に設定します。

noise.h.x = 0.01
noise.h.z = 0.03

同じ操作に対して複数のノイズ・タイプを構成する場合、プログラム内の各操作に適用できるノイズ・タイプは 1 つだけです。 たとえば、各 Hadmard ゲートは、$X$ ノイズまたは $Z$ ノイズのどちらかを持つことができますが、両方を持つわけではありません。

ノイズ モデル関数

ノイズ モデル パラメーターの代わりに、次のノイズ関数のセットを使用して、ノイズ モデルを構築できます。

パウリノイズを設定する

モデルにパウリ ノイズを含めるには、ゲートまたは移動操作で set_pauli_noise 関数を呼び出します。

単一量子ビット演算の場合は、1 文字の Pauli 文字列とノイズ レートを渡します。 たとえば、次のコードでは、量子ビットの移動中にビット フリップが発生する可能性が 1% 設定されます。

# Equivalent to: noise.mov.x = 0.01
noise.mov.set_pauli_noise('X', 0.01)

2 量子ビット演算の場合は、2 文字の Pauli 文字列とノイズ レートを渡します。 Pauli 文字列の最初の文字は制御量子ビットのノイズに対応し、2 番目の文字はターゲット量子ビットのノイズに対応します。 たとえば、次のコードは、$CX$ 演算の 1% 後に相関フェーズ フリップを設定します。

# Equivalent to: noise.cx.zz = 0.01
noise.cx.set_pauli_noise('ZZ', 0.01)

脱分極ノイズを設定する

set_depolarizing関数は、3 種類のパウリ ノイズすべてに対して等しいが、相関のないノイズ レートを設定します。 たとえば、次のコードでは、3 つのパウリ ノイズの種類ごとに 1% の確率として均等に分散された、$H$ 操作の後に Pauli ノイズが発生する可能性が 3% 設定されます。

# Equivalent to:
#     noise.h.x = 0.01
#     noise.h.y = 0.01
#     noise.h.z = 0.01
noise.h.set_depolarizing(0.03)

ビット フリップ ノイズを設定する

ビット フリップのノイズ レートを設定するには、ゲートまたは移動操作で set_bitflip 関数を使用します。 たとえば、次のコードでは、$R_Z$ 演算の後に位相反転が発生する可能性が 1% 設定されます。

# Equivalent to: noise.rz.x = 0.01
noise.rz.set_bitflip(0.01)

位相反転ノイズを設定する

操作で位相反転のノイズ レートを設定するには、ゲートまたは移動操作で set_phaseflip 関数を使用します。 たとえば、次のコードでは、$R_Y$ 演算の後に位相反転が発生する可能性が 1% 設定されます。

# Equivalent to: noise.ry.z = 0.01
noise.ry.set_phaseflip(0.01)