@yuichirominato 2019.01.03更新 670views

【量子機械学習】XANADUのPenny Laneとは何か?

XANADU 深層学習 自動微分 量子機械学習

はじめに

最近カナダトロントの光量子コンピュータベンチャーのXANADUがPennylaneという機械学習ライブラリを発表しました。XANADUはフォトニクスマシンを行なっていますが、今回発表したPennylaneはフォトニクスの汎用マシンだけでなく、ProjectQやIBMのQiskitにも対応しています。ユニバーサル対応ということで翻訳を通じて早速概要と内容を確認したいと思います。

Pennylaneとは?

量子機械学習、自動微分、およびハイブリッド量子古典計算の最適化のためのクロスプラットフォームPythonライブラリ

特集サイトはこちら、
https://pennylane.ai/

githubはこちら、
https://github.com/XanaduAI/pennylane

ドキュメント類はこちら、
https://pennylane.readthedocs.io/en/latest/

今回は内容を見たいのでドキュメント中心に

ということで、
https://pennylane.readthedocs.io/en/latest/index.html

こちらからテンポよく見ていきます。

特徴

・自動微分
・量子古典ハイブリッド計算
・最適化と機械学習
・マシンを選ばないユニバーサル性
・複数プラットフォーム対応:プラグインで対応

特徴は一般的にありそうな感じです。

プラグイン

三種類あるようです
・Strawberry Fields対応
・ProjectQ対応
・IBMQ対応

今回はあまり深く見ませんので興味ある方はウェブサイトから詳細にアクセスしてみてください。

導入の仕方

PennyLaneをシステムにインストールして実行するには、ダウンロードおよびインストールガイドから始めてください。まずは、PennyLaneの量子回路の機械学習に関する重要な概念をよく理解してください。 PennyLaneを使い始めるために、ハイブリッド量子最適化を調べ始める前に、基本的な量子ビット回転とGaussian変換チュートリアルを勉強してください。より高度なチュートリアルには、教師あり学習、量子GAN(QGAN)の構築、および量子分類機が含まれます。 次に、PennyLane-SFプラグインによって提供されるStrawberry Fields、PennyLane-PQおよびPennyLane-qiskitプラグインによって提供されるIBM QX4量子チップなど、ハイブリッドモデルを実行するために使用可能な多数のデバイスとプラグインを試してみてください。 最後に、PennyLaneインターフェースとAPIに関する詳細なドキュメントが提供されています。利用可能な量子操作と期待値についての詳細、そしてあなた自身のPennyLane互換の量子デバイスを書く方法に関する詳細なガイドのためにそこを見てください。

どうやら機械学習が様々乗っているようですが、量子ビットの回転もしくはGaussian変換を使うようです。

インストール

https://pennylane.readthedocs.io/en/latest/installing.html

インストールは、pip経由か、

$ python -m pip install pennylane

ソースコードをダウンロードしてからの、

$ python setup.py install

こちらで導入できます。

テスト

テストを行う場合には、pipで入手できるpytestを準備してください。

$ python -m pip install pytest

正しくソフトウェアが動いているかを確認するには、ソースコードのフォルダに移動して、

$ make test

とすることで確認できます。

(途中省略します)

イントロ

https://pennylane.readthedocs.io/en/latest/concepts/introduction.html

PennyLaneの基本は、量子と古典の世界の間のインターフェースをシームレスにすることです。量子コンピューティングデバイスは、古典的なコンピュータの競合相手としてではなく、むしろアクセラレータとして見なされるべきです。両方の種類の情報処理を統合することで、ハイブリッド計算が生み出されます。

PennyLaneでは、古典的なコンピュータと量子コンピュータの両方が同じ基本的な方法で使用されます。つまり、数学関数を評価するためにプログラムする計算デバイスとしてです。有向グラフのノードのように互いに情報をやり取りするので、このような関数をノードと呼びます。量子ノードは、古典的な情報を入力として受け取り、古典的な情報を出力として生成する量子回路の抽象表現です。 各量子ノードは、量子デバイス上で変分回路 – パラメータ化された量子計算 – を実行します。 最適化および機械学習では、モデルは学習可能な変数の勾配を計算することによって学習します。 PennyLaneの中心的な機能は、量子ノードの勾配、または量子勾配を計算する機能です。これにより、ハイブリッド計算をエンドツーエンドで区別することができます。 これら4つの概念 – ハイブリッド計算、量子ノード、変分回路、そして量子勾配 – は、PennyLaneの中心機能です。

ハイブリッド計算

ハイブリッド量子アルゴリズムは、古典的処理と量子処理の両方を統合するアルゴリズムです。多くの提案されたハイブリッドアルゴリズムにおいて、量子装置は量子サブルーチンを評価するために使用され、そして古典的なコプロセッサは主として回路出力を後処理するために使用される。しかし、原則として、ハイブリッド計算ははるかに複雑な手順に拡張することができます。 真のハイブリッド計算モデルでは、古典的デバイスと量子デバイスの両方が、量子ノードの規則に従って、全体の計算の任意の部分を担当します。これは量子と古典的な装置が一緒に使われることを可能にし、それぞれがより大きな計算の不可欠で不可分の部分を形成します。

