The cifar8 step tie at its UN-FUSED gradient nodes — the packed cifar8w_* arms #
Cifar8Tie.cifar8_train_step_tied_certified ties the fused-SGD cifar8_train_step.mlir, which no
trainer runs. The packed wide no-BN arms (cifar8w_{sgd,mom,adam}_train_step.mlir, from
cifar8AdamTrainStepText) emit the same forward and backward chain feeding *Grad ops to a
separate optimizer. This file states those nodes, each at the same chain cotangent: all 22
parameter tensors, via GradNode (Foundation/SgdNodes.lean). The optimizer update is outside the
statement.
Scope (as the fused tie) #
- Below the output layer the cotangents are the rendered chain.
cifar8_net_lossGrad(Cifar8ParamGrad) states each node as the loss gradient in its parameter, with each pool's cotangent routed to one maximal cell, as the renderedselect_and_scatterdoes; this chain'smaxPoolBackDenoteroutes it to the first maximal cell (maxPool2Argmax), the op's own choice, so it is the capstone's chain at that selection (CnnFold.cnnChainCotW2_eq_sel,CifarFold.cifarChainCotW2_eq_sel). - Conv backward rendered hand-written (cotangent SSA ↔ chain-cot per-op trust); per-op
prettylexing; ℝ → Float32.
Whole cifar8 train step at its gradient nodes. All 22 parameter tensors (8 conv W+b,
the dense head W₉,b₉,Wa,ba,Wb,bb), at the real cifar8 forward: each emitted *Grad node
denotes the certified per-layer Jacobian contracted with the rendered backward-chain cotangent,
driven by the composed softmax-CE cotangent g — the fused tie's chain, node for node.