最近の投稿

アーカイブ

カテゴリー

最近のコメント

  1. にんじん
  2. アバター
  3. アバター
  4. タロウ
  5. アバター

テクノロジー

量子コンピューターは「不完全」!? NISQ時代の量子計算とは?

松原 太一

今回は、量子コンピューターを使った量子計算について説明します。そもそも、現在の量子コンピューターは、ノイズがあって、数十年以内に開発される中規模の量子コンピューターを指す「NISQ(ニスクまたはエヌアイエスキュー:Noisy Intermediate-Scale Quantum Computer)」と呼ばれています。つまり、エラーが付きまとうために性能が完全ではありません。NISQマシンが持つ量子コンピューターとしての性能を最大限に活用するには、アルゴリズムとソフトウェアの準備が必要です。

この記事では、NISQマシンの活用を考える前に、量子計算とは何か?プログラマーの仕事は量子コンピューターでどう変わるのか?NISQアルゴリズムの作り方とは?量子プログラミングの現状と未来が知りたい!といった疑問について整理します。では、いきましょう!

量子計算とは

まずは、一般に「量子計算」とはどのような営みを指すのか、その定義を設定しましょう。量子計算とは、量子コンピューターから出力(計算結果)を取り出す営みのことを指します。

なお、この記事では、全体のイメージを掴むため、具体的な専門用語は使わずに抽象的な枠組みで説明します。以下では、量子コンピューターのことを「ハードウェア」と呼びます。また、実際にハードウェアでどのような計算をすればいいか、人間が指令するためのプログラミング環境のことを「ソフトウェア」と呼びます。さらに、ソフトウェアでつくる『どのような計算をするかについての指令』、または『問題の解を得るための具体的手順』のことを「アルゴリズム」と呼んで説明していきます。

この記事での呼称

  • ハードウェア:量子コンピューターのこと
  • ソフトウェア:ハードウェアでどのような計算をするか、人間が指令するプログラミング環境
  • アルゴリズム:ソフトウェアによる計算の指令、または問題の解を得る具体的手順
この記事におけるソフトウェアとハードウェア、アルゴリズムの関係
この記事におけるソフトウェアとハードウェア、アルゴリズムの関係

量子計算の営み

続いて、アルゴリズムについて具体例を挙げておきましょう。私たちの生活の中では、無数のアルゴリズムが作用しています。データを昇順や降順に並べ替える「ソート」や、検索して絞り込む「フィルター」もアルゴリズムです。

ローコードのソフトウェア開発環境として代表的なOutSystemsにも、アルゴリズムが使われています。プログラマーは、プログラミング言語を記述することなく、ビジュアル言語を使ってロジックを組み立てます。隠れたアルゴリズムが、コードを自動生成してくれるのです。

話を戻して、量子計算の営みがどういう動作をするかまとめておきます。

  1. 人間はソフトウェア上でアルゴリズムを作成する
  2. 作成されたアルゴリズムに基づいてハードウェアが計算を実行する
  3. その計算結果を出力として得る

量子計算とは、これらの出力結果をワンセットで得る営みのことを指します。

ここで、『量子コンピューター業界のプログラマーって、結局、何をプログラムしてるの?』という疑問が解けます。つまり、量子プログラマーは、量子コンピューター専用のアルゴリズム—いわば「量子アルゴリズム」をプログラムしているのです。

では次に、実際に量子アルゴリズムをどうのように実装するかを見てみましょう。

量子回路

量子アルゴリズムは「量子回路」により表現されます。アルゴリズム=量子回路です。ひとまず、量子回路図の一例を見てみましょう。

量子テレポーテーションの回路
量子テレポーテーションの回路 
出典:IBM-Quantum https://www.ibm.com/jp-ja/quantum-computing

この図は、量子回路が量子コンピューター中の「どの量子ビットに、どのような順番で量子ゲートを施すか」を表しています。実際に量子回路の基本構成を見てみましょう。「量子ゲート」や「測定」など、個別に解説が必要な用語もありますが、とりあえず構成として、このようになっていることは押さえておいてください。

量子回路基本3構成

  1. 初期化:量子ビットの量子状態を初期化する
  2. ゲート操作:量子ビットに対し量子ゲートを作用させる
  3. 測定:量子ビットの値を読み取る

このように、量子回路に基づいて量子コンピューターが駆動するわけですが、では、プログラマーはこの量子回路をどのようにプログラミングするのでしょうか?

量子プログラミング言語は、現在、Pythonのライブラリの一つとして提供されるものが一般的です。Pythonをホスト言語とする量子プログラミング言語にはQiskit, Cirq, Forestなどがあります。基本的には、次のサンプルコードのように、『ここの量子ビットにはこのゲートを作用させろ』といった命令型のプログラムを書くことになります。