量子ノード

量子情報は、特に近年のマシンは脆弱です。量子デバイスを古典的な計算とどのようにシームレスかつスケーラブルに統合することができるでしょうか。 この問題は、量子ノードまたはQNode、すなわち量子回路上にプログラムされた量子情報処理のサブルーチンを実行する基本的な計算ユニットの概念を導きます。量子ノードに出入りできるのは古典的なデータのみです。 古典的な装置にとって、量子ノードは機能を評価することができるブラックボックスです。しかしながら、量子デバイスは回路のより精密な問題を解決します。

変分回路

変分回路は、調整可能な変数に依存する量子アルゴリズムであるため、最適化できます。 PennyLaneでは、変分回路は3つの要素で構成されています。固定初期状態(例:真空状態またはゼロ状態)の準備。入力xと関数パラメータθの両方によってパラメータ化された量子回路。出力における観測可能なBの測定。変分回路はQNodeの内部動作を提供し、量子ハードウェアまたはシミュレータデバイスを実行することによって評価できます。

量子勾配

勾配の自動計算とバックプロパゲーションアルゴリズムは、現代のディープラーニングソフトウェアの中心的な要素です。 PennyLaneは、この重要な機能を量子計算とハイブリッド計算に拡張します。 量子ノードを評価することは古典的なコンピュータでは非効率的である、そこで我々は量子ノードの勾配が同様に扱い難いと予想するかもしれない。幸いなことに、1つの変数がシフトされている2つの量子ノードの線形結合を使用して、量子ノードの勾配∇f(x;θ)を正確に計算できます。 したがって、同じ量子デバイスを使って量子ノードと量子ノードの勾配の両方を計算することができます。これは古典的なコプロセッサのわずかな支援で達成されます。

ハイブリッド計算

https://pennylane.readthedocs.io/en/latest/concepts/hybrid_computation.html

はじめに、量子ノードの概念を簡単に紹介しました。この抽象化により、より大規模なハイブリッド量子 – 古典計算の一部として、量子関数を古典関数と組み合わせることができます。 ハイブリッド計算は、多くの既存の提案において考慮されてきました。しかしながら、量子成分と古典成分の間の分業はしばしば非常に厳格です。通常、量子デバイスはいくつかの回路を評価するために使用され、結果として得られる期待値は単一の古典的なコスト関数にまとめられます。

このアプローチは最初のステップとしてある程度の成功を収めていますが、まだ限界があります。量子成分と古典成分を組み合わせて、より大規模で複雑なハイブリッド計算を行うことができる、もっと興味深い方法を考えてみたいとおもいます。

有向非巡回グラフ

PennyLaneは、ハイブリッド計算について、もっと表現力豊かな概念を念頭に置いて設計されました。量子ノードと古典的ノードは、任意の有向非巡回グラフ(DAG)に組み合わせることができます。これは、各ノードからその後続ノードに情報が流れ、サイクル(ループ)が作成されないことを意味します。これらの基本的な規則以外に、あらゆる設定がサポートされています。グラフ内の各ノードは、古典的または量子的のいずれかでありえ、そして異なるデバイス(例えば、キュ​​ビットおよびCVデバイス)上で実行される量子ノードは、同じ計算において組み合わされ得る。 このDAG構造は、現代のディープラーニングモデルに見られるものと似ています。実際、PennyLaneは、NumPyを使用してコード化できるあらゆる機械学習モデルをサポートしています。もちろん、PennyLaneには、計算グラフでシームレスに量子回路をサポートするという追加の利点があります。

ハイブリッド計算による逆誤差伝搬

PennyLaneは量子関数の勾配を評価するための方法を提供するので、それは有名な逆伝播アルゴリズム(逆モード自動微分としても知られる)、深層学習モデルを訓練するための主力なアルゴリズムのような技術と互換性があります。 これは、PennyLaneがハイブリッドな量子 – 古典的計算を通じてエンドツーエンドを区別できることを意味します。したがって、量子力学的な学習モデルは、古典的な深層学習モデルが訓練されるのと基本的に同じ方法で訓練することができます。

注)PennyLaneは、通常のNumPy数学ライブラリをラップするPythonライブラリautogradを利用して、自動微分機能を提供します。 PennyLaneは、autogradでサポートされている古典的な機械学習モデルと、利用可能な量子デバイスでサポートされている任意のハイブリッド機械学習モデルをサポートできます。 量子 – 古典的ハイブリッドモデルを構築するときは、必ずPennyLaneが提供するNumPyのラップされたバージョンをインポートしてください。つまり、nnyとしてpennylane import numpyからインポートしてください。これはPennyLaneが量子回路の勾配と一緒に、NumPyで構築された関数の勾配を計算することを可能にします。

量子ノード

https://pennylane.readthedocs.io/en/latest/concepts/quantum_nodes.html

古典情報と量子情報

