量子机器学习:TensorFlow Quantum入门

注:转载请注明作者,本文也发布在作者的个人公众号上。 相关代码请见作者的Github。 TensorFlow Quantum TensorFlow Quantum (TFQ) 是谷歌在2020年发布的 量子机器学习框架 ,它能够帮助开发者方便的创建经典+量子结合的混合机器学习模型。量子+机器学习,两个热门的名词结合在一起,听上去很酷!但是你可能会问,这个框架是如何把经典和量子世界结合起来的呢?所谓的”经典-量子混合模型“又是如何工作的?在这个笔记里,我会结合谷歌的"Hello, many world"示例,实际讲解一下在TFQ下量子机器学习模型的搭建和工作原理。 基本概念 要理解TFQ的代码,首先需要了解一些量子计算的基本概念。 量子比特和状态向量 你可能在很多地方已经听到过量子比特(Qubit)的概念。一个经典比特在任意时刻只能处于两个状态中的一个,而量子比特则可以处于两个状态的叠加态: \(|\psi\rangle = \alpha|0\rangle + \beta|1\rangle\) 其中, \(\alpha\) 和 \(\beta\) 都是复数,并且 \(|\alpha|^2+|\beta|^2=1\) 。如果我们对这个量子比特进行测量,得到两个状态的概率分别是 \(|\alpha|^2\) 和 \(|\beta|^2\) 。 因此,一个量子比特的状态可以用一个**状态向量**来表示: \begin{matrix} \begin{pmatrix} \alpha \\ \beta \end{pmatrix} \end{matrix} 如果我们的系统里有多个量子比特,每个量子比特有相应的状态向量,那么这个系统的状态向量就是这些量子比特的**张量积**(tensor product)。例如一个系统有两个量子比特 \(\begin{pmatrix}\alpha_1 \\ \beta_1\end{pmatrix}\) 和 \(\begin{pmatrix}\alpha_2 \\ \beta_2\end{pmatrix}\) ,那么这个系统的状态向量就是: \(\begin{pmatrix}\alpha_1 \\ \beta_1\end{pmatrix} \otimes \begin{pmatrix}\alpha_2 \\ \beta_2\end{pmatrix} = \begin{pmatrix} \alpha_1\alpha_2 \\ \alpha_1\beta_2 \\ \beta_1\alpha_2 \\ \beta_1\beta_2 \end{pmatrix}\) 在谷歌的量子计算框架[Cirq]里,模拟器运行的结果里有一个 final_state 成员,这就是系统的状态向量。详细信息请参见我的[另一篇笔记]。 量子比特另外一种重要的表示方法是 Bloch球 (Bloch Sphere)。每一个量子比特都可以表示为Bloch球面上的一个向量: ...

November 27, 2020 · 3 min · Ping Zhou

Machine Learning Meets Quantum: Getting Started with TensorFlow Quantum

Source: My notebook Introduction Earlier this year, Google announced TensorFlow Quantum. It's a framework for building Hybrid Quantum-Classical Machine Learning models. So now we are entering the era of Quantum Machine Learning - sounds exciting! TensorFlow Quantum logo You may wonder how these two very different worlds work together, and what these hybrid ML models look like. In this notebook, I'm going to walk you through the "Hello, many world" example to explain the basic ideas of building quantum-classical hybrid ML model and how it works on a real problem. ...

November 23, 2020 · 12 min · Ping Zhou

用Cirq模拟量子隐形传态过程

这里我们用谷歌的Cirq框架来模拟量子隐形传态的过程:Alice这里有一个量子比特 \(|\psi\rangle\) ,通过量子隐形传态电路,把状态传送到Bob那里。 关于量子隐形传态的原理,请参见我的相关文章。 制备纠缠态的量子比特 要在Alice和Bob之间实现量子隐形传态,首先需要用到一对纠缠态的量子比特。这可以通过一个H门和一个CNOT门来实现: 为简化后面的量子电路,可以把这里的H门和CNOT门包装成一个自定义的复合门,这样也方便以后重用。我们把这个自定义门起名叫“纠缠门”(EntangleGate)。 import cirq import numpy as np # 创建一个自定义门 - “纠缠门”,输入2个量子比特 class EntangleGate(cirq.ops.gate_features.TwoQubitGate): # 内部就是一个H门和一个CNOT门 def _decompose_(self, qubits): q0, q1 = qubits yield cirq.H(q0), yield cirq.CNOT(q0, q1) # 打印的时候如何显示这个门? def _circuit_diagram_info_(self, args): return cirq.protocols.CircuitDiagramInfo(wire_symbols=('E', 'E')) 试验一下这个自定义门: ...

