PennyLane 初級 Tutorials : Gaussian 変換 (翻訳)
翻訳 : (株)クラスキャット セールスインフォメーション
作成日時 : 10/18/2019
* 本ページは、PennyLane : Tutorials : Learn PennyLane の次のページを翻訳した上で適宜、補足説明したものです:
* サンプルコードの動作確認はしておりますが、必要な場合には適宜、追加改変しています。
* ご自由にリンクを張って頂いてかまいませんが、sales-info@classcat.com までご一報いただけると嬉しいです。
$$
\def\bra#1{\mathinner{\left\langle{#1}\right|}}
\def\ket#1{\mathinner{\left|{#1}\right\rangle}}
\def\braket#1#2{\mathinner{\left\langle{#1}\middle|#2\right\rangle}}
$$
初級 Tutorials : Gaussian 変換
このチュートリアルは連続変数 (CV) 光量子デバイスのための PennyLane の基本動作原理を実演します。光量子計算についてのより詳細のためには、Strawberry Fields ドキュメント が素晴らしい開始点です。
量子回路
この基本的なチュートリアルのために、CV 演算の特別なサブセットを考えます : Gaussian 変換です。次の単純な Gaussian 回路で作業します :
この回路は何をしているのでしょう?
- 1 つの wire (qumode) で真空状態で始めます。前の 量子ビット・チュートリアル のように初期状態のために同じ表記 $|0\rangle$ を使用することに注意してください。光量子 CV 系では、この状態は真空状態です、i.e., wire に光量子がない状態です。
- qumode を displace します。displacement ゲートは位相空間の qumode の状態を線形にシフトします。真空状態は位相空間の源 (= origin) で中心に置かれますが、一方で displace された状態はポイント $\alpha$ で中心に置かれます。
- qumode を回転します。これは位相空間のもう一つの線形変換です、displacement の代わりに (角度 $\phi$ による) 回転ですが。
- 最後に、mean photon number $\langle\hat{n}\rangle = \langle\hat{a}^\dagger \hat{a}\rangle$ を測定します。最終状態の photon の平均総量を伝えてくれるこの量は photonic 系のエネルギーに比例します。
このチュートリアルは回路パラメータ $(\alpha, \phi)$ を mean photon number が 1 に等しくなるように最適化することです。回転ゲートは実際には pasive 変換です、それは系のエネルギーを変更しないことを意味します。displacement ゲートは active 変換で、これは photonic 系のエネルギーを変更します。
QNode を構築する
前のように、PennyLane、そして PennyLane により提供される NumPy のラップされたバージョンをインポートします :
import pennylane as qml from pennylane import numpy as np
次に、回路を評価するために使用されるデバイスをインスタンス化します。私達の回路は Gaussian 演算のみを含みますので、組込み default.gaussian を利用できます。
dev_gaussian = qml.device("default.gaussian", wires=1)
デバイスを初期化した後、量子ノードをコンストラクトできます。前のように、(上の回路によりエンコードされた) 量子関数を default.gaussian デバイス上で動作する量子ノードに変換するために qnode デコレータ を使用します。
@qml.qnode(dev_gaussian) def mean_photon_gaussian(mag_alpha, phase_alpha, phi): qml.Displacement(mag_alpha, phase_alpha, wires=0) qml.Rotation(phi, wires=0) return qml.expval(qml.NumberOperator(0))
複素数 $\alpha$ を 2 つの実数 mag_alpha と phase_alpha に分解したことに気付いてください、これは $\alpha$ の極 (座標) 表現を形成します。これは勾配の記法が明確で well-definied であるようにです。
最適化
量子ビット回転チュートリアルのように、望まれる結果に向けて量子回路を最適化するために今は組込み PennyLane optimizer の一つを使用しましょう。平均 photon number が正確に 1 になることを望みますので、自乗差コスト関数を使用します :
def cost(params): return (mean_photon_gaussian(params[0], params[1], params[2]) - 1.0) ** 2
最適化の最初に、任意の小さな初期パラメータを選択します :
init_params = [0.015, 0.02, 0.005] print(cost(init_params))
0.9995500506249999
ゲート・パラメータがゼロに近いとき、ゲートは identity 変換に近いです、これは初期状態を大きくは変更しません。初期状態は photon を含みませんので、回路出力の平均 photon number はおよそゼロで、コストは 1 に近いです。
Note
正確にゼロである初期パラメータは回避しました、何故ならばそれはゼロ勾配を持つ critical ポイントに対応するからです。
今、GradientDescentOptimizer を使用して、100 最適化ステップに渡り回路パラメータを更新しましょう。
# initialise the optimizer opt = qml.GradientDescentOptimizer(stepsize=0.1) # set the number of steps steps = 20 # set the initial parameter values params = init_params for i in range(steps): # update the circuit parameters params = opt.step(cost, params) print("Cost after step {:5d}: {:8f}".format(i + 1, cost(params))) print("Optimized mag_alpha:{:8f}".format(params[0])) print("Optimized phase_alpha:{:8f}".format(params[1])) print("Optimized phi:{:8f}".format(params[2]))
Cost after step 1: 0.999118 Cost after step 2: 0.998273 Cost after step 3: 0.996618 Cost after step 4: 0.993382 Cost after step 5: 0.987074 Cost after step 6: 0.974837 Cost after step 7: 0.951332 Cost after step 8: 0.907043 Cost after step 9: 0.826649 Cost after step 10: 0.690812 Cost after step 11: 0.490303 Cost after step 12: 0.258845 Cost after step 13: 0.083224 Cost after step 14: 0.013179 Cost after step 15: 0.001001 Cost after step 16: 0.000049 Cost after step 17: 0.000002 Cost after step 18: 0.000000 Cost after step 19: 0.000000 Cost after step 20: 0.000000 Optimized mag_alpha:0.999994 Optimized phase_alpha:0.020000 Optimized phi:0.005000
最適化はゼロのコスト関数値におよそ 20 ステップ後に収束します。2 つの角度パラメータ phase_alpha と phi は最適化の間変化しないことを観測します。複素 displacement $\alpha$ の大きさだけが回路の平均 photon number に影響します。
以上