古典的な情報と量子的な情報を区別することが重要です。我々の目的のために、我々は古典的な情報として従来のデジタルコンピュータ内に記憶された数の値(例えば、実数または複素数の浮動小数点2進表現)を検討する。加算、減算、乗算、sin、cos、exp、sin、cos、expなどのような多くの一般的な関数はすべて、古典的なコンピュータで、たとえばPythonのNumPyライブラリを使用して効率的に評価できます。これらの関数は、浮動小数点数を浮動小数点数にマッピングします。言い換えれば、それらは古典的な情報を処理する関数です。 一方、量子情報は、量子ヒルベルト空間内の複素数ベクトルの状態を指します。量子コンピュータ内のゲートは、量子状態を量子状態に変換し、量子情報を処理します。

古典的世界と量子世界のインターフェース

古典的な情報を量子システムにロードするためのスキームはたくさんありますが、これらはしばしばかなり複雑になることがあります。古典的世界と量子世界を結び付けるために、PennyLaneは2つの直接的な方法を使用します。 ゲートパラメーター 量子回路で使用されるゲートは、それらに関連する古典的なパラメータをしばしば持っています。この古典的な情報は、量子状態がどのように変換されるか、例えば、量子状態をどの角度だけ回転させるべきかを決定します。したがって、ゲート引数は、古典的データを量子状態にインプリントする方法を提供し、古典的情報を量子情報に変換します[1]。 量子回路の測定は、量子情報(量子システムの状態)を古典的な情報(測定値)に変換します。測定はしばしば結果の確率分布を持ち、十分な数の測定が行われた後に初めてパターンが明らかになります。 PennyLaneでは、量子デバイスから古典的な情報を取得するための主要なメカニズムとして、測定結果の期待値(つまり平均)を使用します。

量子ノードの抽象化

量子ノードは、異なる計算装置に対して異なる分解能を有する量子関数f(x;θ)の計算カプセル化である。 量子計算装置の場合、量子ノードは、そのゲートがxおよびθによってパラメータ化され、その測定結果が平均されて期待値を生成する変分回路である。 古典的な計算装置の場合、量子ノードは、引数(x、θ)を取り、値f(x;θ)を返す関数です。古典的な装置は量子回路の中間状態を見ることはできません。

量子ノードを評価するための何らかのメカニズム(すなわち、量子計算装置またはシミュレータ)を提供する限り、古典的計算装置はそれを古典的データを操作する他の呼び出し可能関数と同じように扱うことができます。このようにして、量子ノードを古典的変換と結び付けて、複雑な多段ハイブリッド量子 – 古典的計算を構築することができます。

変分回路

https://pennylane.readthedocs.io/en/latest/concepts/varcirc.html

変分回路は3つの要素で構成されています。 固定初期状態(例えば、真空状態またはゼロ状態)の準備。 量子回路U(x;θ)は、入力xとパラメータθの両方によってパラメータ化されます。 出力における観測可能なBの測定。 1つまたは複数のそのような回路の期待値f(x;θ)=⟨0| U†(x;θ)B U(x;θ)|0⟩は、おそらく何らかの古典的な後処理を用いて、与えられたコスト関数のコストを表しています。最終的に回路のパラメータθはこのコスト関数を最適化するように調整されます。

基本的には変分回路は、量子デバイスに問い合わせをする古典的な最適化アルゴリズムによって訓練されます。最適化は、すべてのステップでパラメータθのより良い候補を探す反復方式を採用します。変分回路は、最適化、量子化学、機械学習、データ圧縮、線形代数、および特徴埋め込みなど、さまざまな近年の量子コンピュータの用途に提案されています。 変分回路は、近年の量子デバイス用の量子アルゴリズムについて考える方法として普及しています。そのような装置は短いゲートシーケンスしか実行できず、高いエラーを有するのが一般的です。通常、量子アルゴリズムは、一連の標準的な基本操作に分解され、それらは次に量子ハードウェアによって実装されます。近年の量子デバイスのための変分回路の興味深いアイデアは、与えられたタスクのためにノイズの多いデバイス上で回路を「学習」することによって、この2ステップの手順を1つのステップにマージすることです。このようにして、デバイスの「自然な」調整可能ゲートを使用して、固定された基本ゲートセットを経由することなく、アルゴリズムを定式化できます。さらに、体系化されたエラーは最適化中に自動的に修正することができます。

回路を構成する

回路のゲートの引数として入力xと変分パラメータθの両方が量子回路に入ります。これにより、古典的な情報(xとθの値)を量子情報(量子状態U(x;θ)|0⟩)に変換できます。 観測可能なBの期待値を評価することで、量子情報は古典的な情報に戻ります。 f(x;θ)=⟨B^⟩=⟨0| U†(x;θ)B ^ U(x;θ)|0⟩。 入力およびパラメータ(x;θ)がゲートの引数として使用されるという基本的な規則を超えて、正確にゲートがどのように配置されるか、回路アーキテクチャは本質的に任意である。

データの埋め込み

