戻る


量子コンピュータの原理

作成: 2022/09/25

目次

量子コンピュータの原理量子力学と量子コンピュータ、量子ビットハミルトニアンとエネルギー量子コンピュータの動作原理古典ビットと量子ビットの違い1量子ビット測定2量子ビット2つの1量子ビットエンタングルメント(量子もつれ)状態ベクトルを視覚化するブロッホ球量子ゲート1量子ビットゲートパウリゲートアダマールゲートS, Tゲート位相ゲート回転ゲート2量子ビットゲート基底ベクトル表記の順番CNOTゲート制御ユニタリゲート制御Zゲート制御アダマールゲートSWAPゲート主な量子ゲートまとめ量子コンピュータはどのように計算をするのか量子ビットの操作は具体的にどうするのかゲート操作の例量子コンピュータは万能量子コンピュータの制約事項・課題量子コンピュータの現在量子アルゴリズムの種類FTQCアルゴリズムNISQアルゴリズムPython と IBM Quantum, Qiskit でプログラミングIBM Quantum実行環境IBM Quantumのアカウント作成IBM Quantum ローカル実行環境Anacondaのインストールと環境設定Qiskit フレームワークの全体像TerraAerIgnisAquaQiskit とPython を用いた量子コンピュータのプログラミングQiskitのプログラムの基本的なステッププログラミングの実例ステップ 1 : パッケージをインポートする。ステップ 2 : 量子回路を定義する。ステップ 3 : ゲートを追加する。ステップ 4: 回路を可視化するステップ 5: 演算のシミュレーションステップ6: 演算結果の可視化実機で実行汎用量子計算量子フーリエ変換(Quantum Fourier Transform, QFT)量子位相推定(Quantum Phase Estimation, QPE)Shorのアルゴリズム量子古典ハイブリッドアルゴリズム量子古典ハイブリッドアルゴリズムの基本ハミルトニアンと期待値量子変分アルゴリズム VQEQiskit プログラム例QAOAQiskit プログラム例 MaxcutQiskitを用いてVQE,QAOA で実問題を解くポートフォリオ最適化四銘柄のポートフォリオ最適化問題ライブラリのインポート時系列データ(金融データ)の生成期待リターンと共分散行列の計算Qiskit Finance のポートフォリオ最適化クラスMinimum Eigen Optimizer(最小固有値オプティマイザー)古典コンピュータの最適化アルゴリズムで問題を解くVQEを使ったソリューションQAOAを使ったソリューションナップザック問題一般的なナップサック問題をQAOAで解く動的計画法(古典コンピュータによる計算)QAOAによる解法蓄電池システムの収益最大化問題設定電池による収益の最適化をQAOAで解く量子機械学習量子古典ハイブリッド機械学習1. 入力データの量子状態へのエンコーディング2. 学習用量子回路3. 損失関数4.回路パラメータ更新量子機械学習の実例パッケージのインポートQiskitを用いた量子回路を作成しますPyTorchを用いた量子古典回路の作成データの準備ハイブリッド・ニューラルネットワークの作成ネットワークの学習学習曲線を表示しますテストを行います。推論結果を表示しますサンプルプログラムについて参考文献

量子力学と量子コンピュータ、量子ビット

量子というのは、粒子と波の両方の性質を両方もつ原子、電子、中性子、陽子、光を粒子とみんなした光子などが量子の代表的なものです。量子力学的な現象を用いているわけですから、量子力学とは切っても切れない関係にあるわけです。ここでは、まず、量子コンピュータで様々な問題を解く際に押さえておくべき基本的な概念をみてみます。

量子の振る舞いは、次のシュレディンガーの波動方程式を解くことによってもとまります。

iddtψ(x,t)=Hψ(x,t)(1)

この式の両辺はエネルギーであって、粒子が持つエネルギーは、波動関数にハミルトニアンという運動エレルギーと位置エネルギーの和からなる演算子Hを作用させることによって計算できます。波動関数の時間微分がエネルギーに等しいということです。つまり、量子状態が時間的に変化するには、エネルギーが必要で、時間変化の原因となるものがエネルギーだということができます。

波動関数に作用する演算子であるハミルトニアンの固有値と固有関数を求めれば、波動関数が解け、量子力学的な状態がわかります。ハミルニアンという名称は、1830年代に活躍したウィリアム・ローワン・ハミルトンにちなんでいます。ハミルトニアンを、波動関数に作用させるとエネルギーが計算できます。ハミルトニアンは行列ですから、エネルギー変換行列とでも呼んだほうが分かりやすいかも知れません。

ハミルトニアンの固有値と固有関数を求め、最低エネルギー状態とそれより一つエレルギーが高い状態が求まったとします。

Hψ0(x)=E0ψ0(x)(2)Hψ1(x)=E1ψ1(x)

2つの状態だけを考えて、量子状態は、この2つの状態に対応する波を重ね合わせたものとして記述できます。複素数 αβ を用いて、以下のように書けます。

αψ0(x)+βψ1(x)(3)

ψ0(x)ψ1(x) は、定数ですから、それを明示的に書く必要はなく、係数だけで表す ことができます。これが量子ビットです。

(αβ)(4)

ハミルトニアンとエネルギー

量子状態にハミルトニアンをかけるとエネルギーになるということは重要です。たとえば、量子古典ハイブリッドアルゴリズム(NISQアルゴリズム)で解くことの出来る問題の典型は、問題がハミルトニアン、つまり状態をエネルギーに変換する行列が与えられ、安定なエネルギー状態を求めることに置き換えることができます。つまり、固有値と固有ベクトルを求めることになります。または、言い換えると安定なエネルギー状態のうち、一番エネルギーが小さいものを求めるということになります。

量子コンピュータの動作原理

量子コンピュータは、「重ね合わせ」や「量子もつれ」と言った量子力学的な現象を用いて従来のコンピュータでは現実的な時間や規模で解けなかった問題を解くことが期待されるコンピュータです。量子コンピュータの世界では、従来のコンピュータは、量子力学的な現象に基づいていないという意味で、古典コンピュータと呼ばれます。

量子コンピュータは、量子力学的な重ね合わせによって、n個の量子ビットを用いて2nの状態を同時に処理できるため、古典コンピュータでは、時間がかかりすぎ解くことが著しく困難な問題が解けることが期待されています。

古典ビットと量子ビットの違い

図1にしめすように、古典コンピュータでは、ビットは、0と1かのどちらか値をとります。量子ビットでは、基底ベクトル |0⟩ |1⟩ に係数を掛けて足し合わせた状態ベクトル |ψ=α|0+β|1 を用いて計算が行われます。量子ビットの状態ベクトルは、直接知ることはできなくて、測定という操作をすると、状態ベクトルの要素、αβ に応じて、結果が0になる確率と1になる確率が決まります。測定という操作を複数回繰り返すことによって、量子ビットの状態が得られます。測定を行うと、状態ベクトルが変化してしまうのも忘れてはいけません。

図1 古典ビットと量子ビット

1量子ビット

式(1)、(2)で示すように、一つの量子ビットは、2つの基底ベクトル、 |0,|1 を用いて量子状態を表します。

|0=(10)(1)|1=(01)(2)
|ψ=(αβ)=α|0+β|1 (3)

これは状態ベクトルや量子ビットと呼ばれます。式(3)でしめす足し合わせた状態のことを重ね合わせ状態と呼びます。αβ は、複素確率振幅と呼ばれます。もともと、αβ は、2つの波の重ね合わせの状態を表すものなので、状態ベクトル|ψ も波の性質をもち、干渉するということは、量子プログラミングを理解するにあたって重要なことです。

測定

残念ながら、量子力学では、この複素確率振幅は、直接知ることができません。測定という操作をしたときに、0か1かが確率的に決まります。また、測定を行うと、状態ベクトルは、測定結果が 0 の場合は|01 の場合は|1に変化してしまいます。したがって、量子ビットを初期状態に設定し、操作し、測定を行うということを、繰り返すことによって、01 の分布を求めます。

状態ベクトル|ψを、基底ベクトル|0,|1で測定したときに、測定結果が0になる確率 p0と1になる確率 p1 は、式(4),(5)のように、複素確率振幅の絶対値の2乗になります。すべての確率の和は1ですので、複素確率振幅は、式(6)の関係を満たします。

 p0=|α|2(4)p1=|β|2(5)|α|2+|β|2=1(6)