October 28, 2020 · 3 min · Ping Zhou

瞬间移动?传送门?“量子隐形传态”是怎么回事?

注: 本文也发布在作者的个人公众号上,转载请注明作者。 说起“ 量子隐形传态 ”( Quantum Teleportation ),你会想到什么?传送门?瞬间移动?是不是感觉很科幻?其实,量子隐形传态是已经被实验证实的现象,所以理论上说是可以用来制造传送门的……今天我们就来聊聊,量子隐形传态到底是怎么回事。 既然叫“隐形传态”,那么必然有发送方和接收方。这里我们给发送方起名叫Alice,接收方起名叫Bob。假设Alice那边需要传送的量子比特是 \(|\Psi\rangle\) = \((\alpha|0\rangle + \beta |1\rangle)\) 。我们的目标是在Bob那端得到一个和 \(|\Psi\rangle\) 状态完全一样的量子比特。 量子隐形传态需要用到 量子纠缠 ,我在这篇专栏文章里有介绍。简单的说,Alice和Bob之间要准备一对纠缠态的量子比特 \(|\Phi_0\Phi_1\rangle\) : \(|\Phi\rangle\) = \(|\Phi_0\Phi_1\rangle\) = \((\frac{1}{\sqrt{2}}|00\rangle + \frac{1}{\sqrt{2}}|11\rangle)\) 这两个纠缠态的量子比特,Alice和Bob各拿其中一个,Bob可以在很远的地方,只要两个量子比特仍然处于纠缠态,隐形传态就能进行。 好了,准备工作完成,我们可以来搭电路了! Alice这边的电路长这样: 老规矩,我们分时序来分析: t0: \(|\Psi\rangle |\Phi\rangle = (\alpha|0\rangle + \beta |1\rangle) (\frac{1}{\sqrt{2}}|00\rangle + \frac{1}{\sqrt{2}}|11\rangle)\) ,展开成 \begin{matrix} \frac{\alpha}{\sqrt{2}}|000\rangle + \frac{\beta}{\sqrt{2}}|100\rangle + \frac{\alpha}{\sqrt{2}}|011\rangle + \frac{\beta}{\sqrt{2}}|111\rangle \end{matrix} t1: \(|\Psi\rangle\) 和 \(|\Phi_0\rangle\) 经过CNOT门,系统状态变成了 \begin{matrix} \frac{\alpha}{\sqrt{2}}|000\rangle + \frac{\beta}{\sqrt{2}}|110\rangle + \frac{\alpha}{\sqrt{2}}|011\rangle + \frac{\beta}{\sqrt{2}}|101\rangle \end{matrix} t2: \(|\Psi\rangle\) 再经过一个H门,前面我们说过,H门会把 \(|0\rangle\) 变成 \(\frac{1}{\sqrt{2}}(|0\rangle + |1\rangle)\) ,把 \(|1\rangle\) 变成 \(\frac{1}{\sqrt{2}}(|0\rangle - |1\rangle)\) 。那么把这个替换上面的 \(|\Psi\rangle\) ,系统状态变成了: ...

October 15, 2020 · 2 min · Ping Zhou

超越时空的联系 – 量子纠缠是怎么回事

