Path: blob/main/notebooks/summer-school/2021/resources/lab-notebooks/lab-2-ja.ipynb
3855 views
Lab 2: 変分アルゴリズム入門
このLabでは、以下を学びます。
特定のVQE(変分量子固有値ソルバー)における変分量子アルゴリズム
パラメーター付き回路と二次計画法のQiskitでの作成方法と実行方法
QAOAを使った最適化問題の解法
1) はじめに
この章は変分量子アルゴリズムのトピックの入門であり、また以前の講義の復習です。
変分量子アルゴリズム(VQA)
最も一般的な意味では、変分量子回路は、パラメーターのセットに依存する回路です。一般的に、変分量子アルゴリズムは、このパラメーター化された量子回路の出力を量子コンピューターに問い合わせ、その出力に基づいて、与えられたコスト関数を評価します。その後、古典的なオプティマイザーを用いて、目的関数を最大化または最小化するために、回路のパラメータを更新します。これらのステップは、量子-古典ハイブリッドループで繰り返され、最終的には古典的な最適化によって最適なパラメータが見つかると終了します。
変分量子アルゴリズム(VQA)は、近未来のデバイスで量子的優位性を実現するための有望な手法とみなされることが多いです。多くのケースでは、深い量子回路の実行を必要とせず、古典的なオプティマイザーに最適化手法を委託することで、システマティックなエラーを部分的に軽減することができます。それにもかかわらず、VQAは多くの課題を抱えています。特に、VQAが効率的に学習可能であり、古典的なアルゴリズムで得られたものよりも実際に優れたソリューションを生み出すことができるかどうかという問題です。これらの課題にもかかわらず、VQAは以下のような様々な問題設定に対して提案されています。
変分量子固有値ソルバー(VQE): VQEは、ハミルトニアンで表現された量子システムの基底状態とそれに対応するエネルギーを近似します。(つまり、対応するエルミート行列の最小の固有値と固有ベクトルです。)(こちらをご覧ください。)
QAOA: 組み合わせ最適化問題に使われる、近似最適化アルゴリズムです。QAOAは、問題ハミルトニアンとしてコスト関数をエンコードすることで最適化問題を解くVQEとみなすことができます。(Section 4をご覧ください。)
変分分類器: 変分分類器は、古典的な機械学習分類器を彷彿とさせる、見えないデータサンプルを分類するためにデータセットで学習する量子回路です。
変分量子線形ソルバー(VQLS): VQLSは、VQEの元となる基本的なアイディアを活用して線形方程式によるシステムを解きます。
このLabでは、VQEの特別な場合であるQAOAにフォーカスします。
変分法
基底状態と基底状態エネルギーをもつ量子システムを記述するエルミート演算子を考えます。 変分法は、とを近似する技術手法です。 これは、パラメーター化された試行状態を選ぶことで行います。ここで、 は、パラメーターのセットまたはベクトルです。 状態のシステムのエネルギーは以下のに関する期待値によって与えられることを思い出しましょう。
システムの基底状態は、最低のエネルギーの固有状態であるので、定義上、以下のようになります。すべてのパラメーターに対して、
したがって、試行状態の期待値を最小化することによって、つまり期待値 ができるだけ小さくなるようなパラメーターを見つけることによって、基底状態エネルギーの上限を得ることができ、基底状態そのものの近似値を得ることができます。 当然ながら、良い試行状態の選択が、変分法の成功の鍵です。
VQE(変分量子固有値ソルバー)
変分量子固有値ソルバーは、変分法を使って、基底状態とハミルトニアンの最小の固有値を近似的に求めます。試行状態は、変分量子回路によって準備された量子状態に相当し、量子コンピューターによる回路の実行をすることで、相当する期待値が測定されます。そして、古典オプティマイザーは、回路のパラメーターの調整に使われ、測定される期待値を最小化します。
与えられたハミルトニアンの基底状態に直接興味のある、化学や量子力学そのものの問題への適用から離れて、最適化問題において、ハミルトニアンの基底状態が問題の最適解に相当するコスト関数をエンコーディングすることで変分量子固有値ソルバーの概念を使うことができます。このアイディアはQAOAの核心となっています。
パラメーター付き量子回路
このセクションでは、Qiskitでパラメーター付き回路を構築し、回路のパラメーターに値を割り当てる方法を学び、独自の変分形式を構築します。
パラメーター付き回路の構築
Qiskitでパラメーター付き回路を構築することは、標準的な量子回路を作成するのとあまり違いはありません。QiskitのParameterクラスを使ってパラメーターを初期化し、回路を構築するゲートが追加された時にそれに応じて使います。以下の例では、回転量子ゲートの回転角をパラメーターとします。
同じパラメーターは、同じ回路の中で何回も使うことができます。上記の回路で、同じパラメーターを異なるゲートに繰り返し使うことを考えてみてください。
便宜上、QiskitにはParameterVectorクラスが存在し、一度に複数のパラメーターを作ることができます。 以下のRealAmplitudes回路について考えてみてください。この回路は、パラメーター付きゲートとエンタングルするゲートの交互の層で構成されています。RealAmplitudes 変分形式は量子機械学習でよく使われ、Qiskitのcircuit libraryにもあります。
量子回路の一部であるパラメーターを調べることができます。
パラメーターに値を割り当てる
パラメーター付き回路は、パラメーターの値が割り当てられないと量子バックエンドで実行できません。そのためにQuantumCircuitメソッドを使うことができます。
bind_parametersは回路のパラメーターに数値を割り当て、新しい回路を作ります。 assign_parametersで、数値を割り当て、または他のパラメーター式を用いて、パラメーターを代用することができます。 さらに、assign_parametersでは、新しい回路を作る代わりにパラメーターを代用することができます。 回路のパラメーターに割り当てられるべき値またはパラメーター式は、ディクショナリーとして提供できます。ディクショナリー・キーは回路のパラメーターに相当し、ディクショナリーの値が値に紐づけられるか、または値の反復として提供されます。 後者においては、値は、回路に追加されたパラメーターから順にパラメーターに割り当てられます。
元の回路のパラメーターを別のパラメーター式で置き換えた次の回路を考えてみましょう。
制限付きの回路が、量子デバイス上で実行できるようになりました。パラメーター付き量子回路を、パラメーターが割り当てられていない状態で実行しようとすると、エラーが発生します。
二次計画法
この章では、MaxCut問題を振り返り、Qiskitで二次計画法を構築する方法を学びます。
MaxCut
MaxCut問題では、入力を(おそらく重みのある)グラフとし、異なるカットからの頂点を結ぶエッジの累積重みが最大となるような、グラフの頂点を2つの離散したセットに分割する方法を見つけます。
を個の頂点を持つ(重み付き)グラフとします。頂点に番号を付け、各頂点に値0か1のどちらかを割り当てることで、グラフの任意のカットをベクトルで識別することができます。そして、カットの重みは、以下のコスト関数により決まります。
ここで、は頂点とを結ぶエッジの重みで、とがエッジでつながっていない場合はとします。の場合に限り、各エッジの重みが合計にちょうど1回寄与することは簡単にわかります。
以下に定義されているディクショナリーのgraphsには、様々なグラフのインスタンスが含まれているので、調べてみてください。各グラフの末尾の名前は、使われている重みの種類を指定しています。
networkxモジュールを使ってもう一つのグラフ・インスタンスを作成し、ディクショナリーに追加してみましょう。下のウィジェットを使って、異なるグラフ・インスタンスのカットを調べることができます。 2グループの頂点がそれぞれ水色と紺で示され、異なるグループ間の頂点の間につながっている辺(つまりカットの重みに寄与する部分)が赤で示されています。
Exercise 1: MaxCut
上で新たに定義したグラフについて、最大のカットを見つけて、ビットのリスト'[]'としてgraderに渡します。可能なすべてのビット列に対するコスト関数の値を棒グラフで表示する以下の関数を使うことができますが、特定のビット列に対するMaxcutのコスト関数の値を計算するコードを追加する必要があります。numpy行列のweight_matrixはを参照しており、weight_matrix[i,j]を介してその要素にアクセスできます。
二次計画法
二次制約付き二次計画法とは、二次目的関数と、最適化変数に対する線形制約および二次制約を持つ最適化問題です。つまり、次のような形で書くことができます。
ここで、は対称的な実数の値の-行列、は、目的関数の二次関数部分と一次関数部分を指定する実数値のベクトルです。最適化変数は、問題に応じて、バイナリー、整数、実数の値のいずれかです。
Qiskitでは、qiskit_optimizationモジュールにあるQuadraticProgramクラスを使って二次計画法を作成することができます。新しいモデルを作成するには、単に希望する名前でイニシャライザーを呼び出します。
binary_var、integer_var、continuous_varというそれぞれのメソッドを呼び出すことで、バイナリー、整数、連続の最適化変数を追加することができます。二次計画法に追加された変数はすべて名前で指定されます。また、整数型や連続型の変数の境界を指定するには、lowerboundとupperboundという引数を使います。
目的関数を設定するには、最小化問題か最大化問題かに応じて、minimize または maximizeというメソッドを使用します。linearとquadraticの引数には、リスト、行列、ディクショナリーのいずれかを渡すことで、二次項と線形項を指定できます。また、引数constantで定数のオフセットを指定することも可能です。
最後に、二次計画法を読みやすい形式で表示するには、export_as_lp_stringメソッドを使用します。
二次計画法を一から作るのではなく、既存のdocplexモデルを変換することもできます。詳しくは、二次計画法のチュートリアル で説明しています。
二次計画法としてのMaxCut
任意のMaxCut問題を二次計画法で定式化することができます。対称的な重み行列を持つMaxCut問題のコスト関数をもう一度考えてみましょう。
これは明らかに二次コスト関数であり、上に書いたように二次計画法の標準的な形式で再構成することができます。 とについては、以下のように定義されます。 このようにして、バイナリー変数、二次目的関数を持ち、変数制約のない最適化インスタンスが得られます。このような形式の二次計画法は、二次制約なし二値最適化インスタンス(quadratic unconstrained binary optimization instance)、略してQUBOとも呼ばれます。次のセクションでは、QAOAを使ってこのタイプの問題を最適化する方法を学びます。
Exercise 2: MaxCutからQUBOへ
以下の関数は、graphで定義されたMaxCut問題インスタンスから二次計画法を構築するものです。前のセクションで説明した方法を使って、コードを完成させて下さい。二次計画法にバイナリー変数を'x_0', 'x_1', ..., 'x_n'という名前をつけて追加する必要があります。ここでは、重み行列をweight_matrixと呼び、qubo行列をqubo_matrixと呼びます。
QAOA
このセクションでは、Qiskitに実装されているQuantum Approximate Optimization Algorithm (QAOA)を用いて、QAOAの変分形式の独自のバージョンを実装し、上のセクションで定義したMaxCut問題を解きます。
QAOA の変分形式
QAOAの変分形式は、次のような層状構造になっていることを思い出してください。
ここで、は最適化問題のコスト関数を符号化したコストハミルトニアン、はミキサーハミルトニアンを指します。
オリジナル版のQAOAでは、初期準備状態は、均等な重ね合わせ状態 であり、ミキサーハミルトニアンは、すべての量子ビットの単一パウリ演算子の和として以下のように定義されます。
対応する行列を持つQUBOインスタンスに対して、我々はコスト関数をコストハミルトニアンとして符号化したいです。つまり、すべての計算基底状態に対して以下のような演算子を見つけようとしています。
以下の事実を使います。
ここで、は単位演算子、 は量子ビットのPauli-Z行列を表します。コスト関数の式において、という置換を行うことで、をPauli-Z演算子の総和として書くことができます。これにより、次のようなの式が得られます。
両方のハミルトニアンを指数化すると、コスト層にとのゲート、ミキサー層にのゲートからなる変分法が得られます。 例として、上で定義したMaxCutインスタンスのQUBOに対するQAOA変分形式(の場合)を考えます。
上の回路のゲートは、2つのゲートと1つのシングル回転ゲートの組み合わせとして分解されています。また、MaxCut QUBOインスタンスのQAOA回路では、シングル回転ゲートの角度は常に0に等しいことに注意してください。
Exercise 3: QAOAの変分形式
二次計画法とパラメータを入力として受け取り、出力として対応する層のQAOA回路を生成する関数を書いてください。 関数の基本的な構成は以下の通りですが、コスト層やミキサー層として適用される部分を作成する必要があります。 また、上の説明の最後の式にあるように、回転ゲートの角度を計算する必要があります。 以下のコードでは、qubo行列をqubo_matrix、ベクトルをqubo_linearityと表記しています。回路の中に測定が入らないように注意してください。
上記の演習を終えたら、さまざまなグラフインスタンスのQAOA回路を調べてみましょう。
QAOAクラスとMinimumEigenOptimizerクラス
これまでの演習を完了された方、おめでとうございます! あなたは、一般的なQUBOインスタンス、特にMaxCut問題を量子コンピューター上で実行して解くことができる独自QAOAを実装しました。Qiskitは、たった数行のコードで最適化問題を解く独自のQAOAの実装も提供しています。
QiskitにおけるQAOAのクラスは、qiskit.algorithmsの中にあり、変分固有値ソルバーのクラスVQEを直接継承しています。 QAOAのイニシャライザーは、特に以下の入力パラメーターを受け取ります。
optimizer: この引数は、回路のパラメーターをアップデートするための古典オプティマイザーをさします。Qiskitは、数多くの異なるoptimizersを提供しており、QiskitのNativeOptimizerクラスをサブクラス化することで独自のオプティマイザーを定義することもできます。Qiskitで提供されている基本的なオプティマイザーは以下のものがあります。reps: QAOAの変分形式における層の数、つまり、アルゴリズムの深さ(デプス)です。の値が高いと、QAOAは理論的には、より良い結果を得ますが、量子回路は深くなり、最適化すべきパラメーターが増えます。initial_point: 最適化を始めるための、最適化された初期パラメーターの値(との値)。quantum_instance:アルゴリズムを実行させる量子インスタンス。これは、シミュレーターかまたは、実際のハードウェアデバイスです。callback: 最適化の過程をモニターするための呼び出し関数。
以下で、QAOAの最適化過程において、これらの引数の影響をテストすることができます。
MinimumEigenOptimizerオブジェクトは、最適化プロセスにおけるラッパーを提供し、対応する最適化の結果を得るために、二次計画法から、QAOAなどの与えられたMinimumEigenSolverと呼ばれる量子ビット演算子への変換を処理します。イニシャライザーは、最適化に使用するMinimumEigenSolverを入力として受け取り、二次計画法を入力とするoptimizeメソッドを呼び出すことで最適化が実行されます。全てを一つにまとめると、上で定義したMaxCut問題の解をたった数行のコードで求めることができます。
ご覧のように、わずかな回数の最適化ステップで最適値を得ることができます。最適化された状態ベクトルを表示することで、パラメーターの最適化が完了した後に、どのビット列がよりサンプリングされる可能性が高いかを確認できます。
QAOAの最適化プロセスの探究
以下のウィジェットは、上で定義されたMaxCut問題についてすでに計算されたエネルギーの分布を表し、深さにおけるQAOAの最適化の過程を可視化しています。パラメーターを更新するたびに、状態ベクトルと平均関数値がどのように変化するかを示しています。 別の古典オプティマイザーや初期ポイントを使って、最適化プロセスにどれだけ影響があるかみてみましょう。initial_pointセットにおける最初の値は、パラメーターの初期値を設定し、2個目の値はパラメーターの値を設定することに注意してください。
上にプロットされたコスト関数のランドスケープに周期性があることに注目してください。 これは、QAOAの変分形式で使われる回転ゲートに周期性があることの直接的な結果です。 全ての回転ゲートがの周期性を持ち、我々が調べているMaxCutの例が、整数の重みのみをエッジに持つので、パラメーターのの周期性が、パラメーターのの周期性が認められます。
の値がより高い時
より大きな値のにおいては、QAOAは、理論的にコストハミルトニアンに対してより良いエネルギー値を持つ量子状態に到達することができます。なぜなら、層の数を増やすと、到達できる量子状態の空間が厳密に増えるからです。つまり、もし
が深さのQAOA変分形式で最大エネルギー値に到達することを示す場合、以下が成り立ちます。
実際、断熱定理を使えば、無限の極限では、以下のコスト関数の最大値に到達することを証明できます。
断熱量子コンピューターとの関連性は、QAOAが良い結果をもたらすと期待する理由の正当性を示しますが、それが成立するのは無限の限界においてのみであり、それはつまり、無限の長い量子アルゴリズムに対応するものです。 また、層の数の増加とともにパラメーターの数が増え、パラメーターの数が増えれば増えるほど大域的な最適解を見つけるのが難しくなるという事実にも注意する必要があります。
以下のプロットは、の値の増加に伴う最適なQAOAの状態の進化を示し、回路の深さがQAOAのパフォーマンスに与える影響について示しています。
CVaR
最近提案されたQAOAの適応作の一つは、リスクのある条件付き価値(CVaR)を計算するアイディアです。ここでは、コスト関数を計算するために、回路の測定結果から、全てのカットの値の平均を計算する代わりに、アルゴリズムは、測定された最大のカット値の一部のみを考慮します。
ここで、は大きさが多い側に並んでいます。 我々が興味があるのは、最適化問題の最適解を一つ得ることだけなので、最適なカットの一部のみを見ることで最適化プロセスをスピードアップさせることができます。 CVaRを使うことで、QAOAインスタンスのエネルギーランドスケープがどのように変化するか見てみましょう。 以下のコードは、上のexerciseであなたが作成したコードを使って、与えられたMaxCutインスタンスについてQAOAランドスケープを作成しプロットし、グリッドサーチにおいて最適なパラメーターを返します。 エネルギーランドスケープの計算には少し時間がかかります。
Exercise 4: CVaR
上記のコードを適応して、サンプルされたすべてのカット値の平均を取る代わりに、リスク時の条件付き値を計算するアルゴリズムで、パラメータの設定を変化させることでQAOAのエネルギー分布がどのように変わるかを観察します。1000ショットを用いてCVaRパラメータをに設定し、qasm simulatorのrandom seedを42に設定した場合(上記のコードで既に設定しています)、グリッド探索によって得られるエネルギーと最適なパラメーターはどのようになるでしょうか。
その他の参考資料
QiskiteテキストブックにおけるVQEのチュートリアル
QiskiteテキストブックにおけるQAOAによる組み合わせ最適化のチュートリアル
E. Farhi, J. Goldstone, and S. Gutmann, A Quantum Approximate Optimization Algorithm (2014): QAOAの最初の論文
サイモンズ計算機理論研究所におけるE. Farhiによる QAOAの最近の結果 についてのスピーチ