このような表現の方法は、ディラック記法と呼ばれ、|ψ は、ケットベクトル、α, β の複素共役(複素数の虚数部の符号を反転したもの)を要素とした行ベクトル ψ|=(α β) を、ブラベクトルと呼びます。

ψ||ψの行列積をとると、内積になります。ψ||ψは、ψ|ψとも、表記されます。ブラベクトルとケットベクトルの内積をもちいると、上の条件は、式(7)のように表記できます。

ψ||ψ=ψ|ψ=(α β)(αβ)=αα+ββ=|α|2+|β|2=1 (7)

2量子ビット

2個の量子ビットの状態ベクトル |ψ は、基底ベクトル |00,|01,|10,|11 と、4個の複素数を用いて、式(8)、式(9)のように表せます。

|00=(1000),|01=(0100),|10=(0010),|11=(0001) (8)
|ψ=c00|00+c01|01+c10|10+c11|11=(c00c01c10c11) (9)

ここでも、状態ベクトルの絶対値が量子の存在確率を表しますので、cij は、式(10)のような関係を満たす複素数とします。

ψ|ψ=|c00|2+|c01|2+|c10|2+|c11|2=1 (10)

1量子ビットの場合と同様、cij を複素確率振幅と呼び、基底ベクトルで測定すると、確率を得ることができます。

2つの1量子ビット

2 のの1量子ビット |ψ,|ϕ に対して、テンソル積 |ψ|ϕを、式(11)、式(12)のように定義します。

|ψ=(a0a1), |ϕ=(b0b1)(11)
|ψ|ϕ:=(a0|ϕa1|ϕ):=(a0b0a0b1a1b0a1b1) (12)

基底ベクトル|0,|1に対しては、式(12)がなりたちます。

|0|0=(1000),|0|1=(0100),|1|0=(0010),|1|1=(0001) (12)

つまり、上の2量子ビットの基底ベクトル |00,|01,|10,|11|0|0, |0|1,|1|0,|1|1 と、テンソル積を用いて表すことができるということです。

エンタングルメント(量子もつれ)

重ね合わせ状態に加えて、重要な量子ビット間の関係に、エンタングルメント(量子もつれ)があります。2つの1量子ビットが、上のテンソル積で記述できない状態が存在します。例えば、式(13)のような状態です。この状態のことをエンタングルメント(量子もつれ)といい、量子コンピュータにおいては、非常に重要な役割を果たします。

12(|00+|11)(13)

量子もつれとは、複数の量子ビットがつくられるときや、相互作用するとき、空間的に近接した場合に起こる物理現象です。量子ビットが大きく離れている場合も含めて、量子ビットの量子状態が他の量子ビットの状態に依存するという不思議な現象です。

状態ベクトルを視覚化するブロッホ球

量子ビットを単位球面上の点として視覚化するのが、Bloch(ブロッホ)球です。状態ベクトル |ψ を式(14)のように変形して、長さ1のベクトルとして表示したものです。ここでは、下の式の右辺全体にかかるグローバル位相と呼ばれる項(eiλ )を、省略しています。量子ビットを複数もちいた量子回路における量子ビットの回転操作を視覚化するのに用いられます。

|ψ=cos(θ/2)|0+eiϕsin(θ/2)|1=cos(θ/2)|0+(cosϕ+isinϕ)sin(θ/2)|1 (14)

図2 ブロッホ球

量子ゲート

古典コンピュータでは、論理ゲートは、AND, OR, NOTなどですが、量子コンピュータでは、量子ビットの回転操作を行う量子ゲートによって、計算が行われます。量子ゲートの回転操作は行列によて表わされます。式(15)のように、状態ベクトル|ψ に行列をかける演算を繰り返すことによって計算が行われます。1量子ビットの操作は、 2行×2列の 行列 U で表されます。 この行列Uを量子ゲートと呼び、量子ゲートを状態ベクトルにかけることによって、状態ベクトルに回転操作をすることができます。

|ψ=U|ψ (15)

この行列 U は、状態ベクトルにUをかけた後のベクトルも量子ビットでなければなりませんので、任意のα,β についてϕ|UU|ϕ=1 がなりたつ必要があり、そのためには、UU=UU=I である必要があります。このU は、Uの随伴行列で、行列U に対して、U の転置と成分の複素共役(実部はそのままで虚部の符号を反転する)をとったものです。このような行列 U は、ユニタリ行列と呼ばれます。以下で説明する各量子ビットゲートは、ユニタリ行列になっており、特に意識する必要はありません。

1量子ビットゲート

1量子ビットゲートには、パウリゲート、アダマールゲート、Sゲート、Tゲート、位相ゲート、回転ゲートなどがあります。

パウリゲート

ブロッホ球のX軸、Y軸、Z軸で、180°回転させるゲートで、Xゲート、Yゲート、Zゲートと呼ばれます。

X=(0110),Y=(0ii0),Z=(1001) (16)

図3 Xゲート、Yゲート、Zゲート

アダマールゲート

Z軸とX軸にたいして45度傾く軸で180°させるゲートで、Hゲートと呼ばれます。アダマールゲートを使うことにより、量子ビット |0,|1 の重ね合わせ状態を作ることができます。

H=12(1111) (17)

|0 に、アダマールゲートを作用させたときは、以下のよう操作になります。

図4 アダマールゲート

S, Tゲート

位相を回転させるゲートです。

S=(100i),S=(100i),T=(100eiπ4),T=(100eiπ4) (17)

S ゲートは π2T ゲートは π4 位相を回転します。 S,T は位相を逆に回転します。

図5 sゲート、Tゲート

位相ゲート

量子ビットを任意の位相だけ回転させるゲートです。

P(ϕ)=(100eiϕ) (18)

図6 位相ゲート

回転ゲート

各軸にたいして量子ビットを回転させるゲートです。

Rx(θ)=(cos(θ2)isin(θ2)isin(θ2)cos(θ2))(19) Ry(θ)=(cos(θ2)sin(θ2)sin(θ2)cos(θ2))(20)Rz(θ)=(eiθ200eiθ2)(21)

図7 回転ゲート

2量子ビットゲート

2量子ビットゲートには、CNOTゲート、制御ユニタリゲート、SWAPゲートなどがあります。SWAPゲートを除く、2量子ビットゲートは制御タイプです。制御2量子ビットゲートは 最初の量子ビットが |1⟩ の時に、2番目の量子ビットに対して単独の量子ビットゲートを適用します。このとき最初の量子ビットを制御量子ビットと呼び、2番目の量子ビットをターゲット量子ビットと呼びます。

基底ベクトル表記の順番

通常、状態をケットであらわすときに、「1番目」の量子ビット、「2番目」の量子ビットの状態に対応する0と1を左から順番に並べて表記されます。例えば、最初の qubit が |0⟩ 状態で、2番目のものが |1⟩ 状態の場合、その結合状態は |01⟩ です。ところが、今回、プログラミングにもちいるQiskit では、古典コンピューター上でのビット列表現と同じ順序同様にし、測定が実行された後のビット文字列から整数への変換を容易にするという理由から、 最上位ビット (Most Significant Bit - MSB) を左にとり、最下位ビット (Least Significant Bit - LSB) が右にとられます。つまり、「1番目」の量子ビット、「2番目」の量子ビットの状態に対応する0と1を右から順番に並べて表記されます。上の例でいえば、最初の qubit が |0⟩ 状態で、2番目のものが |1⟩ 状態の場合、その結合状態は |10⟩ となります。この点は、注意が必要です。 今回は、Qiskitをもちいたプログラミングを紹介しますので、以下では、Qiskitの基底ベクトル表記を用います。

CNOTゲート

制御Xゲートとも呼ばれます。制御量子ビットが、|1 のとき、対象となる量子ビットを反転、つまりXゲートを作用させます。MSBを制御ビットとしたときは、以下のようになります。Qiskitでは、 cx(q[1],q[0])

CX=(1000010000010010)(22)

LSBを制御にした場合は、以下のようになります。Qiskitではcx(q[0],q[1])