所谓“遇事不决,量子力学”,“量子纠缠”是量子力学中的一个重要现象,也是科幻故事中经常用到的填坑大杀器。实际上,量子纠缠是真实的物理现象,也是实现量子通信的核心之一。今天我们就来聊聊量子纠缠是怎么回事。 假设我们有2个量子比特A和B,初始状态都是\(|0\rangle\),然后搭一个简单的电路: 只需要一个H门和一个CNOT门,就能让A和B之间形成量子纠缠! 不信?我们来分析一下。 t0时刻,两个量子比特都是 \(|0\rangle\) ,整个系统的状态是 \(|00\rangle\) 。 t1时刻,A经过H门后变成了相干态 \(\frac{1}{\sqrt{2}}(|0\rangle + |1\rangle)\) ,而B不变还是 \(|0\rangle\) ,整个系统状态变成 \(\frac{1}{\sqrt{2}}(|00\rangle + |10\rangle)\) 。 t2时刻,经过一个CNOT门。CNOT意思是“Controlled NOT”,就是说当A是1的话,B就取反,否则B不变。因为这里A已经是相干态( \(|0\rangle\) 和 \(|1\rangle\) 的叠加),那么经过这个CNOT门以后,A如果是 \(|0\rangle\) ,那么B不变还是 \(|0\rangle\) ,而A如果是 \(|1\rangle\) ,那么B就从 \(|0\rangle\) 变成 \(|1\rangle\) 。所以整个系统经过这个CNOT门后,就变成了这样一个状态: \(\frac{1}{\sqrt{2}}(|00\rangle + |11\rangle)\) 看出什么没有?在这个状态下,A和B要么都是 \(|0\rangle\) ,要么都是 \(|1\rangle\) !也就是说,如果我们测量A得到0,那么我们知道B测量得到肯定也是0,反之如果我们测量A得到1,那么B肯定也是1。通过这个电路,我们把A和B两个量子比特的状态“纠缠”在了一起,这个状态就叫做“ 纠缠态 ”。 这时候,如果我们把A和B分开,A和B之间还会处于纠缠态吗?答案是肯定的,只要它们没有退相干,A和B仍然处于会量子纠缠状态。即使我们把B送到银河系的另一端,它们仍然会“纠缠”在一起。甚至,如果我们对其中之一做进一步的量子变换,只要不导致退相干,它们之间仍然会保持纠缠态! 这就是量子纠缠的原理,是不是挺简单的?:-) 常见误解:量子纠缠能实现超光速通信? 信息的传递不可能超光速,否则会导致因果律的崩溃。表面上看,一端的测量会导致另一端的状态坍缩,这个作用是“瞬时”的,但是实际上这个动作没有在两端之间传递任何信息,因为测量得到0和1完全是随机的。

September 22, 2020 · 1 min · Ping Zhou

用谷歌Cirq模拟双比特Deutsch问题

