common.title
Cloud support

Nobisuke

Dekisugi

RAG


autoQAOA
RAG for dev
Fortune telling app
Annealing
DEEPSCORE
Translation

Overview
Service overview
Terms of service

Privacy policy

Contact
Research

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