CX=(1000000100100100)(23)
制御ユニタリゲート

CNOTでは、ターゲット量子ビットに、Xゲートを作用させましたが、その他の量子ゲート U を作用させることができます。

制御Zゲート

制御量子ビットが |1⟩ である場合には、Z ゲートがターゲット量子ビットの位相を反転させます。 この行列は、制御量子ビットが、MSBでも、LSBでも、同じになります。

CZ=(1000010000100001)(24)
制御アダマールゲート

制御量子ビットが |1⟩ のとき、ターゲット量子ビットに H ゲートを作用させます。制御がLSB量子ビットの時は、以下のようになります。

CH=(10000120120010012012)(25)
SWAPゲート

SWAPゲートは2量子ビットの値を交換します。

SWAP=(1000001001000001)(26)

主な量子ゲートまとめ

ゲート回路行列
パウリXゲートimage-20211206135707260(0110)
パウリZゲートimage-20211206135839572(1001)
アダマールゲートimage-2021120614105062912(1111)
Tゲートimage-20211206141308744(100eiπ4)
CNOTゲート(1000010000010010)

図8 主な量子ゲートのまとめ

量子コンピュータはどのように計算をするのか

これまで、量子ビットとはなにか、量子ゲートにはどのようなものがあるかを見てきました。では、量子コンピュータは、量子ビット、量子ゲートを用いて、どのように計算をするのでしょうか。

量子コンピュータでは、まず、すべての状態の重ね合わせを準備します。この状態に、量子ビット間を干渉させるための操作つまり量子ゲートによる操作を順次施します。状態ベクトルつまり量子ビットは、波の性格をもつため干渉するというのがポイントです。量子ビットの間の干渉の結果を測定することによって計算が行われます。複数の量子ビットの状態を同時に操作できるのも量子コンピュータの大きな特徴の一つです。

図9 量子コンピュータの基本

量子ビットの操作は具体的にどうするのか

これまで、量子ビットや量子ゲートを、ベクトルや行列で説明してきましたが、量子コンピュータでは、具体的に、どのように量子ビットを操作しているのかでしょうか。代表的な量子ビットである超電導量子ビットの場合で、見てみたいとおもいます。

超電導量子ビットは、図10に示すように、2つの超電導電極を薄い絶縁膜でつないだものです。

図10 超電導量子ビットの構造

これは、非線形インダクタとコンデンサによるLC共振回路とみなせます。量子状態 |0|1 を持ち、2つの状態の間のエネルギー差のマイクロ波(典型的には4~6GHz)を印加することによって、量子状態を、 |0 から |1 に変化させることができます。

図11 超電導量子ビットの操作 (12)

重ね合わせ状態をつくるには、|0 から|1への操作を途中でやめます。様々な量子ゲート操作を行うには、それにしたがったパルス操作を行います。ゲート操作を順次繰り返し、最後に測定をすることによって、計算が行われます。また、量子もつれ操作を行うため、量子ビットの間が共振器で結ばれます。

図12 超電導量子チップの構造 (13)

出所: https://www.ibm.com/blogs/research/2017/11/qubit-explained/

ゲート操作の例

図13の上の縦軸は電磁波の強度を表しています。実線が1量子ビットの操作で、破線が2量子ビットの操作です。まず、初期状態を準備し、量子回路を通した後、計測を行います。このように、マイクロ波や交流パルスを、順次、印加することによって、量子ビットを操作し、計算を行っていきます。図13の下に対応するゲートからなる量子回路をしめしています。

図13 量子ビットゲート操作の例 (14)

出所: https://journals.aps.org/prx/pdf/10.1103/PhysRevX.6.031007

量子コンピュータは万能

古典コンピュータが、NANDゲートをくみあわせれば任意の計算が可能なように、CNOT、アダマールゲート、Tゲートがあれば任意の計算が可能なことがわかっています。ただし、ノイズの影響により正しい計算ができるかどうか、その計算が早いかどうかは別問題だということに注意が必要です。

図14 古典コンピュータと量子コンピュータ

量子コンピュータの制約事項・課題

理想的な量子コンピュータは万能であり、古典コンピュータを凌ぐ能力があることはわかっています。ただし、まだまだ、多くの制約事項や課題をかかえています。

このように、現時点のハードウェアでは、演算中に発生するエラーで正しい計算を行うことが困難なことに加えて、コヒーレンス時間の制約から、深い量子回路の計算も困難です。誤り訂正ありの量子コンピュータが実現されて初めて、実用的な計算を行うことができると言われています。

量子コンピュータの現在

誤り訂正ありの量子コンピュータの実現は、まだまだ先のことです。現在実現されているハードウェアは、エラーの原因となるノイズがある中規模量子デバイス、Noisy Intermediate-Scale Quantumです。今後は、NISQと呼びます。現時点では、性能・機能に制約が多いNISQのうまい使い方の研究開発が進められていたり、誤り訂正ありの量子コンピュータの応用研究がすすめられている段階です。また、現在のNISQで解ける問題の規模は限られており、古典コンピュータで十分高速に解くことができます。

規模が大きくなると古典コンピュータで解くことが困難な問題の一つに、巡回セールスマン問題などの組み合わせ最適化問題があります。セールスマン巡回問題とは、セールスマンが所定の複数の都市を1回だけ巡回する最短経路を計算するというものです。都市数が増加すると計算量が急速に増加しますので、都市数が多くなると現実的な時間で計算が終わりません。このような問題を現実的な時間で解くことが、量子コンピュータに期待されていますが、残念ながら、現状では、量子コンピュータで扱える都市数が少ないとともに、古典コンピュータに勝る計算速度が実現されているわけではありません。今後の量子コンピュータの発展が期待されています。

量子アルゴリズムの種類

量子コンピュータでは、すべての状態の重ね合わせを準備し、順次、量子ゲートの操作を加えていき、量子ビット間の干渉を起こさせ、回答が高確率で得られるような特別なアルゴリズムが必要です。これは古典コンピュータで、様々なアルゴリズムが作られているのと同じです。量子アルゴリズムは、大きく2つに分類されます。

FTQCアルゴリズム

FTQCアルゴリズムの代表的なものには、以下のようなものがあります。

NISQアルゴリズム

NISQアルゴリズムには、以下のものがあります。

Python と IBM Quantum, Qiskit でプログラミング

現在利用可能なNISQを用いる前提で、どのような問題が解けるのか、アルゴリズムは実際どのようなものなのかを知るために、現在利用できるフレームワークを用いたプログラムを見てみましょう。

量子コンピューティングのフレームワークとしては、以下のように多くのものがあります。この中で、資料が充実していて、実機も無料で使えることなどを総合的に判断して、今回は、IBM Qiskit とPythonをもちいて量子コンピュータのプログラミングを解説していきます。

IBM Quantum実行環境

IBM Quantumのアカウント作成

まず、IBM Quantum URL: https://quantum-computing.ibm.com/ にアクセスして、Create an IBMid account で、IBMidを取得してください。

image-20211209104634063

IBM Quantum サインイン画面

取得したIBMidで、サインインするとIBM Quantum Welcome 画面が表示されます。API tokenは、IBM QuantumのAPIにアクセスするときに、必要になります。

IBM Quantum Welcome 画面

ここで、Launch Composer をクリックすると、下のようにGUIで量子回路の作成ができます。ここでは、Pythonを用いたプログラミングを扱いますので、詳細は割愛します。

Welcome画面で、Launch Lab をクリックすると、Jupyter Lab が起動します。標準のJupyter Lab とは、デザインが異なりますが、基本的な使い方は、同じです。Jupyter Labの使い方のは省略します。

Notebookの下のアイコンをクリックすると、Jupyter Lab が立ち上がります。その後、プログラミングを行うという流れです。

image-20211214101358706

IBM Quantum ローカル実行環境

以下のようにローカルにもインストールできますが、各種モジュールのバージョン依存関係などによりエラーが発生する可能性少なからずあります。IBM Quantum lab を使うことを、推奨します。

Anacondaのインストールと環境設定

Qiskitは、Python3.6以降がサポートされており、データサイエンス用のプラットフォームAnacondaが推奨されています。Anacondaのインストールについては、ネット上にも様々な情報がありますので、ここでは省略します。