from qiskit import QuantumCircuit, QuantumRegister, ClassicalRegister, execute, BasicAer, IBMQ
crz=ClassicalRegister(1, name=”crz”)
crx=ClassicalRegister(1, name=”crx”)
q=QuantumRegister(3, name=”q”)
teleportation_circuit=QuantumCircuit(q, crz, crx)
teleportation_circuit.h(1)
teleportation_circuit.cx(1,2)
teleportation_circuit.cx(0,1)
teleportation_circuit.h(0)
teleportation_circuit.measure(0, crz)
teleportation_circuit.measure(0, crx)

def Bob_send_and_measure(qc, qubit, crz, crx):
qc.x(qubit).c_if(crx, 1)
qc.z(qubit).c_if(crz, 1)
Bob_send_and_measure(teleportation_circuit, 2, crz, crx)

Pythonライブラリ「Qiskit」のサンプルコード
出典: 量子コンピューティング: 基本アルゴリズムから量子機械学習までより

NISQアルゴリズム

計算性能が限定的な、NISQ量子コンピューター向けのアルゴリズムを「NISQアルゴリズム」と呼びます。現在は、NISQアルゴリズムで「量子優位性」を検証していこう!という流れが主流です。ここでいう量子優位性とは、量子コンピューターの古典コンピューターに対する優位性という意味です。その「作りこみのポイント」について代表的な例を挙げておきます。

1.回路設計を浅くする

量子回路は、量子ビットに対するゲート操作の手順書だと先に説明しました。

理論上は、量子ビットに対して、より多くのゲート操作を施せた方がより望ましい量子ビットを得られます。しかし、そう簡単にはいきません。その理由は、ゲート操作の数、つまり「回路の深さ」を深くしすぎると、NISQマシンでは計算がうまくいかなくなるからです。

NISQマシンの抱える量子ビットはノイズにもろく、エラーを抱えやすいため、量子ビットに対する外部からの操作などによっても、その影響が出てしまいます。そのため、NISQアルゴリズムの設計には、回路の深さを考慮に入れる必要があります。

2.量子古典ハイブリッド

「量子古典ハイブリッド」とはその名の通り、量子コンピューターと従来の古典コンピューターを両方活用して計算する仕組みを指します。

量子古典ハイブリッドの基本思想はずばり、「NISQマシンはまだ不完全で、すべての計算を任せるには負担が大きすぎる」「だったら、量子コンピューターには量子の力でしか計算できない計算をさせ、それ以外は古典コンピュータに任せよう!」です。 量子古典ハイブリッドなNISQアルゴリズムの代表例が、「変分量子固有値アルゴリズム(VQE)」です。VQEは、現在のNISQアルゴリズム研究の根幹となっています。下の図では、量子と古典が共同している様子を示しています。

NISQアルゴリズムの代表例「変分量子固有値(VQE)アルゴリズム」
NISQアルゴリズムの代表例「変分量子固有値(VQE)アルゴリズム」
出典: A. Peruzzo et al. , “A variational eigenvalue solver on a photonic quantum processor“

量子プログラミングと従来のプログラミングの違い

現在の量子コンピューターのプログラミングの現状を見て、古典コンピューターのプログラミングとは、だいぶ性質が異なると感じた方もいるのではないでしょうか?量子コンピューターのプログラミングがどのようなものか、図で確認してみましょう。

量子コンピューターのプログラミング
量子コンピューターのプログラミング

人間がプログラミングによって作るのは「量子回路」です。この量子回路によって、量子コンピューターには『どの量子ビットに、どのような順番で、量子ゲートを施せ』という命令が下ります。この記事で使ってきた「ソフトウェア」「ハードウェア」を意識して抽象的に言い換えるなら、『ハードウェアの存在を強く意識して、ソフトウェアとしてのプログラムが実行されている』とも言えます。

ちなみに量子回路は、初期の古典コンピューターのプログラミングと非常に似ていると言われています。古典コンピューターが登場した頃は、プログラマーはコンピューター内の各回路に対して指示を出す、命令型のプログラミングで処理されていました。

一方、現在の古典コンピューターのプログラミングの状況はどうでしょう?古典コンピューターのことを考える時に役立つのが、次の図の「抽象化レイヤー」です。

古典コンピューターのプログラミング
古典コンピューターのプログラミング

量子コンピューターの時の図と見方は同じで、上に行くほど人間に近く(ソフトウェア側)、下に行くほど機械に近い(ハードウェア側)構造になっています。それぞれの箱の中身を具体的に知らなくても、量子コンピューターとの大きな違いがわかると思います。

それは、人と機械を結ぶ層(レイヤー)がとても深いからです。

人による命令がプログラミング言語として入力され、コンピューター回路に出力されるまでには、いくつもの入出力が変換されます。これが抽象化レイヤーの考え方です。抽象化レイヤーにより、『人と機械を結ぶ距離が深く、遠くなった』ともいえるでしょう。

抽象化レイヤーがもたらした最大の恩恵は、『ハードウェアの物理的詳細を考慮しなくても、ソフトウェアによるプログラミングできるようになった』点でしょう。

現在は、PythonやC言語などの高級言語を使うことで、限りなく人間の思考様式に近いプログラミングが可能になりました。プログラマーは、CPU内のトランジスタが動作する固定物理学の背景や、その製造に使われる半導体微細加工技術などについて、全く知らなくても問題ありません。