谷歌量子计算框架Cirq Cirq是谷歌开发的开源量子计算框架,它让开发者能够方便的用Python搭建量子电路。您可能会问,我没有量子计算机,如何运行我设计的电路呢?别急,Cirq内置了模拟器,您在自己的电脑上就可以模拟您设计的量子电路。如果想在真实的量子计算机上运行,Cirq也提供了相应的接口。 Cirq的源码:https://github.com/quantumlib/Cirq Cirq的安装,最简单的方法是用pip: python -m pip install --upgrade pip python -m pip install cirq 安装完成,您就可以在电脑上模拟量子计算了! 接下来进入实战,我们要用Cirq来模拟双比特Deutsch问题。 回顾一下双比特Deutsch问题 回顾一下双比特Deutsch问题:有人给你一个函数f,不告诉你它内部是怎么运作的,只知道它输入2个比特,输出1个比特,并且f有可能是常量函数(无论什么输入,输出总是0或者总是1),也有可能是平衡函数(对所有可能的输入,一半的情况下输出0,另一半情况输出1)。我们只能通过对f的查询,来判断f的性质。在上文我们讨论过,这样的函数f总共有8种可能(2个常量函数,6个平衡函数)。所以,提问的人实际上是从这8个可能的f函数中,随机抽一个给我们来判断。 我们知道量子计算里,每个这样的函数f,都可以包装成相应的可逆变换Uf。所以在量子计算环境下,提问的人实际上是把这8种可能的函数f包装成8个Uf,从里面随机抽一个作为黑盒给我们,让我们判断相应的函数f的性质。 所以要模拟双比特Deutsch问题,我们首先要从提问者的角度,把这8个可能的Uf准备出来。 我们从一个简单的例子出发: 假如有这样一个平衡函数函数f,它在输入是00或01的情况下输出0,其余情况下输出1,我们把它和相应的Uf输出列在下面的表里: 输入 (x0x1) \[f(x_0x_1)\] \[y\oplus f(x_0x_1)\] 00 0 y 01 0 y 10 1 y取反 11 1 y取反 从上面这个表中可以看出,Uf的第三个输出端,其状态取决于第一个输入: 如果x0=1,那么在第三个输出端输出,反之如果x0=1,那么就输出。这在量子电路里,就是一个简单的CNOT门:CNOT(x0, y)。所以对于上面这个表里的f函数,包装成相应的Uf内部就是一个简单的CNOT门实现。 以此类推,对每一个函数f,我们都可以用量子电路来实现相应的Uf。 我们把这些Uf放在一个池子里,模拟的时候从里面随机选一个,作为提问者的问题。 用Cirq模拟双比特Deutsch问题 首先我们要导入Cirq包: import cirq import random 然后生成这个Uf池子: q0, q1, q2 = cirq.LineQubit.range(3) constant = [[], [cirq.X(q2)]] balanced = [[cirq.CNOT(q0, q2)], [cirq.CNOT(q1, q2)], [cirq.CNOT(q0, q2), cirq.CNOT(q1, q2)], [cirq.CNOT(q0, q2), cirq.X(q2)], [cirq.CNOT(q1, q2), cirq.X(q2)], [cirq.CNOT(q0, q2), cirq.CNOT(q1, q2), cirq.X(q2)]] Uf_pool = [ [], # 常量函数: f(x0x1) = 0 [cirq.X(q2)], # 常量函数: f(x0x1) = 1 [cirq.CNOT(q0, q2)], # 平衡函数: f(00/01)=0, f(10/11)=1 [cirq.CNOT(q1, q2)], # 平衡函数 [cirq.CNOT(q0, q2), cirq.CNOT(q1, q2)], # 平衡函数 [cirq.CNOT(q0, q2), cirq.X(q2)], # 平衡函数 [cirq.CNOT(q1, q2), cirq.X(q2)], # 平衡函数 [cirq.CNOT(q0, q2), cirq.CNOT(q1, q2), cirq.X(q2)] # 平衡函数 ] Uf_attributes = [ "constant", "constant", "balanced", "balanced", "balanced", "balanced", "balanced", "balanced", ] 根据Uf生成量子电路 接下来,我们要写一个函数,根据提问者给出的Uf,生成相应的量子电路。 ...

September 13, 2020 · 2 min · Ping Zhou

量子计算编程实战 – 双比特Deutsch问题

