基于 MindQuantum 和 本源真实量子计算机,以参数移位法求解量子线路的梯度并进行训练
量子梯度求解 - 参数移位法
参数移位法(Parameter-shift rule):若量子门的生成子 G G G 只有两个不同的本征值 e 0 e_{0} e0 和 e 1 e_{1} e1,那么线路期望值相对于量子门参数的导数就正比于两个移参线路的期望值的差值:
d d θ f ( θ ) = r [ f ( θ + π 4 r ) − f ( θ − π 4 r ) ] , \frac{d}{d\theta}f(\theta)=r\left[f(\theta+\frac{\pi}{4r})-f(\theta-\frac{\pi}{4r})\right], dθdf(θ)=r[f(θ+4rπ)−f(θ−4rπ)],
其中,移量常数
r
=
a
2
(
e
1
−
e
0
)
r=\frac{a}{2}(e_{1}-e_{0})
r=2a(e1−e0)。参数移位法的优势在于其使用两个与原线路结构和参数量都相同的线路来对其求导数,而不需要任何辅助量子比特。此外,对于本征值不止两个的量子门,通过采用量子门分解技术,可以将其分解为适用参数移位法的量子门组成的序列。
我们不考虑 NISQ 时期量子计算机期望求解的实际精度。
注意, r r r 的取值是与参数本身性质有关的,比如,对于单量子比特泡利旋转门, r = 1 2 r=\frac{1}{2} r=21。另外, a a a 的值也设置为 1。
在以下实例中,我们考虑一个很简单的任务:训练 R X ( θ ) RX(\theta) RX(θ) 门中的参数 θ \theta θ 使其将量子比特的状态从 ∣ 0 ⟩ |0\rangle ∣0⟩ 制备到 ∣ 1 ⟩ |1\rangle ∣1⟩。为此,我们构建哈密顿量, h a m = σ z \mathrm{ham} = \sigma_z ham=σz。 我们知道,理论上当 θ = π \theta=\pi θ=π 时,量子态即为 ∣ 1 ⟩ |1\rangle ∣1⟩,此时哈密顿量的期望值最小 e x p e c t a t i o n = ⟨ 1 ∣ σ z ∣ 1 ⟩ = − 1 \mathrm{expectation}=\langle1|\sigma_z |1\rangle=-1 expectation=⟨1∣σz∣1⟩=−1。
我们先在 MindQuantum 上模拟运行一下该算法:
from mindquantum import *
import numpy as np
circ = Circuit()
circ += RY('theta').on(0)
sim = Simulator('mqvector', 1)
ham = Hamiltonian(QubitOperator('Z0'))
h = np.pi/2
def get_expectation_with_grad(params=0):
sim.apply_circuit(circ, pr=params)
expectation = sim.get_expectation(ham).real
sim.reset()
sim.apply_circuit(circ, pr=(params + h))
expectation_0 = sim.get_expectation(ham).real
sim.reset()
sim.apply_circuit(circ, pr=(params - h))
expectation_1 = sim.get_expectation(ham).real
sim.reset()
grad = (expectation_0 - expectation_1)/2
return expectation, grad
lr = 0.2
param = np.array([1.]) # 拟设参数 params 初始化为 1,后面会不断更新,最终为 -1
for i in range(30):
expectation, grad = get_expectation_with_grad(param)
param -= lr * grad # 采用固定学习率对参数进行更新
print('\t迭代次数:', i, '期望值:', expectation, '旋转角度为:', param[0], '角度近似率为:', param[0]/np.pi)
print('param:', param)
迭代次数: 0 期望值: 0.5403023058681398 旋转角度为: 1.1682941969615794 角度近似率为: 0.3718795928640235
迭代次数: 1 期望值: 0.39172173508926134 旋转角度为: 1.3523109442710197 角度近似率为: 0.4304539427560028
迭代次数: 2 期望值: 0.21675126199781447 旋转角度为: 1.5475563171147677 角度近似率为: 0.492602475163808
迭代次数: 3 期望值: 0.02323791775597034 旋转角度为: 1.7475023097406133 角度近似率为: 0.5562472613194459
迭代次数: 4 期望值: -0.1757878101001235 旋转角度为: 1.9443879258551688 角度近似率为: 0.6189178993760956
迭代次数: 5 期望值: -0.3649616384423912 旋转角度为: 2.1305924373435263 角度近似率为: 0.678188636234863
迭代次数: 6 期望值: -0.5310134405013788 旋转角度为: 2.300065116676437 角度近似率为: 0.7321334655045839
迭代次数: 7 期望值: -0.666324577712243 旋转角度为: 2.4491974816595756 角度近似率为: 0.7796037716286863
迭代次数: 8 期望值: -0.7697191882037133 旋转角度为: 2.576874005940434 角度近似率为: 0.8202444715408683
迭代次数: 9 期望值: -0.8447392074913151 旋转角度为: 2.683909639507381 角度近似率为: 0.8543149718791732
迭代次数: 10 期望值: -0.8970787129234834 旋转角度为: 2.772283794738319 角度近似率为: 0.8824453391723216
迭代次数: 11 期望值: -0.9325770502158797 旋转角度为: 2.8444779899095787 角度近似率为: 0.9054254652204157
迭代次数: 12 期望值: -0.9561851864634903 旋转角度为: 2.9030304925675456 角度近似率为: 0.9240633056772493
迭代次数: 13 期望值: -0.9716787487730284 旋转角度为: 2.950291643286876 角度近似率为: 0.9391069971836343
迭代次数: 14 期望值: -0.9817576967347026 旋转角度为: 2.988318909768795 角度近似率为: 0.9512114520493746
迭代次数: 15 期望值: -0.988276558124946 旋转角度为: 3.018853771589809 角度近似率为: 0.9609310004402594
迭代次数: 16 期望值: -0.9924770348920124 旋转角度为: 3.0433399597063446 角度近似率为: 0.9687251961927087
迭代次数: 17 期望值: -0.9951770858161983 旋转角度为: 3.0629588973599273 角度近似率为: 0.9749700980042675
迭代次数: 18 期望值: -0.9969099588955574 旋转角度为: 3.078669446497189 角度近似率为: 0.9799709211120341
迭代次数: 19 期望值: -0.9980209880973074 旋转角度为: 3.0912457851015276 角度近似率为: 0.9839740940217899
迭代次数: 20 期望值: -0.9987328641127335 旋转角度为: 3.1013109053515313 角度近似率为: 0.9871779213029948
迭代次数: 21 期望值: -0.9991888000773846 旋转角度为: 3.109365076444614 角度近似率为: 0.9897416435869387
迭代次数: 22 期望值: -0.9994807365809826 旋转角度为: 3.1158094761948982 角度近似率为: 0.9917929597379745
迭代次数: 23 期望值: -0.9996676322947254 旋转角度为: 3.1209655403615173 角度近似率为: 0.9934341859360074
迭代次数: 24 期望值: -0.9997872686428002 旋转角度为: 3.1250906704674373 角度近似率为: 0.994747255630516
迭代次数: 25 期望值: -0.9998638453663077 旋转角度为: 3.128390917302451 角度近似率为: 0.9957977568249476
迭代次数: 26 期望值: -0.9999128583451404 旋转角度为: 3.1310311878647306 角度近似率为: 0.9966381810471213
迭代次数: 27 期望值: -0.9999442282392917 旋转角度为: 3.133143441740828 角度近似率为: 0.9973105323380131
迭代次数: 28 期望值: -0.9999643056219158 旋转角度为: 3.134833264004616 角度近似率为: 0.9978484194704703
迭代次数: 29 期望值: -0.9999771554131975 旋转角度为: 3.1361851316272715 角度近似率为: 0.9982787322995734
param: [3.13618513]
可以看到,经过大约 30 次训练,即达到了收敛效果,最终旋转角度近似为 π \pi π。
在本源真机上完成 VQA 训练
from pyqpanda import *
# 通过QCloud()创建量子云虚拟机
qm = QCloud()
# 通过传入当前用户的token来初始化
qm.init_qvm("ADBFC5146AA54297A338AD22EDD6E4B1")
qbits = qm.qAlloc_many(1)
cbits = qm.cAlloc_many(1)
def get_expectation_with_grad(params=0): # 获取期望值,并基于参数移位法获取梯度
prog = QProg()
prog << RX(qbits[0], params) << Measure(qbits[0], cbits[0])
result = qm.real_chip_measure(prog, 1000) # 调用真实芯片计算接口,需要量子程序和测量次数两个参数
expectation = result['0'] - result['1']
prog = QProg()
prog << RX(qbits[0], params + np.pi/2) << Measure(qbits[0], cbits[0])
result = qm.real_chip_measure(prog, 1000)
expectation_0 = result['0'] - result['1']
prog = QProg()
prog << RX(qbits[0], params - np.pi/2) << Measure(qbits[0], cbits[0])
result = qm.real_chip_measure(prog, 1000)
expectation_1 = result['0'] - result['1']
grad = (expectation_0 - expectation_1)/2
return expectation, grad
lr = 0.2
param = np.array([1.]) # 拟设参数 params 初始化为 0,后面会不断更新,最终为 -1
for i in range(30):
expectation, grad = get_expectation_with_grad(param)
param -= lr * grad # 采用固定学习率对参数进行更新
print('\t迭代次数:', i, '期望值:', expectation, '旋转角度为:', param[0], '角度近似率为:', param[0]/np.pi)
print('param:', param)
迭代次数: 0 期望值: 0.5145436308926781 旋转角度为: 1.1570712136409227 角度近似率为: 0.36830720632058267
迭代次数: 1 期望值: 0.3179538615847543 旋转角度为: 1.3267803410230692 角度近似率为: 0.42232729934194413
迭代次数: 2 期望值: 0.21163490471414237 旋转角度为: 1.5115346038114343 角度近似率为: 0.4811364077020788
迭代次数: 3 期望值: 0.04312938816449341 旋转角度为: 1.6962888665997995 角度近似率为: 0.5399455160622135
迭代次数: 4 期望值: -0.1253761283851555 旋转角度为: 1.878034102306921 角度近似率为: 0.5977968213545936
迭代次数: 5 期望值: -0.2577733199598797 旋转角度为: 2.05777331995988 角度近似率为: 0.6550095912684705
迭代次数: 6 期望值: -0.448345035105316 旋转角度为: 2.2244734202607828 角度近似率为: 0.7080718812220773
迭代次数: 7 期望值: -0.5225677031093279 旋转角度为: 2.370912738214644 角度近似率为: 0.7546849638528029
迭代次数: 8 期望值: -0.6770310932798396 旋转角度为: 2.5045135406218657 角度近似率为: 0.7972114200611087
迭代次数: 9 期望值: -0.7693079237713139 旋转角度为: 2.621664994984955 角度近似率为: 0.8345018861656892
迭代次数: 10 期望值: -0.8094282848545639 旋转角度为: 2.704914744232698 角度近似率为: 0.8610011043735675
迭代次数: 11 期望值: -0.8756268806419257 旋转角度为: 2.7875626880641926 角度近似率为: 0.8873087619678948
迭代次数: 12 期望值: -0.9077231695085255 旋转角度为: 2.8527582748244735 角度近似率为: 0.9080611617692452
迭代次数: 13 期望值: -0.8836509528585756 旋转角度为: 2.899899699097292 角度近似率为: 0.9230667431640679
迭代次数: 14 期望值: -0.8976930792377131 旋转角度为: 2.9442326980942832 角度近似率为: 0.9371783750289863
迭代次数: 15 期望值: -0.9237713139418255 旋转角度为: 2.983550651955868 角度近似率为: 0.9496936684476469
迭代次数: 16 期望值: -0.9177532597793381 旋转角度为: 3.0126379137412242 角度近似率为: 0.9589524314359417
迭代次数: 17 期望值: -0.9217652958876631 旋转角度为: 3.0385155466399203 角度近似率为: 0.9671895378186316
迭代次数: 18 期望值: -0.9378134403209628 旋转角度为: 3.0665997993981953 角度近似率为: 0.9761290331176748
迭代次数: 19 期望值: -0.9538615847542629 旋转角度为: 3.07703109327984 角度近似率为: 0.979449417085891
迭代次数: 20 期望值: -0.9317953861584752 旋转角度为: 3.0976930792377138 角度近似率为: 0.9860263314844727
迭代次数: 21 期望值: -0.925777331995988 旋转角度为: 3.1077231695085263 角度近似率为: 0.9892190083769883
迭代次数: 22 期望值: -0.9398194583751255 旋转角度为: 3.1117352056168515 角度近似率为: 0.9904960791339945
迭代次数: 23 期望值: -0.9518555667001003 旋转角度为: 3.105717151454364 角度近似率为: 0.9885804729984852
迭代次数: 24 期望值: -0.9578736208625879 旋转角度为: 3.1143430290872627 角度近似率为: 0.9913261751260485
迭代次数: 25 期望值: -0.9398194583751255 旋转角度为: 3.121163490471415 角度近似率为: 0.993497195412959
迭代次数: 26 期望值: -0.9438314944834504 旋转角度为: 3.130992978936811 角度近似率为: 0.9966260187676241
迭代次数: 27 期望值: -0.9157472417251755 旋转角度为: 3.1358074222668013 角度近似率为: 0.9981585036760315
迭代次数: 28 期望值: -0.9478435305917753 旋转角度为: 3.1394182547642937 角度近似率为: 0.9993078673573371
迭代次数: 29 期望值: -0.9237713139418255 旋转角度为: 3.1456369107321973 角度近似率为: 1.0012873270306966
param: [3.14563691]
可以看到,经过大约 30 次训练,在真机上的结果,也基本达到了收敛效果,最终旋转角度近似为 π \pi π。
参考文献:Gradients of parameterized quantum gates using the parameter-shift rule and gate decomposition