Anacondaのconda コマンドを使ってQiskit専用の仮想環境を作成することをお勧めします。Anaconda プロンプトを使って以下のように環境を作成します。環境名である ENV_NAME は、各自選んだ適当な名前に変更してください。

新しい環境をアクティブにします。

pip をアップグレードします。

Qiskitパッケージをインストールします。

可視化機能やJupyter notebookを使うために、 visualization 機能を追加してインストールします。

Qiskit フレームワークの全体像

The Qiskit framework.

Terra

量子プログラムを実行する基盤です。いろいろなモジュールから成り立っています。以下、代表的な機能です。

Aer

Aer は、Terraでコンパイルされた回路を実行するためのC++言語で記述された 量子回路のシミュレーターです。Aerは実機で発生するエラーのノイズ・シミュレーションも含みます。3つのシミュレーターがあります。

  1. Qasm シミュレーター 量子回路を、ノイズがなし、またはノイズありで複数回実行し、結果を返します。
  2. 状態ベクトル(state vector)シミュレーター 量子回路をノイズなしで一回実行し状態ベクトルを返します。実機では、状態ベクトルは直接観測できず計測をしないといけませんが、状態ベクトルシミュレーターでは実行結果の状態ベクトルを知ることができます。あくまでシミュレーションであることに注意が必要です。
  3. ユニタリー・シミュレーター。 量子回路をノイズなしで、一回実行し、結果のユニタリー行列を返します。測定やリセット操作を含めることはできません。

Ignis

研究者を対象とした、エラー特定、ゲートの改良、ノイズ存在下での計算などを行うものです。

Aqua

化学や最適化、金融、AI などのアプリケーション用アルゴリズムを実装した量子計算のハイレベルAPIです。量子ゲートの操作などを意識することなく量子化学計算、量子機械学習、最適化、金融への応用などの量子コンピューティングのアプリケーションを作ることができます。

Qiskit とPython を用いた量子コンピュータのプログラミング

Qiskitのプログラムの基本的なステップ

ビルド:問題を解くための量子回路を作成します。

コンパイル:量子コンピュータの実機やシミュレーターで動作させるために回路をコンパイルします。

実行:コンパイルされた回路の演算を実行します。

分析:実行結果の統計処理を行い、実行結果を可視化します。

ビルドとコンパイルは、クラウドのIBM Quantum lab でも、ローカルにQiskit をインストールした環境でも、かまいません。ローカル環境から、実機を用いる場合は、APIを経由して、実機で計算が実行します。

プログラミングの実例

IBM Quantum にサインインして、Launch Lab をクリックし、Qiskit ノートブックを立ち上げます。セルに順次プログラムを入力し、セルを選択して、シフトキーとリターンキーを押すと、セルに入力したプログラムが実行されます。

ステップ 1 : パッケージをインポートする。

必要なパッケージをインポートし、使用するシュミレータを指定します。ここでは、Qasmシュミレータを用います。

ステップ 2 : 量子回路を定義する。

2つの量子ビットと2つの古典ビットからなる回路を作成します。おのおのビットはゼロに初期化されます。

ステップ 3 : ゲートを追加する。

ステップ4で可視化される回路を参照するとこのプログラムの意味が、よく理解できると思います。

circuit.h(0) : 初期化された量子ビット0を、アダマールゲートで重ね合わせ状態をつくります。

circuit.cx(0, 1) : 量子ビット0を制御ゲート、1をターゲットゲートとしたCNOTゲートで、量子ビット0と量子ビット1を、エンタングル状態にします。|ψ=(|00+|11)/2

circuit.measure([0,1], [0,1]) : 測定をします。 measure(qubit, cbit) qubit: 計測する量子ビット、cbit: 計測結果を保存する古典ビット

ステップ 4: 回路を可視化する

draw()を用いて、回路を可視化します。

 

image-20211214100258709

ステップ 5: 演算のシミュレーション

シュミレータ Qiskit Aer を用いてシミュレーションを行います。シミュレーションには、qasm_simulator を使います。

シミュレーション結果

ノイズを含むqusm_simulotorを使って、1000回シミュレーションを繰り返して、11となるのが483回、00となるのが、517回という結果になりました。状態ベクトルは、|ψ=(|00+|11)/2 で、演算結果が0になる確率 p0=|α|2=1/2 、1になる確率は、 p1=|β|2=1/2 ですので、0になる確率が、517/1000=0.517 と期待どおりの結果となりました。0.5にならないのは、ノイズの影響です。

ステップ6: 演算結果の可視化

Qiskit には、多くの可視化のやり方が含まれていますが、ここでは、plot_histogramという関数を用いて可視化を行います。

実機で実行

上では計算の実行にシュミレータを用いましたが、実機を用いて計算を実行させるには、ここまでのプログラムに、以下のプログラムを追加します。

まず、アカウント設定します。 MY_API_TOKEN には、ログイン時に表示されるAPI token をコビー&ペーストします。

 

Welcome画面

次に、設定したアカウントで使用可能な実機のリストを取得します。量子ビット数が1ビットのものがあり、1ビットの実機では、このプログラムは動作しませんので、稼働している実機のうち、量子ビット数が5以上のものをリストアップするようにしています。backendというのは、プログラムを実行する環境のことで、実機とシミュレーターがあります。

稼働している実機のリストが表示されます。実機の稼働状況は変わりますので、リストは取得時点により変わります。

次に、一番空いている実機を選択します。

実機でプログラムを実行します。

結果

image-20211214114951391

この結果を見ると、理論上は得られない|01|10が表れています。これは、実機の演算プロセスで発生したエラーによるものです。量子コンピュータの実機では、このようなエラーがあることが分かります。

汎用量子計算

現在、稼働していて我々が使うことのできる量子コンピュータは、量子ビット数が限られ、量子ビット間の接続にも制限があり、エラー率も高いので、NISQでの実行は難しいと考えられています。したがって、ここでは、汎用量子計算の代表的なアルゴリズムの紹介にとどめます。

量子フーリエ変換(Quantum Fourier Transform, QFT)

離散フーリエ変換を量子コンピュータで実行するアルゴリズムです。離散フーリエ変換は、式(27)に従って、ベクトル (x0,,xN1) をベクトル (y0,,yN1) に変換します。xN1 をAD変換された時間信号とすると、yN1 は周波数スペクトルになります。古典コテンコピュータで、この変換を高速に行うのが、高速フーリエ変換 (fast Fourier transform, FFT) です。古典コンピュータのFFTをさらに高速に実行しようとするのが、量子フーリエ変換です。量子フーリエ変換は、いろいろな量子アルゴリズムの構成要素として用いられます。回路が複雑で、入力状態をどう準備するのかの問題があります。

 

yk=1Nj=0N1xjωNjk,  ωNjk=e2πijkN(27)

量子フーリ工変換は、式(28)に従って、量子状態 i=0N1xi|i を、 量子状態 i=0N1yi|i に変換します。 |i は、整数 i の進数での表示 i1in(im=0,1) に対応する量子状態 |i1in を表します。(例えば、|2=|0010,|5=|00101 などです。)

yk=1Nj=0N1xjωNjk(28)

ケットベクトルを用いて、式(29)のように表すこともできます。

|x1Ny=0N1ωNxy|y(29)

ユニタリ行列として表現すると、式(30)のようになります。QFTは、まとめてユニタリ行列として、扱われることがあります。

UQFT=1Nx=0N1y=0N1ωNxy|yx|(30)

回路図は以下のようになります。

QFT

量子フーリエ変換回路図

Rl は、式 (31) の角度 2π/2l の一般位相ゲートです。

Rl=(100ei2π2l) (31)

量子位相推定(Quantum Phase Estimation, QPE)

ユニタリ行列の固有値を求めるアルゴリズムです。多くの量子アルゴリズムの構成要素として用いられます。ユ二タリ行列 Uが、U|ψ=e2πiθ|ψ であたえられた場合に、θ を推定するアルゴリズムです。ここで、 |ψ は、固有ベクトルで、e2πiθ は、固有ベクトルに対応する固有値です。固有ベクトルが重ね合わせられた|ψから固有値を推定するものだと言うこともできます。

