こんにちは、量子コンピュータですが、NISQと呼ばれるエラーありはあまり使えず、かといってFTQCというエラー訂正モデルはまだ20年かかりそうという状況で多くの量子技術者が路頭に迷っています。blueqatでは人数を採用しすぎないことで対応していますが、最近では機械学習との親和性の高さを活かし、様々なシーンで活躍するエンジニアも出てきました。
このような成功事例を中心に、機械学習と量子計算の親和性の高い技術を中心に近年発展めざましいGPU技術との統合により量子コンピュータを利用しやすくしております。この機会に量子計算と機械学習をビジネス応用前提でインターンを行います。
諸説明
募集要項
https://blueqat.com/yuichiro_minato2/9fc571d6-53c3-4c0e-9bbb-1e5452ee2cea
講義内容
1、インターンの諸説明と量子回路の基礎(本講義)
3、パラメータ化量子回路と量子機械学習、SGDと古典最適化処理
3、量子最適化と固有値問題、VQE/QAOA、量子断熱計算とMixer
5、量子機械学習を利用したOpenAI Gymでの量子強化学習
環境
V100のGPU環境を利用します。インターン中は共有のGPU環境を利用します。自分のJupyter環境を利用しても構いません。
Google Colabにしました。
講義日程の予約
インターン参加者にはミーティングの予約システムのリンクが送られますので、好きな日程で五回登録してもらいます。
講義1回目:量子回路の基礎
量子コンピュータは従来のコンピュータとは異なり、量子ビットと呼ばれる専用の計算素子を利用します。従来のコンピュータでは、ビットと呼ばれる0と1の計算を行いますが、量子コンピュータではこの量子ビットは特殊なデータの持ち方をします。
1量子ビットの量子データ
ブロッホ球は1つの量子ビットの量子データの状態を表すのによく利用されます。基本的には北極の位置にある0の状態からスタートして、半径1の球の表面を中心から回転操作を通じてデータが移動します。
引用:https://ja.wikipedia.org/wiki/ブロッホ球
量子ゲート
量子コンピュータでは、この量子データの状態を量子状態と呼び、量子データや状態を量子ゲートを利用して操作を行います。量子回路はこのような量子操作を記述した音符のようなものです。量子コンピュータのプログラミングでは、この量子回路を書いてきます。
pip install blueqat
でツールをインストールして下記のように書くと、
from blueqat import Circuit
Circuit().h[0].cx[0,1].x[2].run(backend="draw")
これが量子回路です。一番左は量子ビットを表し、最初は0の状態です。HやXは操作を表し、球の上での回転を表します。Xから上に棒が伸びているようなものは2量子ビットゲートと呼ばれ、q0の量子ビットが0の場合には何もしませんが、1の場合にはq1の量子ビットにXの操作を行います。
X,Y,Zなどの操作は、固定回転ゲートと呼ばれていて、それぞれx,y,z軸周りに180度回転を表します。
Hは特殊なゲートで、XZの間45度の軸回りに180度回転します。これによってZ軸のデータをXY平面に移すことができる便利なゲートです。もう一回操作すると、XY平面上のデータをZ軸に戻すことができます。
まだ出てきていませんが、RX,RY,RZなどはx,y,z軸回りを自由な角度で回転させられます。角度は指定します。
CXなどのように先頭にCがつく場合は、大体が2量子ビットゲートと呼ばれるもので、制御ゲート側の量子ビットの値が0の時には何もせず、1の時には指定の操作をします。CXだとXゲート操作をします。CZだとZゲート操作をします。
このように、量子ゲートを並べていくのが量子コンピュータのプログラミングに相当します。
量子状態
このような量子コンピュータの操作を利用すると、既存コンピュータと異なる計算ができます。量子状態は操作したデータが現在どのような状態になっているかを表します。量子状態は波動関数とも呼ばれ、通常プログラミングではベクトルの形で表現されます。このベクトルは量子ビット数に対して、2^Nの要素数になり、現在のコンピュータでこれらの量子状態を保存しながら計算できる最大サイズはこの量子状態の保存ができる50量子ビット程度までといわれています。量子コンピュータでは計算するたびに異なる答えが確率的に出ることが基本で、この確率の元となるデータが量子状態に格納されています。
|psi> = [|000>, |001>, |010>, |011>, |100>, |101>, |110>, |111>] (縦ベクトルに直してください。。。)
量子状態はベクトルの形となっており、中には量子ビットの計算結果のビット列に対応した確率振幅と呼ばれる値が格納されています。確率振幅は複素数となっており、それらの絶対値の二乗は出現確率と対応しています。上記は3量子ビットの場合を表しています。例えば2量子ビットの場合は、状態ベクトルには、00から11までの確率振幅が格納されています。
(例)|psi> = [|00>, |01>, |10>, |11>] = [0.5, 0.5, 0.5, 0.5]
例えば上記のようにすべての確率振幅が0.5の場合、その絶対値の二乗である、|0.5|*|0.5| = 0.25がそれぞれのビット配列の出現確率に対応します。
c = Circuit().h[0,1]
c.run(backend="numpy")
array([0.5+0.j, 0.5+0.j, 0.5+0.j, 0.5+0.j])
この状態で、サンプリングといって01の配列を取り出す計算をしてみると、
c.m[:].run(backend="numpy", shots=100)
Counter({'11': 24, '01': 23, '00': 23, '10': 30})
00から11まで約1/4ずつでます。
量子重ね合わせと量子もつれ
量子コンピュータの特徴的なものとして量子重ね合わせと量子もつれがあります。
Circuit().h[0,1].m[:].run(backend="numpy",shots=100)
Counter({'00': 23, '01': 26, '11': 25, '10': 26})
このように、重ね合わせでは、二つの状態が重ね合わさっているため、計算結果は複数出ます。次に下記のような量子回路を準備すると、
Circuit().h[0].cx[0,1].m[:].run(backend="numpy",shots=100)
Counter({'11': 53, '00': 47})
このように特定の量子状態に限定された形で解が出ます。これが量子もつれです。量子もつれ状態はブロッホ球上に量子データを表現することはもはやできません。
量子ゲートと回転操作
量子ゲートは回転操作に対応しており、半径1の球の表面上にデータの位置が限定されます。量子ゲートは数学的に行列で表現でき、それらはユニタリ行列となっています。
引用:https://en.wikipedia.org/wiki/Quantum_logic
量子計算とテンソル
ここまでは一般的な話で、ここからはこれからの時代に合わせた形で量子計算を考えるために、テンソルを取り上げます。テンソルはスカラー量、ベクトル、行列、テンソルとこれらの配列の総称となっています。量子計算における量子ゲートはユニタリ行列に限定されますが、テンソルを利用して、さらに量子回路を細かく分解することができます。また、量子状態に関しても不要な情報がたくさん入っている場合があるので、状態ベクトル、波動関数を近似的に表現するなどして効率的に計算を行うことができます。
本インターン講座では、今後すべて量子計算はテンソルとして扱っていき、既存深層学習などのテンソルと共通化して扱っていきます。二回目へ続く。
以上