在上一篇 “一文看懂量子计算机的威力 – 从Deutsch问题说起” 中,我们看到了量子计算机只需一次查询就可以判断函数的特性。但是在那个例子中,我们讨论的是一个简单的单比特函数,如果把输入扩展到多比特,量子计算机是否仍然只需要一次查询呢?今天我们就结合谷歌的Cirq框架,看看量子计算的 指数级 加速。 双比特Deutsch问题 首先和上次一样,假设我们有个函数f,但这次函数f输入2个比特,输出1个比特。这个函数f对我们是黑盒,我们不知道这个函数内部是怎么运作的,只能通过喂给它不同的输入,观察输出。因为输入有2个比特,因此共有4种可能的输入00,01,10,11。 如果f无论什么输入,输出始终是0或者1,我们称它为“常量”函数,记作 \(f_0\) 或者 \(f_1\) ; 如果f的输出,0和1各占一半,我们称它为“平衡”函数。平衡函数有多少种可能呢?这个问题就相当于说,我们在下面表中的4个输出位置,需要填两个0和两个1,有几种填法?用简单的排列组合可以知道,一共有6种,也就是说一共有6个“平衡”函数。 输入 输出 --- --- 00 0或者1 01 0或者1 10 0或者1 11 0或者1 当然,函数f也有可能既不是常量,也不是平衡的,例如上面的表里面,输出栏里可以填上三个0。 双比特Deutsch问题是问,假如我们已经知道函数f要么是常量,要么是平衡的,如何判断它是常量还是平衡的呢? 对于n比特输入,经典计算机需要至少查询一半可能的输入,也就是 \(2^{n-1}+1\) 次(在这个例子里n=2,所以需要查询3次)。显然随着输入比特数的增加,计算复杂性(需要查询的次数)是指数上升的。而 如果用量子计算机,无论输入n有多大,我们始终只需要对函数f进行一次查询! 怎么做到呢?套路和上次一样,引入一个辅助输入y,把函数f包装成量子比特版本Uf: \begin{matrix} U_f |x_0\rangle |x_1\rangle |y\rangle \to |x_0\rangle |x_1\rangle |y \oplus f(x_0x_1)\rangle \end{matrix} 然后在两边加上Hadamard门,电路也和上次的单比特电路差不多: 猜猜看在输出端测量,我们会得到啥? 这里先把结论放在这里 :如果输出端得到的是全0,那么函数f一定是常量函数,反之它就是平衡函数。 原理解析 下面我们做一些推导,可以帮助您理解其中的原理。如果您不感兴趣,可以直接跳到下一篇的实战部分。其实推导并不难,不要被公式吓到 :-) 为便于分析,我在前面的电路图中标出了时间(t0, t1, t2, t3)。 在 时间t0 ,电路的状态是 \(|0\rangle|0\rangle|1\rangle\) 。 在 时间t1 ,前两个量子比特都处于 \(\frac{1}{\sqrt{2}}(|0\rangle+|1\rangle)\) 状态,第三个处于 \(\frac{1}{\sqrt{2}}(|0\rangle-|1\rangle)\) 状态。如果我们把前两个量子比特放一起考虑,相当于把他们的状态做一个卷积,也就是: \begin{matrix} \frac{1}{\sqrt{2}}(|0\rangle+|1\rangle) \otimes \frac{1}{\sqrt{2}}(|0\rangle+|1\rangle) = \frac{1}{2}(|00\rangle + |01\rangle + |10\rangle + |11\rangle) \end{matrix} 加上第三个辅助量子比特,整个电路的状态就是 ...

September 4, 2020 · 2 min · Ping Zhou

理解量子计算机的威力:Deutsch问题

简介 量子计算是现在的热门话题之一,很多人可能听说过诸如“量子霸权”之类的名词,那么量子计算为什么会被认为有可能比经典计算机更快呢?这里就从最简单的Deutsch问题入手,解析量子计算的一些基本思路,相信看完后你会对量子计算的潜力有更直观的认识。 一些术语和基础概念 首先要先解释一下后面讨论中用到的一些术语和基础知识。 量子比特(Qubit) 我们知道,一个经典比特(bit)只能表示两种状态(0或者1)。而一个量子比特除了 \(|0\rangle\) 和 \(|1\rangle\) 之外,还可以处于一种叫相干态(superposition)的状态,即“同时”处于 \(|0\rangle\) 和 \(|1\rangle\) 两种状态。这可以用 \(\alpha|0\rangle + \beta|1\rangle\) 来表示( \(\alpha\) 和 \(\beta\) 都是复数)。一个常见的例子是 \(\frac{1}{\sqrt{2}}(|0\rangle+|1\rangle)\) ,测量得到0和1的概率分别是50%。 量子计算电路里常见的几种门(变换): I:Identity变换,简单说就是啥也不变,输入啥输出也是啥。 H: Hadamard门,在这个例子里主要作用是制备相干态,因为H门可以把 \(|0\rangle\) 变成 \(\frac{1}{\sqrt{2}}(|0\rangle+|1\rangle)\) ,而把 \(|1\rangle\) 变成 \(\frac{1}{\sqrt{2}}(|0\rangle-|1\rangle)\) 。另外H变换还有个特性,就是HH=I,两个H变换互相抵消。 Z:输入 \(|x\rangle\) ,输出 \((-1)^x|x\rangle\) ,例如输入 \(|0\rangle\) ,输出 \(|0\rangle\) ,而输入是 \(|1\rangle\) 的话,输出是 \(-|1\rangle\) 。 X:简单说就是将输入取反,输入 \(|0\rangle\) 的话,输出 \(|1\rangle\) ,而输入 \(|1\rangle\) ,则输出 \(|0\rangle\) 。 另外,还有两个特性后面会用到: \begin{matrix} HZH=X \\ HIH=I \end{matrix} 好了,需要了解的基础知识就这么些,接下来我们来看量子计算是如何加速Deutsch问题的。 问题的提出:如何判断单比特函数的性质? 假设我们有个函数f,输入和输出都是1个比特: \(y=f(x)\) : ...