データ埋め込み 直接的な埋め込み戦略の1つは、回路内の最初の数ゲートが入力xを量子状態に埋め込むことを担当することであり(特徴マップとして機能する)、後続のゲートは引数θを引数として持つ。 一例として、フォトニック量子コンピュータを検討する(同様の例をキュビットに対して構成することができる)。簡単にするために、パラメータθを一時的に省略する。初期状態を真空状態とし、測定された観測量B ^を位置演算子xとします。真空状態は、期待値【数4】を有する。 N次元を持つ入力xがあるとします。変位演算子を使って、これをNワイヤを使って量子回路に埋め込むことができます。 xのすべての成分xiに対して、ワイヤiにD(xi)を適用します。 各ワイヤ上のx ^演算子の期待値を測定すると、結果が得られます。 (⟨x^1⟩、⋯、⟨x^N⟩)=(x1、…、xN)。 したがって、変位入力ゲートは、真空入力および位置測定と組み合わせて、データをフォトニック量子コンピュータに直接エンコードするために使用できます。

データ処理

データを量子状態に埋め込んだので、次に処理を実行したいと思います。現状では、私たちの例題の回路は現在、自由なパラメータを持たない恒等式f(x)= xを表しています。パラメータθを有する追加のゲートを導入することによって、より複雑な機能を構築し始めることができます。 明確にするために、我々は、自由パラメータθを用いて、一次元入力 xに制限し、単一の回転演算子を追加する。このゲートを適用した後、我々の回路によって評価された量子ノードは次のようになります。

f(x;θ)= xcos(θ)

まとめると、2つの量子ゲート(変位と回転)だけで、量子回路を使用して上記の形式の関数を評価できます。 上記の例は、データとパラメータを量子回路に埋め込むことの背後にある原理を説明するために非常に単純に保たれています。確かに、この例で評価された関数は古典的に扱いやすいです。しかし、サブシステムの数と回路の深さを増やすことによって、対応する関数は古典的に評価することが次第に難しくなる可能性があり、量子デバイスを使用する必要があります。

アーキテクチャ

多くの変分回路アーキテクチャが量子計算コミュニティによって提案されています。アーキテクチャーの強みは、目的のユースケースによって異なりますが、何が良い答えになるのか必ずしも明確ではありません。さまざまなアプローチの表現力の研究も進行中です。 PennyLaneの1つの目的は、さまざまなアーキテクチャーおよびハードウェアプラットフォームにわたってこのような研究を容易にすることです。 大まかに要約すると、我々は3つの異なるタイプのアーキテクチャ、すなわちlayered gate architecturesalternating operator architectures and tensor network architectures を区別します。

Layered gate architectures

レイヤーは、変分回路で繰り返される一連のゲートです。層の繰り返し数は、変分回路のハイパーパラメータを形成します。

私たちはしばしば層をさらに2つの全体的なユニタリーAとBに分解することができます。

ブロックAには、すべてのサブシステムに適用される単一システムゲートが含まれています。ブロックBは、シングルサブシステムゲートともつれゲートの両方で構成されています。

階層化ゲートアーキテクチャは、3つの点で異なります。

・Aのみ、Bのみ、またはAとBの両方がパラメータ化されているかどうか
・AとBで使用されているゲートの種類
・ブロックBのゲートがランダムに配置されているか、固定されているか、またはハイパーパラメーターによって決定されているか

そのような階層化アーキテクチャは、離散および連続可変量子計算モデルの両方に現れます。

A 変数あり、 B 固定

量子ビットベースの装置の最も単純な場合では、ブロックAにおいて一般的なSU(2)ゲート(すなわち回転)Rを使用し、Bを固定とすることができます。

AもBも変数あり

AとBの両方をパラメータ化することもでき、2量子ビットゲートの配置は2量子ビットゲートの範囲を定義するハイパーパラメータに依存します

連続可変システムに特有の完全にパラメータ化されたアーキテクチャが提案されています

もつれ層Bは、干渉計、個々のビームスプリッタおよび移相器からなる受動光回路を含む。ブロックAは、ゲートを生成する直交演算子x ^に対して連続してより高次のシングルモードゲートからなる。変位ゲートDは次数1であり、二次位相ゲートQは次数2であり、三次位相ゲートVは次数3である。

A固定、B変数あり

シングル量子ビットゲートが固定されている例は、いわゆるIQP回路であり、ここで、Aはアダマールゲートからなり、Bはパラメータ化された対角1および2量子ビットゲートからなる。

類似回路は、連続可変システムに対しても考慮することができます。

IQP回路は、Bブロック内のすべてのゲートが計算上対角になるように構成されています。

その他のストラクチャ

単純な2ブロック構造を一般化すると、古典的なニューラルネットで情報がどのように処理されるかをエミュレートするフォトニックニューラルネットワークの層など、より複雑な層を構築することができます。

Alternating operator architectures

交代演算子アーキテクチャは、FarhiとGoldstoneの量子近似最適化アルゴリズム(QAOA)で最初に導入され、後に機械学習やその他の分野固有のアプリケーションに使用されました。 繰り返しになりますが、2ブロックのレイヤーを使用します。違いは、今度はこれらのブロックを表すユニタリが、短い時間Δtの間に進化するハミルトニアンAとBを介して定義されることです。

この仮説のアイデアは、断熱量子計算との類似に基づいています。そこでは、システムはAの基底状態から始まり、断熱的にBの基底状態に進化します。非常に短い時間Δtの間にAとBを素早く交互に適用することは、この発展を近似するための発見的手法として使用することができます。

