---
# System prepended metadata

title: 07 VQE
tags: [量子演算法（下下）]

---

# VQE 演算法

前一節我們介紹了如何使用 QAOA 解優化問題，在這一節我們將介紹另一種也可以用於優化問題的演算法：Variatrional Quantum Eigensolver （VQE），在文末你會發現 QAOA 是 VQE 的一種特殊形式。

在這裡雖然我們專注在優化問題，但 VQE 的起源來自於化學，因此在這裡我們會從基礎量子物理切入，帶你了解 VQE 究竟怎麼運作。

## 量子力學簡介

在經典力學中（高中程度），描述萬物運動軌跡與行為的方程式是牛頓定律：

\begin{align}
F=ma
\end{align}

<blockquote>
實際上是 Euler–Lagrange equation，不僅僅只在古典力學，量子力學也是
</blockquote>

相同的，在微小尺度中，描述萬物運動行為的核心方程式是：

\begin{align} \tag{1}
\hat{H}|\psi\rangle=E|\psi\rangle
\end{align}

$\hat{H}$ 是一個矩陣，包含這系統的動能與位能資訊，比方說最簡單的彈簧系統，那他的 $\hat{H}$ 可以寫作：

\begin{align}
\frac{1}{2}mv^2+\frac{1}{2}kx^2
\end{align}

當然上式要經過"量子化"才能代入（1）式，但透過這樣的舉例你能知道 $\hat{H}$ 講白話就是一個系統的總能量；$|\psi\rangle$ 就是你熟悉的波函數，以 qubit 為例就是 $|0\rangle$ 或 $|1\rangle$，以原子為例，就是高中學過的 $1s,2s,2p$ 等 orbitals（軌域）。當 $\hat{H}$ 作用在 $|\psi\rangle$ 上後就會變成在這狀態 $|\psi\rangle$ 下系統的能量值 $E$。

### 以氫原子為例
以下舉例以一個簡化的氫原子作為範例，並且為了讓讀者能看懂（1）式的意義而非專注在計算過程，這例子會忽略許多嚴謹性，如果想知道最完整的計算過程可以翻看任何一本量子力學教科書。

在氫原子中，其 $\hat{H}$ 就是動能（電子與原子核）加上位能（電子與原子核）：

\begin{align}\tag{2}
\hat{H}=-\frac{1}{2m_e}\nabla^2_e-\frac{1}{2m_N}\nabla^2_N-\frac{1}{4\pi\epsilon_0}\frac{(Ne)e}{r^2}
\end{align}

如果讀者還沒碰過這類公式，你就暫時先接受上式，不必鑽研於為何他是這樣，或是可以參看我們量子模擬系列文章（努力中，未上架）。第一項是描述電子的動能，第二項是質子的動能，第三項是電子與質子的位能。

接著是波函數 $|\psi\rangle$，為方便起見，我們拋去 $s, p, d, f$ 等 orbitals 概念，僅有電子位在第幾層（即主量子數 $n$），因此

\begin{align}\tag{3}
|\psi\rangle = |n\rangle, \space \text{where }n=0,1,2,\cdots
\end{align}

照你所學過的波爾氫原子模型，代入（1）式會得到：

\begin{align}
\hat{H}|n\rangle=-\frac{13.6}{n^2}|n\rangle
\end{align}

比方說當電子位於基態 $|n\rangle=|1\rangle$ 時：

\begin{align}
\hat{H}|1\rangle=-13.6|1\rangle
\end{align}

## VQE 簡介

VQE 全名第一個單字 "variatrional" 代表量子力學裡的一個近似方法：變分法（variational principle），說明給定一個 $\hat{H}$ 後，任何量子態 $|\psi\rangle$ 對應的期望值（或說能量 $E$）都會比基態能量高或一樣，即：

\begin{align}
\langle \psi|\hat{H}|\psi\rangle\geq E_{ground}
\end{align}

