在写这篇博客之前,依然心有余悸,前一段时间的北航博士深夜敲代码猝死,大连理工研究生自挂东南枝,最令人深感不安的并不是从我们每个人的自身角度出发担心自己是不是也有一天散手人寰了,恰恰相反,为量子科研舍生取义,像这些学长学姐们一样筚路蓝缕,即使有些许的不测也不失为一种好结局吧,真正的忐忑是迷茫,是内卷,2020的悲伤必将被社会铭记,即使量子道路上充满了无数未知的有趣和期待,惨绝人寰的 “内卷” 让我们失去的不是前进的动力,从竞争的角度来说“过渡内卷” 直接摧毁了 我们在 朦胧的科研探索中 唯一的一座灯塔,是那么的不知所措、并且让我们感受到了前所未有的痛楚!
~~
本期博客我们一起来学习量子机器学习领域另一个非常重要的算法——相位估计算法,只有先解决了它,我们才能进一步的向前走!
Quantum phase estimation algorithm
一 . 简介概述
量子相位估计算法(Quantom Phase Estimation)也称作量子特征值估计算法,是一个比较基础的算法。它的作用就是快速的估计一个酉变换的特征值。由于酉矩阵拥有一个性质:酉矩阵的特征值都是模为1的复数。所以对酉矩阵而言,其特征值和相位基本是对等的(因为模长已经确定了)!
其实这里的相位估计算法对我们来说起到的一个最主要的作用就是 过渡 ,即结合的我们上周博客学习中的量子傅里叶逆变换,也为后面将要学习的量子机器学习算法大杀器——HHL 算法铺垫了,除此之外,它还是许多量子机器学习算法的子程序,所以,PE算法的重要性可见一斑!
对与一个给定的酉算子 U U U,我们可以写出它的本征方程(也就是线代中特征方程): U ∣ ψ ⟩ = e 2 π i θ ∣ ψ ⟩ U|\psi\rangle=e^{2 \pi i \theta}|\psi\rangle U∣ψ⟩=e2πiθ∣ψ⟩ ,那么显然 ∣ ψ ⟩ |\psi\rangle ∣ψ⟩ 就是本征矢量, e 2 π i θ e^{2 \pi i \theta} e2πiθ也就是其对应的特征值了!而我们的目的就是估算出 θ \theta θ 的值!
问题就来了,如何求得这个 θ \theta θ 呢?
二 . QTF可视化
在上篇有关 S h o r Shor Shor 算法的博客中,不知道大家还记不记得我们为了求解函数的周期 t t t 使用了量子傅里叶变换( Q T F QTF QTF) ,那也是我们第一次接触量子的傅里叶变换,也只是简单的从数学表达的角度介绍一下,在这里,先不着急进入相位估计算法,接着上周博客中还未结束的量子傅里叶,仔细品位一番!
书读百遍、其义自见,再来回顾一下,经典离散傅里叶变换作用于一个复向量
(
x
0
,
x
1
⋯
,
x
N
−
1
)
(x_{0},x_{1}\cdots,x_{N-1})
(x0,x1⋯,xN−1),并把它们作用到另一个向量
(
y
0
,
y
1
⋯
,
y
N
−
1
)
(y_{0},y_{1}\cdots,y_{N-1})
(y0,y1⋯,yN−1),其映射关系为:
y
k
=
1
N
∑
j
=
0
N
−
1
x
j
e
−
2
π
i
j
k
/
N
y_{k}=\frac{1}{\sqrt{N}} \sum_{j=0}^{N-1} x_{j} e^{-2 \pi i j k / N}
yk=N1j=0∑N−1xje−2πijk/N
当时也指出其逆变换为:
x
j
=
1
N
∑
k
=
0
N
−
1
y
k
e
2
π
i
j
k
/
N
x_{j}=\frac{1}{\sqrt{N}} \sum_{k=0}^{N-1} y_{k} e^{2 \pi i j k / N}
xj=N1k=0∑N−1yke2πijk/N将其作用在量子态上
∣
x
⟩
=
∑
i
=
0
N
−
1
x
i
∣
i
⟩
|x\rangle=\sum_{i=0}^{N-1} x_{i}|i\rangle
∣x⟩=∑i=0N−1xi∣i⟩ ,在映射到量子态
∑
i
=
0
N
−
1
y
i
∣
i
⟩
\sum_{i=0}^{N-1} y_{i}|i\rangle
∑i=0N−1yi∣i⟩上,而映射规则为:
∣
j
⟩
↦
1
N
∑
k
=
0
N
−
1
e
2
π
i
j
k
/
N
∣
k
⟩
|j\rangle \mapsto \frac{1}{\sqrt{N}} \sum_{k=0}^{N-1} e^{2 \pi i j k / N}|k\rangle
∣j⟩↦N1k=0∑N−1e2πijk/N∣k⟩
Q T F QTF QTF 的张量积表示为:
Q F T ( ∣ x 1 x 2 … x n ⟩ ) = 1 N ⨂ j = 1 n ( ∣ 0 ⟩ + e 2 π i [ 0. x j x j + 1 … x n ] ∣ 1 ⟩ ) Q F T\left(\left|x_{1} x_{2} \ldots x_{n}\right\rangle\right)=\frac{1}{\sqrt{N}} \bigotimes_{j=1}^{n}\left(|0\rangle+e^{2 \pi i\left[0 . x_{j} x_{j+1} \ldots x_{n}\right]}|1\rangle\right) QFT(∣x1x2…xn⟩)=N1j=1⨂n(∣0⟩+e2πi[0.xjxj+1…xn]∣1⟩)
看不懂上面一大坨式子也没关系~~,你只需要知道:量子傅里叶变换的作用就是根据输入,改变输出量子比特的相位
一般这种复杂的理论公式配合图解食用效果更佳:
下图是0-15 这个十进制位的数字在
b
l
o
c
h
bloch
bloch 球中,用二进制来表示的示意图,不过这里用量子比特量子比特来表示,顺序是倒过来的,所以第一位表示的反而是二进制中的最后一位,大家可以自己动手算一算:
这里有显而易见的规律:第一个球中的相位随着数字的变化一直在做交替性周期变化,第二个球是数字每增长两个相位才变化一次,以此类推,我们用不同的相位来存储数字!
在 b l o c h bloch bloch球中,我们可以想象 Q T F QTF QTF 其实就是将原始在 Z Z Z 轴上进行计数的数字指针 ∣ 1 ⟩ |1\rangle ∣1⟩ 和 ∣ 0 ⟩ |0\rangle ∣0⟩转移到, x , y x,y x,y轴中的 ∣ + ⟩ |+\rangle ∣+⟩ 和 ∣ − ⟩ |-\rangle ∣−⟩ 上去了,比如 H H H 算子就是一种单比特的 Q T F QTF QTF 。
而使用了
Q
T
F
QTF
QTF 作用了之后就变成这样:
根据图片所示,数字的大小直接决定了
x
,
y
x,y
x,y平面上 指针旋转的角度大小!根据数字调整每次旋转的角度,第一个球中转完一圈正好是15,第二个每次旋转角度增加一倍,后面依次倍增,知道最后一个
b
l
o
c
h
bloch
bloch 在
∣
+
⟩
|+\rangle
∣+⟩ 和
∣
−
⟩
|-\rangle
∣−⟩ 交替!
到这里,是不是恍然大悟,为什么前面求 S h o r Shor Shor 算法的周期要用 Q T F QTF QTF 呢,呕 我的天,我感觉到了前所未有的通畅!
三 . 算法框架
该算法的主要原理就是:利用相位反推将算子 U U U 中的相位写入到一个具有 t t t 个量子比特位的量子寄存器中,然后充分利用量子逆傅里叶变换进行相位转化,将原本的 傅里叶基转化为我们可直接计算的基上去!也就是上图中将 指针从 x , y x,y x,y平面还原到 ∣ 0 ⟩ |0\rangle ∣0⟩ 和 ∣ 1 ⟩ |1\rangle ∣1⟩所在的 Z Z Z轴上去!
前面在
Q
T
F
QTF
QTF 的可视化中,一个十进制为
2
t
2^{t}
2t(t就是二进制位数)的数,在第一个
b
l
o
c
h
bloch
bloch 球中随着0 到
2
t
2^{t}
2t 以此增加,每次以
x
2
t
\frac{x}{2^{t}}
2tx 的偏转角 绕
Z
Z
Z 轴随之转动!第二个球中便是
2
x
2
t
\frac{2x}{2^{t}}
2t2x 以此类推
⋯
\cdots
⋯
前请提示,一个单量子比特作用于一个受控
U
U
U 门,其相位将转变为
e
2
π
i
θ
e^{2 \pi i \theta}
e2πiθ ,接下来重复使用 后面即将介绍的
C
U
CU
CU门作用,直到将相位
θ
\theta
θ 转化到 0 到
2
t
2^{t}
2t 之间的一个数!
四 . 数学模型
首先,我们需要初始化两个量子寄存器,没错,和shor算法一样,需要两个!第一个
r
e
g
i
i
s
t
e
r
regiister
regiister 储存
θ
\theta
θ值,不过我们先将它初始化为:
∣
00
⋯
0
⟩
|00\cdots0\rangle
∣00⋯0⟩,第二个储存输入矩阵
U
U
U 的 一个特征向量
∣
ψ
⟩
|\psi\rangle
∣ψ⟩ .
先把电路流程图放上,方便理解:
对第一个寄存器的系统进行初始化:
ψ
0
=
∣
0
⟩
⊗
n
∣
ψ
⟩
\psi_{0}=|0\rangle^{\otimes n}|\psi\rangle
ψ0=∣0⟩⊗n∣ψ⟩
接着用
n
n
n 个
H
a
d
a
m
a
r
d
Hadamard
Hadamard 算子作用在该寄存器上的
n
n
n个
∣
0
⟩
|0\rangle
∣0⟩态上,得到:
ψ
1
=
1
2
n
2
(
∣
0
⟩
+
∣
1
⟩
)
⊗
n
∣
ψ
⟩
\psi_{1}=\frac{1}{2^{\frac{n}{2}}}(|0\rangle+|1\rangle)^{\otimes n}|\psi\rangle
ψ1=22n1(∣0⟩+∣1⟩)⊗n∣ψ⟩
这是用一个
H
H
H 门作用的,可以参照上面的解释理解一下!
下一步就很重要了,引入受控
U
U
U 门,它只作用在第二个量子寄存器上,注意,这里的
U
U
U 门有点奇妙,上述经过
H
a
d
a
m
a
r
d
Hadamard
Hadamard 变换过的第一个寄存器中的与第二个寄存器中的特征向量进行张量积,之后在使用受控
U
U
U门的时候,它只会对上述张量积之后结果中的
∣
1
⟩
|1\rangle
∣1⟩ 态进行操作,我们以第一个寄存器中的第一个
∣
0
⟩
|0\rangle
∣0⟩ 为例,进行上述简单操作后得到入下结果:
∣
0
⟩
+
∣
1
⟩
2
⊗
∣
u
⟩
⟶
C
−
U
1
2
(
∣
0
⟩
⊗
∣
u
⟩
+
∣
1
⟩
⊗
U
∣
u
⟩
)
=
1
2
(
∣
0
⟩
⊗
∣
u
⟩
+
e
2
π
i
φ
∣
1
⟩
⊗
∣
u
⟩
)
\begin{aligned} \frac{|0\rangle+|1\rangle}{\sqrt{2}} \otimes|u\rangle \stackrel{C-U}{\longrightarrow} \frac{1}{\sqrt{2}}(|0\rangle \otimes|u\rangle+|1\rangle \otimes U|u\rangle) &=\frac{1}{\sqrt{2}}\left(|0\rangle \otimes|u\rangle+e^{2 \pi i \varphi}|1\rangle \otimes|u\rangle\right) \end{aligned}
2∣0⟩+∣1⟩⊗∣u⟩⟶C−U21(∣0⟩⊗∣u⟩+∣1⟩⊗U∣u⟩)=21(∣0⟩⊗∣u⟩+e2πiφ∣1⟩⊗∣u⟩)
注意,这里运用了一个等价替换: U ∣ ψ ⟩ = e 2 π i θ ∣ ψ ⟩ U|\psi\rangle=e^{2 \pi i \theta}|\psi\rangle U∣ψ⟩=e2πiθ∣ψ⟩ ,相信你一眼就看出来了!除此之外,为了实现我们这个比较特别的受控 U U U 门,对于第一个寄存器中 ∣ 0 ⟩ |0\rangle ∣0⟩态的位置不同,我们的 U U U门也要进行相应的改变才能实现我的受控准确性!
可以从电路图中看到,引入 2 j 2^{j} 2j 作为指数可以很好的解决这个问题,也就可以得到这个更一般的式子:
U 2 j ∣ ψ ⟩ = U 2 j − 1 U ∣ ψ ⟩ = U 2 j − 1 e 2 π i θ ∣ ψ ⟩ = ⋯ = e 2 π i 2 j θ ∣ ψ ⟩ U^{2^{j}}|\psi\rangle=U^{2^{j}-1} U|\psi\rangle=U^{2^{j}-1} e^{2 \pi i \theta}|\psi\rangle=\cdots=e^{2 \pi i 2^{j} \theta}|\psi\rangle U2j∣ψ⟩=U2j−1U∣ψ⟩=U2j−1e2πiθ∣ψ⟩=⋯=e2πi2jθ∣ψ⟩
当所有的操作通过并行性写在一起,再稍微利用
∣
0
⟩
⊗
∣
ψ
⟩
+
∣
1
⟩
⊗
e
2
π
i
θ
∣
ψ
⟩
=
(
∣
0
⟩
+
e
2
π
i
θ
∣
1
⟩
)
⊗
∣
ψ
⟩
|0\rangle \otimes|\psi\rangle+|1\rangle \otimes e^{2 \pi i \theta}|\psi\rangle=\left(|0\rangle+e^{2 \pi i \theta}|1\rangle\right) \otimes|\psi\rangle
∣0⟩⊗∣ψ⟩+∣1⟩⊗e2πiθ∣ψ⟩=(∣0⟩+e2πiθ∣1⟩)⊗∣ψ⟩的原理“提取公因式”变换一下得到:
上图中右边就是每一份单独的结果啦,再写在一起就是(
k
k
k 是
n
n
n个二进制位量子比特的整数表示):
ψ
2
=
1
2
n
2
(
∣
0
⟩
+
e
2
π
i
θ
2
n
−
1
∣
1
⟩
)
⊗
⋯
⊗
(
∣
0
⟩
+
e
2
π
i
θ
2
1
∣
1
⟩
)
⊗
(
∣
0
⟩
+
e
2
π
i
θ
2
0
∣
1
⟩
)
⊗
∣
ψ
⟩
=
1
2
n
2
∑
k
=
0
2
n
−
1
e
2
π
i
θ
k
∣
k
⟩
⊗
∣
ψ
⟩
\begin{aligned} \psi_{2} &=\frac{1}{2^{\frac{n}{2}}}\left(|0\rangle+e^{2 \pi i \theta 2^{n-1}}|1\rangle\right) \otimes \cdots \otimes\left(|0\rangle+e^{2 \pi i \theta 2^{1}}|1\rangle\right) \otimes\left(|0\rangle+e^{2 \pi i \theta 2^{0}}|1\rangle\right) \otimes|\psi\rangle \\ &=\frac{1}{2^{\frac{n}{2}}} \sum_{k=0}^{2^{n}-1} e^{2 \pi i \theta k}|k\rangle \otimes|\psi\rangle \end{aligned}
ψ2=22n1(∣0⟩+e2πiθ2n−1∣1⟩)⊗⋯⊗(∣0⟩+e2πiθ21∣1⟩)⊗(∣0⟩+e2πiθ20∣1⟩)⊗∣ψ⟩=22n1k=0∑2n−1e2πiθk∣k⟩⊗∣ψ⟩
到了最关键的一步,利用量子傅里叶变换的逆变换求得相位:
通过逆变换得到:
∣
j
⟩
→
1
2
n
2
∑
k
=
0
2
n
−
1
e
−
2
π
i
j
k
/
2
n
∣
k
⟩
|j\rangle \rightarrow \frac{1}{2^{\frac{n}{2}}} \sum_{k=0}^{2^{n}-1} e^{-2 \pi i j k / 2^{n}}|k\rangle
∣j⟩→22n1k=0∑2n−1e−2πijk/2n∣k⟩
具体的原理在上面也解释的比较清楚了,可以结合 Q T F QTF QTF 的可视化得到!
最终的输出结果 ∣ j ⟩ |j\rangle ∣j⟩呢,包含了 t t t个 ψ \psi ψ 值,也就是第一个寄存器中的 t t t 个比特,在理想情况下, t t t 个人比特能够表示精确的相位值;但在很多实际情况下, t t t比特只能表示 ψ \psi ψ的一个估计值。下面我们来分析如何以高概率得到一个较好 ψ \psi ψ的估计值。如下图所示,我们将输出的比特的二进制串进行隔断,分为红色和蓝色部分,红色部分包含 n n n个比特,蓝色部分包含 t − n t-n t−n个比特(冗余部分)!
其中
t
t
t是相位估计算法所实际输出的比特数,
n
n
n是我们需要的一个精度(即
t
t
t个比特就可以满足我们的精度需求),另外的
t
−
n
t-n
t−n比特数相当于是冗余部分(。那这个冗余比特的作用是什么?量子算法虽然在执行过程中能够实现指数级的加速效果,但在得到最终结果时,是概率性的。因此在算法分析时常常需要分析成功输出结果的概率。冗余比特越多,算法成功输出好的相位估计值的概率就越大。因此个冗余比特的作用是为了提高成功输出好的相位值的概率,所以我们在构造第一个量子寄存器初始化
t
t
t 个量子比特的时候是有讲究的!
本次量子机器学习算法就介绍到这里了,我也是第一次学这么难的东西,还望大家不吝指教,在评论区积极留言!