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