模板

PennyLane 提供了一个不断增长的预编码模板库,包含常见变分电路架构,可以用来轻松构建、评估和训练更复杂的模型。在文献中,这些架构通常被称为 ansatz。模板可以用来 嵌入数据 到量子态中,定义可训练的 量子门,作为电路中的第一步操作 准备量子态,或简单地作为电路构建的一般 子程序

以下是PennyLane提供的内置模板的画廊。

嵌入模板

嵌入将输入特征编码为电路的量子态。 因此,它们通常将数据样本(例如特征向量)作为参数。嵌入也可以依赖于可训练参数,并且可以由重复的层构成。

层模板

层架构定义了可训练门的序列,这些序列像神经网络中的层一样重复。注意,任意模板或操作也可以使用layer()函数重复。

状态准备

状态准备模板将零状态 \(|0\dots 0 \rangle\) 转换为另一个初始状态。与可以在电路中任何地方使用的嵌入相比,状态准备通常作为第一个操作使用。

算术模板

量子算术模板允许进行就地和非就地的模运算,例如加法、乘法和指数运算。

量子化学模板

量子化学模板定义了在变分算法中使用的各种量子电路,例如 VQE,以执行量子化学模拟。

张量网络

张量网络模板创建量子电路架构,其中电路块可以以张量网络的形状和连接性进行广播。

交换网络

交换网络模板以线性成本进行量子比特路由,为执行量子比特之间的所有成对交互提供了平方优势。

参数初始化

通常带有权重参数张量的模板提供返回该张量形状的方法。形状可以例如在训练开始时用于构造随机权重。

import pennylane as qml
from pennylane.templates import BasicEntanglerLayers
from pennylane import numpy as np

n_wires = 3
dev = qml.device('default.qubit', wires=n_wires)

@qml.qnode(dev)
def circuit(weights):
    BasicEntanglerLayers(weights=weights, wires=range(n_wires))
    return qml.expval(qml.PauliZ(0))

shape = BasicEntanglerLayers.shape(n_layers=2, n_wires=n_wires)
np.random.seed(42)  # to make the result reproducible
weights = np.random.random(size=shape)
>>> circuit(weights)
tensor(0.72588592, requires_grad=True)

如果一个模板需要多个权重张量,shape 方法会返回一个形状元组的列表。

自定义模板

创建自定义模板可以简单到只需定义一个创建操作并且没有返回语句的函数:

from pennylane import numpy as np

def MyTemplate(a, b, wires):
    c = np.sin(a) + b
    qml.RX(c, wires=wires[0])

n_wires = 3
dev = qml.device('default.qubit', wires=n_wires)

@qml.qnode(dev)
def circuit(a, b):
    MyTemplate(a, b, wires=range(n_wires))
    return qml.expval(qml.PauliZ(0))
>>> circuit(2, 3)
-0.7195065654396784

注意

确保经典处理与您使用的自动微分库兼容。例如,如果 MyTemplate 要与 torch 框架一起使用,我们必须将 np.sin 更改为 torch.sin。PennyLane 的 math 库包含一些针对框架无关处理的高级功能。

根据驼峰命名的建议,PennyLane中的内置模板是类。类是一种比函数更复杂的数据结构,因为它们可以定义模板的属性和方法(例如梯度配方或矩阵表示)。请参阅贡献运算符页面,了解如何编写自己的模板类以及如何将其添加到PennyLane模板库中。

分层函数

layer 函数通过将一系列量子门重复应用于一组线缆来创建一个新的模板。您可以通过 qml.layerqml.templates.layer 导入此函数。

pennylane.layer(模板, 深度, *args, **kwargs)

重复应用一个单位操作指定的次数。