在 VQE 中，演算法要盡可能地找到一組 $|\psi\rangle$ 使得上式相等，或是說盡可能地找到最低能量（因為不是一定能找到真實的基態能量），其中這量子態 $|\psi\rangle$ 與 QAOA 類似，由一組參數 $\theta$ 所決定，所以我們會把量子態改寫成 $|\psi(\theta)\rangle$，跟上一節介紹的 QAOA 一樣，量子電路會輸出 $|\psi(\theta)\rangle$ 的測量結果，將這測量結果傳回給經典電腦計算 $\hat{H}$ 的期望值，透過期望值與當下的參數計算梯度，由 optimizer 給出新的參數傳回量子電腦，如此循環，直到能量收斂，如下圖所示：

<div style="text-align: center;">
    <img src="https://hackmd.io/_uploads/ryniyHmYgg.svg" 
         alt="Bloch Ｚ" width="100%"/>
    <br>VQE 流程圖
    <p>黃色區域包括黑色測量都是在量子電腦上運行，藍色方塊則是在古典電腦上運行。注意初始態 phi0 沒有一定要是全零。
    </p>
</div>

至於要用什麼樣的電路來製備 $|\psi(\theta)\rangle$，這塊電路稱作 "ansatz"，這單字的意思就是「怎麼猜」，當然這猜法有很多種，而且目前仍是學術的研究熱門議題之一，學界裡有各種五花八門的 ansatz，怎麼設計 ansatz 可以透過還是猜（或者說各種嘗試之後找到一個不錯用的，也不知道為何好用，就沿用下來了），也可以透過像 QAOA 寫出一個指數項 $e^{-i...}$ 然後分解成一個一個 quantum gate，ansatz 的細節我們先放在文末再介紹。

## VQE 範例
接著我們用一個簡單的範例來帶大家更了解 VQE 怎麼運作的。假設今天你要模擬的物理系統，其 Hamiltonian 為：

\begin{align}
H=2Z+X
\end{align}

<blockquote>
可以回想過去我們介紹圖論，這步就像是把一個 max-cut 問題寫成一堆 Z
</blockquote>

當我們要計算其期望值時：

\begin{align}
\langle \psi|H|\psi\rangle&= \langle \psi|2Z+X|\psi\rangle\\
&=2\langle\psi|Z|\psi\rangle+\langle \psi|X|\psi\rangle\tag{4}
\end{align}

<blockquote>
這部分就相當於計算 graph 的 cost
</blockquote>

在過去的 max-cut 問題中，graph 的期望值都類似上式第一項 $\langle\psi|Z|\psi\rangle$，而在現實中做測量時也是以 $Z$ 軸作為 basis，因此當我們測量到 $|0\rangle$ 時經典電腦就直接當作 $+1$ 做計算，$|1\rangle$ 則為 $-1$，那後面第二項怎麼辦呢？第二項是以 $X$ 軸做 basis，如果今天我們的電腦可以以$X$ 軸做測量，我們會得到 $|+\rangle$ 或是 $|-\rangle$，但今天常用的量子電腦不是這樣，此時我們該怎麼辦呢？讓我們回到 Bloch sphere:

<div style="text-align: center;">
    <img src="https://hackmd.io/_uploads/ByhuCpr30.svg" 
         alt="Bloch Ｚ" width="60%"/>
    <br>
    <p>
    </p>
</div>

遇到此情形，就要想辦法從原本以 X 軸做測量翻轉到 Z 軸，因此最簡單的方法就是加上 $RY(-\frac{\pi}{2})$ gate，對 Y 軸順時鐘旋轉 90 度，同理，如果今天遇到 $\langle\psi|Y|\psi\rangle$，就對 X 軸旋轉 90 度，即 $RX(\frac{\pi}{2})$ gate。

<blockquote>
只是之前 graph 都只有 Z operator，所以不會有這段
</blockquote>