Tensor network architectures

層ではなく単一の固定構造からなるアーキテクチャには、テンソルネットワークに着想を得たゲートシーケンスがあります。最も単純なものは、量子ビットのサブセットを連続的に絡めるツリーアーキテクチャです。

他のテンソルネットワークは行列積状態に基づいています。回路ユニタリはさまざまな方法で分解することができ、それらのサイズは行列積状態の「結合次元」に対応します。結合次元が大きいほど、回路は複雑になります。

行列積状態などのテンソルネットワークは、古典的なコンピュータ上で(普遍的ではないが)効率的に特定の量子系をシミュレートするために発明されました。したがって、テンソルネットワークアーキテクチャは必ずしも古典的に扱いにくい量子ノードを生み出すわけではないですが、機械学習モデルとしての用途を見出しました。

量子勾配

https://pennylane.readthedocs.io/en/latest/concepts/autograd_quantum.html

導関数と勾配は、科学と工学の至るところにあります。近年、自動微分は、特に機械学習(例えば、Theano、Autograd、Tensorflow、またはPytorch)に関して、多くの数値ソフトウェアライブラリにおいて重要な特徴となっています。 一般的に言って、自動微分はソフトウェアライブラリが任意の数値コードの導関数を計算する能力です。関数h(x)を計算するためのアルゴリズムを書くと(それは数式を含みますが、if、forなどの制御フローステートメントも含む)、自動微分は∇h(x)のアルゴリズムを提供します。 自動識別は他の形式の識別と区別されるべきです。手作業での区別、つまり紙の上で式を手作業で区別する作業は、非常に時間がかかり、エラーが発生しやすいものです。高校の計算からよく知られている差分法のような数値微分では、関数の微分は2つの無限に離れた点で関数を数値的に評価することによって近似されます。ただし、この方法は、古典的な浮動小数点演算の制約のために不正確になることがあります。

量子関数の勾配計算

変分回路は、量子化回路を測定することによって評価することができるパラメータ化された関数$f(x;\theta)$です。量子関数の勾配を計算することができれば、最適化または機械学習アルゴリズムでこの情報を使用して、勾配降下を介して量子回路を調整し、目的の出力を生成できます。数値微分はオプションですが、PennyLaneは量子回路の自動微分をサポートする最初のソフトウェアライブラリです。量子関数$f(x;\theta)$の勾配は、多くの場合、他の量子関数の線形結合として表すことができることが分かります。実際、これらの他の量子関数は一般的に同じ回路を使用しますが、引数のシフトが異なるだけです。

古典的に計算可能な関数に大まかに類推すると、これは関数$f(x) = sin(x)$の導関数が$\frac{1}{2}sin(x+\frac{\pi}{2})-\frac{1}{2}sin(x-\frac{\pi}{2})$であることを考えることに類似する。したがって、同じ基礎をなすアルゴリズムを再使用して、およびその導関数の両方を計算することができる。この直感は、関心のある多くの量子関数を保持します。同じ回路を使って、量子関数と量子関数の勾配の両方を計算することができます。

より技術的な説明

PennyLaneの回路は一連のゲートによって指定されます。回路によって実行されるユニタリ変換は、したがって、ユニタリの積に分解することができます。

$$U(x;\theta) = U_N(\theta_{N}) U_{N-1}(\theta_{N-1}) \cdots U_i(\theta_i) \cdots U_1(\theta_1) U_0(x).$$

これらの各ゲートはユニタリであり、したがって、次の形式$U_j(\gamma_j)=\exp{(i\gamma_j H_j)}$を持たなければなりません。ここで、$H_j$はゲートを生成するエルミート演算子で、$\gamma_j$はゲートパラメータです。以下の説明では必要ないため、各ユニタリーがどのワイヤーに作用するかを省略しました。

単一のパラメータ化ゲート

単一のパラメータ$\theta_i$とその関連ゲート$U_i(\theta_i)$を選び出します。簡単にするために、今のところ$U_i(\theta_i)$と$U_0(x)$を除くすべてのゲートを削除します。この場合、単純化された量子回路関数があります。

$$f(x; \theta_i) = \langle 0 | U_0^\dagger(x)U_i^\dagger(\theta_i)\hat{B}U_i(\theta_i)U_0(x) | 0 \rangle = \langle x | U_i^\dagger(\theta_i)\hat{B}U_i(\theta_i) | x \rangle.$$

便宜上、ユニタリー共役を線形変換として書き換えます。

$$U_i^\dagger(\theta_i)\hat{B}U_i(\theta_i) = \mathcal{M}_{\theta_i}(\hat{B}).$$

この量子関数は明確に定義された勾配を持つので、

$$\nabla_{\theta_i}f(x; \theta_i) = \langle x | \nabla_{\theta_i}\mathcal{M}_{\theta_i}(\hat{B}) | x \rangle \in \mathbb{R}.$$

多くの場合、この勾配を同じ変換の線形結合として表現することができ、異なるパラメーターを使用することができます。すなわち