量子位相推定、QPEの応用としては、以下のようなものがあります。

  1. 素因数分解問題が解ける。 位数という数を推定し、素因数分解をすることができる。
  2. 量子系のエネルギー計算ができる。 エネルギーはハミルトニアンと呼ばれる行列の固有値によって与えらます。基底状態のエネルギーは最小の固有値、状態ベクトルは固有ベクトルで与えらます。ハミルトニアン自体はユニタリー行列ではありませんが、工夫を加えることによって、量子位相推定でエネルギーを計算することができます。
  3. 連立一次方程式 Ax=b を解くことができる。 固有値・固有ベクトルが求められるということは、連立一次方程式が解けるということです。また、機械学習への応用も期待されています。

Shorのアルゴリズム

素因数分解を高速にとく量子アルゴリズムです。素因数分解は、自然数 N(1,2,3,) に対して、N=pq となる素数、p,q を求めるというものです。この問題が、古典コンピュータでは高速に解けないことが、RSAなど暗号の基礎となっています。

この素因数問題の解き方は、N を偶数として、以下のようになります。

  1. 1 から N1 までの数 x を1つ選びます。
  2. xN の最大公約数を計算します。 最大公約数が1でなければ、その最大公約数が素因数です。 最大公約数が1の場合、次に進みます。
  3. xr を、Nで割った余りが1になる r を求めます。数式で書くと xr mod N=1 です。 r が偶数で、 (xr/2+1) mod N0 の条件を満たせば、xr/21Nの最大公約数が素因数となります。条件が満たされないなら、1.に戻ります。

この中で、xr mod N=1 を求める問題を量子アルゴリズムを用いて高速に解くというのがShorのアルゴリズムです。

回路は、量子位相推定と似たものですが、ここでは割愛します。

Shorのアルゴリズムを用いても、現在の量子コンピュータでは、エラーがあることと、量子ビットの数が限られていることから、すぐさま暗号が解読されるレベルの素因数分解の解を求めることはできません。

量子古典ハイブリッドアルゴリズム

量子アルゴリズムだけのプログラムは、現時点では、エラーが多く発生し、また量子ビット数が限らることから、正しく動作しません。そこで、現在も利用可能で、量子ビット数が着実に増えているNISQ(Noisy Intermediate-Scale Quantum technology、小・中規模でノイズを含む量子コンピュータ)の活用方法の開発が盛んに行われています。その多くが、量子コンピュータでは、ビット数の少ないパラメータ付き量子回路を動作させ、古典コンピュータで、そのパラメータを探索・最適化する量子古典ハイブリッドアルゴリズムです。

量子古典ハイブリッドアルゴリズムの基本

回転角度をパラメータ θ にする回転ゲートなどを用いてパラメータ付き量子回路 Un をつくり連結した回路を準備します。その回路に、初期状態を入力し、計測結果からコストを計算した後、コストが最低になるようにパラメータ付き量子回路のパラメータを最適化します。この量子回路は、深層学習におけるモデルと似ています。機械学習、深層学習においては、モデルのパラメータをコストを下げるように、繰り返し、学習を進行させます。深層学習のレイヤーが、各パラメータ付き量子回路 Un に相当します。同様の手法を用いるのが、量子古典ハイブリッドアルゴリズムです。コストが小さくなるようにパラメータを調節するのが、オプティマイザの役割です。コスト関数は、以下にの具体例で述べるように、問題を定式化(値が小さくなるほど望ましい数式で表すこと)したものを用います。最低のコストが求まれば、問題が解けたことになります。

古典コンピュータの深層学習モデルより、量子回路は少ない量子ビット数でも、高い表現力を持つところから、NISQでも実行可能な実用的な計算ができることが期待されています。量子化学計算、組み合わせ最適化問題、機械学習などへの応用が進められています。

ハミルトニアンと期待値

量子状態にハミルトニアンを掛けるとエネルギーになりますので、ハミルトニアンは、量子状態をエネルギーに変換する行列だということができます。量子状態 |ψ に対するエネルギーの期待値は、ψ|H|ψ と書けます。量子は、通常、エネルギーが一番低い状態となっていることが多く、それは、どのような状態なのかが問題になります。また、最適化問題は、問題をエネルギーの形で書き表して、エネルギーの期待値を最小化するという問題と理解することができます。

量子変分アルゴリズム VQE

Variational Quantum Eigen solver(変分量子固有値ソルバー、VQEと略されます)は、量子状態を用いてエネルギーが最小になる基底状態を探索するアルゴリズムです。

分子の性質は、電子の状態によって決まり、その電子の状態は、シュレディンガー方程式 H|ψ=E|ψ を解くことによって、明らかになります。ハミルトニアンは、分子の構造などで決まります。 シュレディンガー方程式を解くということは、ハミルトニアン H の固有値 Ei と対応する固有ベクトル |ϕiを求めることと同じです。このとき固有値 Ei は、固有状態 |ϕiのエネルギーとなります。この問題をとくことは、量子化学計算と呼ばれています。電子の数が増加すると指数的に難しくなるため、厳密に解くことは実質不可能になります。そこで、いかに解を近似するかが課題になります。

式(32)に示すように、VQEは、様々な量子状態 |ψ についてそのエネルギーを計算すると、その期待値が基底エネルギー E0よりも高くなるという原理に基づいています。

ψ|H|ψE0 (32)

網羅的に様々な状態にたいするエネルギーを計算するのは、効率が悪いため、パラメータ付きの量子状態 |ψ(θ)を用いて、ψ(θ)|H|ψ(θ) を最小化する θ を発見的に見つけようというのがVQEです。

  1. 量子コンピュータ上で量子状態 |ψ(θ) を生成します。
  2. H(θ)=ψ(θ)|H|ψ(θ) を測定します。
  3. 測定結果をもとに、古典コンピュータによって ψ(θ)|H|ψ(θ) が小さくなるように θ を更新し、1.に戻ります。

これを ψ(θ)|H|ψ(θ) が収束するまで繰り返します。

Qiskit プログラム例

ここではH-He+(水素化ヘリウムイオン)の基底エネルギーを求めてみましょう。量子コンピュータの実機では、測定を行うためにパラメータ量子状態に、ハミルトニアンを対角化するためのゲートを追加する必要がありますが、ここでは、簡単のため計算途中の量子状態を得ることができる量子状態シミュレータのプログラムを示します。 以下はdojo.qulacs.orgに掲載されたコードをQiskitで書き直したものです。

まず、必要なモジュールをインポートします。

ハミルトニアンを準備します。H-He間の距離が0.9オングストロームの時のハミルトニアンです。このハミルトニアンの固有状態を計算することによって、HHe+分子の性質がわかります。

パラメータ付き量子回路を作成する関数を準備します。

出来上がった量子回路を、パラメータを、θ0θ5 として、次のプログラムで表示すると以下のようになります。

 

image-20211226171313045

パラメータ θ に対する期待値 ψ(θ)|H|ψ(θ) を計算する関数を定義します。

scipy の古典最適化関数 minimize で、基底エネルギをあたえるθ をもとめます。ランダムな初期値から始めて、上で定義したcost_func を呼び出し、損失関数の最小値となるまでパラメータ θ を更新して計算を繰り返します。

計算結果です。これで、H-He間の距離が0.9オングストロームの場合の基底エネルギーが求まりました。この問題を厳密(ミルトニアンを対角化)に解いた解、-2.8626207640766816 と小数点以下第三位まで一致しています。

QAOA

QAOA は、Quantum Approximate Optimization Algorithm の略で、量子近似最適化アルゴリズムと呼ばれるものです。組み合わせ最適化問題を解くためのアルゴリズムです。組み合わせ最適化問題には、巡回セールスマン問題、配車ルートの問題、集合被覆問題、ナップサック問題、スケジューリング問題などがあります。これらの問題には、意味のある時間内で正確な解を見つけることが非現実的なものが含まれるため、近似アルゴリズムが必要となります。このアルゴリズムを理解するには、量子断熱計算と呼ばれる知識が必要ですが、ここではQAOAのアルゴリズムの紹介と使い方の説明をすることにとどめます。

