# 量子機器學習 (五) - 參數更新方法
在古典機器學習中,參數更新是很重要的一環。主流的方法是基於計算梯度(gradient)的更新方法,有了 gradient,參數往變化最大的那個方向去調整等等的。那在 QML 中也不例外,尤其要計算量子電路的參數的 gradient,本身就是一門學問。
其中比較有名的例子是 Parameter-shift rule (參數位移規則),以旋轉閘構成的量子電路,他的 gradient 更新可以[表示為](https://pennylane.ai/qml/glossary/parameter_shift/):
\begin{align}\tag{1}
\nabla_{\theta}f(x;\theta) = \frac{1}{2}[f(x;\theta + \frac{\pi}{2}) - f(x;\theta - \frac{\pi}{2}) ]
\end{align}
這個表示式會因為不同的量子閘構成的量子電路而有所不同,詳細推導可以在 pennylane 的[文章](https://pennylane.ai/qml/glossary/parameter_shift/)找到,簡易推導可以看文末附錄。其中 $\frac{\pi}{2}$ 來自於在更 general 的形式中把分母中的 $\sin$ 函數消掉有關([詳見此影片 12:38 處](https://www.youtube.com/watch?v=TnFIW7cYLFU))。
除了基於 gradient 的更新方法,其實在更新量子電路做優化任務的研究中也常常用各式各樣的非梯度更新方法,例如 Nelder-Mead、COBYLA、L-BFGS 等等。所以如果設計出了一些特殊的 QML 架構,以至於 gradient 難以傳遞的話,就可以考慮這些不用 gradient 的更新方法,在IBM的[這個](https://docs.quantum.ibm.com/api/qiskit/0.28/qiskit.algorithms.optimizers)模組中可以找到許多相關的方法。
那讀者如果是在使用一些量子相關的 python package 的話,可能會發現不同的 package 對參數更新方法支援的程度不一樣。以筆者的經驗而言,[pennylane](https://www.entangletech.tw/courses/program) 是有最多教學,也有支援許多的[參數更新](https://docs.pennylane.ai/en/stable/introduction/interfaces.html)方法,包含梯度與非梯度的,以及 CPU 與 GPU 的。那目前筆者有遇過的限制是,pennylane 尚不支援以 GPU 去更新目標函數"不是 "observable 期望值的 exact 梯度更新方法(CPU 的話是支援的)。什麼意思呢?例如模型的輸出是跟量子態每個 basis 的測量機率有關的話,這樣的任務就還不能用 GPU 以 exact 的梯度去更新,其他一些 finite difference 的方法應該是可以的。那如果有讀者也有類似的需求,也可以去試看看 [TorchQuantum](https://github.com/mit-han-lab/torchquantum)。 Exact 梯度更新的好處是效果會比其他的近似梯度效果更好,在提出新的 QML 想法想快速 demo 看看的時候就很實用,因為有時候不是架構不行,是參數更新方法的效果太差使得整個方法的效果不好。
不過,當如果要用到真實的量子電腦硬體的話,目前還是得老實地去使用 Parameter-shift rule 或其他的 finite difference 方法。在古典的機器學習中,也有[一派](https://jmlr.org/papers/volume23/21-0308/21-0308.pdf)是使用機器學習方法去“學習”如何更新參數,在量子機器學習中也有相關的[研究](https://arxiv.org/abs/2304.07442),並且可以不使用到梯度,這在難以計算梯度的情況就會很實用。也許在不遠的將來,可以出現基於機器學習的,可以很有效在真實量子電腦硬體更新量子神經網路的算法。
## 附錄:公式推導
從[基本課程](https://www.entangletech.tw/lesson/basic-algorithm-10#toc-8)中,我們知道 quantum gate 可以寫成以下形式:
\begin{align}
U(\theta)=e^{-i\frac{\theta}{2}G}
\end{align}
將之對 $\theta$ 微分得到:
\begin{align}\tag{2}
\frac{d}{d\theta}U(\theta)=(-i\frac{1}{2}G)e^{-i\frac{\theta}{2}G}=-i\frac{1}{2}GU(\theta)
\end{align}
量子電路的輸出結果 $f(\theta)$ 為測量的物理量 $\hat{O}$ 與量子態 $U(\theta)|0\rangle$ 的期望值:
\begin{align} \tag{3}
f(\theta)=\langle 0|U^\dagger(\theta)\hat{O}U(\theta)|0\rangle
\end{align}
將(3)式對 $\theta$ 微分:
\begin{align}
\frac{d}{d\theta}f(\theta)&=\frac{d}{d\theta}\langle 0|U^\dagger(\theta)\hat{O}U(\theta)|0\rangle \\
&=
\langle 0|[\frac{d}{d\theta}U^\dagger(\theta)]\hat{O}U(\theta)|0\rangle+
\langle 0|U^\dagger(\theta)\hat{O}[\frac{d}{d\theta}U(\theta)]|0\rangle
\end{align}
將(2)式代入上式
\begin{align}
\frac{d}{d\theta}f(\theta)&=
\langle 0|[\frac{d}{d\theta}U^\dagger(\theta)]\hat{O}U(\theta)|0\rangle+
\langle 0|U^\dagger(\theta)\hat{O}[\frac{d}{d\theta}U(\theta)]|0\rangle \\
&=
\langle 0|[i\frac{1}{2}GU^\dagger(\theta)]\hat{O}U(\theta)|0\rangle+
\langle 0|U^\dagger(\theta)\hat{O}[-i\frac{1}{2}GU(\theta)]|0\rangle \\
&=\frac{i}{2}[
\langle 0|GU^\dagger(\theta)\hat{O}U(\theta)|0\rangle-\langle0|U^\dagger(\theta)\hat{O}GU(\theta)|0\rangle
]\\
&=\frac{i}{2}\langle0|GU^\dagger(\theta)\hat{O}U(\theta)-U^\dagger(\theta)\hat{O}GU(\theta)|0\rangle\tag{4}
\end{align}
記得這個結果,現在我們回到(2)與(3)式,將其做 $\frac{\pi}{2}$ 偏移:
\begin{align}
U(\theta+\frac{\pi}{2})&=e^{-i\frac{\theta+\frac{\pi}{2}}{2}G}=e^{-i\frac{\theta}{2}G}e^{-i\frac{\pi}{4}G} \tag{5}\\
f(\theta+\frac{\pi}{2})&=\langle 0|U^\dagger(\theta+\frac{\pi}{2})\hat{O}U(\theta+\frac{\pi}{2})|0\rangle \tag{6}
\end{align}
將 (5)式代入(6)式:
\begin{align}
f(\theta+\frac{\pi}{2})&=\langle 0|U^\dagger(\theta+\frac{\pi}{2})\hat{O}U(\theta+\frac{\pi}{2})|0\rangle \\
&=\langle 0|e^{i\frac{\pi}{4}G}e^{i\frac{\theta}{2}G}\hat{O} e^{-i\frac{\pi}{4}G}e^{-i\frac{\theta}{2}G} |0\rangle \tag{7}
\end{align}
其中,我們知道
\begin{align}
e^{-i\frac{\theta}{2}G}|0\rangle=U(\theta)|0\rangle=|\psi(\theta)\rangle
\end{align}
所以(7)式變成:
\begin{align}
f(\theta+\frac{\pi}{2})&=\langle\psi(\theta)|e^{i\frac{\pi}{4}G}\hat{O}e^{-i\frac{\pi}{4}G}|\psi(\theta)\rangle \tag{8}
\end{align}
同理:
\begin{align} \tag{9}
f(\theta-\frac{\pi}{2})&=\langle\psi(\theta)|e^{-i\frac{\pi}{4}G}\hat{O}e^{i\frac{\pi}{4}G}|\psi(\theta)\rangle
\end{align}
將(8)與(9)式相減:
\begin{align}
f(\theta+\frac{\pi}{2})-f(\theta-\frac{\pi}{2})
&=\langle\psi(\theta)|
e^{i\frac{\pi}{4}G}\hat{O}e^{-i\frac{\pi}{4}G}-e^{-i\frac{\pi}{4}G}\hat{O}e^{i\frac{\pi}{4}G}
|\psi(\theta)\rangle \tag{10}
\end{align}
其中,從[基礎課程](https://www.entangletech.tw/lesson/basic-algorithm-10#toc-8)中,我們得知:
\begin{align}
e^{-i\frac{\pi}{4}G}&=\cos{\frac{\pi}{4}}I-i\sin{\frac{\pi}{4}}G \\
&=\frac{\sqrt 2}{2}I-i\frac{\sqrt 2}{2}G
\end{align}
因此(10)式中的第一項就變成:
\begin{align}
e^{i\frac{\pi}{4}G}\hat{O}e^{-i\frac{\pi}{4}G}&=
(\frac{\sqrt 2}{2}I+i\frac{\sqrt 2}{2}G)\hat{O}(\frac{\sqrt 2}{2}I-i\frac{\sqrt 2}{2}G)\\
&=\frac{1}{2}\hat{O}+\frac{i}{2}G\hat{O}-\frac{i}{2}\hat{O}G+\frac{1}{2}G\hat{O}G
\end{align}
兩項相減得到:
\begin{align}
e^{i\frac{\pi}{4}G}\hat{O}e^{-i\frac{\pi}{4}G}-e^{-i\frac{\pi}{4}G}\hat{O}e^{i\frac{\pi}{4}G} &=
(\frac{i}{2}G\hat{O}-\frac{i}{2}\hat{O}G)-
(-\frac{i}{2}G\hat{O}+\frac{i}{2}\hat{O}G) \\
&=iG\hat{O}-i\hat{O}G \\
&=i[G,\hat{O}]
\end{align}
所以(10)式變成:
\begin{align}
f(\theta+\frac{\pi}{2})-f(\theta-\frac{\pi}{2})&=
\langle\psi(\theta)|i[G,\hat{O}]|\psi(\theta)\rangle \\
&=i\langle 0|U^\dagger(\theta)[G,\hat{O}]U(\theta)|0\rangle \\
&=i\langle 0|U^\dagger(\theta)G\hat{O}U(\theta)-U^\dagger(\theta)\hat{O}GU(\theta)|0\rangle \\
&=i\langle 0|GU^\dagger(\theta)\hat{O}U(\theta)-U^\dagger(\theta)\hat{O}GU(\theta)|0\rangle
\end{align}
與第(4)式我們得到
\begin{align}
\frac{d}{d\theta}f(\theta)&=\frac{i}{2}\langle0|GU^\dagger(\theta)\hat{O}U(\theta)-U^\dagger(\theta)\hat{O}GU(\theta)|0\rangle\\
&=\frac{1}{2}[f(\theta+\frac{\pi}{2}-f(\theta-\frac{\pi}{2}))]
\end{align}