Path: blob/master/site/zh-cn/quantum/tutorials/gradients.ipynb
25118 views
Copyright 2020 The TensorFlow Authors.
计算梯度
本教程探讨适用于量子电路期望值的梯度计算算法。
计算量子电路中某个可观测对象的期望值的梯度是一个复杂的过程。可观测对象的期望值并不具备总是易于编写的解析梯度公式——这不同于诸如矩阵乘法或向量加法等具备易于编写的解析梯度公式的传统机器学习变换。因此,可以轻松地为不同的场景采用不同的量子梯度计算方法。本教程比较了两种不同的微分方案。
设置
安装 TensorFlow Quantum:
现在,导入 TensorFlow 和模块依赖项:
1. 准备工作
我们来更具体地说明量子电路的梯度计算概念。假设您具有如下所示的参数化电路:
以及可观测对象:
所用算子为
如果定义 ,则 。请参见下例:
2. 对微分器的需求
对于大型电路,要始终具备可精确计算给定量子电路梯度的公式并不现实。如果简单的公式不足以计算梯度,则可以使用 tfq.differentiators.Differentiator
类来定义用于计算电路梯度的算法。例如,您可以使用以下方法在 TensorFlow Quantum (TFQ) 中重新创建以上示例:
但是,如果您改为基于采样(在真实设备上进行)估计期望值,则值可能会有所变化。这意味着您的估计方法并不完善:
涉及到梯度时,这会迅速加剧造成严重的准确率问题:
在这里可以看到,尽管有限差分公式在解析示例中可以快速计算出梯度本身,但当涉及到基于采样的方法时,却产生了大量噪声。必须使用更细致的技术来确保可以计算出良好的梯度。接下来,您将了解一种速度缓慢而不太适用于解析期望梯度计算的技术,但该技术在基于实际样本的真实示例中却有着出色的表现:
从上面可以看到,某些微分器最好用于特定的研究场景。通常,在更为“真实”的环境下测试或实现算法时,基于样本的较慢方法在面对设备噪声等问题时鲁棒性更佳,因此是理想的微分器。诸如有限差分之类的较快方法非常适合面向解析计算且需要更高吞吐量的场景,但尚未考虑算法在实际设备上是否可行。
3. 多个可观测对象
我们来引入一个额外的可观测对象,借此了解 TensorFlow Quantum 对单个电路的多个可观测对象的支持情况。
如果此可观测对象同样用于之前的电路,则 且 。快速检查:
结果匹配(足够接近)。
现在,如果定义 ,则 。在 TensorFlow Quantum 中为电路定义多个可观测对象,相当于向 添加更多项。
这意味着,电路中特定符号的梯度等于该符号应用于该电路的每个可观测对象的相应梯度之和。这与 TensorFlow 梯度计算和反向传播(将所有可观测对象的梯度总和作为特定符号的梯度)相兼容。
在这里可以看到,第一个条目是相对于 Pauli X 的期望,第二个条目是相对于 Pauli Z 的期望。现在,梯度计算方法如下:
现在,您已验证每个可观测对象的梯度之和即为 的梯度。所有 TensorFlow Quantum 微分器均支持此行为,且此行为在与其余 TensorFlow 的兼容性方面起着至关重要的作用。
4. 高级用法
TensorFlow Quantum 子类 tfq.differentiators.Differentiator
中存在的所有微分器。要实现微分器,用户必须实现两个接口之一。标准是实现 get_gradient_circuits
,它告诉基类要测量哪些电路以获得梯度估计值。或者,也可以重载 differentiate_analytic
和differentiate_sampled
;类 tfq.differentiators.Adjoint
就采用这种方式。
下面使用 TensorFlow Quantum 实现一个电路的梯度。您将使用一个参数转移的小示例。
回想上文定义的电路,。和之前一样,可以定义一个函数作为该电路对 可观测对象的期望值,。对于该电路使用参数转移规则,您可以发现导数是 。get_gradient_circuits
函数返回该导数的分量。
Differentiator
基类使用从 get_gradient_circuits
返回的分量来计算导数,如上面的参数转移公式所示。现在,这个新的微分器可以与现有 tfq.layer
对象一起使用:
现在,可以使用这个新的微分器来生成可微运算。
要点:如果微分器之前已附加到一个运算,那么在附加到新的运算之前,必须先进行刷新,因为一个微分器一次只能附加到一个运算。
成功:现在,您可以使用 TensorFlow Quantum 提供的所有微分器,以及定义自己的微分器了。