PennyLane : 初級 Tutorials : Gaussian 変換

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. 1 つの wire (qumode) で真空状態で始めます。前の 量子ビット・チュートリアル のように初期状態のために同じ表記 $|0\rangle$ を使用することに注意してください。光量子 CV 系では、この状態は真空状態です、i.e., wire に光量子がない状態です。
  2. qumode を displace します。displacement ゲートは位相空間の qumode の状態を線形にシフトします。真空状態は位相空間の源 (= origin) で中心に置かれますが、一方で displace された状態はポイント $\alpha$ で中心に置かれます。
  3. qumode を回転します。これは位相空間のもう一つの線形変換です、displacement の代わりに (角度 $\phi$ による) 回転ですが。
  4. 最後に、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 に影響します。

 

以上