最後，$|\psi(\theta)\rangle$ 我們就簡單地用 $RY$ gate 來製備（理論上不會這樣做，因為 RY gate 只能遍歷 Bloch 球上的一圈，而我們通常會希望一個好的 ansatz 可以翻遍球面上各個地方）

<div style="text-align: center;">
    <img src="https://hackmd.io/_uploads/H1E2iqltex.png" 
         alt="Bloch Ｚ" width="90%"/>
    <br>不同 ansatz 能在 Bloch sphere 上表達的量子態分佈
    <p>Picture comes from doi: 10.1002/qute.201900070
    </p>
</div>

<blockquote>
所以前一節 QAOA 那複雜的電路就是這邊的 ansatz，製備 graph 的量子態（怎麼切法）
</blockquote>

那我們這例子的 VQE 完整電路如下：

<div style="text-align: center;">
    <img src="https://hackmd.io/_uploads/B1GHeH7Fxx.svg" 
         alt="Bloch Ｚ" width="60%"/>
    <br>範例（4）式第一項對應的電路圖
    <p>
    </p>
</div>


<div style="text-align: center;">
    <img src="https://hackmd.io/_uploads/S1OIeSXKlg.svg" 
         alt="Bloch Ｚ" width="60%"/>
    <br>範例（4）式第二項對應的電路圖
    <p>
    </p>
</div>

對，每一項代表一個電路，所以以這個例子，VQE 會有兩個各為 1 qubit 電路（並不是一個 2 qubits 電路），前面是製備 $|\psi(\theta)\rangle$ 的 ansatz，$RY$，後面則是要轉向 Z 軸，最後做測量，2 這個數字可以直接在經典電腦裡處理）將兩個電路測量到的量子態傳給經典電腦，個別算出期望值後加總起來，然後再提供新的 $\theta$，如此循環。

假設在某次循環，經典電腦給出 $\theta=\pi$，那當下 VQE 第一個電路輸出的 $|\psi(\theta)\rangle$ 為：

\begin{align}
|\psi\rangle=RY(\pi)|0\rangle =
\begin{bmatrix}
\cos{\frac{\pi}{2}} & -\sin{\frac{\pi}{2}} \\
\sin{\frac{\pi}{2}} & \cos{\frac{\pi}{2}}
\end{bmatrix}
\begin{bmatrix}
1 \\
0
\end{bmatrix}=
\begin{bmatrix}
0 \\
1
\end{bmatrix}
\end{align}

那第一項 $2\langle\psi|Z|\psi\rangle$：

\begin{align}
2\langle\psi|Z|\psi\rangle=
\begin{bmatrix}
0 & 1
\end{bmatrix}
\begin{bmatrix}
1 & 0 \\
0 & -1
\end{bmatrix}
\begin{bmatrix}
0 \\
1
\end{bmatrix}=
-2
\end{align}

第二個電路輸出的 $|\psi(\theta)\rangle$ 為

\begin{align}
|\psi\rangle&=RY(-\frac{\pi}{2})RY(\pi)|0\rangle \\
&=
\begin{bmatrix}
\cos{(-\frac{\pi}{4})} & -\sin{(-\frac{\pi}{4})} \\
\sin{(-\frac{\pi}{4})} & \cos{(-\frac{\pi}{4})}
\end{bmatrix}
\begin{bmatrix}
\cos{\frac{\pi}{2}} & -\sin{\frac{\pi}{2}} \\
\sin{\frac{\pi}{2}} & \cos{\frac{\pi}{2}}
\end{bmatrix}
\begin{bmatrix}
1 \\
0
\end{bmatrix}\\
&=
\begin{bmatrix}
\cos{(-\frac{\pi}{4})} & -\sin{(-\frac{\pi}{4})} \\
\sin{(-\frac{\pi}{4})} & \cos{(-\frac{\pi}{4})}
\end{bmatrix}
\begin{bmatrix}
0 \\
1
\end{bmatrix}=
\begin{bmatrix}
\frac{1}{\sqrt 2} \\
\frac{1}{\sqrt 2}
\end{bmatrix}
\end{align}