August 1, 2020 · 2 min · Ping Zhou

看懂量子计算机的威力 - 从Deutsch问题说起

简介 量子计算是现在的热门话题之一,很多人可能听说过诸如“量子霸权”之类的名词,那么量子计算为什么会被认为有可能比经典计算机更快呢?这里就从最简单的Deutsch问题入手,解析量子计算的一些基本思路,相信看完后你会对量子计算的潜力有更直观的认识。 一些术语和基础 首先要先解释一下后面讨论中用到的一些术语和基础知识。 量子比特(Qubit) :我们知道,一个经典比特(bit)只能表示两种状态(0或者1)。而一个量子比特除了 \(|0\rangle\) 和 \(|1\rangle\) 之外,还可以处于一种叫相干态(superposition)的状态,即“同时”处于 \(|0\rangle\) 和 \(|1\rangle\) 两种状态。这可以用 \(\alpha|0\rangle + \beta|1\rang\) 来表示( \(\alpha\) 和 \(\beta\) 都是复数)。一个常见的例子是 \(\frac{1}{\sqrt{2}}(|0\rangle+|1\rangle)\) ,测量得到0和1的概率分别是50%。 量子计算电路里常见的几种门(变换): I:Identity变换,简单说就是啥也不变,输入啥输出也是啥。 H: Hadamard门,在这个例子里主要作用是制备相干态,因为H门可以把 \(|0\rangle\) 变成 \(\frac{1}{\sqrt{2}}(|0\rangle+|1\rangle)\) ,而把 \(|1\rangle\) 变成 \(\frac{1}{\sqrt{2}}(|0\rangle-|1\rangle)\) 。另外H变换还有个特性,就是HH=I,两个H变换互相抵消。 Z:输入 \(|x\rangle\) ,输出 \((-1)^x|x\rangle\) ,例如输入 \(|0\rangle\) ,输出 \(|0\rangle\) ,而输入是 \(|1\rangle\) 的话,输出是 \(-|1\rangle\) 。 X:简单说就是将输入取反,输入 \(|0\rangle\) 的话,输出 \(|1\rangle\) ,而输入 \(|1\rangle\) ,则输出 \(|0\rangle\) 。 另外,还有两个特性后面会用到: \(HZH=X\) \(HIH=I\) 好了,需要了解的基础知识就这么些,接下来我们来看量子计算是如何加速Deutsch问题的。 问题的提出:如何判断单比特函数的性质? 假设我们有个函数f,输入和输出都是1个比特: \(y=f(x)\) : 因为输入和输出都只有1个比特,这个函数无非就是这4种可能: \(f(x)=0\) ,即不管x是0还是1,f(x)总是0,我们记作 \(f_0\) \(f(x)=1\) ,即不管x是0还是1,f(x)总是1,我们记作 \(f_1\) \(f(x)=x\) ,即f(x)输出比特和输入比特相同,我们记作 \(f_x\) \(f(x) = \bar{x}\) ,即f(x)输出比特与输入比特相反,我们记作 \(f_\bar{x}\) 前两种可能,我们称为“常量”函数(constant),因为他们的输出是常量;而后两种我们称为“平衡”函数(balanced),因为他们所有可能的输出中间,0和1各占一半。 ...

August 1, 2020 · 2 min · Ping Zhou