らんだむな記憶

blogというものを体験してみようか!的なー

Qiskit (59) —VQE

ここからは IBM Quantumで学ぶ量子コンピュータ - 秀和システム あなたの学びをサポート! とは無関係に、Qiskit textbook やチュートリアルからトピックを拾って知識を深めてみたい。Qiskit (52) —パラメータ付き量子回路 - らんだむな記憶 の続きというわけでもないが、まずは Simulating Molecules using VQE を見てみたい。

  • variational form $U(\theta)$: 出力状態 $\ket{\psi(\theta)} = U(\theta) \ket{\psi}$ を生成。

2 つの反するゴール

  • $n$ 量子ビットの variational form で任意の可能な状態 $\ket{\psi} \in \C^N\ (N =2^n)$ を生成したい。
  • variational form のパラメータを可能な限り少なくしたい。

ニューラルネットの汎化性能を高めつつパラメータを少なくしたいといったのと似ている。

$n=1$ のケースとしてユニバーサルゲート $U3$ が挙げられている:

$$
\begin{align*}
U3(\theta, \phi, \lambda) = \begin{pmatrix}
\cos \left( \frac{\theta}{2}\right) & -e^{i\lambda} \sin \left( \frac{\theta}{2}\right) \\
e^{i\phi} \sin \left( \frac{\theta}{2}\right) & e^{i\lambda + i\phi} \cos \left( \frac{\theta}{2}\right)
\end{pmatrix}
\end{align*}
$$

$U3(\theta, \phi, \lambda) \ket{0}$ は Bloch 球上の状態になるので、$\theta$ と $\phi$ を変えることで任意の状態を表現できる。よって、$\bra{\psi(\theta, \phi, \lambda)} H \ket{\psi (\theta, \phi, \lambda)}$ が $\bra{\psi_{\min}} H \ket{\psi_{\min}}$ に近づけない可能性を考慮する必要がない。つまり、$\ket{\psi(\theta)} \approx \ket{\psi_{\min}}$ が得られるか?どれくらい早く?といったことはオプティマイザの最適化能力だけに依存することになる。

$$
\begin{align*}
&\ U(\theta) \\
=&\ U3(\theta_7) \otimes U3(\theta_6) CX_{1,0} U3(\theta_5) \otimes U3(\theta_4) CX_{0,1} U3(\theta_3) \otimes U3(\theta_2) CX_{1,0} U3(\theta_1) \otimes U3(\theta_0)
\end{align*}
$$

も、あまり自明ではないユニバーサル variational form であるとのこと。

$\bra{\psi(\theta)} H \ket{\psi (\theta)}$ の最適化には、安直にはディープラーニングに見られるような gradient descent が考えられて、勾配はパラメータシフト則で求まるはずだから理屈上は良さそう。だた、NISQ だとノイズが乗るし、ディープラーニングSGD を使うように、素朴な GD では local optima に行きやすい。と言うことで VQE ではあまり良くなさそう。*1

Simultaneous Perturbation Stochastic Approximation optimizer (SPSA) というのは初耳。“同時摂動確率的近似最適化” とでも呼んだらいいのだろうか?説明の内容からして、SGD 的な効果がありそうな内容になっている。シミュレータのようにノイズがないなら COBYLA が良いと。COBYLA only performs one objective function evaluation per optimization iteration というのは恐らく、パラメータシフト則を使う場合、$\pm \frac{\pi}{2}$ で回路を通さないと勾配が求まらないけど、なんらかの方法で 1 回で近似値を求められるとかだろうか?この辺はもっと読んでいかないと分からない。

textbook の下のほうのコードで qiskit.aqua を用いているが既に deprecated なので、この辺はチュートリアルの新しいコードで見ることにしよう。

*1:その分、実装は簡単そうに感じる。