图1,传统电脑中的数据流
尽管在许多领域中传统电脑很好的解决了很多问题,但在某些领域中使用传统电脑进行计算看起来非常困难。比如这些领域:图像识别、自然语言(让电脑理解我们人类所说的话而不是编程语言)、必须让电脑先学习相关经验才有能力处理的某些特殊的任务。甚至有些是在过去几十年已经投入大量努力和研究到某个领域,但我们在这个领域的进展还是很慢的,我们不得不去使用大量超级计算机去运算,消耗着大量的能源和空间。
我们可能会问:难道这世上没有其他设计计算机系统的方式吗?如果我们可以从挠头思考开始,做些完全不同的,使得计算效果在传统电脑发现很难的领域有较大的改进。那么我们怎样才能重新构建一种新类型的电脑呢?
1.2 - 一种新的计算方式
相对于将0和1组成的比特流转换成其他比特流的传统计算操作,量子计算是一种截然不同的计算方式。在量子计算中,一切都是变化的,不管是从我们经常理解信息比特的物理层还是操作他们的设备都完全不同。我们制造这种设备的方法是不同的,需要新材料、新的设计规则和新的处理器架构。最终,我们编写这些系统的方法也完全不同。本文将揭露这些问题的源头,也就是如何将传统的二进制0和1的信息表达方式替换成新的信息表达方式“qubit"(Q比特),这样才能改变我们对计算本身的思考方式。
1.3 - 电灯开关游戏
在了解量子计算之前,我们需要深刻理解为什么我们不能用传统数字计算机去解决某些问题。让我们思考这样一个数学问题去勾勒这一点,我们称之为电灯开关游戏。
电灯开关游戏涉及试图在一堆开关中寻找最好的设置。这里的一张图举例介绍这个问题:
图二,电灯开关游戏
让我们想象一下,每一个灯的开关有一个数字跟它紧密相关,是给你备选的的(你不要去改变这个)。我们叫这个数字是“偏差值”。你要做的是:对每一个灯的开关打开或者关闭进行选择。在我们的游戏中,打开表示1,关闭表示-1。我们紧接着把所有开关的偏差值乘以对应的打开/关闭的值。这将会产生一个结果。这个游戏的本意是设置所有开关打开关闭状态以求得最小值。在数学上,我们把每隔开关的偏差值定义为hi,开关设定称为Si
图三,玩电灯开关游戏,把每个开关的偏差值乘以他们的设定值(你必须选)后加总。
根据哪个开关是打开以及哪个开关是关闭的,我们将得到不同的分数。您可以试一下这个游戏。希望您能很轻松地找到,因为这有一个简单规则可以成功:
图四,请为这个开关设置的特殊“猜想”作答
我们发现如果我们设置所有带正偏差值的开关为关闭,将负偏差值的开关打开,然后再加总,我们将得到最小的一个值。容易吧?我可以给你无穷多个不同偏差值的开关,而你只用看把这些开关按这个规则打开关闭即可。
好,我们让这个问题更难一些。请想像一下有很多“对”开关有附加规则,这里的一是“一对”而不是一个开关。我们增加一个新的偏差值J,把两个开关的设定值相乘后与J相乘,我们把这样的规则用于每一对开关后的结果和之前的结果加总。还是一样,我们需要做的是,如何选择开关状态打开或关闭以适应这个新规则。
图五,增加附加规则让开关游戏的难度取决于开关“对”数
但现在这个是非常、非常难以决定到底是哪个个开关应该打开或者关闭了,因为邻居会影响它。甚至简化到如前图只有两个开关的情况,您仍不能使用之前的规则,也就是根据偏差值设置他们为负数。(您试试)在所有开关都有邻居的复杂网络面前,这一下子要找出正确的组合让你得到最小值,就变得非常沮丧了。
图六,电灯开关游戏,带有附加规则,产生一张互相作用的电灯开关网
1.4 - 那么量子机制怎么帮我们?
每一对开关你若尝试所有组合,有四种可能性:
[开,开],[开,关],[关,开],[关,关]。
但随着您增加越来越多的开关数量,这种可能性的数量将随着开关数量呈指数增长:
图7,电灯开关游戏带来的指数问题
您应该明白为什么这个游戏不再好玩了。实际上这个问题甚至对于大多数强大的超级计算机来说都很困难。要把这么多可能的配置存进内存,并把他们送进传统处理器,去计算我们的猜测是否正确的话,那将花费非常长的时间。假设500个开关,宇宙都没有足够的时间去检查所有的配置。
量子机制可以给我们此问题的好帮手。量子计算机的基础计算能力来源于一种想法,也就是您可以将信息比特放进状态中的叠加态。您可以想象成这么一种情况,量子比特还没有决定它将成为那种状态。有人喜欢把这种叠加态看作“同时拥有两种状态”。或者你也可以把量子比特的状态看作未决定是选+1还是-1。这意味着如果使用量子计算机,我们的电灯开关将能同时打开和关闭。
图8:量子机制的信息比特(Q比特)可以存在于已知的叠加态中,这个叠加态并没有选择到底是变成+1或是-1(换句话讲,您可以认为它即是+1又是-1)
现在来看一下和之前同样数目的开关群,但现在送入量子计算机的内存(注意那个偏差值还没有加上去)
图9,一个由叠加态下的量子比特组成的网,答案就在这里的某处!
由于所有的电灯开关都是同时打开并且关闭,我们知道正确答案(正确的打开关闭每一个开关)就在什么地方摆着呢,它只是现在还躲着我们。但也没问题,因为量子机制将把它给我们找出来。D-Wave量子计算机允许您用一种这样的“量子表述”并提取出获得最小值的开关打开关闭的配置。下面就是它的工作原理:
图10,计算机采用叠加态比特开始计算,结束时产生传统常态比特流,并沿此方式找到答案
你启动了如前所述的量子叠加态下的系统,您慢慢的调节量子计算机去关闭量子叠加效应。同时,你慢慢调高所有的偏差值(H,J的要先调)。当这个操作执行了,所有开关会慢慢跳出他们的叠加态并选择一个状态不管是打开还是关闭。当您把他们加总的时候,内部采用量子机制工作的电脑帮助开关设置到正确的状态以获得最小值。尽管N个开关可能产生2的N次方个可能性配置,它也能在结束的时候发现最小值,赢得电灯开关游戏。所以,我们可以知道量子计算机允许我们精简表达式,就像这种我们研究的:
\[ E(s) = \sum_i h_i s_i + J_{ij}s_i s_j \]
但对于传统计算机又是非常困难的(或者说不可能完成)
第二节
2.1 这是个数学公式,谁关心啊?
我们从来不会制造一个机器用来玩某种奇怪变态的电灯开关游戏。日常生活中,我们曾经遇到许多应用程式的核心问题,其本质是在一对变量中(比如开关)寻找一个最佳组合。一部分我们列举如下。甚至科学探索本身就是一种优化问题。(你们试图寻找最佳要素“配置”,以使得科学公式能够和真实世界的观测一致)
图11,举的这些例子都是在寻找良好的“开关设置”,并可以非常有效的被量子计算机处理。
2.2 能量程序
为了理解这些问题是如何被映射成寻找开关设置的,让我们看看量子计算机是如何被编程的。回到前面的图1,在比特流通过逻辑程序的应用软件转换成其他比特流的那个过程,我们现在用一种不确定是“-1”还是“1”的东西去代替,因此计算方式从最基础的方式上就不一样了,如图12所示。在这种情况下,一组Q比特被初始化进入叠加态,此时“能量程序”(取代逻辑程序)开始作用于这组Q比特。Q比特在计算的开始时一种未决定的状态,在计算结束时所有的Q比特都已经做出了选择,不论这种选择是-1还是1。那么什么是能量程序呢?其实就是H和J的数值啦,我们之前说的偏移量设置。在电灯开关游戏中,我们说H和J是给定的。我们现在知道了,H和J其实是来自您想解决的问题,并因为问题不同而不同。
图12,量子计算机最基础的操作就是支持能量程序(一组H和J的数字)
并让计算机寻找开关设置(+1和-1)
精巧制作一个能量程序或者说构造出一系列的H和J的值,用来解析您真正关心的实际问题,是极端困难和花费时间的。这基本上等同于在您的电脑内部通过发送机器码到微处理器给您的电脑编程一样!幸运的是,这有一个比较好的方式,即通过量子编译器去编写量子计算机程序。这种过程的细节解释,参见“Programming with D-Wave”白皮书。
2.3 量子计算机会学习
教会电脑知道现实问题的原因并从经验中学习的方法就叫做机器学习。这是人工智能的一个分支。我们所写的大部分代码都是完全静态的,也就是说,给定新的数据,它将不断地重复执行相同的计算并且犯同样的错误。使用机器学习,我们可以设计自我修正的程序。这种程序还可以学习采用新的方法去处理一小段数据,甚至这些数据机器从来就没见过。在D-Wave硬件上运行很好的程式都是需要在不确定条件下学习和做出决定的程序。举个例子,假设让电脑基于一组之前给它看过的相似物体的图片中识别某个物体。对于遵循严格逻辑原因设计的传统电脑架构来说,这个任务非常困难。如果系统被输入了一张新图,它就很难对这张图进行总体描述。比如“这看起来像个苹果”。D-Wave的处理器是被设计成支持那些拥有高级认知水平和决断能力的应用程序
我们怎样才能使用量子计算机去实现学习呢?举个例子,比如我们想让系统识别物体。为此编写能量程序也是非常困难的,甚至是使用量子编译器也是如此,因为我们不知道在细节上如何能抓住让系统必须认识的物体本质。幸运的是,我们还有另一种方法绕开这个问题。因为这里有一种模式可以让量子计算机根据新输入的数据片段来调整它自己的能量程序。这就允许机器做出比较好的去猜想这个物体到底是什么。甚至这个实例电脑从来没有见过。下面的章节给除了这个过程的大致框架。
2.4 一种可以自我编程的电脑
为了让系统可以改变自己的能量程序,你一开始给系统看很多很多的你想让它知道的概念实例。如图13的例子,这里是想让电脑学习不同类型水果的差异。为了达到这一点,我们展示很多不同的苹果、杨梅、瓜果的图片(或者其他,用数字代表这些图)给系统构思差异。同时,我们每次告诉系统“正确”答案,也就是告知它“开关设置”(标识)在每次量子计算完成后的设置。系统必须找出一个能量程序(我们一开始并不知道,再此显示一个问号),能让系统一看到所示图片,就能找到相关的标识。如果它答错了许多次,那么算法就知道应该需要更改能量程序了。
图13,通过允许它自己改写能量程序教育量子芯片。系统调整能量程序直至每次都能答对。
这就是我们常说的培训或者学习阶段。
一开始系统随机选择一个能量程序(记得吗,就是一堆h和j的值)。他一开始可能选择了错误的标识,不过没关系,我们继续给它看样品,而且每次允许它调整能量程序。那么他将越来越会选择正确的标识(开关设置)。当系统基于之前的数据已经100%准确了,我们就保留最后的能量程序,并用这个能量程序作为我们的“学习”程序去识别一张新的从未见过的样品(图14)。在机器学习术语中,这就是称为强制学习算法。我们不断地示图和告诉正确答案的目的就是为了帮助它学习。当然系统还支持其它类型的学习算法,甚至某些可以在标识数据不可用的情况下使用。
图14,在系统在训练期间发现一个好的能量程序后,它可以标识出从未见过的样品以帮助我们解决现实问题。这就是所谓的“测试”阶段。
2.5 不确定性是一个功能特性
另外有意思的一点就是量子计算机是概率论化的,意思就是它会给出很多个答案,某些是你在寻找的,而某些不是。一开始听到这个,恐怕不是件好事。就像你每次问计算机同一个问题,而计算机每次给你不同的答案一样,这应该是个Bug吧!但是,对于量子计算机来说,返回不同答案意味着我们得到了关于电脑的信心度重要信息。拿上面的水果例子。假设你问它100遍,计算机回答100遍苹果,那么计算机就是100%自信。但如果它回答50遍苹果,50遍杨梅,那就意味着电脑不确定你拿给他看的是什么。但如果你把苹果和杨梅的混合图片给电脑看而得到这种结果的话,那么这个就是完全正确的了。当你要设计一种能够做出复杂决定和从现实生活中学习的系统时,这种不确定性是非常有用的。