Path: blob/main/notebooks/summer-school/2021/resources/lab-notebooks/lab-4-ja.ipynb
3855 views

パラメーター化量子回路の学習
このラボセッションでは、回路ベースのモデルをトレーニングする方法について詳しく見ていきます。このセッションの終わりには、以下のことがわかるはずです。
変分法量子分類器の作り方
さまざまな学習手法、特に勾配ベースの学習手法の使い方
変分法に基づくモデルにはどのような制限があり、それをどのように克服できるか
どこでパラメーター化回路を学習する必要があるか?
タスク

勾配
Qiskitでは期待値の勾配を計算する方法をいくつか提供しています。それらを見ていきましょう!
パラメーター化試行状態(Ansatz)は です。ここで は次の回路で与えられます。
そして、この例での我々のハミルトニアンはです。
これらを使って期待値を計算します。 :
具体的には 、と添字を固定した上で次のことを考えます:「点 でのパラメータ に対する期待値の微分は何か?」
ランダムな点と添字を選びます。(0からカウントすることを忘れないでください)
このセッションを通して、8192ショットのショットベースシミュレーターを使っていきます。
期待値の計算
期待値を使うことが多いので、Qiskitでどのように使われていたかを振り返ってみましょう。
qiskit.opflow モジュールを使って、期待値を書いたり評価することができます。ある回路によって準備された状態の期待値の一般的な構造は次のようになります。
上記のコードでは、期待値の評価に単純な行列の乗算を使用していますが、これは量子ビットの数が多い場合には非効率的です。 代わりに、シミュレーター (もしくは実量子デバイス)を使って、CircuitSampler と PauliExpectation のような期待値変換器を併用して、以下のように回路を評価することができます。
Exercise 1:次のハミルトニアンHと単純な行列積回路U で準備される状態との期待を計算してみましょう。
Exercise 2: ノートブックの最初に定義したQuantumInstanceオブジェクトq_instance を使ってQASMシミュレーターでの期待値を評価してみましょう。
有限差分勾配
勾配を近似する最も簡単な方法は、おそらく有限差分法です。これは、関数の内部構造(非常に複雑な場合もある)に関係なく動作します。
手作りでこの計算をする代わりに、QiskitのGradientクラスをこのために使うことができます。
有限差分勾配はノイズの多い関数では不安定になることがあり、勾配の正確な公式を使うことでより安定した結果を得ることができます。
解析的勾配
幸運なことに、回路ベース勾配の公式として、パラメーターシフト則(parameter shift rule)というものがあります. (注意: ここでは、係数のないPauli回転についてのみ述べます, Evaluating analytic gradients on quantum hardware)を参照してください。

同じ原理で、ユニタリ線形結合(linear combination of unitaries) アプローチというものがあります。追加の補助量子ビットを使いますが、1つの回路だけを使うことができます。
最適化を試してみましょう!
再現性を高めるために、最初のポイントを固定しました。
期待値を評価する関数があるのと同様に、勾配を評価する関数も必要です。
オプティマイザーの収束を比較するために、コールバック関数を使って各ステップでの損失を追跡することができます。

そして、最適化を開始し、損失をプロットします。
これはいつも動くのでしょうか?

自然勾配



Qiskitでは、Gradientの代わりにNaturalGradientクラスを使うことで、自然勾配を評価することができます!
勾配を計算する関数と同様に、自然勾配を評価する関数を書くことができます。
ご覧のように、実際に違いがあります。
これが収束にどのような影響を与えるか見てみましょう。
これは素晴らしいことです。しかし、この勾配を評価するために必要な回路数を考えると、コストが高くなってしまいます。

同時摂動による確率的近似法
アイデア: 勾配からサンプリングすることで、高価な勾配評価を避けます。正確な値は気にせず、収束だけを気にしているので、偏りのないのサンプリングは平均して同じようにうまくいくはずです。

この最適化手法はSPSAと呼ばれています。その性能はどうでしょうか?
しかも、ほんのわずかなコストでした。
自然勾配も同じようにできるのでしょうか?


その結果、なんと、できることがわかりました。
ここでは詳細を省略しますが、考え方としては、勾配からだけでなく、これを量子フィッシャー情報にまで拡大して、自然勾配にまで拡大することです。
コストはどのくらいでしょうか?

