Path: blob/main/translations/ja/ch-paper-implementations/vqls.ipynb
3855 views
量子変分線型ソルバー(Valiational Quantum Linear Solver)
1. はじめに
線型変分量子ソルバー(Variational Quantum Linear Solver:VQLS)は、古典コンピューターよりも効率的に連立一次方程式を解くためにVQEを活用する変分量子アルゴリズムです。特に、 既知のベクトル に対して、を満たす行列が与えられたときに、VQLSアルゴリズムは理論的に、上記の関係式を満たすようなに比例する規格化されたを発見することができます。
このアルゴリズムの出力は、HHLアルゴリズムのものと同一で、HHLはVQLSよりもはるかにスピードアップが見込まれますが、VQLSはNISQ量子コンピューター上での稼働を可能にしている一方、HHLは多くの量子ビットを搭載していて、十分なエラー耐性が実現している量子ハードウェアを必要とします。
2. アルゴリズム
最初に、このアルゴリズムの入力は、複素係数で線型結合されたユニタリ行列に分解できる行列とします。
各はユニタリとして、状態から状態に遷移するユニタリ行列をとします。ここで、変分量子アルゴリズムの一般的な構造を思い出してください。低深度のパラメーター化された量子回路で評価し、古典的オプティマイザーに出力するような、量子コスト関数を構成しなければいけません。これにより、であるような、パラメーターセットをパラメーター空間から探すことができるようになります。ここで、 は、あるパラメーターセットにおける量子回路の出力になります。
実際のコスト関数を構成する前に、原論文に記載されている画像を元に、このアルゴリズムにおけるサブルーチンの俯瞰した概要を見てみましょう。

各量子ビットがに初期化されている量子ビットレジスタから始めます。このアルゴリズムは、入力値を取り入れて、コスト関数を準備し、評価し、いくつかの補助量子ビット状態を生成します。計算したコストが、あるパラメーターよりも大きい場合、このアルゴリズムは、パラメーターを更新して再度実行します。そうでない場合は、アルゴリズムは処理を停止し、補助量子ビット状態は最適なパラメーターによって計算されます。これにより、コスト関数を最小化する状態ベクトルが得られ、の規格化したベクトルを得ることができます。
3. Qiskitでの実装
固定ハードウェア補助量子ビット状態(Fixed Hardware Ansatz)
任意の状態を用意する、補助量子ビット状態を考えることから始めてみましょう。これによって、パラメーターを変動させることによって状態空間を“探索”することができるようになります。では、今回の実装に使う補助量子ビット状態を次のように与えてみましょう。
これは固定ハードウェア補助量子ビット状態(fixed hardware ansatz)と呼ばれます、量子ゲートの構成は、各実行において回路は同じであり、パラメーターが置き換わります。QAOAにおけるanstazとは異なり、トロッター化されたハミルトニアンでは構成されていません。が異なる量子ビット間での"干渉"を起こす限り、ゲートの応用によって、状態空間を探索できるようになります。
ここで、実際のコスト関数について考えてみましょう。このアルゴリズムの目的は、コストを最小化することです。つまり、が に非常に近い時にはコスト関数の出力をとても小さくし、逆に直交するようなベクトルであった場合にはコスト関数を大きくするようにします。そこで、射影ハミルトニアンを導入します。
これは次のような性質を持ちます。
第2項目から、に沿った の"適合度"がわかります。次に、これを別の数値から差し引いて、と の内積が大きい場合(より一致する場合)、望ましい低い数を取得します。これだけでもとても良く見えます。しかし、このアルゴリズムの正確性をさらに向上させることができる方法がもう一つあります。これは、が小さいノルムを持つと、に一致していなくても、コスト関数が小さい値になってしまうという事実です。それゆえ、をに置き換えると次のようになります。
これで、補助ビットによって を準備できました。ここから、コスト関数を計算するために、2つの値とを求めていきます。幸運なことに、これらを計算するための量子サブルーチンとして、アダマールテストを使って計算することができます。本質的に、もし何らかのユニタリ演算子と状態を持っていて、その状態に対するの期待値 を求めたいとすると、その時、次の回路で見積ることができます。

