Path: blob/master/site/ja/quantum/tutorials/gradients.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
勾配の計算
このチュートリアルでは、量子回路の期待値の勾配計算アルゴリズムについて説明します。
量子回路で特定のオブザーバブルの期待値の勾配を計算することは、複雑なプロセスです。行列の乗算やベクトルの加算などの従来の機械学習変換では簡単に使用できる解析的勾配式がありますが、オブザーバブルの期待値には、このような解析的勾配式は必ずしもありません。そのため、シナリオに適したさまざまな量子勾配計算方法を使用する必要があります。このチュートリアルでは、2 つの異なる微分スキームを比較対照します。
セットアップ
TensorFlow Quantum をインストールします。
次に、TensorFlow とモジュールの依存関係をインポートします。
1. 予備
量子回路の勾配計算の概念をもう少し具体的に見てみましょう。次のようなパラメータ化された回路があるとします。
オブザーバブルは以下のとおりです。
この演算子を見ると、 であることが分かります。
と定義すると になります。確認しましょう。
2. 微分器の必要性
より大きな回路では、与えられた量子回路の勾配を正確に計算する式は必ずしもありません。単純な式では勾配を計算できない場合、tfq.differentiators.Differentiator
クラスを使用すると、回路の勾配を計算するためのアルゴリズムを定義できます。たとえば、TensorFlow Quantum(TFQ)で上記の例を次のように再現できます。
ただし、サンプリングに基づいて期待値を推定するように切り替えると(実際のデバイスで何が起こるか)、値が少し変わる可能性があります。これは、期待値が不正確になることを意味します。
これは、勾配における深刻な精度の問題につながる可能性があります。
ここでは、解析の場合は有限差分式は勾配自体を高速に計算できますが、サンプリングベースの方法の場合ではノイズが多すぎることが分かります。適切な勾配を計算するには、より注意深い手法を使用する必要があります。次に、解析的期待値の勾配計算にはあまり適していませんが、実際のサンプルベースの方法の場合ではより優れたパフォーマンスを発揮する、大幅に低速な手法を見ていきます。
上記から、特定の微分器が特定の研究シナリオに最適であることがわかります。一般に、デバイスノイズなどに対して堅牢な、低速のサンプルベースの方法は、より「現実的」設定でアルゴリズムをテストまたは実装する場合に適した微分器です。有限差分のようなより高速な方法はアルゴリズムのデバイスにおける実行可能性にはまだ関心がなく、解析的計算やより高いスループットが必要な場合に最適です。
3. 複数のオブザーバブル
2 番目のオブザーバブルを使用し、TensorFlow Quantum が 1 つの回路に対して複数のオブザーバブルをサポートする方法を見てみましょう。
このオブザーバブルが以前と同じ回路で使用されている場合、 およびになります。確認します。
(ほぼ)一致します。
次に、 を定義すると、になります。TensorFlow Quantum で複数のオブザーバブルを定義して回路と共に使用するには、 にさらに項を追加します。
これは、回路内の特定のシンボルの勾配が、その回路に適用されたそのシンボルの各オブザーバブルに関する勾配の合計に等しいことを意味します。これは、TensorFlow の勾配取得およびバックプロパゲーションと互換性があります(特定のシンボルの勾配として、すべてのオブザーバブルの勾配の合計を指定します)。
ここで、最初のエントリは期待値 w.r.t Pauli X であり、2 番目のエントリは期待値 w.r.t Pauli Z です。勾配は以下のとおりです。
ここで、各オブザーバブルの勾配の合計が実際に の勾配であることを確認しました。この動作は、すべての TensorFlow Quantum 微分器によってサポートされており、TensorFlow の他の部分との互換性において重要な役割を果たします。
4. 高度な使用
TensorFlow Quantum 内にあるすべての微分器は tfq.differentiators.Differentiator
をサブクラス化します。微分器を実装するには、ユーザーは 2 つのインターフェースのいずれかを実装する必要があります。標準的なのは get_gradient_circuits
を実装することで、これは勾配の推定を取得するためにどの回路を測定するのかを基本クラスに指定します。または、differentiate_analytic
と differentiate_sampled
をオーバーロードすることもできます。クラス tfq.differentiators.Adjoint
はこの経路を使用します。
以下は TensorFlow Quantum を使用して、サーキットの勾配を実装しています。パラメーターシフトの小さな例を使用します。
上記で定義した という回路を思い出してみましょう。前と同様に、 観測可能に対するこの回路の期待値として関数を定義できます()。パラメーターシフトの規則を使用すると、この回路では、導関数は であることを見つけ出すことができます。get_gradient_circuits
関数は、この導関数の成分を返します。
Differentiator
の基本クラスは、上記で見たパラメーターシフトの式のように、get_gradient_circuits
から返された成分を使用して導関数を計算します。この新しい微分器を tfq.layer
オブジェクトで使用することができます。
この新しい微分器を使用して、微分可能な演算を生成できるようになりました。
重要点:微分器は一度に 1 つの演算にしか接続できないため、以前に演算に接続されていた微分器は、新しい演算に接続する前に更新する必要があります。
成功:TensorFlow Quantum が提供するすべての微分器を使用して、独自の微分器を定義できるようになりました。