跳转至

设计一个可复现的小实验

运用噪声与精度中的知识,回答一个具体问题:旋转角怎样影响测到 1 的概率?运行前选定三个角度,保持线路结构与采样预算相同,每个角度使用四组不同种子运行。

每个参数点都保存参数值和全部重复结果。只挑一次最好看的输出,不能代表整个实验。

"""Repeat a small parameter scan and keep each seed and observed frequency."""

from __future__ import annotations

import json
from math import sin, sqrt
from statistics import mean, stdev

import cascaqit
from cascaqit import Circuit


def experiment() -> dict[str, object]:
    shots, repeats = 256, 4
    rows = []
    for index, theta in enumerate((0.4, 0.8, 1.2)):
        seeds = [101 + 10 * index + repeat for repeat in range(repeats)]
        frequencies = []
        for seed in seeds:
            result = Circuit(1).ry(theta, 0).measure_all().run(shots=shots, seed=seed)
            frequencies.append(result.counts.get("1", 0) / shots)
        rows.append(
            {
                "theta_rad": theta,
                "seeds": seeds,
                "frequencies": frequencies,
                "mean_frequency": mean(frequencies),
                "standard_error_across_repeats": stdev(frequencies) / sqrt(repeats),
                "ideal_probability": sin(theta / 2) ** 2,
            }
        )
    return {
        "sdk_version": cascaqit.__version__,
        "shots_per_run": shots,
        "repeats": repeats,
        "total_shots": len(rows) * shots * repeats,
        "points": rows,
    }


if __name__ == "__main__":
    print(json.dumps(experiment(), sort_keys=True))

下载完整脚本

python examples/learning/foundations/experimental_design.py
{
  "points": [
    {
      "frequencies": [
        0.0390625,
        0.04296875,
        0.0390625,
        0.02734375
      ],
      "ideal_probability": 0.039469502998557456,
      "mean_frequency": 0.037109375,
      "seeds": [
        101,
        102,
        103,
        104
      ],
      "standard_error_across_repeats": 0.0033829117335329633,
      "theta_rad": 0.4
    },
    {
      "frequencies": [
        0.16015625,
        0.15625,
        0.16796875,
        0.1875
      ],
      "ideal_probability": 0.1516466453264173,
      "mean_frequency": 0.16796875,
      "seeds": [
        111,
        112,
        113,
        114
      ],
      "standard_error_across_repeats": 0.006951222820332885,
      "theta_rad": 0.8
    },
    {
      "frequencies": [
        0.32421875,
        0.33203125,
        0.28515625,
        0.30078125
      ],
      "ideal_probability": 0.31882112276166324,
      "mean_frequency": 0.310546875,
      "seeds": [
        121,
        122,
        123,
        124
      ],
      "standard_error_across_repeats": 0.010756973725168168,
      "theta_rad": 1.2
    }
  ],
  "repeats": 4,
  "sdk_version": "1.0.8a",
  "shots_per_run": 256,
  "total_shots": 3072
}

平均频率估计的是 sin²(θ/2)。脚本把四次频率的样本标准差除以 sqrt(4),估计均值的标准误。只有四次重复时,不确定度估计本身也会波动;打印的数值不是自动得到的 95% 置信区间。全部采样成本仍要计算:三个参数点 × 四次运行 × 256 shots = 3,072 shots。

这里的理想概率是简单线路的独立解析对照,不是实验测量值。解释差异时,也要说明基准及其假设。

先确定怎样公平比较

尝试另一种方法前,决定固定什么预算:shots、总目标求值次数、运行时间,还是其他资源。这些标准不等价。相同迭代次数不一定意味着相同后端成本,尤其是梯度算法或重复采样算法。

练习:增加 θ = 1.6,并使用一组新 seed。需要额外多少次采样?如果只运行一次就看到某个角度“更好”,在认为差异可靠之前,还应该报告什么?

答案

四次新运行需要 1,024 shots。报告原始运行、均值、不确定度、比较预算,以及“更好”的具体含义。重复预先确定的比较,不要只等到出现有利结果就停止。以后若使用配对随机输入,应按配对数据分析差值,不能当成相互独立的两组运行。

保存自己的实验记录,再选择 Digital、Analog 或优化路线。

相关概念:可复现性。

English

SDK 1.0.8a · `8b227bff`