このとき、最初の量子ビットがと測定される確率はであり、と測定される確率はとなり、この2つの確率の差を取ることでを得ます。幸運なことに、このテストで扱おうとしているこの行列は、この特定の実装において、全要素が実数の行列、つまりです。これは、アダマールテストがどのように動くかを示したものです。回路図によると、一般の状態ベクトルは次のようになります。
制御ユニタリゲートを作用させると、次のようになります:
最初の量子ビットにアダマールテストを作用させます:
最初の量子ビットに測定を行うと、これがを測定する確率を見つけることを思い出すと、その状態との内積を計算しなければならず、その時にそれの複素共役(複素共役に慣れていない場合は、量子力学の章を確認してください。)をかけることになります。同じことをの測定についても行います。それによって、次の式を得ます。
同様の手順で、次の式を得ます:
それから、差分を取ります:
素晴らしい!今、我々は計算しなければならない2つの値についてこれを実装できました。から始めて、我々は次の式を得ます。
そして、アダマールテストを使うことで、いかなる項を計算することができるようになりました。これによって、我々は状態を用意して、ユニタリ行列とに対していくつかの制御補助量子ビットと共に制御演算を行います。これをコードで実装します。
我々が2つの異なるゲートタイプを適用しようとする理由は、これがの拡張形式の中に見れるゲートのペアを表現しているからです。
この実装の目的に注意しておくことも重要です。(実際に解く連立方程式は、ゲートとにだけ関心があり、したがってこれらのゲートのサポートのみを含みます。(そのコードでは、に対するとに対する)という異なるゲートの応用を意味する数字”識別子”を含みます。))
今、我々は計算すべき2つ目の値に移ることができます。次の式を得ます。
今しなければならないことは、積に対して以前と同じ拡張です。
今再び、このデモの目的として、我々が実装した全ての出力/期待値が実数になることを見ることになります。つまり、次の式を得ます。
故に、この特定の実装では
新しく提案されたアダマールオーバーラップテスト(別紙参照)と呼ばれる方法を使って、この値を得るための洗練された方法がありますが、このチュートリアルではそれぞの行列を操作する標準的なアダマールテストのみを使っていきます。不幸なことに、これは補助量子ビットの使用が必要となります。我々は本質的に、補助量子ビット 事前準備したユニタリとユニタリ に関連する各ゲートに制御を配置します。 これで制御補助ビットに対してこれになるようなものを得られます。
外部量子ビットq0_4に注目してください。これは補助量子ビットであり、この回路にあるようにゲートを作れるようになます。今、我々もも回路で作る必要があります。我々の実装では、を次のように構成します。
故に、我々は次の関数を作れます。
最終的に、我々は新しいアダマールテストを構成します。
これは、我々のパラメーターの全てがに設定されたときの特別な実装であり、ゲートの集合は単に[0, 0, 0]が全ての量子ビット上での恒等行列を作用させることに相当し、[0, 0, 1]が第3量子ビットに行列を作用させるものになります。(我々の"コード表記法"に従う)
さて、最終的なコスト関数を計算する準備ができました。これは単純に、異なる回路からの期待出力のすべての組み合わせの積を取り、それぞれの係数を掛け合わせて、前に説明したコスト関数に配置することを意味します!
このコードは長くて大変そうに見えますが、そんなことはありません!この状況では、数値的なアプローチを取っており、ここで、状態にある補助量子ビットアダマール用量子ビットの測定に一致する各々の状態の振幅の2乗を計算し、この情報を元にを計算します。これは非常に正確ですが、(後でサンプリングについて議論しますが)現実の量子デバイスではこれらの確率を生成するために何度も回路のサンプリングを行わないといけないので、現実的ではありません。加えて、このコードは最適化されていません(必要以上に回路の評価を完成させています)。しかしこれが実装可能な最も簡単な方法であり、近い将来このチュートリアルを更新して最適化する予定です。
最後のステップは、実際にある一次方程式を解くことをこのコードを使って実施してみることです。まずは1つ例を見ていきましょう。
コスト関数を最小化するために、COBYLA最適化手法を繰り返し使用していきます。パラメーターに対する我々の探査空間は初期ではランダムに選択されるで決定されます。最適化された状態ベクトルを獲得するために、オプティマイザーを200ステップ実行し、そこで停止して最適なパラメーターに対して補助ビットを適用します。さらに、このアルゴリズムが実際に機能するかを確認するために、いくつかの後処理を計算します!これをするために、最適なベクトルにを適用し、それを正規化し、このベクトルと回答ベクトル との内積の2乗を計算します。これを全てコードに書き下すと以下のようになります。
見て取れるように、コスト関数は非常に小さい値0.03273673575407443を達成しています。そして古典的コスト関数計算すると、我々が測定したものと完全に一致するように 0.96776862579723を得ます。ベクトルとはとても似ています。
別のテストやってみましょう。このとき、を同じにしておきますが、次のようにします。
再び、最適化コードを実行します。
再び、0.00014718223342624626という非常に小さいエラーとなっており、古典的コスト関数は0.9998563418983931になっています。正常に動いています!
今、このアルゴリズムが理論通り動いていることがわかりました。数値的に確率を計算する代わりに回路をサンプリングしてある回路のシミュレーションをいくつか実行してみました。そこで、実際の量子コンピューターが動いているように、量子回路を取り出してみましょう!いくつかの理由により、このシミュレーションだけは、とんでもないショット(結果の確率分布を計算するために回路を実行する)数に対して、ほんの少し良く収束するでしょう。これは、量子回路をサンプリングする際のノイズ性(同じパラメータで測定しても、必ずしも同じ結果が得られるとは限らない)から、古典的なオプティマイザ(COBYLA)の限界に起因していることがほとんどだと考えられます。幸運なことに、SPSAのようなノイズのある関数に対して構築した他のオプティマイザーがあります。しかしこのチュートリアルではそこまで踏み込みません。の2番目の値と同じ行列のサンプリングをしてみましょう。
見てきたように、驚くことなく、この解法はまだかなりのマージンで外れています。(エラーは酷くはありませんが、しかし理想的には、より0に近づけていこうとしています。)さらに、これは実際の量子回路が原因であったわけではなく、オプティマイザー自身のせいだと考えれます。この問題(先ほど述べたように、ノイズありオプティマイザーの導入のように)を正す方法を理解してから、このノートブックを更新していきます。
4. 謝辞
この実装は、研究論文"Variational Quantum Linear Solver: A Hybrid Algorithm for Linear Systems", written by Carlos Bravo-Prieto, Ryan LaRose, M. Cerezo, Yiğit Subaşı, Lukasz Cincio, and Patrick J. Coles で述べられる内容を元にしています。
論文に関する私の質問に答えてくれたカルロス・ブラボ=プリエト氏に特別な感謝の意を表したいと思います。