$$\nabla_{\theta_i}\mathcal{M}_{\theta_i}(\hat{B}) = c[\mathcal{M}_{\theta_i + s}(\hat{B}) – \mathcal{M}_{\theta_i – s}(\hat{B})],$$

ここで、乗数cとシフトsは、変換のタイプによって完全に決定され、θiの値とは無関係です

複数のパラメータ化ゲート

最後に、回路に多くのゲートがある場合に戻ります。ゲートiの前に適用されたゲートをすべて初期状態にすることができます。$|\psi_{i-1}\rangle = U_{i-1}(\theta_{i-1}) \cdots U_{1}(\theta_{1})U_{0}(x)|0\rangle$

同様に、ゲートiの後に適用されたゲートは、観測可能なものと結合されます。$$\hat{B}_{i+1} = U_{N}^\dagger(\theta_{N}) \cdots U_{i+1}^\dagger(\theta_{i+1}) \hat{B} U_{i+1}(\theta_{i+1}) \cdots U_{N}(\theta_{N})$$

この単純化により、量子回路関数は次のようになります。

$$f(x; \theta) = \langle \psi_{i-1} | U_i^\dagger(\theta_i) \hat{B}_{i+1} U_i(\theta_i) | \psi_{i-1} \rangle = \langle \psi_{i-1} | \mathcal{M}_{\theta_i} (\hat{B}_{i+1}) | \psi_{i-1} \rangle,$$

そしてその勾配は、

$$\nabla_{\theta_i}f(x; \theta) = \langle \psi_{i-1} | \nabla_{\theta_i}\mathcal{M}_{\theta_i} (\hat{B}_{i+1}) | \psi_{i-1} \rangle.$$

この勾配は、シングルゲートの場合とまったく同じ形式ですが、ただし、状態|x⟩→|ψi-1⟩および測定演算子\hat{B}→\hat{B}_{i + 1}を変更します。回路に関しては、これは他のすべてのゲートをそのままにして、パラメータθiに関して微分したいときにのみゲートU(θi)を修正できることを意味します。

パウリゲート例

次の形式のパラメータ化されたゲートを持つ量子コンピュータを考えます

$$U_i(\theta_i)=\exp\left(-i\tfrac{\theta_i}{2}\hat{P}_i\right),$$

勾配は、

基本チュートリアル:量子ビット回転

https://pennylane.readthedocs.io/en/latest/tutorials/qubit_rotation.html

PennyLaneが量子関数の簡単な構築と最適化をどのように可能にするかを見るために、量子ビット回転の単純なケース、「Hello、world!」の例のPennyLaneバージョンを考えてみましょう。 当面の課題は、単一キュビットを状態|0⟩から状態|1⟩に反転するために、2つの回転ゲートを最適化することです。

$$\nabla_{\theta_i}U_i(\theta_i) = -\tfrac{i}{2}\hat{P}_i U_i(\theta_i) = -\tfrac{i}{2}U_i(\theta_i)\hat{P}_i .$$

これを量子回路関数に代入すると、

$$\begin{align} \nabla_{\theta_i}f(x; \theta) = & \frac{i}{2}\langle \psi_{i-1} | U_i^\dagger(\theta_i) \left( P_i \hat{B}_{i+1} – \hat{B}_{i+1} P_i \right) U_i(\theta_i)| \psi_{i-1} \rangle \\ = & \frac{i}{2}\langle \psi_{i-1} | U_i^\dagger(\theta_i) \left[P_i, \hat{B}_{i+1}\right]U_i(\theta_i) | \psi_{i-1} \rangle, \end{align}$$

$[X,Y]=XY-YX$は交換子です。私たちは今、パウリ演算子を含む交換子に対して次の数学的恒等式を利用します

これを前の式に代入すると、勾配式が得られます。

$$\begin{align} \nabla_{\theta_i}f(x; \theta) = & \hphantom{-} \tfrac{1}{2} \langle \psi_{i-1} | U_i^\dagger\left(\theta_i + \tfrac{\pi}{2} \right) \hat{B}_{i+1} U_i\left(\theta_i + \tfrac{\pi}{2} \right) | \psi_{i-1} \rangle \\ & – \tfrac{1}{2} \langle \psi_{i-1} | U_i^\dagger\left(\theta_i – \tfrac{\pi}{2} \right) \hat{B}_{i+1} U_i\left(\theta_i – \tfrac{\pi}{2} \right) | \psi_{i-1} \rangle. \end{align}$$

最後に、これを量子関数で書き換えることができます。

$$\nabla_{\theta}f(x; \theta) = \tfrac{1}{2}\left[ f(x; \theta + \tfrac{\pi}{2}) – f(x; \theta – \tfrac{\pi}{2}) \right].$$

基本チュートリアル:量子回路

量子ビット回転の例では、以下の量子回路を実装したいと思います。

これを段階的に分解すると、まず基底状態$\mid0\rangle= [1 0]^T$の量子ビットから始め、ゲートを適用してx軸の周りに回転させます。

$$\begin{split}R_x(\phi_1) = e^{-i \phi_1 \sigma_x /2} = \begin{bmatrix} \cos \frac{\phi_1}{2} & -i \sin \frac{\phi_1}{2} \\ -i \sin \frac{\phi_1}{2} & \cos \frac{\phi_1}{2} \end{bmatrix},\end{split}$$

