yenomotoと申します。
VQEについて自分なりに調べ整理した内容を投稿させていただきます。
目次
・VQEって何?
・VQEのスタート、ゴール
・VQEの実行プロセス
・VQEの実装
・終わりに
本文
・VQEって何?
VQE…Variational Quantum Eigensolver(*1)
・量子コンピュータと古典コンピュータを組み合わせるアルゴリズムです。
・量子コンピュータの連続動作時間を短くすることで、量子コンピュータの弱点を補います。
・現在は「量子化学計算」「組み合わせ最適化計算」の分野に応用されています。
→量子コンピュータの弱点?
量子コンピュータの弱点は、構成要素である量子ビットが超デリケート、ということです。
量子ビットを量子コンピューティングできる状態(量子状態という)は、
温度や振動などによって簡単にノイズが入ります(*2)。
現在の技術では、ノイズを訂正できません(*3)。
そしてノイズは当然計算結果に悪い影響を与えます。
量子コンピュータの連続動作時間が長くなると、
経過時間の分だけ量子状態にノイズが入る機会が多くなってしまいます。
逆に量子コンピューティングの連続動作を最低限にして、
量子状態に入るノイズを減らし信頼できる計算結果を得よう、
というのがVQEの狙いです。
・VQEのスタート、ゴール
VQEの考え方は、量子力学の波動関数をベースとしています。
H|ψ>=_E_|ψ>
H…ハミルトニアン。エネルギー固有値を求めるためのエルミート行列
|ψ>…系の状態ベクトル。
E…エネルギー固有値
「系の状態ベクトルにハミルトニアンを作用させたものとエネルギー固有値_E_には相関関係がある」ということを表しています。
少し乱暴に言い換えると
「量子系のある地点の状態に行列をかけると、ある地点のエネルギー固有値_E_がわかる」
という式です。
さらに|ψ>はパラメータ化されている必要があるので
H|ψ(Θ)>=_E_|ψ(Θ)>
じゃあエネルギー固有値_E_どう求めるの?に対してこの式をもとに変換したものが、以下の式になります。
**<ψ(Θ)|H|ψ(Θ)>≧_E_**0
_E_0…基底状態のエネルギー固有値
「任意の波動関数におけるハミルトニアンの期待値は基底状態のエネルギー固有値_E_0以上である」、ということを表しています。
言い換えれば
「系のエネルギーの最低値→系の基底状態≒もっとも安定した状態」です。
「もっとも安定した状態」は
量子化学計算でいえば、「化学分子が安定して存在していられる状態」
組み合わせ最適化問題でいえば「もっともコストが低くすむ組み合わせ」
という形で、実際の問題に応用できます。
まとめるとVQEにおけるゴールは、ハミルトニアン**H、系の状態ベクトル|ψ(Θ)>**を準備し
できるだけ基底状態のエネルギー固有値**E****0に近いエネルギー固有値E**を求めることです。
・VQEの実行プロセス
最適なエネルギー固有値**E**を求めていくVQEの実行プロセスは、以下のようになります。
(図1:VQEの流れイメージ※blueqatチュートリアル動画(*4)より)
1. ハミルトニアン**H、波動関数|ψ(Θ)>(とパラメータ初期値Θ**0)の準備
2. 量子コンピューティングで**<ψ(Θ)|H|ψ(Θ)>を計算、エネルギー固有値E**を得る
3. 2.で出たエネルギー固有値_E_を勾配法で判定し、次のパラメータ値_Θ_を決定する
(2に戻る。そして2.→3.をエネルギー固有値**E**が十分小さくなるまで繰り返す)
それぞれの項目について、見ていきます。
1. ハミルトニアン**H、波動関数|ψ(Θ)>(とパラメータ初期値Θ**0)の準備
1-1. ハミルトニアン**H**を準備する。
ハミルトニアン_H_は、現行「量子化学計算」「組み合わせ最適化問題」に対して準備方法が確立されています。
・量子化学計算の場合
量子化学のプログラム(*5)を使って必要な値を計算します。
「STO-nG基底関数」といわれるもので、原子間距離、原子のスピン方向などから基底状態を求める方法です。
量子コンピューティングにおける量子化学計算でよく使われるのはSTO-3G、STO-6Gあたりです。
VQEの学習用途では、過去の論文や記事で「これを使いました」というハミルトニアンを使うのがてっとり早いです。
・組み合わせ最適化問題の場合
組み合わせの条件から「イジングモデル」を作成します。
イジングモデル…二つの配位状態をとる格子点から構成され、最隣接する格子点のみの相互作用を考慮する格子模型
「QAOA」の理論も入ってくる話なので、本ブログでは深く語りません。
量子コンピュータ上ではユニタリ行列しか扱えないため、
以下のようにハミルトニアン_H_をユニタリ行列の和で表現します。
H=σ1∔_σ_2+・・・・ ( σnはユニタリ行列)
1-2. 波動関数**|ψ(Θ)>(とパラメータ初期値Θ**0)を準備する。
波動関数|ψ(Θ)>の初期状態はAnsatzと呼ばれます。
ハミルトニアンに対応するものを選ばなければ効率的に計算ができません。
blueqatではAnsatzを求める処理はライブラリ化されており、プログラム内で呼ぶだけで準備できます。(便利!)
2. 量子コンピューティングで**<ψ(Θ)|H|ψ(Θ)>を計算、エネルギー固有値E**を得る
ここでようやく量子コンピューティングの出番です。
ハミルトニアンをユニタリ行列の和として表現している経緯から、エネルギー固有値も各ユニタリ行列の固有値の和となります。
<ψ(Θ)|H|ψ(Θ)>=**<ψ(Θ)|σ1|ψ(Θ)>∔<ψ(Θ)|σ2|ψ(Θ)>**+・・・・
3. 2.で出たエネルギー固有値_E_を勾配法で判定し、次のパラメータ値_Θ_を決定する
2.の結果をもとに「勾配法」にて次の値を決定します。(*6)
勾配法は、一般的に以下の式で表現されます。
x′=x–η*∂f/∂x
η:学習率、パラメータ値なので独自設定する。細かすぎると計算効率が悪くなる。
今回の波動関数を当てはめてみると以下のようになります。
Θn+1=Θn-η*∂<ψ(Θ)|H|ψ(Θ)>>/∂_Θ_
計算の進んでいく状況をグラフで見ると以下のようなイメージです。
(図2:VQE⁻勾配法を使っての計算進行イメージ)
3.まで終わったら、次のパラメータΘを決めて、2.から再計算、それを繰り返す・・。
エネルギー固有値_Eが_十分に小さい値がなれば、計算は終了です。
・VQEの実装
blueqatVQEチュートリアル(*7)で紹介されている実装でどの箇所がどの実行プロセスを担うかをマッピングしてみます。
=============
import numpy as np
from blueqat import Circuit
from blueqat.pauli import X, Y, Z, I
from blueqat.vqe import AnsatzBase, Vqe
class OneQubitAnsatz(AnsatzBase):
def __init__(self, hamiltonian):
super().__init__(hamiltonian.to_expr(), 2)
self.step = 1
def get_circuit(self, params):
a, b = params
return Circuit().rx(a)[0].rz(b)[0]
→「1-2. 波動関数|ψ(Θ)>(とパラメータ初期値_Θ_0)を準備する。」の呼び出し先クラスです。
# hamiltonian
h = 1.23 * I - 4.56 * X(0) + 2.45 * Y(0) + 2.34 * Z(0)
→「1-1. ハミルトニアン**H**を準備する。」を実施しています。
runner = Vqe(OneQubitAnsatz(h))
→ハミルトニアン_H_を対応させて「1-2. 波動関数**|ψ(Θ)>(とパラメータ初期値Θ**0)を準備する。」を実施しています。
result = runner.run()
**→「**2. 量子コンピューティングで<ψ(Θ)|H|ψ(Θ)>を計算、エネルギー固有値_E_を得る
3. 2.で出たエネルギー固有値_E_を勾配法で判定し、次のパラメータ値_Θ_を決定する
(2に戻る。そして2.→3.をエネルギー固有値**E**が十分小さくなるまで繰り返す)」
この3点をここで実施しています。
print('Result by VQE')
print(runner.ansatz.get_energy_sparse(result.circuit))
# This is for check
mat = h.to_matrix()
print('Result by numpy')
print(np.linalg.eigh(mat)[0][0])
=============
blueqat実装では、共通化で使用する処理はパッケージ化されるためすっきりした記述になっています。
・終わりに
VQEについて、広く浅くを意識して流れを書いてみました。
理論はシンプルですが、全体の流れをつかむまでは調べたり、湊様はじめ有識者に教えていただいたりする必要がありました。
「VQE知らなったけどちょっとだけわかった」「素人にしてはまずまず」と思った方はいいね!いただけるとありがたいです。
<参考文献>
(*1)「A variational eigenvalue solver on a quantum processor」
https://arxiv.org/pdf/1304.3061.pdf
(*2)「量子優位性時代の到来の鍵となる量子ボリュームとは? THINK Blog Japan」
https://www.ibm.com/blogs/think/jp-ja/power-quantum-device/
(*3)「2-1. NISQアルゴリズムとlong-termアルゴリズム — Quantum Native Dojo ドキュメント」
https://dojo.qulacs.org/ja/latest/notebooks/2.1_NISQ_and_long_term.html
(*4)「VQE (Blueqat チュートリアル 200 / 量子コンピュータ) - YouTube」
https://www.youtube.com/watch?v=5ChtZho4yu4
(*5)「qchandson2019/07_h2_sto3g_hf_dumpint.dat at master · nakatamaho/qchandson2019 · GitHub」
https://github.com/nakatamaho/qchandson2019/blob/master/07_h2_sto3g_hf_dumpint.dat
(*6)「勾配法の仕組みを具体例でわかりやすく解説 | AVILEN AI Trend」
https://ai-trend.jp/basic-study/neural-network/optimizer/
(*7)「Blueqat-tutorials/200_vqe_ja.ipynb at master · Blueqat/Blueqat-tutorials · GitHub」
https://github.com/Blueqat/Blueqat-tutorials/blob/master/tutorial-ja/200_vqe_ja.ipynb
以下は本ブログを書くにあたり、全体的に参考としました。
「量子コンピュータVariational Quantum Eigensolver(VQE)、QAOA4周目まとめ - Qiita」
https://qiita.com/YuichiroMinato/items/531cb67492783a1b19b9
「実践版量子コンピュータVariational Quantum Eigensolver(VQE)、QAOA5周目まとめ - Qiita」
https://qiita.com/YuichiroMinato/items/82d9cc34d2bf7a54f16d
「VQE algorithm (Variational Quantum Eigensolver) - Qiita」
https://qiita.com/KeiichiroHiga/items/c900d430dc33d4342b24
「VQEアルゴリズム(ゲスト:DEVEL比嘉くん)-youtube」
https://www.youtube.com/watch?v=scAY3OA9aiU
<書いた人>
榎本 吉伸(yenomoto)
北海道・札幌にて医療・製造系IoTソリューションのSIやってます。