← 返回书架人工智能 · 交互式 Wiki
模型工程/分块输出投影与交叉熵资料与边界
训练系统与性能进阶实测报告

OUTPUT PROJECTION / EXACT CROSS ENTROPY

分块交叉熵:从输出投影开始省保存量

词表分数来自 hidden 与输出权重的乘积。前向扫描词表块得到全局归一化和目标分数,反向重算局部概率,把每个块的贡献传回 hidden、权重和 bias。

01 / SAME OBJECTIVE

把完整投影与 CE 看作同一个计算

完整路径先生成 N×V 的 logits,再计算交叉熵。本页把位置分成 T 行、词表分成 B 列,每次只生成一个 T×B 的分数块。分块改变中间值的生命周期;每个有效位置的分母仍覆盖整个词表。

Zij=HiWjT+bj,ai=1[maski] 1[yi≠ignore],C=∑iai,L=1C∑i:ai=1(log⁡∑j=0V−1eZij−Zi,yi),C>0.\begin{aligned}Z_{ij}&=H_iW_j^{\mathsf T}+b_j,\\a_i&=\mathbf{1}[\mathrm{mask}_i]\,\mathbf{1}[y_i\ne\mathrm{ignore}],\quad C=\sum_i a_i,\\L&=\frac{1}{C}\sum_{i:a_i=1}\left(\log\sum_{j=0}^{V-1}e^{Z_{ij}}-Z_{i,y_i}\right),\quad C>0.\end{aligned}
H∈ℝᴺˣᴰ,W∈ℝⱽˣᴰ,b∈ℝⱽ;没有 bias 时 b=0。mask=True 表示参与监督,ignore 默认 −100。类别权重和 label smoothing 不在本页目标内。
FORWARD / PROJECT

生成当前分数块

读取当前 H 行与 W 行,计算 HₜWᵦᵀ,可选加 bias。

REDUCE / CAPTURE

累计全局统计

更新逐行最大值与指数和;目标所属块到达时捕获目标分数。

BACKWARD / REPLAY

重算局部概率

用保存的全词表归一化统计重建 p;对目标类别减 1。

ACCUMULATE / RETURN

归还三类梯度

dH 跨词表块累加;dW 与 db 跨位置块累加。

C=0 时平均 loss 未定义。程序返回可微零哨兵与零梯度,调用者应跳过 optimizer 更新;有 weight decay 或动量时,零梯度本身不能保证参数不变。

02 / RUNNING LSE

每个词表块怎样加入同一个分母?

每行维护 m=已访问分数的最大值、s=相对 m 的指数和。初值 m=−∞、s=0;新的更大分数出现时,先缩放已有和。目标 logit 从包含 yᵢ 的块中读取一次,不能把块内目标 ID 当作全局 ID。

mi′=max⁡ ⁣(mi,max⁡j∈BZij),si′=emi−mi′si+∑j∈BeZij−mi′,ℓi=(mi−Zi,yi)+log⁡si.\begin{aligned}m'_i&=\max\!\left(m_i,\max_{j\in\mathcal B}Z_{ij}\right),\\s'_i&=e^{m_i-m'_i}s_i+\sum_{j\in\mathcal B}e^{Z_{ij}-m'_i},\\\ell_i&=(m_i-Z_{i,y_i})+\log s_i.\end{aligned}
首块把已有和的缩放因子定义为 0。最后 LSE=m+log s;loss 用 (m−target)+log s 计算,减少大幅共同平移时的相消。
为什么这个在线统计与完整 LSE 相同?
si=∑j∈AeZij−mi,emi−mi′si=∑j∈AeZij−mi′,emi′si′=∑j∈A∪BeZij.\begin{aligned}s_i&=\sum_{j\in\mathcal A}e^{Z_{ij}-m_i},\\e^{m_i-m'_i}s_i&=\sum_{j\in\mathcal A}e^{Z_{ij}-m'_i},\\e^{m'_i}s'_i&=\sum_{j\in\mathcal A\cup\mathcal B}e^{Z_{ij}}.\end{aligned}
𝒜 是此前访问的类别,ℬ 是当前不重叠词表块。实数运算下恒等;浮点下分块顺序会产生舍入差,不能承诺逐位相同。

Python 保存 m 和 log s 两个 N 向量,反向使用 exp((Z−m)−log s)。这种表示与保存 LSE 等价,但避免先把很大的 m 与较小的 log s 相加再相减。目标 logit 只参与前向 loss,不需要保存给反向。

03 / FOLLOW A TILE

沿前向与反向块检查一次完整计算

固定 H / W,改变块、监督和上游梯度

教学实际计算 · binary64 · 无梯度过滤
完整计算 loss:分块 / dense
有效监督位置
loss 绝对误差
dH 最大绝对误差
dW 最大绝对误差
db 最大绝对误差

事件

顶部误差使用所有块完成后的结果;事件表使用当前事件。网格与保存的事件快照仅供教学展示,不计入独立 Python 的逻辑保存量或 hooks 测量。T≥N 且 B≥V 时允许一个完整大小的块,此选项用于边界对照。

当前块:前向分数 / 反向概率

位置前向 scores / 反向 prunning m / dZrunning s目标捕获 / 本块 dH

所有位置的最终归一化与概率质量

位置Hlabel / mask最终 LSE目标 logit逐位置 CE重建 Σp
逐元素梯度:当前累加、最终分块与 dense
求导变量当前事件后最终分块dense 参考

完整固定输入与监督配置
04 / RECONSTRUCT AND SUM

重建概率后,三类梯度分别累加在哪里?

pij=exp⁡ ⁣((Zij−mi)−log⁡si),Gij=λaiC(pij−1[j=yi]),dHT+=GT,BWB,dWB+=GT,BTHT,dbB+=∑i∈TGi,B.\begin{aligned}p_{ij}&=\exp\!\left((Z_{ij}-m_i)-\log s_i\right),\\G_{ij}&=\frac{\lambda a_i}{C}\left(p_{ij}-\mathbf{1}[j=y_i]\right),\\dH_{\mathcal T}&\mathrel{+}=G_{\mathcal T,\mathcal B}W_{\mathcal B},\\dW_{\mathcal B}&\mathrel{+}=G_{\mathcal T,\mathcal B}^{\mathsf T}H_{\mathcal T},\qquad db_{\mathcal B}\mathrel{+}=\sum_{i\in\mathcal T}G_{i,\mathcal B}.\end{aligned}
λ=∂J/∂L 是后续标量目标传入的上游梯度;L 的数值不随 λ 改变。块中不包含 yᵢ 时仍要保留所有 pᵢⱼ 的梯度贡献。

局部归一化故障

每个词表块单独 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,不能把它标成共享权重的完整梯度。

05 / THREE DIFFERENT ACCOUNTS

保存引用、逻辑中间量和实际时间怎样一起看?

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 中间量。反向重算每个输出分数,增加投影工作;小块也增加循环与矩阵调用开销。下面的图只画已保存运行里的测量,不把块大小公式换算成预测毫秒。

06 / INDEPENDENT CPU EVIDENCE

读取独立 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 哈希必须与已通过的正确性报告一致。具体命令与已保存记录见本专题实施说明。

默认快照尚未生成;请选择本机成功报告。文件只在本页读取。

07 / AUTHOR METHOD AND SCOPE

与 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 项
知识目录
搜索知识库