实验总结:双簇 Teacher-Student 协议下 C~N 曲线随 Teacher/Student 宽度的变化

← 返回主页

运行目录experiments/20260821_2032_width_ts_sweep(远程 cephfs); 脚本width_ts_sweep.py(run 目录内留有副本);日期:2026-08-21 至 2026-08-22。

1. 实验任务

在双簇(two-cluster)teacher-student 协议下,当 teacher 与 student 等宽(wt = ws = w)、深度均为 2 时,对 6 个宽度 w ∈ {4, 8, 16, 32, 64, 128}、4 个结构比例 fs ∈ {0.0, 0.3, 0.7, 1.0},扫描数据集大小 N,记录训练结束后学生记住的信息量 C 随 N 变化的曲线(C~N 曲线),并量化曲线拐点之后相邻点斜率的抖动(slope jitter)。

2. 实验设置(协议)

2.1 数据生成(双簇协议,与 20260819 twocluster 运行一致)

2.2 模型

2.3 训练

2.4 运行规模与执行

3. 代码实现(两阶段网格)

3.1 阶段一:探针(probe)

目的:为每个宽度定位 fs = 0(纯随机标签)曲线的容量拐点 N*0。对每个宽度,在 [max(16, w), 200·w] 内取 12 个对数等间隔的 N,只跑 fs = 0、seed = 1000(每宽度 12 runs,共 72 runs)。对得到的 C~N 曲线做连续两段线性拟合(见 4.2),拟合的拐点位置即 N*0。实测结果:

w48163264128
N*04713046693230189769
拟合 R²0.630.950.980.990.9990.999

3.2 阶段二:主扫描(main)

每个宽度的 N 网格围绕自己的 N*0 生成,共 10 个点(w = 4 时因下限 16 合并为 9 点),同一宽度内 4 个 fs 共享该网格:

wN 网格(实际取整后)
416, 24, 47, 70, 99, 136, 193, 273, 376
816, 32, 65, 130, 195, 273, 377, 533, 754, 1040
1658, 116, 233, 466, 699, 979, 1351, 1911, 2703, 3728
32116, 233, 466, 932, 1398, 1957, 2703, 3821, 5406, 7456
64377, 754, 1509, 3018, 4527, 6338, 8752, 12374, 17504, 24144
1281221, 2442, 4884, 9769, 14654, 20515, 28330, 40053, 56660, 78152

每个 (w, fs, N) 组合跑 3 个 seed,共 6 宽 × 4 fs × ~10 N × 3 seeds ≈ 708 runs(含探针 72)。

3.3 输出文件

4. 数据与量的定义

4.1 学习比特数 C(C~N 曲线的纵轴)

对每个 run,取训练结束(30000 epochs)时的全训练集交叉熵 Ltrain,定义每样本学习比特数与总量:

bits/sample = max(ln V − L_train, 0) / ln 2
C (bits)    = bits/sample × N

其中 ln V 是 V 类均匀标签的熵(交叉熵的随机水平)。Ltrain 越低说明学生对训练标签拟合得越死,C 越大。每条 C~N 曲线就是一个 (w, fs, seed) 下约 10 个 N 值对应的 C 值连成的折线。

4.2 连续两段线性拟合(虚线与拐点的来源)

对每条 C~N 曲线,在所有内部网格点上搜索候选拐点 x*,用设计矩阵 [1, N, max(N−x*, 0)] 做最小二乘,取残差最小的 x* 作为拐点 N*。输出参数:segment-1 斜率 s1、segment-2 斜率 s2、拐点位置、R²。图中的同色虚线画的是拟合的 segment-2 段(从 N* 到最大 N)。

4.3 斜率抖动(slope jitter)

对一条 C~N 曲线,取拐点 N* 之后的所有网格点,计算相邻两点之间的斜率 si = (Ci+1 − Ci) / (Ni+1 − Ni)(单位 bits/sample),jitter = 这些斜率的标准差。每条曲线用自己的拟合拐点;若拟合退化(拐点落在网格末尾、拐后不足 3 点,fs = 1 的曲线常如此),则退回使用同宽度 fs = 0 曲线的拐点作为阈值。jitter 图中每个数据点是 3 个 seed 的均值,error bar 为 3 个 seed 的标准差。

注意:各宽度网格的拐后点间隔 ΔN 随宽度同比放大(网格按 N*0 的倍数生成),大宽度下每个斜率是对更大 N 窗口的平均。

4.4 训练损失斜率抖动(train-loss slope jitter)

C 由 Ltrain 乘以 N 得到,逐点噪声随之被放大 N 倍。为去掉这一放大作用,对同一批 run 直接取训练结束时的 Ltrain 对 N 的折线,在拐点之后(阈值与 4.3 相同,含 fs = 0 回退)计算相邻点斜率 si = (Li+1 − Li) / (Ni+1 − Ni),取标准差,单位 nats/sample(Ltrain 为自然对数交叉熵)。

5. 图

5.1 C~N 曲线(每宽度一张,共 6 张)

w=4
Figure 1.C~N 曲线,w = 4
w=8
Figure 2.C~N 曲线,w = 8
w=16
Figure 3.C~N 曲线,w = 16
w=32
Figure 4.C~N 曲线,w = 32
w=64
Figure 5.C~N 曲线,w = 64
w=128
Figure 6.C~N 曲线,w = 128

5.2 斜率抖动图(2 张,同一数据的两种纵轴)

jitter linear
Figure 7.slope jitter vs width(纵轴线性)
jitter log-y
Figure 8.slope jitter vs width(纵轴对数)

5.3 训练损失斜率抖动图(2 张,同一数据的两种纵轴)

loss jitter linear
Figure 9.train-loss slope jitter vs width(纵轴线性)
loss jitter log-y
Figure 10.train-loss slope jitter vs width(纵轴对数)

6. 数值记录(seed = 1000,来自 summary.json 与探针拟合)