まず、0か1 の値をとるn個の変数 z1,z2,,zn について、式(33)のコスト関数が最小になるような zn の組み合わせを探索する問題として、最適化問題を定式化します。

C(z)=i,jcijzizj (33)

初期状態をつくるハミルトニアンを B、 最適解に相当するハミルトニアンを C(Z) とし、 β=(β1,βp),γ=(γ1,γp) をパラメータとして、式(34)のような量子状態を考えます。

|s=|+n|β,γ=UB(βp)UC(γp)UB(βp1)UC(γp1)UB(β1)UC(γ1)|s (34)

ここで |+=12(|0+|1) で、 UCγ),UB(β) は 式(35)のとおりです。

UC(γ)=eiγC(Z)UB(β)=eiβB(35)

初期状態 B の代表的なものは、X (パウリ演算子)です。X 以外にも、様々なハミルトニアンが工夫されていて、ミキサ・ハミルトニアンと呼ばれます。

そして、 F(β,γ)=β,γ|C(Z)|β,γ を最小にするような β,γ を探索することで、元々の 最適化問題の答えを求めようとするのが、QAOAアルゴリズムです。

Qiskit プログラム例 Maxcut

手順は、以下の通りです。

  1. 問題の定式化
  2. コスト関数に変換
  3. 量子回路の作成
  4. 量子回路と古典オプティマイザをもちいて最適なパラメータを求める
  5. 得られたパラメータでQAOA回路をつくり結果を分析する。

まず、必要なパッケージをインポートします。

4個の頂点 V=0,1,2,3 と、4つの辺 E=(0,1),(1,2),(2,3),(3,0) を持つグラフを考えます。このグラフのを2つに分割するときに、分割される辺の数の最大値を求める問題を考えます。これは、Maxcut問題と呼ばれています。

Python のnetworkxというモジュールでグラフを作成し描画するとこのようになります。

image-20220103224151332

このグラフ G(V,E) において、頂点を2つに分割して、一つのグループにたいして、xi=0 、他のグループに対して、xi=1 を与えると、分割した各々のグループの頂点を結ぶ辺の数をコスト関数とすれば、式(36)のように、問題を定式化できます。

C(x)=i,j=1nxi(1xj)=(i,j)E(xi(1xj)+xj(1xi)) (36)

このような形式は、QUBO (Quadratic Unconstrained Binary Optimization) と呼ばれます。

これをハミルトニアンに、変換するには、xi=(1Zi)/2  (Zi は、パウリZ演算子)とすればよく、式(37)のようになります。

C(Z)=(j,k)E12(1ZjZk)(37)

この問題のグラフでは、式(38)のようになります。

C(Z)=12(1Z0Z1)12(1Z1Z2)12(1Z2Z3)12(1Z3Z1)=12(Z0Z1+Z1Z2+Z2Z3+Z3Z1)2 (38)

2 は、定数ですので、コスト関数としては、2 を考慮する必要はありません。したがって、コスト関数は式(39)のようになります。

C(Z)=12(Z0Z1+Z1Z2+Z2Z3+Z3Z1)(39)

初期状態としては、式(40)の通り、X (パウリ演算子)をもちいます。

B=i=1nXi(40)

作成される回路は次の通りです。

Maxcut 回路図

 

次に、scipyの古典最適化モジュールで、最適値を求めます。

fun: -2.994140625 ​ maxcv: 0.0 message: 'Optimization terminated successfully.' ​ nfev: 30 ​ status: 1 success: True ​ x: array([1.9793337 , 1.16663483])

最適化が終了し、x すなわち βγ の最適値 [1.9793337 , 1.16663483] が求まりました。

次に、最適化されたパラメータ βγ で、QAOA回路をつくり、結果の分析をします。

 

image-20220103224856418

ビット列「0101」と「1010」(すなわち頂点0と頂点2、頂点3と頂点1でカットする)の確率が最も高く、図25に示すように、最大の辺の数が、4つである分割となっています。

image-20220104091124282

Maxcut の計算結果

このプログラムを見て、複雑だと思われた読者も多いと思いますが、心配はいりません。IBM Qiskit には、QAOAのゲート回路などをプログラミングすることなく問題を解くことができるハイレベルAPIが準備されています。