比較的身近な例で考えると、再び前述のローコード開発環境OutSystemsがあります。ロジックの構成は、各種のアクションなどをツリー上にドラッグ&ドロップで配置することで、視覚的に操作できます。コードの詳細を与えなくても、抽象化レイヤー中に隠れたアルゴリズムが自動でコードを生成してくれます。

量子コンピューターと古典コンピューターでプログラミングにどうしてこんなに差があるのか

量子コンピューターと古典コンピューターとで、プログラミングの在り方がここまで違う理由とは、何か?これもやはり「ハードウェアの性能の違い」に行き着くでしょう。

今のNISQ量子コンピューターの状況は、昔の古典コンピューターの状況と非常に近いと説明しました。実際、1940~1950年代のコンピューターは、低水準のアセンブリ言語を使ってプログラムされていました。後世では当たり前になる、プログラムを実行可能な形に変換するコンパイラなどは、ほとんど存在していませんでした。

そんな時代もありながら、現在では抽象化レイヤーが完成しています。その理由は、半導体の集積回路のトランジスタ数が2年ごとに2倍に進化するという「ムーアの法則」に従って、ハードの性能が向上したからでしょう。

一方、量子コンピューターは、ハードウェアの制約が非常に厳しいのが現実です。例えば、現在の量子コンピューターは量子回路が深くなるとエラーが積み重なるので、プログラム中の量子ゲート数に注意する必要があります。そうした制約条件をより正確に満たすためには、むしろ現在の形の量子回路プログラミングが向いているのです。

物理の問題を解きながら実装する、量子プログラミングの未来

古典コンピューターは抽象化レイヤーによって、ハードウェアの詳細が程よく「隠ぺい」されているので、プログラマーはハードウェアを意識しなくても実装できます。言い換えれば、「コンピューターの中身を知らなくても済む」ということです。

しかし、NISQマシンはそのような「隠ぺい」が効くほど発達していません。そのため、プログラマーは量子コンピューターの中身や性質を少なからず理解している必要があります。

つまり、現在の量子プログラマーは、例えば、「量子ビットはコピーできない」「測定すると量子ビットは壊れてしまう」など、頭の片隅で物理の問題を解きながら、本来の目的である実装に取り組んでいるような状況です。

こうした状況は、ハードウェアの性能が向上すれば解消し、いずれは古典コンピューターと同じように、抽象化レイヤーが発達する未来も考えられます。そうすれば、量子に関して詳しく知らない人でも使えるようになって、量子コンピューターのハードルはより下がるかもしれません。

プログラミングの概念が異なる、2つの世界を行き来しながら

今回は、あまり一般には認知されていないと思われる、「量子計算」の大きな枠組みを解説した後で、量子回路を使ってアルゴリズムが実装されていることを解説しました。また、NISQアルゴリズムの作り込みポイントを確認した後で、『量子コンピューターと古典コンピューターでは、プログラミングの概念がそもそも異なる』ことを強調しました。

古典コンピューターは、計算機としての性能はかなり成熟したため、現在はAIや、OutSystemsなどの自動化ツールを使った「応用フェーズ」に入っています。一方、量子コンピューターは計算機としては未熟なので、計算機を長い目で育てる「育成フェーズ」にあるといえます。

両者がそもそも別のフェーズにあることを強く意識し、どちらともうまく付き合っていきたいものです。

参考文献

▼McClean, Jarrod R., et al. “The theory of variational hybrid quantum-classical algorithms.”
https://iopscience.iop.org/article/10.1088/1367-2630/18/2/023023/meta

▼A. Peruzzo et al. , “A variational eigenvalue solver on a photonic quantum processor“
A variational eigenvalue solver on a photonic quantum processor | Nature Communications

▼国立研究開発法人科学技術振興機構 研究開発戦略センター
みんなの量子コンピューター ~情報・数理・物理で拓く新しい量子アプリ~
https://www.jst.go.jp/crds/pdf/2018/WR/CRDS-FY2018-WR-09.pdf

▼量子コンピューターが本当にわかる! ― 第一線開発者がやさしく明かすしくみと可能性、技術評論社、武田 俊太郎
https://amzn.to/2XxbbI6

▼いちばんやさしい量子コンピューターの教本、インプレス、湊雄一郎
https://amzn.to/3k6gMgK

▼量子コンピューティング: 基本アルゴリズムから量子機械学習まで、オーム社、嶋田 義
https://amzn.to/3q9dH3u

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

ABOUT ME
松原 太一
松原 太一
研究員(専門分野:バイオインフォマティクス・深層学習・量子コンピューティング)
2021年から株式会社BlueMemeで量子コンピューティングやゲノム情報解析の研究開発を担当。専門分野は、量子AIの生命医科学への応用。BlueMemeに在籍する傍ら、2023年度より社会人学生として、九州大学大学院システム生命科学府へ進学し博士号取得を目指す。
松原 太一の記事一覧

記事URLをコピーしました