実践トレーニング
現在でも、勾配の評価は非常に高コストであり、また、どのような場合でもノイズの多い読み出しが行われるため、精度の向上はそれほど価値のあるものではありません。そのため、実際にはSPSAを使用することが多いです。収束性を高めるために、一定の学習率ではなく、指数関数的に減少する学習率を使用しています。
学習率が指定されていない場合、Qiskitは自動的に学習率をモデルにキャリブレーションしようとします。
新しい損失関数の学習
この演習では、前回とは異なる損失関数を訓練します。3つのスピンを持つ線形鎖の横磁場イジングハミルトニアン
あるいは、すべての操作を略さずに表記すると
Exercise 3: Opflowの演算子でハミルトニアンを定義してください。 テンソルの塊には必ず括弧をつけてください。, 例えば. は(X ^ X) + (Z ^ I) となるようにしてください
Exercise 4: 今は複素数の振幅を気にしているので、試行状態(Ansatz)として EfficientSU2 変分形式を使用します。横磁場イジングハミルトニアンのエネルギーを評価する evaluate_tfi 関数を使って、 SPSA で最適なパラメータを見つけます。
このセルでは、SPSAオプティマイザを使って最小値を求めます。
ヒント:(学習率と摂動を指定しないことで)自動キャリブレーションを使用し、300回反復すると、最小値に十分近づきます。
VQC/QNNsではどのように使えるのでしょうか?
データ生成
QiskitのMLパッケージで提供されている人工的なデータセットを使っています。他にもIrisやWineなどのデータセットがありますが、ここではデータをプロットできるようにシンプルな2次元のデータにします。
変分型量子分類器の構築
必要な構成要素を手に入れよう。
データをエンコードする特徴量マップ
学習するための試行状態(Ansatz)
評価するための観測量
ここでは、回路ライブラリの標準的な特徴量マップを使用します。
複素数の振幅は気にしないので、実数の振幅だけの試行状態(Ansatz)を使ってみましょう。
この回路をまとめると
期待値のためのグローバルな演算子を使います。
データの分類
全てのパーツを理解したところで、いよいよデータを分類します。そのためにQiskitのMLパッケージを使用しており、回路と期待値を記述するための OpflowQNN クラスと、学習のための NeuralNetworkClassifier を使用しています。
まず、バニラの勾配降下法を行います。
ここで、QNN、損失、オプティマイザーを含む分類器を定義します。
... そして、学習!
test_featureの新しいラベルを予測するには、 predict メソッドを使用します。
また、自然勾配の使い方がわかったので、GradientをNaturalGradientに置き換えることで、自然勾配降下法によるQNNの学習が可能になります。
学習回路の限界
人生にタダで手に入るものはありません...それは、すべてのモデルに十分な大きさの勾配があることも含みます。
勾配を利用したトレーニングは、テストした小さなモデルではうまくいくことがわかりました。しかし、量子ビットの数を増やしても、同じことが期待できるのでしょうか?これを調べるために、異なるモデルサイズの勾配の分散を測定しました。考え方は簡単で、もし分散が非常に小さければ、パラメータを更新するのに十分な情報が無いということになります。
指数関数的勾配消失 (不毛な台地:Barren plateaus)
勾配の中から好きな例を選び、量子ビット数やレイヤー数を増やした場合にどうなるかを見てみましょう。

2量子ビットから12量子ビットまでプロットしてみましょう。
なんと、分散が指数関数的に減少しているではありませんか。つまり、勾配に含まれる情報がどんどん少なくなり、モデルの学習に苦労することになります。これは、不毛な台地( Barren plateau )問題または指数関数的勾配消失( exponentially vanishing gradients )として知られています。
Exploratory Exercise: 自然勾配は勾配消失問題の影響を受けるか?
標準的な勾配の代わりに自然勾配でBarren plateau plotを繰り返します。このために,その勾配の代わりに自然勾配を計算する新しい関数 sample_natural_gradients を書きます。
今度は、勾配の分散を確認するために実験を繰り返します(このセルの実行には時間がかかります!)。
その結果をプロットします。何が見えてきましたか?
回路の短縮化については?
この「不毛な台地」について、私たちは何かできることがあるのでしょうか?現在の研究ではホットな話題であり、不毛な台地を緩和するための提案もなされています。
ここでは、グローバルおよびローカルなコスト関数と試行状態(Ansatz)の深さが不毛な台地にどのような影響を与えるかを見てみましょう。
また、local の演算子を使った場合はどうでしょうか?
層別学習

便利な機能:Qiskitの試行状態(Ansatz)回路は可変的にできます!
まとめ