そしてゲートを介してy軸周り

$$\begin{split}R_y(\phi_2) = e^{-i \phi_2 \sigma_y/2} = \begin{bmatrix} \cos \frac{\phi_2}{2} & – \sin \frac{\phi_2}{2} \\ \sin \frac{\phi_2}{2} & \cos \frac{\phi_2}{2} \end{bmatrix}.\end{split}$$

これらの操作の後、量子ビットは現在このような量子状態にあります

$$| \psi \rangle = R_y(\phi_2) R_x(\phi_1) | 0 \rangle.$$

最後に、Z演算子の$\langle \psi \mid \sigma_z \mid \psi \rangle$の期待値を測定します

$$\begin{split}\sigma_z = \begin{bmatrix} 1 & 0 \\ 0 & -1 \end{bmatrix}.\end{split}$$

上記を使って正確な期待値を計算すると、

$$\langle \psi \mid \sigma_z \mid \psi \rangle = \langle 0 | R_x(\phi_1)^\dagger R_y(\phi_2)^\dagger \sigma_z R_y(\phi_2) R_x(\phi_1)|0\rangle = \cos(\phi_1)\cos(\phi_2).$$

回路パラメータϕ 1と ϕ 2に応じて、出力の期待値は1($\mid\psi\rangle = \mid0\rangle$)の場合と-1($\mid\psi\rangle = \mid1\rangle$)の間にあります。 PennyLaneを使ってこの回路を簡単に実装し最適化する方法を見てみましょう。

PennyLaneとNumPyのインポート

最初に必要なことは、PennyLaneと、PennyLaneが提供するNumPyのラップバージョンをインポートすることです。

import pennylane as qml
from pennylane import numpy as np

重要

PennyLaneでハイブリッド量子/古典的計算モデルを構築するとき、標準のNumPyではなく、常にPennyLaneからNumPyをインポートすることが重要です。 PennyLaneが提供するNumPyのラップバージョンをインポートすることで、NumPyの機能とPennyLaneを組み合わせることができます。 量子関数(量子ハードウェア/シミュレータで評価される)と古典関数(NumPyによって提供される)を組み合わせる PennyLaneに古典関数と量子関数の両方の勾配を自動的に計算させることができます。

デバイスを作成する

量子ノードを構築する前に、デバイスを初期化する必要があります。

定義

量子演算を適用して期待値を返すことができる計算オブジェクトは、量子デバイスと呼ばれます。 PennyLaneでは、デバイスはハードウェアデバイス(PennyLane-PQプラグインを介したIBM QX4など)、またはソフトウェアシミュレータ(PennyLane-SFプラグインを介したStrawberry Fieldsなど)です。 デバイスは関数pennylane.device()を通してPennyLaneにロードされます

PennyLaneは、量子計算の量子ビットモデルを使用するデバイスと量子計算のCVモデルを使用するデバイスの両方をサポートしています。実際、量子ビットとCV量子ノードの両方を含むハイブリッド計算でさえも可能です。詳細については、次のチュートリアルのハイブリッド計算の例を参照してください。 このチュートリアルでは、量子ビットモデルを使用しているので、PennyLaneが提供する ‘default.qubit’デバイス(単純な純粋状態の量子ビットシミュレータ)を初期化しましょう。

dev1 = qml.device('default.qubit', wires=1)

すべてのデバイスで、device()は以下の引数を受け入れます。

name:ロードするデバイスの名前
wires:デバイスを初期化するためのサブシステムの数

ここでは、この例では1つのキュビットしか必要としないので、wires = 1に設定します。

QNodeを構築する

デバイスを初期化したので、次に量子ノード(またはQNode)の構築を始めることができます。

定義
Qノードは、量子回路によって記述される量子関数の抽象カプセル化です。 QNodeは、この回路の期待値を評価するために使用される特定の量子デバイスにバインドされています。 QNodeはpennylane.QNodeクラスを介して、または提供されているqnodeデコレータを使用して構築できます。

まず、QNodeで評価される量子関数を定義する必要があります。

def circuit(params):
    qml.RX(params[0], wires=0)
    qml.RY(params[1], wires=0)
    return qml.expval.PauliZ(0)

これは上記のものと一致する単純な回路です。関数circuit()は他のPython関数のように構築されていることに注意してください。リスト、タプル、または配列の位置引数paramsを受け入れ、ゲートパラメータに個々の要素を使用します。 しかし、量子関数はPython関数の制限されたサブセットです。 Python関数が有効な量子関数でもあるためには、いくつかの重要な制限があります。

量子関数は、適用される順番で、1行に1つの操作で、量子操作のみを含む必要があります。 さらに、wires引数を渡して、操作が適用されるサブシステムを常に指定する必要があります。これは、操作が実行するワイヤの数に応じて、リストまたは整数になります。 量子演算の全リストについては、サポートされている演算を参照してください。

量子関数は、期待値の単一またはタプルを返さなければなりません。 結果として、量子関数は常に古典的な量を返し、QNodeが他の古典的関数(そして他のQNode)とも連動することを可能にします。 量子期待値の完全なリストについては、サポートされている期待を参照してください。

