本页章节
OUTPUT PROJECTION / EXACT CROSS ENTROPY
分块交叉熵:从输出投影开始省保存量
词表分数来自 hidden 与输出权重的乘积。前向扫描词表块得到全局归一化和目标分数,反向重算局部概率,把每个块的贡献传回 hidden、权重和 bias。
把完整投影与 CE 看作同一个计算
完整路径先生成 N×V 的 logits,再计算交叉熵。本页把位置分成 T 行、词表分成 B 列,每次只生成一个 T×B 的分数块。分块改变中间值的生命周期;每个有效位置的分母仍覆盖整个词表。
生成当前分数块
读取当前 H 行与 W 行,计算 HₜWᵦᵀ,可选加 bias。
累计全局统计
更新逐行最大值与指数和;目标所属块到达时捕获目标分数。
重算局部概率
用保存的全词表归一化统计重建 p;对目标类别减 1。
归还三类梯度
dH 跨词表块累加;dW 与 db 跨位置块累加。
C=0 时平均 loss 未定义。程序返回可微零哨兵与零梯度,调用者应跳过 optimizer 更新;有 weight decay 或动量时,零梯度本身不能保证参数不变。
每个词表块怎样加入同一个分母?
每行维护 m=已访问分数的最大值、s=相对 m 的指数和。初值 m=−∞、s=0;新的更大分数出现时,先缩放已有和。目标 logit 从包含 yᵢ 的块中读取一次,不能把块内目标 ID 当作全局 ID。
为什么这个在线统计与完整 LSE 相同?
Python 保存 m 和 log s 两个 N 向量,反向使用 exp((Z−m)−log s)。这种表示与保存 LSE 等价,但避免先把很大的 m 与较小的 log s 相加再相减。目标 logit 只参与前向 loss,不需要保存给反向。
沿前向与反向块检查一次完整计算
固定 H / W,改变块、监督和上游梯度
教学实际计算 · binary64 · 无梯度过滤事件
顶部误差使用所有块完成后的结果;事件表使用当前事件。网格与保存的事件快照仅供教学展示,不计入独立 Python 的逻辑保存量或 hooks 测量。T≥N 且 B≥V 时允许一个完整大小的块,此选项用于边界对照。
当前块:前向分数 / 反向概率
| 位置 | 前向 scores / 反向 p | running m / dZ | running s | 目标捕获 / 本块 dH |
|---|
所有位置的最终归一化与概率质量
| 位置 | H | label / mask | 最终 LSE | 目标 logit | 逐位置 CE | 重建 Σp |
|---|
逐元素梯度:当前累加、最终分块与 dense
| 求导变量 | 当前事件后 | 最终分块 | dense 参考 |
|---|
完整固定输入与监督配置
重建概率后,三类梯度分别累加在哪里?
局部归一化故障
每个词表块单独 softmax,会让每个块的概率质量都等于 1。全词表 Σp 变为块数量,dH/dW/db 均被改变。正确前向 loss 可以与错误反向同时出现。
dH 被覆盖故障
不同词表块都向同一 H 行送回梯度,必须用加法。如果每次写入本块结果,最终只剩最后一个词表块。这个故障保留 dW/db,有助于定位反向累加位置。
Python 的自定义 autograd Function 在前向和反向都显式使用 no_grad。前向只保存 H、W、可选 bias、有效标签与 m/log s;反向把 score 块原地改成概率再改成 dZ,完成当前块后释放。框架不会为每个 tile 建立隐含的反向图。本实现只支持声明的标量平均目标的一阶梯度。
本页把 H 与 W 当作独立求导变量,没有接入输入查表的权重绑定。若同一参数同时用于 embedding lookup 与输出投影,最终参数梯度需要把两条路径精确相加;这里只核验输出路径的 dW,不能把它标成共享权重的完整梯度。
保存引用、逻辑中间量和实际时间怎样一起看?
8,192 个预测位置与 131,072 个词表项,单份 FP16 logits 的逻辑大小是 8,192×131,072×2 B=2,147,483,648 B=2 GiB。这是一个张量的算术账本;dtype 转换、输入、参数、梯度和其他层仍需单独计入。
| 口径 | 怎样获得 | 解释范围 |
|---|---|---|
| 逻辑元素 | 从形状计算 score 块、两个 N 统计向量、H/W/b 与梯度缓冲区;块容量至多 min(T,N)×min(B,V)。 | 各类别分别列出。临时行向量和 GEMM 结果也存在,不能把单块容量直接称为总峰值。 |
| 保存张量引用 | 单独一次 saved_tensors_hooks 运行,按仍被反向图引用的唯一底层 storage 计字节,视图别名只计一次。 | 包括保存的输入与参数。没有被保存的 tile、梯度缓冲区及其他分配不在此数中;这不是 allocator 峰值、reserved 内存或 RSS。 |
| CPU 实际时间 | 同一固定输入,3 次预热后 12 次前向+反向。计时区内不启用 hooks、profiler 或 dispatch 审计。 | 包含参数有限性检查、清空 .grad 与 Python 循环。CPU 实现与 GPU kernel 的并行、SRAM、内存带宽不同。 |
分块后仍保留 H/W/b 与 dH/dW/db;主要减少需要留到反向的 N×V 中间量。反向重算每个输出分数,增加投影工作;小块也增加循环与矩阵调用开销。下面的图只画已保存运行里的测量,不把块大小公式换算成预测毫秒。
读取独立 PyTorch 实验的误差与测量
Node 导出固定 H/W/b、标签和教学结果;独立 Python 使用完整 PyTorch autograd 与自定义 Function 对照。检查覆盖所有位置/词表尾块、mask 与忽略标签、零有效位置、共同大幅分数平移、目标出现在任意词表块,以及正数、负数和零上游梯度。H/W/b 另用完整目标的中央有限差分核验。
node --test scripts/test-chunked-ce.mjs
.venv-framework/bin/python scripts/test-chunked-ce.py
node scripts/run-output-lab.mjs --out-dir artifacts/output-lab-my-run
每次实验创建新目录并拒绝覆盖已有记录。需要等待其他重计算任务时,可先加 --correctness-only;协调后用 --timing-only、--correctness-report 与 --reference 在另一个新目录采样,源代码和 fixture 哈希必须与已通过的正确性报告一致。具体命令与已保存记录见本专题实施说明。
默认快照尚未生成;请选择本机成功报告。文件只在本页读取。
| 方案 | N×V×D | T×B | 中位 ms | min…max ms | 保存引用峰值 B | 单块 score 元素 |
|---|
原始耗时样本、分项账本与逐变量误差
这些数值是报告声明环境中的 CPU 算术实验,不包含语言模型训练质量、GPU 性能或分配器内存峰值。dense 的参考误差 0 表示它本身是比较基准。
与 Apple CCE 的机制联系与精确范围
Apple 的 Cut Your Losses in Large-Vocabulary Language Models 把目标分数与在线 linear-log-sum-exp 分开计算,并在反向重建局部概率。作者 GPU 实现把小块计算放在 on-chip SRAM;本页 CPU 循环在普通内存里生成 tile,复现的是目标、梯度与生命周期,不复现作者 kernel 的硬件执行或速度。
作者 README 区分 cce_kahan_full_c 与 cce_kahan_full_c_full_e (cce_exact):前者取消 classifier 梯度过滤,后者进一步取消 embedding 梯度过滤。阈值过滤跳过小概率块的梯度贡献,是相对完整实数梯度的近似;论文在指定精度与训练配置下评估它。本页先保留全部贡献,浮点舍入仍由 dense/有限差分对照衡量。
2026-10-28 已直接读取原作者仓库 README 的动机、接口、可选 bias 和实现表;读取 Apple 研究页的作者/ICLR 2025 元数据与摘要;读取 arXiv:2411.09009v2(2025-03-10)第 3、4.1–4.3、5.2 节及附录 B/E。原文版本与链接随独立报告记录;本轮数值核验依据新保存的固定输入、源码与计算报告,未补造历史原文抓取快照。作者性能数字保留为论文特定结果,不作为本站实测;本实验未安装 CCE 包或下载模型。
适用范围与一手资料
小型 CPU hidden/输出权重/bias 目标的一阶梯度,按位置和词表分块累计稳定 LSE,保留全部梯度贡献。完整投影加 CE 的独立 autograd 为参考;逻辑元素、保存 storage 引用与独立 CPU 时间分别计量,教学事件快照不计入 Python 保存量。不包含 tied lookup、过滤近似、GPU 性能或语言模型质量。
公式与机制的原始依据 · 4 项
- Apple · Cut Cross-Entropy author README保存的作者 README 于 2026-10-28 读取:动机、接口、bias 与实现表;cce_exact 取消 classifier/embedding 两侧过滤,cce_kahan_full_c 只取消 classifier 过滤;教学 CPU 实现独立核验
- PyTorch 2.9 · Autograd mechanics本项目框架对照固定 PyTorch 2.9.0;冻结、计算图与 no-grad 的语义,2026-10-27 核对
- PyTorch 2.9 · ProfilerCPU activity、形状、内存事件和 trace 导出;2026-10-28 核对
- Megatron Core · VocabParallelCrossEntropy局部 logits、全局最大值和指数和、目标 token 与梯度