2. 参数化量子电路的结构拆解
在上一节中,我们已经把参数化量子电路(PQC)理解为“由门序列和参数共同定义的量子操作”。但真正进入参数绑定与批量运行之前,必须先回答一个更基础的问题:一个参数化电路里,哪些量是可以在训练中变化的,哪些量是写死的,哪些量根本不参与数值绑定,而是决定电路长什么样?如果这三类量混在一起,后续的绑定接口、批量张量形状和梯度计算都会变得混乱。本节就围绕这个拆解任务展开。
三类参数的本质区别
从工程视角看,一个参数化电路中的“参数”至少可以分成三层:
- 可训练参数(trainable parameters):通常记为 θ,出现在旋转门(如 RX、RY、RZ)或受控旋转门的角度位置上,是优化器真正更新的对象。它们数量固定、顺序固定,构成一个参数向量。
- 固定参数(fixed parameters):同样是角度或相位,但在当前任务中被写死,例如数据编码电路中已经由输入特征决定的编码角,或某些人为设定的偏置角。它们不参与梯度更新,但在绑定阶段仍需提供具体数值。
- 结构参数(structural parameters):不进入门的角度位置,而是决定电路的“骨架”,例如层数 L、每层包含哪些门、纠缠边的连接方式、是否插入屏障、测量哪些比特。它们通常在电路构建阶段就确定,绑定阶段不再改变。
这三类量的关键差别在于“是否进入数值绑定”和“是否参与梯度”。可训练参数两者都参与;固定参数进入绑定但不参与梯度;结构参数两者都不参与,只影响电路的拓扑与门的数量。很多初学者把“固定参数”和“结构参数”混为一谈,结果在批量运行时发现参数形状对不上,根源往往就在这里。
参数在门序列中的位置与作用
要真正识别参数,不能只看变量名,而要看它在门序列中的位置。以常见的变分电路为例,一个典型的层可以写成:
# 单层结构示意(示例,非实测结果)
# 对每个量子比特 q:
RY(theta[q]) # 可训练参数,位于旋转门角度位
RZ(phi[q]) # 可训练参数,位于旋转门角度位
# 相邻比特之间:
CX(q, q+1) # 无参数,结构决定
# 数据编码部分(示例):
RX(x[i]) # 固定参数,由输入特征决定
在这个例子里,theta 和 phi 是可训练参数,x[i] 是固定参数,而 CX 的连接关系和层的重复次数属于结构参数。可以看到,参数的位置决定了它的角色:出现在旋转门角度位、且被优化器引用的,是可训练参数;出现在角度位但由外部数据给定的,是固定参数;不出现在角度位、只影响门是否存在的,是结构参数。
这里有一个容易忽略的细节:同一个门在不同上下文中可能承担不同角色。例如 RY(x) 在数据编码层是固定参数,但在变分层就是可训练参数。因此识别参数不能脱离“这一层在电路中承担什么职责”来判断,而应结合电路的分段结构:编码段、变分段、测量段。
建立参数绑定的对象模型
识别完三类参数后,下一步是把它们组织成一个可操作的对象模型,供绑定和批量运行使用。一个实用的对象模型至少应包含以下字段:
| 字段 | 含义 | 示例 |
|---|---|---|
| 参数名 | 电路中的符号标识 | theta_0, phi_1 |
| 角色 | 可训练 / 固定 / 结构 | trainable |
| 所属门 | 参数所在的门与比特 | RY on q0 |
| 形状 | 标量或批量维度 | [batch, 1] |
| 绑定来源 | 优化器 / 输入数据 / 构建期常量 | optimizer |
这个模型的价值在于:绑定阶段只需遍历“角色为可训练或固定”的参数,结构参数在构建期已经固化,不进入绑定循环。批量运行时,可训练参数通常扩展为 [batch, n_params],固定参数则按输入特征逐样本给出,两者形状必须对齐到同一批次维度,否则会在绑定接口处报形状不匹配。
下面这张图把一个参数化电路拆解为“结构骨架 + 参数槽位”的关系视图,帮助看清三类参数分别落在哪里:
拆解时的常见判断与检查
在实际操作中,可以用三个问题快速判断一个参数属于哪一类:第一,它是否出现在旋转门的角度位置?如果不在,基本可归为结构参数。第二,它是否被优化器引用、需要计算梯度?如果是,就是可训练参数。第三,它的数值是否由外部输入逐样本给出?如果是,就是固定参数。三个问题按顺序回答,绝大多数参数都能被正确归类。
还有一个工程上的检查点值得强调:可训练参数的总数应与参数向量的长度严格一致。例如 4 个量子比特、3 层、每层每比特两个旋转门,则单层可训练参数为 8 个,三层共 24 个,参数向量形状应为 [24],批量运行时为 [batch, 24]。如果实际绑定接口收到的长度不是 24,就说明有参数被误判为固定参数,或结构层数被意外改变。这个数量核对是拆解是否正确的直接证据。