量子関数は、回路パラメータの古典的な処理を含んではいけません。

量子関数を作成したら、関数定義のすぐ上にqnodeデコレータを適用して、それをデバイスdev1で実行されているQNodeに変換します。

@qml.qnode(dev1)
def circuit(params):
    qml.RX(params[0], wires=0)
    qml.RY(params[1], wires=0)
    return qml.expval.PauliZ(0)

したがって、circuit()の量子関数はQNodeになり、評価されるたびにデバイスdev1上で実行されます。評価するには、適切な数値入力を使って関数を呼び出すだけです。

>>> circuit([0.54, 0.12])
0.8515405859048368

量子勾配を計算する

関数自体の評価に使用したのと同じ量子デバイス(dev1)を使用することで、QNode内にカプセル化された関数回路の勾配を評価できます。 PennyLaneは、解析的微分と数値法(差分法など)の両方を組み込んでいます。どちらも自動的に行われます。 組み込みのgrad()関数を使って区別することができます。これは、回路の勾配(すなわち偏導関数のベクトル)を表す別の関数を返します。勾配は元の関数と同じ方法で評価できます。

>>> dcircuit = qml.grad(circuit, argnum=0)

関数grad()自体が、argnumで指定された引数に関するQNodeの導関数を表す関数を返します。この場合、関数回路は1つの引数(params)を取るので、argnum = 0を指定します。引数には2つの要素があるため、返される勾配は2次元です。その後、この勾配関数をパラメータ空間の任意の点で評価できます。

>>> dcircuit([0.54, 0.12])
[-0.510438652516502, -0.10267819945693203]

注意
Pythonの関数の限定されたサブセットである量子回路関数は、複数の位置引数とキーワード引数を利用することもできます。たとえば、1つの配列引数の代わりに2つの位置引数を使用して上記の量子回路関数を定義できます。

@qml.qnode(dev1)
def circuit2(phi1, phi2):
    qml.RX(phi1, wires=0)
    qml.RY(phi2, wires=0)
    return qml.expval.PauliZ(0)

このような関数の勾配を計算するとき、argnumの使い方は少し異なります。この場合、argnum = 0は最初のパラメータ(phi 1)についてのみ勾配を返し、argnum = 1はphi 2の勾配を返します。両方のパラメータに関する勾配を得るには、argnum = [0,1]を使います。

>>> dcircuit = qml.grad(circuit2, argnum=[0, 1])
>>> dcircuit(0.54, 0.12)
(array(-0.510438652516502), array(-0.10267819945693203))

キーワード引数はあなたのカスタム量子関数でも使用できます。 PennyLaneはキーワード引数に関してQNodeを区別しますので、それらはあなたのQNodeに外部データを渡すのに役立ちます。

最適化

定義
PennyLaneは勾配降下法に基づくオプティマイザのコレクションを提供します。これらのオプティマイザはコスト関数と初期パラメータを受け入れ、PennyLaneの自動微分を利用して勾配降下を実行します。利用可能なオプティマイザの詳細とドキュメントについてはpennylane.optimizeを参照してください。

次に、2つの回路パラメータを最適化するためにPennyLaneの内蔵オプティマイザを利用して、量子ビットが回転することを確認しましょう。これは、Pauli-Zの期待値-1を測定することと同じです。

言い換えれば、最適化手順は下記のブロッホ球での回転に対応する重みを見つけます。

そのためには、コスト関数を定義する必要があります。コスト関数を最小にすることによって、オプティマイザは所望の結果を生み出す回路パラメータの値を決定します。 この場合、私たちが望む結果は、Pauli-Zの期待値-1です。 Pauli-Zの期待値は[-1,1]の間にあることがわかっているので、コストを直接QNodeの出力として定義できます。

def cost(var):
    return circuit(var)

最適化を始めるために、次のような小さな初期値を選択しましょう。

>>> init_params = np.array([0.011, 0.012])
>>> cost(init_params)
0.9998675058299387

これらの初期パラメータ値に対して、コスト関数は1に近いことがわかります。 最後に、オプティマイザを使用して100ステップの回路パラメータを更新します。組み込みのpennylane.optimize.GradientDescentOptimizerクラスを使用できます。

# initialise the optimizer
opt = qml.GradientDescentOptimizer(stepsize=0.4)

# set the number of steps
steps = 100
# set the initial parameter values
params = init_params

for i in range(steps):
    # update the circuit parameters
    params = opt.step(cost, params)

    if (i+1) % 5 == 0:
        print('Cost after step {:5d}: {: .7f}'.format(i+1, cost(params)))

print('Optimized rotation angles: {}'.format(params))

これを自分で試してください – 最適化は約40ステップ後に収束し、次の数値的に最適な値が得られます。

Optimized rotation angles: [  5.76516144e-17   3.14159265e+00]

これを理論結果$\langle \psi | \sigma_z | \psi \rangle = \cos\phi_1\cos\phi_2$に代入することで、これが実際に生成する回路パラメータの1つの可能な値-1であることを確認できます。