那第二項期望值為（因為已經轉到 Z basis 了，所以期望值就用 Z 計算）：

\begin{align}
\langle\psi|Z|\psi\rangle=
\begin{bmatrix}
\frac{1}{\sqrt 2} & \frac{1}{\sqrt 2}
\end{bmatrix}
\begin{bmatrix}
1 & 0 \\
0 & -1
\end{bmatrix}
\begin{bmatrix}
\frac{1}{\sqrt 2} \\
\frac{1}{\sqrt 2}
\end{bmatrix}=
0
\end{align}

那其實上式就等於 $\langle\psi|X|\psi\rangle$，我們來做個驗證：

\begin{align}
\langle\psi|X|\psi\rangle=
\begin{bmatrix}
0 & 1
\end{bmatrix}
\begin{bmatrix}
0 & 1 \\
1 & 0
\end{bmatrix}
\begin{bmatrix}
0 \\
1
\end{bmatrix}=
0
\end{align}

最後加總起來為：

\begin{align}
\langle H\rangle&=2\langle H_Z\rangle+\langle H_X\rangle \\
&=-2+0\\
&=-2
\end{align}

接著經典電腦會根據這期望值 $-2$ 和當下的參數（角度）$\pi$ 計算梯度，接著 optimizer 會給出新參數（角度），然後剛剛的步驟再來一次。


## Ansatz
Ansatz 的電路怎麼放是人為設計，並沒有什麼基礎理論來告訴你一定得怎麼做，但怎麼設計有其設計的目標，我們會希望好的 ansatz 有以下性質：
- 可以遍歷所有的量子態，以剛剛 1 qubit 的例子來說，單只有 $RY$ 就不是好的 ansatz，如果多加個 $RX$ 就可以遍歷整個 Bloch sphere 球面，這樣才能找到最低能量的量子態
- 越少的 gates 越好，因為現在的量子電腦都不是好的量子電腦，越多 gates，出錯機率越高
- 參數越少越好，剛剛的例子只有一個參數 $\theta$，當系統越大時，所用的參數越多，參數越多，optimizer 就越難優化

<div style="text-align: center;">
    <img src="https://hackmd.io/_uploads/HJYX39gKlg.png" 
         alt="Bloch Ｚ" width="100%"/>
    <br>人們透過這些準則去設計（就用猜的啦）各種 ansatz，然後透過實驗去找出真的比較好用的（就經驗啦）
    <p>Picture comes from doi: 10.1002/qute.201900070
    </p>
</div>

如果你今天要優化的問題是一個很專門的問題，像是化學分子或是物理的凝態系統，那你的 ansatz 不必遵守第一個守則，你可以設計一個專門針對分子的 ansatz，他只會遍歷符合化學邏輯的量子態，因為如果你要遍歷所有的量子態，可能有些量子態並不符合化學邏輯，那透過 ansatz 刪掉這些可能可以幫你省計算資源與時間，比方說知名的 UCCSD：

\begin{align}
e^{\hat{T}-\hat{T}^\dagger}
\end{align}

這個就類似 QAOA 的

\begin{align}
e^{i\alpha_p H} e^{i\beta_p H}
\end{align}

然後再把它轉成量子電路。

## 延伸閱讀
- 量子模擬系列文章（趕工中）
- [VQE 簡介](https://arxiv.org/pdf/2402.15879#page13)
- [VQE 綜述](https://arxiv.org/pdf/2103.08505)
- [透過 pennylane 實作 VQE](https://pennylane.ai/qml/demos/tutorial_vqe)
- [透過舊版 Qiskit 實作 VQE](https://github.com/DavitKhach/quantum-algorithms-tutorials/blob/master/variational_quantum_eigensolver.ipynb)