[上記のプログラムは、IBM qiskit テキストブックの Solving combinatorial optimization problems using QAOA https://qiskit.org/textbook/ch-applications/qaoa.html の一部で、コメントを日本語に修正しています。]

Qiskitを用いてVQE,QAOA で実問題を解く

ここでは、IBM quantum challenge fall 2021(https://github.com/qiskit-community/ibm-quantum-challenge-fall-2021) から、興味深い実問題の解法を紹介します。Python と Qiskit を用いたプログラムです。Qiskit のハイレベルAPIを用いることによって、実問題を簡単に解くことができます。

ポートフォリオ最適化

ポートフォリオとは、株式などの金融資産の組み合わせのことです。ポートフォリオ最適化のゴールは、リスクを最小化し、リターンを最大化することですが、リスクとリターンは通常トレードオフの関係にあります。積極的に大きなリターンを得ようとするなら、リスクが大きい金融資産を多く所有し、手堅く運用したいなら、リスクが小さい金融資産に多くを配分することになります。最適な配分を決めることは、そう簡単ではありません。

最適な配分を決める方法として、現代ポートフォリオ理論というものがあります。リスクを避けながら、いかにリターンを大きくするかという方針にもとづいて最適な配分を行うというものです。

そのためには、以下のことを行います。

四銘柄のポートフォリオ最適化問題

こでは、株式4銘柄の、リスクとリターンの間のトレードオフを最小化する配分を見つけることを問題とします。

問題の定式化

xi: 銘柄の配分、保有するときは1、保有しない場合は0

n: 保有対象の銘柄数

σi,j:2つの銘柄の値動きが、どう相関しているかの指標である共分散です。2つの銘柄が同時に上がる関係にあるなら正の値、一つが上がればもう一つが下がる関係にあるなら、負の値をとり、値の絶対値が、その度合を示します。リスクは、同じ値動きをする銘柄を保有するときに高く、逆の銘柄を保有するときは、低くなるような指標です。行列の形にしたものを、共分散行列 Σ と表記します。

q: リスクファクタ(リスク許容度)、0から1の間の値をとり、どの程度のリスクを取るか、取れるかを決める指標です。

μi: 各銘柄の期待リターン

B: 保有する銘柄の数

として、(41)のように定式化できます。第一項が、ポートフォリオのリスク(保有する銘柄間の共分散を足し合わせるたものに保有する銘柄数を足したもの)にリスクファクタを掛けたもの、第二項がポートフォリオのリターンを表しています。つまり、リスクを抑えつつ、リターンを大きくしようとすることを数式化したものです。。

qi,jσi,jxixjiμixiinxi=B (41)

ゴール

どの銘柄を選ぶか、選ばないかの xi を見つけることです。

仮定

問題を簡単にするため、以下の仮定を置きます。

ライブラリのインポート
時系列データ(金融データ)の生成

RandomDataProviderクラスを使って、4銘柄のランダムな値動きデータを作成します。バジェットを2として、4銘柄から2銘柄を選択することとし、リスクファクタを0.5にします。

img

期待リターンと共分散行列の計算

get_period_return_mean_vector() メソッドで、期待リータンが計算できます。

[1.59702144e-04 4.76518943e-04 2.39123234e-04 9.85029012e-05]

4銘柄に対しての期待するリターンが、求まりました。次に、共分散行列の計算を行い、表示します。

img

共分散行列 Σ は、2つの銘柄の期待リターンがどのように関連するかを表します。対角成分(図の黄色で示された値)は、ある銘柄自身との関係を示しています。 共分散行列の見方は次の通りです。

違う動きをする銘柄に投資することはリスクを減らす効果があります。

Qiskit Finance のポートフォリオ最適化クラス

PortfolioOptimization クラスを使うと、μ,Σ,q,B から自動的に、QUBOで問題が定式化されます。ポートフォリオの資産選択の変数が、バイナリ変数(0,1)なので、「bounds = None」と設定します。

定式化した結果が出力されます。

Minimize (最小化するコスト関数、x_0, x_1,x_2,x_3 が変数) obj: - 0.000159702144 x_0 - 0.000476518943 x_1 - 0.000239123234 x_2 - 0.000098502901 x_3 + [ 0.000048831990 x_0^2 - 0.000002157372 x_0x_1 - 0.000004259230 x_0x_2 + 0.000001413200 x_0x_3 + 0.000997360142 x_1^2 + 0.000007031887 x_1x_2 + 0.000000737432 x_1x_3 + 0.000287365468 x_2^2 + 0.000006416382 x_2x_3 + 0.000192316728 x_3^2 ]/2 Subject To (制約条件) c0: x_0 + x_1 + x_2 + x_3 = 2

Bounds (値の範囲) 0 <= x_0 <= 1 0 <= x_1 <= 1 0 <= x_2 <= 1 0 <= x_3 <= 1

Binaries (バイナリ変数) x_0 x_1 x_2 x_3

Minimum Eigen Optimizer(最小固有値オプティマイザー)

このポートフォリオ最適化問題は、ハミルトニアンの基底状態を求める問題として解くことができます。ハミルトニアンを考えると、シミュレーションしたいシステムのエネルギー関数と考えることができます。そのためには、図に示すように、QUBOで定式化したものを、イジングモデルと呼ばれる数学モデルで表現し、さらにハミルトニアンに変換するという複雑な計算を行わないといけません。Qiskit は、これらの変換を自動的にやってくれます。MinimumEigenOptimizer(最小固有値オプティマイザー)が、QUBOをハミルトニアンに変換し、VQEやQAOAなどを呼び出して基底状態を計算し、最適化の結果を返します。

最適化問題の解法の流れ

古典コンピュータの最適化アルゴリズムで問題を解く

この規模の問題は、古典コンピュータの最適化アルゴリズムで解くことができます。

以下のような結果がでました。

optimal function value: -0.00023285626449450202 (コスト関数の最適値) optimal value: [1. 0. 1. 0.] (最適値つまりどの銘柄を保有するかは、$x_0 =1, x_1 = 0, x_2 = 1, x_3 = 0) status: SUCCESS (計算は成功)

VQEを使ったソリューション

optimal function value: -0.00023285626449450202 (コスト関数の最適値) optimal value: [1. 0. 1. 0.] (最適値つまりどの銘柄を保有するかは、x_0 =1, x_1 = 0, x_2 = 1, x_3 = 0) status: SUCCESS (計算は成功)

古典コンピュータの最適化アルゴリズムと同じ答えが得られました。

用いている量子回路は、次の通りです。

img

QAOAを使ったソリューション

optimal function value: -0.00023285626449450202 (コスト関数の最適値) optimal value: [1. 0. 1. 0.] (最適値つまりどの銘柄を保有するかは、$x_0 =1, x_1 = 0, x_2 = 1, x_3 = 0) status: SUCCESS (計算は成功)

古典コンピュータの最適化アルゴリズムと同じ答えが得られました。

このように、Qiskit では、ポートフォリオ最適化を、量子回路を強く意識することなく解くことができます。VQEでは、パラメータ付き量子回路の設定をしなければなりませんが、QAOAでは、アルゴリズム自体にパラメータ付き量子回路が含まれているため、その必要性はありません。

このプログラムは、ibm-quantum-challenge-fall-2021challenge-1 のコメントを日本語に修正したものです。

ナップザック問題

ナップサック問題は、図28に示すように、それぞれに重量と価値がある品物リストと、運べる重量の最大値が決められたナップサックがあったとして、なるべく多くの価値になるように品物を選ぶ問題です。

imgImage

ナップザック問題 図:Knapsack.svg.

一般的なナップサック問題をQAOAで解く

問題:容量18のナップサックと5つの荷物があります。荷物の各重量𝑊Wが𝑤𝑖=[4,5,6,7,8]で、価値が𝑣𝑖=[5,6,7,8,9] の場合、重量制限である18kg以内で荷物の価値の合計が最大になる収納方法を見つけてください。

動的計画法(古典コンピュータによる計算)

古典コンピュータで、正確な解を見つけるための典型的な方法である動的計画法によるプログラムは、次のとおりです。この手法の時間計算量は、荷物の数×ナップサックの最大重量に比例します。この場合は、組み合わせの数が限られているため、短時間で問題を解くことができますが、荷物の数が膨大になると、この方法を使うことは、現実的ではありません。 動的計画法というのは、「対象となる問題を複数の部分問題に分割し、部分問題の計算結果を記録しながら解いていく手法」の総称ですが、ここでは古典コンピュータでも、このように解けるというのにとどめ、アルゴリズムの詳細説明は長くなりますので、省略します。

optimal value: 21

index of the chosen items: 1 2 3

計算結果として、荷物1(価値6,重さ5)と2(価値7,重さ6)と3(価値8,重さ7)を運べば、運べる価値は、21という結果がでました。

QAOAによる解法

Qiskitは、ナップサック問題を含むさまざまな最適化問題のアプリケーションクラスを提供しているため、様々な最適化問題を量子コンピューターで簡単に試すことができます。ここでは、Knapsack問題のアプリケーションクラスを使用します。

ナップサック問題をQAOAで解く最適化問題として解くには、この問題を定式化しQUBOを作成する必要があります。

Maximize (最大化するコスト関数、x_0, x_1,x_2,x_3,x_4 が変数なので運べる総価値) obj: 5 x_0 + 6 x_1 + 7 x_2 + 8 x_3 + 9 x_4 Subject To (制約条件、総重量が18以下) c0: 4 x_0 + 5 x_1 + 6 x_2 + 7 x_3 + 8 x_4 <= 18

Bounds (値の範囲) 0 <= x_0 <= 1 0 <= x_1 <= 1 0 <= x_2 <= 1 0 <= x_3 <= 1 0 <= x_4 <= 1

Binaries (バイナリ変数) x_0 x_1 x_2 x_3 x_4

このように、Kanpsackクラスを用いて、ナップザック問題のQUBOが作成できました。

古典コンピュータによる最適化のNumPyMinimumEigensolverを使用しても、最適化ができます。また、QAOAを適用することもできます。

result: optimal function value: 21.0 optimal value: [0. 1. 1. 1. 0.] status: SUCCESS

index of the chosen items: [1, 2, 3]

計算結果として、荷物1(価値6,重さ5)と2(価値7,重さ6)と3(価値8,重さ7)を運べば、運べる価値は、21という結果がでました。

result: optimal function value: 21.0 optimal value: [0. 1. 1. 1. 0.] status: SUCCESS

index of the chosen items: [1, 2, 3]

計算結果として、荷物1(価値6,重さ5)と2(価値7,重さ6)と3(価値8,重さ7)を運べば、運べる価値は、21という結果がでました。

QAOAは近似解のため、QAOAによる解が常に最適であるとは限らないことには注意が必要です。

蓄電池システムの収益最大化

蓄電池システムは、再生可能エネルギー(風力や太陽光など)を、蓄電池に充電し、決められた時間枠に電力網に電力を供給するものです。蓄電池システムの収益を最適化するためには、価格予測に基づいた市場での収益(価値)と、予想される電池の経年劣化(コスト)の両方を考慮して、各時間枠においてどの市場で電力を販売するのかを選択する必要があります。

問題設定

2つの市場M1,M2 を考えます。時間枠は最大n個あり、電池は各時間枠(通常は1日)において、どちらか一方の市場で蓄電池システムを動作させます。 t(日)と各市場において、以下が既知であると仮定します:

問題は、Cmax サイクル以下のコストで寿命時間と収益を最適化したいことです。zt を、時間枠 t で、M1 市場で販売する場合は、zt=0M2 市場で販売する場合は、zt=1 とすると、問題は、式(42)、(43)のように定式化できます。

() t=1n(1zt)λ1t+ztλ2t(42)t=1n[(1zt)c1t+ztc2t]Cmax (43)
電池による収益の最適化をQAOAで解く
 Qiskit optimization knapsackクラスとQAOAを使って蓄電池システムのスケジュールを最適化し、次の条件下で Cmax  以内のコストで収益の合計を最大化します。  - 時間枠の数 t=7 - 日々の収益 λ1=[5,3,3,6,9,7,1] - 日々の収益 λ2=[8,4,5,12,10,11,2] - 日々の電池の劣化 c1=[1,1,2,1,1,1,2] - 日々の電池の劣化 c2=[3,2,3,2,4,3,3] - Cmax =16

パラメータを設定する

問題をナップザック問題として定式化する

[3, 1, 2, 6, 1, 4, 1] [2, 1, 1, 1, 3, 2, 1] 7 (収益、劣化、最大劣化)

Maximize (最大化するコスト関数、収益) obj: 3 x_0 + x_1 + 2 x_2 + 6 x_3 + x_4 + 4 x_5 + x_6 Subject To (制約条件、劣化) c0: 2 x_0 + x_1 + x_2 + x_3 + 3 x_4 + 2 x_5 + x_6 <= 7

Bounds (値の範囲) 0 <= x_0 <= 1 0 <= x_1 <= 1 0 <= x_2 <= 1 0 <= x_3 <= 1 0 <= x_4 <= 1 0 <= x_5 <= 1 0 <= x_6 <= 1

Binaries (バイナリ変数) x_0 x_1 x_2 x_3 x_4 x_5 x_6

QAOAを用いて問題を解く

result: [1. 1. 1. 1. 0. 1. 0.] (販売する市場は、M2, M2, M2, M2, M1, M2, M1 という結果です。) total revenue: 50 (総収益は、50です。)

解答が求まりました。

[このプログラムは、ibm-quantum-challenge-fall-2021(https://github.com/qiskit-community/ibm-quantum-challenge-fall-2021) challenge-4 の一部のプログラムのコメントを日本語に修正したものです。]

量子機械学習

量子古典ハイブリッド機械学習

量子古典ハイブリッドアルゴリズムの基本で見たように、パラメータ付き量子回路を用いたVQE、QAOAは機械学習と似たたアルゴリズムです。つまり、量子コンピューティングは、機械学習にも応用が可能です。もちろん、古典コンピューティングと量子コンピューティングは、違いますので、その差を埋める必要があります。

1. 入力データの量子状態へのエンコーディング

まず、入力データを量子状態にエンコーディングしないといけません。入力データに対応した回転ゲート操作(図29)をします。

回転ゲート

2. 学習用量子回路

次に、古典機械学習のモデルに相当する学習用量子回路を準備します。古典機械学習で、さまざまなモデルが用いられるように、学習用量子回路は、さまざまなものが考えられます。学習用量子回路を構成する量子ゲートをパラメータ付きとし、そのパラメータが、古典機械学習における重みに相当します。古典機械学習では、活性化関数のもつ非線形性が重要な働きをしますが、量子機械学習では測定が、その働きをします。学習用量子回路の出力は、一般的には、測定結果の期待値です。

3. 損失関数

入力データ x 、量子ゲートの回転角パラメー 夕 θ を変数に持つ学習用量子回路の出力を h(x,θ) とし、教師データを y とすると損 失関数は式(44)のように定義されます。損失関数が最小となるように、学習用量子回路の訓練を行います。

L(h(x,θ),y) (44)
4.回路パラメータ更新

古典量子ハイブリッドアルゴリズム VQEやQAOAと同様に、損失関数の計算と、θ の最適化は、古典コンピュータで行われます。ニューラルネットワークにおいては、パラメータ更新は、損失関数の勾配を出力側から入力側へ伝搬させる逆誤差伝搬法が用いられますが、回路の途中の状態ベクトルが直接計測できないため、量子回路ではつかえません。そこで、パラ メータ θi の微小変化について損失関数の差分をとることによって、式(45)の損失関数の θi についての勾配を計算します。

Lθi=L(θ+Δθi)L(θ)Δ(45)

量子機械学習の実例

ここでは、Qiskit のテキストブック Qiskitを使った量子計算の学習 の中から、PyTorchとQiskitを用いた量子古典ハイブリッド・ニューラル・ネットワーク( https://qiskit.org/textbook/ja/ch-machine-learning/machine-learning-qiskit-pytorch.html)に掲載されているプログラムを見てみることにします。プログラムのコメントを日本語化し、プログラムの一部を用いています。

MNIST の手書き文字のなかから、0と1の数字を分類するという簡単なものです。ネットワークの構成は、次のの通りです。まず、MNISTの手書き文字を、二段階の二次元CNNとmax pooling を行い、フラット化し、2層のフルコネクト層をへて、サイズを1まで縮小します。最後のフルコネクト層の出力値が、パラメータ θ として量子回路に渡されます。

ネットワークの構成

パッケージのインポート

まず、必要なパッケージをインポートします。

Qiskitを用いた量子回路を作成します

ネットワーク構成の量子回路の部分です。

barrierは、回路の一部を分離するためのもので、回路コンパイル時に最適化または書き換えをバリア間でのみに制限する設定です。

PyTorchを用いた量子古典回路の作成

PyTorchを使った逆誤差伝搬に必要な関数です。逆誤差伝搬は、損失関数の差分をとることによって、損失関数の 勾配を直接計算します。古典機械学習において、逆誤差伝搬に深く立ち入らないように、ここでも、プログラムの詳細には立ち入りません。上で作成した量子回路の順伝搬、逆伝搬を行うためのクラスであるということに留めます。

データの準備

まず、MNISTのデータから、0と1を含む画像を選択します。

学習データ

学習データの表示

image-20220111112904367

テストデータ

ハイブリッド・ニューラルネットワークの作成

ネットワーク構成に示したように、コンボリューションとマックスプーリングなどからなる古典ニューラルネットワークと、一つのパラメータをもった量子回路からなるハイブリッド・ニューラルネットワークを作成します。

ネットワークの学習

最適化法として Adam 学習率 0.001 負の対数尤度損失関数、エポック数20でネットワークを学習させます。

Training [5%] Loss: -0.7380 Training [10%] Loss: -0.9153 Training [15%] Loss: -0.9282 Training [20%] Loss: -0.9393 Training [25%] Loss: -0.9463 Training [30%] Loss: -0.9515 Training [35%] Loss: -0.9585 Training [40%] Loss: -0.9637 Training [45%] Loss: -0.9713 Training [50%] Loss: -0.9657 Training [55%] Loss: -0.9710 Training [60%] Loss: -0.9758 Training [65%] Loss: -0.9765 Training [70%] Loss: -0.9804 Training [75%] Loss: -0.9873 Training [80%] Loss: -0.9887 Training [85%] Loss: -0.9894 Training [90%] Loss: -0.9873 Training [95%] Loss: -0.9904 Training [100%] Loss: -0.9870

学習曲線を表示します

img

テストを行います。

Performance on test data: Loss: -0.9847 Accuracy: 100.0%

損失は、-0.9837、精度は、100%です。

推論結果を表示します

img

ただしく推論ができています。

このプログラムは、あくまで量子機械学習の概念を示すために作成されています。このネットワークは、量子層がなくても、ちゃんと学習されます。また、量子回路も、エンタングルメントを含まないものです。量子機械学習を有効なものにするには、さらなる改善が必要です。

サンプルプログラムについて

サンプルプログラムは 、 Apache 2.0ライセンス で配布されているプログラムが含まれています。各サンプルプログラムには、出典を明記するとともに、変更を加えた場合は、変更点を記載しています。

参考文献

(1)IBM Quantumで学ぶ量子コンピュータ 湊雄一郎他著

(2)インターフェース 2019年3月号

(3)Qiskit 0.32.0 documentation (Japanese)

(4)Qiskit を使った量子計算の学習

(5)Qiskit API ドキュメンテーション

(6)ibm-quantum-challenge-fall-2021

(7)Quantum Native Dojo

(8)Qmedia

(9)量子コンピューターの基礎 藤井 啓祐 オペレーションズ・リサーチ 2018 年 6 月号

(10)量子コンピュータの応用 - QAOAの仕組みとこれを応用した組合せ最適化問題のプログラミング

(11)Solving combinatorial optimization problems using QAOA

(12)QC — How to build a Quantum Computer with Superconducting Circuit?

(13)IBM Research Blog What’s in a qubit?

(14)P. J. J. O’Malley et al., Scalable Quantum Simulation of Molecular Energies, PHYSICAL REVIEW X 6, 031007 (2016)


Copyright © AiSpirits All Rights Reserved.