← 返回书架人工智能 · 交互式 Wiki
模型工程/激活重算与梯度缓存资料与边界
训练系统与性能进阶计算演示

EXACT MECHANICS / ACTIVATION LIFETIME

激活重算:哪些值保存,哪些值重新生成

反向需要前向中的部分值。保存它们会占用内存,丢弃后重新前向会增加计算。沿一条六层链追踪创建、保留、重算和释放,再核对最终梯度。

01 / BACKWARD NEEDS

反向为什么还要用前向结果?

hi=tanh⁡(wihi−1),L=12h62,Gwi=Ghi(1−hi2)hi−1,Ghi−1=Ghi(1−hi2)wi.\begin{aligned}h_i&=\tanh(w_i h_{i-1}),\quad L=\tfrac12h_6^2,\\G_{w_i}&=G_{h_i}(1-h_i^2)h_{i-1},\\G_{h_{i-1}}&=G_{h_i}(1-h_i^2)w_i.\end{aligned}
这个标量层的反向需要 hi、hi−1 和 wi。权重一直保留;激活可以从前向保存,也可以在反向到达时重算。

保存全部激活时,反向从最后一层往前,用过的中间值即可释放。分段重算保存边界,先从边界重新执行该段前向,得到内部值,再反传和释放该段。真实自动微分框架保存哪些值取决于算子实现。

02 / LIFETIME LEDGER

每个时刻,哪些激活仍然存活?

六层 tanh 链的逻辑激活账本

不含权重、梯度、临时 workspace 和框架开销

h0=0.8,w=[0.9,1.1,0.8,1.2,0.7,1.05]。本例重算模式会完整重跑每一段;实际框架可能提前停止不需要的重算。

事件进度
目前峰值(激活个数)
已执行前向层数

Loss:;与全部保存的梯度最大差:

事件阶段存活激活数量已执行前向层数

账本统计唯一逻辑激活 ID。重算边界与已有相同边界值合并记一个 ID;未计额外物理副本。数值计算和逻辑内存记录分开,不是浏览器或 GPU 实际内存测量。

03 / EQUIVALENCE

什么时候重算能得到同一条反向路径?

输入与参数一致

重算必须使用对应前向时的输入和权重。若参数、全局状态或分支条件在中间改变,重新得到的激活可能属于另一计算图。

随机操作一致

dropout 等操作需保持随机状态约定。框架可以保存并恢复 RNG,但设备迁移、外部随机源和关闭状态保留都需单独检查。

副作用不能无意重复

函数中的计数、缓存写入、统计更新或外部操作可能在重算时再次发生。适合 checkpoint 的区域应有可验证的重执行语义。

比较输出、梯度和更新

固定同一输入与状态,对照前向 loss、每个参数梯度和一次优化器更新。数值容差依精度、实现和规约顺序确定。

分段更细会保留更多边界,分段更粗会在重算时同时保留更多内部值,峰值不必随段长单调变化。实际内存优化还要看张量大小、存活区间、工作空间和通信缓冲;省下激活后,能否扩大 microbatch 以及端到端是否变快,需要测量。

04 / GRADIENT CACHE

放不下全局负例池,怎样分块回传同一个目标?

四个 query 和四个 document 经过同一个小编码器:三维输入 → 四维 tanh → dropout → 二维表示。全局损失使用 4×4 点积候选矩阵,正例在对角线,温度为 1。先无图编码并保存表示,再对表示计算全局梯度,最后重算各块编码器。

hi=fθ(xi),gi=∂L∂hi,∇θL=∑i(∂fθ(xi)∂θ)⊤gi.\begin{aligned} h_i&=f_\theta(x_i),\qquad g_i=\frac{\partial\mathcal L}{\partial h_i},\\ \nabla_\theta\mathcal L&=\sum_i\left(\frac{\partial f_\theta(x_i)}{\partial\theta}\right)^\top g_i. \end{aligned}
第二阶段缓存 gᵢ;第三阶段把 gᵢ 作为固定上游向量,对重算的 fθ(xᵢ) 做向量-雅可比积。参数、输入、分块和随机轨迹必须与第一阶段一致;全部贡献累加完才更新一次。

编码 → 全局表示梯度 → 重算参数梯度

固定小网络 · 确定的伪随机算法
事件进度
全局 loss
最终参数梯度最大差

事件阶段样本编码前 RNG 状态

当前参数梯度与保留计算图的参考
矩阵行当前累计梯度参考梯度
输入、权重和随机数约定
query = [[.2,.5,-.1],[.6,-.3,.4],[-.2,.8,.7],[.3,.1,-.5]]
document = [[.1,.7,-.2],[.3,-.1,.6],[-.3,.5,.9],[.7,.1,-.4]]
W1 = [[.3,-.2,.5,.1],[-.4,.6,.2,-.3],[.1,.3,-.5,.4]]
W2 = [[.5,-.2],[.1,.6],[-.4,.3],[.2,.5]]
seed = 31
state = (1664525 * state + 1013904223) modulo 2^32
u = state / 2^32

按 query 块、document 块的顺序生成随机数,每块按行读取。u≥dropout 时乘 1/(1−dropout),否则置零;dropout=0 时不消耗随机数。页面手工算法与框架默认 RNG 不同;独立验证另外运行真实 PyTorch dropout。

05 / REPLAY CONTRACT

全局目标保留了,哪些状态仍需固定?

比较同一前向轨迹

参考采用相同分块、样本顺序与随机状态,但保留第一遍计算图。不能直接拿不同 batch 形状下的随机 mask 要求逐值一致。关闭随机性后再检查跨块大小的等价关系。

重算不推进训练状态

第一遍编码结束的全局 RNG 应在重算后恢复,防止改变下一步。若模块更新 BatchNorm 统计、缓存或外部状态,还需处理重复副作用;本例没有这些模块。

全局候选矩阵仍有成本

表示和表示梯度随样本数线性增长,直接物化的 query–document 分数矩阵随两侧样本数相乘增长。减少编码器计算图不等于消除全局损失的内存。

隐藏量账本只计声明对象

本例对每行计 tanh 输出、dropout mask 和乘后隐藏值三份四维张量。输入、权重、反向临时量、物理副本以及界面保存的对照快照另计;真实框架保存量见实测。

适用范围与一手资料

六层链使用逻辑激活账本。梯度缓存另用 4 对样本、3→4→2 编码器、tanh 与明确伪随机 dropout;与相同分块轨迹的保留图参考比较。Python 另验真实 dropout。隐藏量计数不包含全部物理分配。

公式与机制的原始依据 · 4 项
知识目录
搜索知识库