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

はじめに

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
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
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
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
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
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
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
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
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
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

まとめ

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

Yuichiro Minato
blueqat CEO/CTO 2015年総務省異能vation最終採択 2017年内閣府ImPACTプロジェクトPM補佐 2019年文科省さきがけ量子情報処理領域アドバイザー
Comments
Yuichiro Minato
blueqat CEO/CTO 2015年総務省異能vation最終採択 2017年内閣府ImPACTプロジェクトPM補佐 2019年文科省さきがけ量子情報処理領域アドバイザー
Related posts

blueqat Inc.

Shibuya Scramble Square 39F 2-24-12, Shibuya, Shibuya-ku, Tokyo
Contact: info@blueqat.com