先看经典网络的流程:输入数据,模型前向传播,得到预测,计算损失,反向传播计算梯度,更新参数。下面分析每一步和经典网络有什么不同。
第一步输入数据
QNN 的量子电路不能直接接受经典数据,需要先编码成量子态。以 2 量子比特为例。输入经典数据X={x0,x1} ,经过编码得到一个 整体量子系统:∣ψ(x)⟩:展开:
∣ψ(x)⟩=a∣00⟩+b∣01⟩+c∣10⟩+d∣11⟩
这个状态很重要,量子相关的计算都是围绕这个状态的。解释一下这个式子。这个系统有 4 个计算基态,∣00⟩,∣01⟩,∣10⟩,∣11⟩。运行量子电路,如果我们选择测量所有比特,得到的结果都是 4 个计算基态的一种,也就是比特串 00 或 01 或 10 或 者 11。这也是和经典网络最不一样的地方,经典网络前向传播得到的是一个具体的值(向量)。计算基态前面的系数叫做振幅,一般是复数。振幅的模的平方就是测出这个基态的概率。概率总和为 1.
第二步前向传播的模型参数是什么
经典网络中模型参数是权重矩阵;QNN 的可训练参数是带参数的量子门。量子门作用在量子态∣ψ(x)⟩上会得到新的量子态∣ψ(x)′⟩,最终导致每个基态的概率发生改变,于是测量结果改变,模型输出发生改变。 这一步和经典网络调整矩阵参数改变输出是一样的。内部细节暂时先不关注。
第三步如何计算损失
得到预测值之后,代入损失函数计算损失这一步和经典网络一样,不同的是,QNN如何把一次前向传播得到的比特串转化为经典任务需要的输出。以一个二分类任务为例:经典网络中模型的输出是模型属于正样本的概率。
首先需要得到每个计算基态的概率:运行电路 1000 次统计每个基态的出现次数,频率代替概率。然后需要定义一个 readout 规则,这个规则就是建立比特串和经典预测值之间的联系。假如 P(00)= 0.2 ; P(01)=0.1;P(10)=0.4; P(11) = 0.3 我们设定的规则是第一个比特是 0 就属于类别 0,第一个比特是 1 就属于类别 1,于是我们得到了正样本的概率 y^=0.7。代入公式即可。
L=−ylog(y^)−(1−y)log(1−y^)
第四步如何计算梯度
真实量子硬件上不能像经典神经网络那样直接对中间量子态做反向传播(因为后者是物理量子态不能随便被读取,复制)。这里我们使用参数移位法则计算梯度。分子就是改变某个参数,重新运行电路得到的两个值之差。
∂θi∂y^=2y^(θi+2π)−y^(θi−2π)
在交叉熵损失函数中代入 y=1,损失函数:
L=−log(y^)
∂θi∂L=∂y^∂L∂θi∂y^
代入移位法则:
∂θi∂L=−y^1⋅2y^(θi+2π)−y^(θi−2π)
可以计算梯度。然后梯度下降算法更新参数。