量子コンピュータゲートモデルの量子古典ハイブリッド計算のVariational Quantum Eigensolverの古典パラメータ最適化にPFNのOptuna使ってみた。


はじめに

パラメータ最適化計算は現在のコンピュータでの問題だけではありません。未来の量子コンピュータも古典パラメータ最適化で困っています。ということで、早速量子コンピュータで発表されたばかりのPFNのOptunaを使ってみます。


Optunaとは!?

日本が誇るPFNが発表したパラメータ自動最適化ツールです。下記を参照ください。

ハイパーパラメータ自動最適化ツール「Optuna」公開

https://research.preferred.jp/2018/12/optuna-release/


量子コンピュータとどのような関係が

量子コンピュータはまだまだ発展途上です、現在のマシンは計算精度が十分に確保できないため、量子コンピュータと古典コンピュータのハイブリッド繰り返し計算を行うことで将来に備えて精度の高い計算を実現しています。

その際に、量子コンピュータの波動関数に古典パラメータを導入し、量子変分原理からハミルトニアンの基底状態を求める量子変分アルゴリズムのVariational Quantum EigensolverにおいてOptunaが使えます。他にも組合せ最適化問題を解くためのQAOAアルゴリズムなどにはたくさんの古典ハイパーパラメータが登場します。

今回はVQEを使ってやってみます。


VQEとは?

VQEはあるハミルトニアンの固有値を求めるためのアルゴリズムで、固有ベクトルに波動関数が入りますが、その状態ベクトルをパラメータで制御して、量子変分原理で基底状態に近づけていくものです。

詳しくはこちらをご覧ください。

BlueqatでVQE(量子変分アルゴリズム)の実装と検証

https://qiita.com/YuichiroMinato/items/62444351b712743d83b7

最適化するパラメータは、波動関数に導入された回転角θです。θは連続的であればいいと思います。


変分原理とは、

E[ψ] = <ψ|H|ψ> >= E0

適当な境界条件を持つ任意の状態|ψ>に対するハミルトニアンHの期待値Eは、基底状態のエネルギーE0よりも常に大きいか等しい。

これを利用して、任意の状態でより基底状態に近いものを探索していきます。この任意の状態|ψ>の探索のためにパラメータθを導入して表現します。


実装方法は、

適当なパラメータθを割り振った初期の波動関数・状態ベクトルを用意し、ハミルトニアンHを用意します。状態ベクトルにHを作用させて、最終的に出てきた<ψ|H|ψ>を測定します。今度はその結果を使って、次のパラメータθを決めて再度繰り返し、一定の値に収束するまで繰り返します。

パラメータθは連続的であれば大丈夫そうですが、今回はRY回転を使って実装をしたいと思います。


ステップの確認

ステップを確認します。

1、状態ベクトルを初期化してRY(θ)回転を使って状態を操作する。

2、求めたいハミルトニアンHを適用する

3、測定してEを求める。

4、以下いろんなθで繰り返し計算を行なってEの低いのを探す

5、ある程度収束したら終了

ステップは慣れればできそうです。今回はせっかくなのでθを0から2πまで離散的に変化させてみます。

今回はこの角度の値をOptunaで最適化してみます。


早速実装

実装には量子コンピュータゲートモデルのSDKであるBlueqatを使います。

https://github.com/Blueqat/Blueqat

from blueqat import Circuit                                                                                                                                                  

import numpy as np
import optuna

def objective(trial):
result = Circuit().ry(trial.suggest_uniform('x',0,2*np.pi))[0].z[0].run()
return np.abs(result[0])*np.abs(result[0])-np.abs(result[1])*np.abs(result[1])

study = optuna.create_study()
study.optimize(objective, n_trials=100)

まずはblueatとnumpyとoptunaを読み込みます、

関数としてゲート回路を準備し、xの値に0から2πまでをセットし、それをRy回転して波動関数を準備します。

次に今回はパウリオペレーターZをハミルトニアンとして固有値を求めます。

確率振幅から固有値の値を100回トライアルして最小値を求めてみます。

実行結果は、

(略)

[I 2018-12-04 14:39:56,521] Finished a trial resulted in value: -0.9392927147309043. Current best value is -0.999987646369594 with parameters: {'x': 3.1465632985864485}.
[I 2018-12-04 14:39:56,539] Finished a trial resulted in value: -0.9392236487408727. Current best value is -0.999987646369594 with parameters: {'x': 3.1465632985864485}.
[I 2018-12-04 14:39:56,556] Finished a trial resulted in value: -0.9966539149682133. Current best value is -0.999987646369594 with parameters: {'x': 3.1465632985864485}.

ということで、だいたいx=3.14の近傍で、基底状態の-1近くの値が出ています。トライアルの数によってやはり精度が変わるので実用的に使いこなすのがいいと思います。Optunaの並列性などを持たせてより実用範囲を広げる試みもしてみたいと思います。

量子コンピュータのパラメータ最適化にも使えることがわかりました。

以上です。