派遣で働くエンジニアのスキルアップを応援するサイト

PRODUCED BY RECRUIT

初心者でもわかる量子コンピュータの計算の仕組み【最終話】現在の量子コンピュータの限界とこれから。実機を動かしてわかるノイズの入った測定結果

量子コンピュータに関して専門知識がなくても理解できるようになることを目指した本連載。量子プログラミングを環境構築から解説した第5話はご覧いただけましたか?いよいよ、最終回です。

まだまだ身近とはいえない量子コンピュータですが、個人でも使用できる量子コンピュータが公開されているのはご存知ですか?でもその実機には世界中の人がアクセスしていて、”行列”ができることもあるんだとか…。

本記事では、クラウドに公開された量子コンピュータの実機を利用できる、IBMQuantumの使用方法をわかりやすく解説します。量子コンピュータの実機を体験すると、現状の量子コンピュータの能力も把握できますので、ぜひ手を動かしながら読み進めてくださいね。

【筆者】束野 仁政さん
量子コンピュータ・プログラマ。学生時代に数学を専攻したのち、ソフトウェア・エンジニアを経て、現在は研究機関にて量子コンピュータの仕事をしている。量子コンピュータの面白さを多くの人に広めたいと思い、雑誌記事や同人誌の執筆、勉強会での発表などを行う。著書は「Elasticsearch NEXT STEP」(インプレスR&D)・Twitterアカウント(https://twitter.com/snuffkin

■免責
本連載は情報の提供のみを目的としています。

本連載の内容を実行・適用・運用したことで何が起きようとも、それは実行・適用・運用した人自身の責任であり、著者や関係者はいかなる責任も負いません。
■商標
本連載に登場するシステム名や製品名は、関係各社の商標または登録商標です。 また本書では、™、®、© などのマークは省略しています。

量子コンピュータの実機を使う準備

IBMがクラウド公開している量子コンピュータの実機は複数あります。また、新しい実機が継続的に開発され、古くなった実機は廃止されていきます。そのため、今回利用する実機も数年後には廃止されている可能性があることに注意してください。ここでは、量子コンピュータの実機を使う準備として、利用可能な実機を確認する方法を説明します。

まず、第5話と同じように、IBMQuantumのサイトにログインします。(はじめて挑戦する方は第5話の環境構築を先にご覧ください。) ログイン後、ダッシュボードの「IBM Quantum compute resources」にある「View all」をクリックします(図1.1)。


▲図1.1: Compute resourcesに遷移

すると、Compute resourcesという画面に遷移します(図1.2)。この画面では、IBMが公開している量子コンピュータの実機や、シミュレータといったリソースを確認できます。「Your resources」「All Systems」「All Simulators」の3個のタブがあり、「Your resources」のタブで自分が利用できるリソースを一覧できます。今回は、ibm_quitoという名前の実機で量子回路を実行しましょう。


▲図1.2: Compute resources

「Your resources」にはさまざまな情報が表示されていますが、実機で実行するために最低限必要なものを紹介します。

Name
実機のマシン名です。量子回路を実行するときに、このマシン名を指定して実行します。

Qubits
実機の量子ビット数です。この量子ビット数より大きな量子回路は実行できないため、注意してください。ibmq_quitoの場合、5量子ビットです。

Status
実機の状態です。実機が稼働していれば、「Online」と表示されます。また、メンテナンスなどにより稼働していなければ「Offline」と表示されます。

Total pending jobs
全世界のユーザが実機を共用しており、受け付けた量子回路から順に実行されます。Total pending jobsの欄には、実行待ちのジョブ数を表示しています。この数字が大きいほど混みあっているため、量子回路を実行するときの待ち時間が長くなる傾向があります。

ibmq_quitoの行をクリックすると画面が遷移し、詳細なマシンスペックを確認できます(図1.3)。個々のパラメータの説明は省略しますが、各量子ビットの精度などが公開されています。これらの情報は基本的に毎日更新され、最新の実機のマシンスペックを把握できます。


▲図1.3: ibmq_quitoのマシンスペック

量子コンピュータでプログラムを実行

ここでは、第5話と同じ図1.4の量子回路を実装・実行します。この量子回路を実機で実行し、第5話の結果と比べてみます。


▲図1.4: 量子回路

必要なライブラリをインポートする部分と量子回路を作成する部分は、第5話と同じ実装になります(リスト1.1、リスト1.2)。

▼リスト1.1: インポート

import numpy as np

# Importing standard Qiskit libraries
from qiskit import QuantumCircuit, transpile, Aer, IBMQ
from qiskit.tools.jupyter import *
from qiskit.visualization import *
from ibm_quantum_widgets import *
from qiskit.providers.aer import QasmSimulator

# Loading your IBM Quantum account(s)
provider = IBMQ.load_account()

▼リスト1.2: 量子回路の作成

circuit = QuantumCircuit(2, 2) # 量子回路を初期化

# 量子回路の組み立て
circuit.h(0) # アダマール行列を適用
circuit.cx(0, 1) # CNOTを適用

# 測定
circuit.measure([0, 1], [0, 1])

リスト1.3は、第5話のプログラムを量子コンピュータの実機で実行できるように修正したものです。第5話のプログラムと異なるのは4行目だけで、変数backendに実機を指定しています。この変更だけで、量子回路を実機で実行できます。

▼リスト1.3: 実行と結果取得

from qiskit import execute

# 実行と結果取得
backend = provider.get_backend("ibmq\textunderscore{}quito") # デバイス指定
job = execute(circuit, backend) # 量子プログラムを実行
result = job.result() # 結果を取得
print(result.get_counts(circuit)) # 結果をテキスト表示

このプログラムを実行すると、量子回路が実機に送信されます。ただし、実行待ちになり、すぐには結果が返ってきません。混雑状況にもよりますが、早くて数十秒、遅いと数時間待つこともあります。

実行待ちの様子:列に並んで実行の順番を待つ

IBM Q Experienceのサイトでは、実行待ちの様子を確認できます。ダッシュボードの「Recent jobs」にある「View all」をクリックします(図1.5)。


▲図1.5: Recent jobsに遷移

すると、Jobsという画面に遷移します(図1.6)。この画面では、量子回路のジョブを一覧できます。


▲図1.6: ジョブ一覧(Pending)

一番上の行でStatusが「Pending(未実行)」になっているものが、実行待ちのジョブです。

この行をクリックすると、ジョブの詳細を確認できます(図1.7)。


▲図1.7: ジョブ詳細(Pending)

「Status Timeline」の部分がジョブの進捗を表しています。図1.7からジョブが「In queue (イン・キュー、順番待ち)」の状態だと分かります。

図1.7のCircuitの部分には、図1.4と異なる量子回路が表示されていますが、問題ありません。表示されているのは、実機で実行できる命令にコンパイルした後の量子回路です。見た目は異なりますが、図1.4と図1.7は同じ結果になります。

実行完了の様子:実行時間のほとんどは待ち時間

順番が回ってきて、量子回路を実行し終わるとリスト1.4の測定値を出力します。

▼リスト1.4: 実行結果

{'00': 1887, '01': 278, '10': 210, '11': 1625\}

ibmq_quitoはデフォルトで4000回測定します。リスト1.4は、|00⟩が1887回、|02⟩が278回、|10⟩が210回、|11⟩が1625回得られたことを表しています。また、測定値は確率的に得られるため、実行する毎に結果の回数が変化します。

ここで、先ほどのジョブ一覧の画面を表示してみましょう(図1.8)。


▲図1.8: ジョブ詳細(Completed)

一番上の行のStatusが「Completed(完了)」に変わっており、実行完了しています。

この行をクリックすると、ジョブの詳細を確認できます(図1.9)。


▲図1.9: ジョブ詳細(Completed)

「Status Timeline」からジョブの進捗が「Completed」になったことが分かります。 左上に記載がありますが、「Total completion time」(総実行時間)は29分14.5秒でした。「Status Timeline」の「In queue:」が28分59秒となっており、ほとんどが実行待ち時間だと分かります。

実行結果の考察:ノイズの入った結果とその対処法

ここで、期待通りの結果になっているか確認するため、測定値の確率分布を表示してみましょう。リスト1.5を実装してください。

▼リスト1.5: 確率分布を表示

# 確率分布を表示
plot_distribution(job.result().get_counts(circuit))

2行目のplot_distribution関数を実行すると、図1.10の確率分布を表示します。 以前はplot_histogram関数で確率分布を表示していましたが、現在はplot_distribution関数で確率分布を表示するようになっています。


▲図10: 確率分布を表示

実行結果について、気になる点があります。

図1.4の量子回路が$\Ket{0}\Ket{0}$からユニタリ発展で変化していく様子を記述すると、次のようになります。

$\begin{array}{lll} \Ket{0}\Ket{0} &\xrightarrow{H_0} &\frac{1}{\sqrt{2}}\Ket{0}(\Ket{0}+\Ket{1}) \\ &\xrightarrow{CNOT_{0,1}} &\frac{1}{\sqrt{2}}(\Ket{0}\Ket{0}+\Ket{1}\Ket{1}) \\ \end{array}$

第5話で実行したシミュレータでは、$\Ket{00}$と$\Ket{11}$のみ得られました。これは理論的に正しい結果です。

しかし、量子コンピュータの実機では、$\Ket{01}$と$\Ket{10}$も得られました。$\Ket{01}$と$\Ket{10}$を得る確率は理論的には0です。理論と量子コンピュータの実機で異なる結果となりました。

量子コンピュータの実機はノイズの影響を避けられないため、このように理論上は起こりえない測定値も結果に含まれます。基本的なユニタリ発展を2回実行しただけですが、0.007+0.052=0.122であるため、$\Ket{01}$と$\Ket{10}$を合わせて12.2%の確率で誤りが発生しています。そのため、量子コンピュータは誤りが発生することを前提として利用する必要があります。ひとつの方法としては、このケースのように何度も実行して確率分布を求めて計算結果を推定します。

現在の量子コンピュータの限界と、これから

現在の量子コンピュータは、大きな計算を行うと誤りが増幅してしまい、正しい実行結果を得ることができません。そのため、誤りの少ない実機の開発や、誤り訂正を行って正しい実行結果を得られるよう研究が進められています。

この連載では、量子コンピュータの現状の紹介からはじめて、計算ルールや量子プログラミングを学び、最終的には実機で量子回路を実行してみました。量子コンピュータの実用化に向けてやるべきことは数多くあります。この連載はあくまでも入門ですが、興味を持った方はぜひ量子コンピュータを引き続き学んでみてください。

 

(コラム)計算精度を向上させる技術:量子エラー制御

■ノイズのない実行結果を推定する量子エラー抑制

上記で確認したように、実機を利用するとある程度のエラーが発生し、測定結果にノイズが混ざります。ノイズの存在は許容した上で現在の量子コンピュータの計算精度を向上させるために研究されているのが、量子エラー抑制(quantum error mitigation)です。量子エラー抑制は、量子エラー緩和とも訳されます。

実行結果を確認する際に、何度も同じ量子回路を実行し、測定値の確率分布を確認しました。統計誤差もノイズもない確率分布は図1.11のようになりますが、サンプリングによる統計誤差がある上に実機ではノイズが混ざるため図1.10のような確率分布になり、理想的な確率分布からずれました。サンプリング回数(ショット数)を増やせば統計誤差は少なくなりますが、ノイズの影響は残ります。量子エラー抑制は、ノイズが混ざった結果に対して数理的な処理を行い、ノイズのない結果を推定できます。


▲図1.11: 理想的な確率分布

■測定エラー抑制

量子エラー抑制には、さまざまな手法が存在します。ここでは、測定エラー抑制(measurement error mitigation)というものを紹介します。

実は測定はかなりエラーが発生しやすい操作です。このことを図1.3の実機のマシンスペックで確認してみましょう。図1.3にある「$Avg. CNOT Error$」は$CNOT$ゲートのエラー率の平均値で、$1.346e-2≒1.3%$です。また、「$Avg. Readout Error$」は測定のエラー率の平均値で、$4.712e-2≒4.7%$です。$CNOT$ゲートより測定の方が、3.5倍もエラーが起きやすいことになります。

そこで、測定時に発生するエラーを抑制したくなります。それが測定エラー抑制です。
測定エラー抑制は、次のステップで実行します。

  • ステップ1: 測定時のノイズに関する統計的な情報を取得する
  • ステップ2: 目的の量子回路を実行する
  • ステップ3: ノイズのない値を推定する

ステップ1: 測定時のノイズに関する統計的な情報を取得する

目的の量子回路を実行する前に、測定時のノイズに関する統計的な情報を取得します。

具体的には、$\Ket{00}$から$\Ket{11}$の各量子状態を用意し、測定するとどの結果を得るか確率分布を取得します。

$\Ket{00}$を用意して測定した結果は図1.12のようになりました。


▲図1.12: 実機で$\Ket{00}$を測定した確率分布

$\Ket{00}$、$\Ket{01}$、$\Ket{10}$、$\Ket{11}$を各成分に並べ、確率分布を表すベクトルを作ると次のようになります。

$\newcommand{\FourOne}[4]{\left(\begin{array}{c} #1 \\ #2 \\ #3 \\ #4 \end{array} \right)} \begin{array}{l} \FourOne{0.960}{0.016}{0.023}{0.001} \begin{array}{c} \leftarrow \Ket{00}を得た確率 \\ \leftarrow \Ket{01}を得た確率 \\ \leftarrow \Ket{10}を得た確率 \\ \leftarrow \Ket{11}を得た確率 \end{array} \end{array}$

同様に、$\Ket{01}$を用意して測定した結果は図1.13のようになりました。確率分布を表すベクトルを作ると、$\FourOne{0.053}{0.926}{0.000}{0.021}$になります。


▲図1.13: 実機で$\Ket{01}$を測定した確率分布

以下、同じように、 $\Ket{10}$ を用意して測定した結果は図1.14のようになりました。確率分布を表すベクトルを作ると、$\FourOne{0.048}{0.001}{0.938}{0.013}$になります。


▲図1.14: 実機で$\Ket{10}$を測定した確率分布

$\Ket{11}$ を用意して測定した結果は図1.15のようになりました。 確率分布を表すベクトルを作ると、 $\FourOne{0.002}{0.045}{0.054}{0.899}$になります。


▲図1.15: 実機で$\Ket{11}$を測定した確率分布

これらの結果から、理想的な確率分布のベクトルと、ノイズが混じった確率分布のベクトルは次のような関係になります。

左辺のノイズが混じった確率分布のベクトルを $p_{\text{noisy}}$ 、右辺の $4 \times 4$ 行列を $M$ 、右辺の理想的な確率分布のベクトルを $p_{\text{ideal}}$ と書くことにすると、次の関係に言い換えられます。

$M \cdot p_{\text{ideal}} = p_{\text{noisy}}$

これで、測定時のノイズに関する統計的な情報を取得できました。

ステップ2: 目的の量子回路を実行する

実機で目的の量子回路を実行し、測定します。この測定結果はノイズにより、理想的な値からずれます。ここでは、図1.4の量子回路を実行し、図1.10の確率分布を得たとします。この確率分布はノイズが混じった結果なので、$p_{\text{noisy}} = \FourOne{0.472}{0.070}{0.052}{0.406}$です。

ステップ3: ノイズのない値を推定する

さきほどの $M \cdot p_{\text{ideal}} = p_{\text{noisy}}$ の両辺に左から $M$ の逆行列 $M^{-1}$ をかけると、 $p_{\text{ideal}} = M^{-1} \cdot p_{\text{noisy}}$ になります。 ステップ1で $M$ を求めたので、 $M^{-1}$ は計算できます。

また、ステップ2で $p_{\text{noisy}}$ も求めてあります。 したがって、 $p_{\text{ideal}}$ を推定できます。 $p_{\text{ideal}}$ を推定した値を $p_{\text{mitigated}}$ と書くことにすると、 $p_{\text{mitigated}}$ は次のようになります。

$p_{\text{mitigated}}$ で $\Ket{01}$ を得る確率は0.045、 $\Ket{10}$ を得る確率は0.018になりました。 $0.045+0.018=0.063$ であるため、 $\Ket{01}$ と $\Ket{10}$ を合わせて6.3\%の確率でエラーが発生しています。ノイズをゼロにはできませんが、図1.10のエラーが12.2%だったことと比べると抑制できました。

図1.16で、ノイズあり(noisy)、エラー抑制後(mitigated)、理想的な値(ideal)の確率分布を比較しました。ノイズありと比べると、エラー抑制後の方が理想的な確率分布に近づいていることが分かります。


▲図1.16: 確率分布の比較

現在の量子コンピュータには量子誤り訂正がなく、計算結果にノイズが混ざりますが、量子エラー抑制によって理想的な計算結果に近づけることができました。量子エラー抑制は測定回数を増やす必要があったり、数理的な処理が必要になりますが、量子誤り訂正がなくても計算精度が上がるのは大きな利点です。ここで紹介した以外にも、さまざまな手法が研究され、量子エラー抑制の重要性は増しています。

・・・

いかがでしたか?話題の先端技術、量子コンピュータの計算の仕組みを全6回にわたって解説いただきました。

数式が出てきたり、はじめて耳にする言葉があったりと、簡単に理解できることばかりではなかったかもしれません。ですが今もう一度、第1話から読み返してみると、きっと以前より理解できるようになっているはずですよ。ここまで一緒に読んでくださった皆さん、ありがとうございました。

これからもエンジニアスタイルではエンジニアの皆さんのスキルアップに役立つ情報を発信していきます。お楽しみに!

▼これまでの「初心者でもわかる量子コンピュータの計算の仕組み」
【第1話】数式なしで量子コンピュータの現状を理解しよう
【第2話】量子コンピュータで使用する計算の土台を学ぼう
【第3話】量子コンピュータの基本のルールを学ぼう
【第4話】基本の量子ゲートと量子回路をおさえよう
【第5話】量子プログラミングをやってみよう
【最終話】現在の量子コンピュータの限界とこれから

束野仁政さんの著書『量子コンピュータの頭の中――計算しながら理解する量子アルゴリズムの世界(技術評論社)』もあわせてご覧ください。(2023年7月追記)