common.title

Overview
Service overview
Terms of service

Privacy policy

Contact

Sign in
Sign up
common.title

blueqatでのvqeでscipyのoptimizerを変えて速度比較

Yuichiro Minato

2021/02/08 21:33

#量子ゲート

はじめに

blueqatをつかってVQEの最適化計算をしてみたいと思います。最適化といっても色々種類があるので、今回はscipyの最適化手法をみてみます。

optimizerを変えてみる

vqeには最適化ステップがあるので、最適化手法を変えてみます。

scipy.optimize.minimizeから読まれるみたいなので、変えてみましょう。

まずは何もやらずの、最適化のシードやステップによって結果が変わるので、10回計算した平均をとってみます。

import numpy as np hamiltonian = q(0)*q(1)*q(2) step = 5 res = [] for _ in range(10): start = time.time() result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step)).run() end = time.time() res.append(end - start) print(np.average(res)) #=> 4.69558162689209
4.69558162689209
hamiltonian = q(0)*q(1)*q(2) step = 5 res = [] #ここで最適化を決めます。 minimizer=vqe.get_scipy_minimizer(method="COBYLA") for _ in range(10): start = time.time() #ここで指定します。 result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run() end = time.time() res.append(end - start) print(np.average(res)) #=> 0.7651197671890259
0.7651197671890259
minimizer=vqe.get_scipy_minimizer(method="Nelder-Mead") for _ in range(10): start = time.time() #ここで指定します。 result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run() end = time.time() res.append(end - start) print(np.average(res)) #=> 1.2728466749191285
1.2728466749191285
minimizer=vqe.get_scipy_minimizer(method="Powell") for _ in range(10): start = time.time() #ここで指定します。 result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run() end = time.time() res.append(end - start) print(np.average(res)) #=> 2.5380529801050824
2.5380529801050824
minimizer=vqe.get_scipy_minimizer(method="CG") for _ in range(10): start = time.time() #ここで指定します。 result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run() end = time.time() res.append(end - start) print(np.average(res)) #=> 2.184863805770874
2.184863805770874
minimizer=vqe.get_scipy_minimizer(method="BFGS") for _ in range(10): start = time.time() #ここで指定します。 result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run() end = time.time() res.append(end - start) print(np.average(res)) #=> 1.90869873046875
1.90869873046875
minimizer=vqe.get_scipy_minimizer(method="L-BFGS-B") for _ in range(10): start = time.time() #ここで指定します。 result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run() end = time.time() res.append(end - start) print(np.average(res)) #=> 1.690256663163503
1.690256663163503
minimizer=vqe.get_scipy_minimizer(method="TNC") for _ in range(10): start = time.time() #ここで指定します。 result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run() end = time.time() res.append(end - start) print(np.average(res)) #=> 1.6919202498027257
1.6919202498027257
minimizer=vqe.get_scipy_minimizer(method="SLSQP") for _ in range(10): start = time.time() #ここで指定します。 result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run() end = time.time() res.append(end - start) print(np.average(res)) #=> 1.6168858793046739
1.6168858793046739
minimizer=vqe.get_scipy_minimizer(method="trust-constr") for _ in range(10): start = time.time() #ここで指定します。 result = vqe.Vqe(vqe.QaoaAnsatz(hamiltonian, step), minimizer=minimizer).run() end = time.time() res.append(end - start) print(np.average(res)) #=> 1.7530574709177018
1.7530574709177018

まとめ

最適化といっても色々な種類があるので、それらを選ぶときにも基準が必要そうです。微分を使ったものが主流になりつつあるので、用途に合わせ見てみたいと思います。

© 2024, blueqat Inc. All rights reserved