Documentation

LeanMlir.Proofs.Nets.ConvNeXt.ConvNeXtStepTie

The full [3,3,9,3] ConvNeXt-T step tie — the whole net tied through the real forward #

The whole-net thread for the ConvNeXt-T schedule (the batched MobileNetV2 peer is MobileNetV2TieB.mnv2_net_tiedB). The folds (ConvNeXtFold and the MobileNetV2 / ResNet-34 / ViT folds it imports) make every rendered param op den = certified ∀ cotangent; this file feeds each consumer the forward activations of the convNextTrainStepText render and the loss-driven backward-chain cotangent that net delivers, so the 18-block train step is den-composed forward → loss → backward with no free activations and no symbolic cotangent. The statement is per example, at one image and a hard label; the artifact runs a batch of 32, and that batch and its mean lie outside this statement (the batched form is ConvNeXtStepTieGB.lean).

The net this is about #

verified_mlir/convnext_train_step.mlir, measured, not assumed:

conventionthis fileread from
depth / widths[3,3,9,3], 96 → 192 → 384 → 768ConvNeXtRender.cnxTiny
stem4×4/s4 patchify conv then channel-LNconvNextFwdChain
normalisationchanLNTensor3 (per-channel [c] affine, h·w statistics per example) at all 22 spatial sites: 1 stem + 18 block + 3 downsamplecnxLnFwdSite
headGAP → vector-LN at one row (rowLNVecFlat 1 768) → densecnxHeadLnFwdSite
activationGELU (smooth — no kink mask anywhere)cnxFwdBlock
layer scaleper-channel Vec c, broadcast by chanIdxlayerScaleChF
paddingsymmetric; ConvNeXt is a PyTorch-origin net and has no XLA-SAME site—
params182allParams, and the artifact's 184 func args (%x + 182 + %onehot)

The channel-LN specifics #

Coverage #

All 182 parameters are tied. 181 of them at the fused step θ − lr·(certified per-layer Jacobian · the chain cotangent), where each chain cotangent is the certified VJP backward of the stages above it (CnxTieGB.cnxBlockCotInChAt_eq_vjp, cnxDownCotInChAt_eq_vjp, cnxHeadDyXheadChN_eq_vjp); the stem weight psW at its gradient, because the render emits convStride4WeightGrad and wraps it in hand-written sgd text (there is no fused convStride4WeightSgd op to be the den of). What remains outside: the block backward is rendered hand-written, so the cotangent SSA ↔ chain-cot correspondence is the per-op trust the whole suite carries; plus per-op pretty lexing; LN 0 < ε smoothness; ℝ → Float32 — the boundary every prior fold carries.

ConvNeXt block — all 9 params tied (depthwise → channel-LN → expand → GELU → project → layer-scale → +skip) #

Forward: out = addV( layerScaleCh lg (conv₁ₓ₁ₚᵣ( gelu( conv₁ₓ₁ₑₓ( chanLN( dw₇ₓ₇(xin) ))))), xin ). Backward from the block-output cotangent dyOut (the residual addV is the outermost op and there is no post-add activation, so it passes dyOut straight to the layer-scale output): layer-scale-back (cnxCotP) → project-conv-back → GELU mask (cnxCotE) → expand-conv-back (cnxCotN) → the channel-LN input-VJP (chanLNTensor3Back) → depthwise-back. cnxCotP/cnxCotE/cnxCotN are LN-form-agnostic and are reused verbatim from ConvNeXtChainClose.

def Proofs.CnxTie.cnxBlockChTied (gf : GeluForm) {c cExp h w : ℕ} (xN wN bN gN epsStr lrStr cotN : String) (ε : ℝ) (Wdw : DepthwiseKernel c 7 7) (bdw ng nbt : Vec c) (Wex : Kernel4 cExp c 1 1) (bex : Vec cExp) (Wpr : Kernel4 c cExp 1 1) (bpr lg : Vec c) (xin d nl p : Vec (c * h * w)) (e g : Vec (cExp * h * w)) (dyOut : Vec (c * h * w)) (lr : ℝ) :

ConvNeXt block, tied. All 9 params (depthwise 7×7 W+b, channel-LN γ/β at Vec c, expand/project 1×1 conv W+b, per-channel layer-scale γ) denote θ − lr·(certified per-layer Jacobian · cot) at the real block forward activations and the chain cotangents driven by dyOut.

Equations
  • One or more equations did not get rendered due to their size.
Instances For
    theorem Proofs.CnxTie.cnx_block_ch_tied {gf : GeluForm} {c cExp h w : ℕ} (xN wN bN gN epsStr lrStr cotN : String) (ε : ℝ) (Wdw : DepthwiseKernel c 7 7) (bdw ng nbt : Vec c) (Wex : Kernel4 cExp c 1 1) (bex : Vec cExp) (Wpr : Kernel4 c cExp 1 1) (bpr lg : Vec c) (xin d nl p : Vec (c * h * w)) (e g : Vec (cExp * h * w)) (dyOut : Vec (c * h * w)) (lr : ℝ) :
    cnxBlockChTied gf xN wN bN gN epsStr lrStr cotN ε Wdw bdw ng nbt Wex bex Wpr bpr lg xin d nl p e g dyOut lr

    Downsample — channel-LN → 2×2/s2 conv (all 4 params tied) #

    Forward: o = convˢ²(chanLN(xin)) (LN over the block-input grid 2h×2w with a Vec ci affine, then a 2×2/s2 conv ci → co). No skip. Backward from dyOut: strided-conv-back (cotN') → channel-LN-back. The strided weight is no longer a gap: convStridedWeightSgd is emitted at 2×2 since sWGradGeom split the odd/even padding cases, and SgdNode.convStridedW_den is kernel-generic.

    def Proofs.CnxTie.cnxDownChTied {ci co h w : ℕ} (xN wN bN gN epsStr lrStr cotN : String) (ε : ℝ) (dng dnbt : Vec ci) (Wd : Kernel4 co ci 2 2) (bd : Vec co) (xin n : Vec (ci * (2 * h) * (2 * w))) (dyOut : Vec (co * h * w)) (lr : ℝ) :

    Downsample, tied. Channel-LN γ/β at the ci·(2h)·(2w) input grid, plus the strided conv's weight and bias, at the real forward + the chain cotangents.

    Equations
    • One or more equations did not get rendered due to their size.
    Instances For
      theorem Proofs.CnxTie.cnx_down_ch_tied {ci co h w : ℕ} (xN wN bN gN epsStr lrStr cotN : String) (ε : ℝ) (dng dnbt : Vec ci) (Wd : Kernel4 co ci 2 2) (bd : Vec co) (xin n : Vec (ci * (2 * h) * (2 * w))) (dyOut : Vec (co * h * w)) (lr : ℝ) :
      cnxDownChTied xN wN bN gN epsStr lrStr cotN ε dng dnbt Wd bd xin n dyOut lr

      Stem — 4×4/s4 patchify conv → channel-LN (all 4 params) #

      psng/psnbt tie at dyStem, the cotangent block 1 delivers at the stem-LN output; the conv's own two parameters then see cotPatch, the LN input-VJP of it. The bias grad is a pure cotangent reduce, so the render emits it as a stride-1 convBiasSgd at the OUTPUT resolution; the node carries an input it never reads (stated at zero), and the clause is at the real stride-4 stem on the image x through GradNodeB.pdiv_flatConvStride4_bias_eq_conv2d (any conv's bias Jacobian is the channel indicator). The weight is the convStride4WeightGrad op, and it ties at the gradient: its SGD wrap is hand-written text.

      def Proofs.CnxTie.cnxStemChTied {c h w : ℕ} (xN _wN bN gN epsStr lrStr cotN : String) (ε : ℝ) (Wst : Kernel4 c 3 4 4) (psb psng psnbt : Vec c) (x : Vec (3 * (2 * (2 * h)) * (2 * (2 * w)))) (patch dyStem : Vec (c * h * w)) (lr : ℝ) :

      Stem, tied. Channel-LN γ/β, the conv bias, and the conv weight's gradient.

      Equations
      • One or more equations did not get rendered due to their size.
      Instances For
        theorem Proofs.CnxTie.cnx_stem_ch_tied {c h w : ℕ} (xN wN bN gN epsStr lrStr cotN : String) (ε : ℝ) (Wst : Kernel4 c 3 4 4) (psb psng psnbt : Vec c) (x : Vec (3 * (2 * (2 * h)) * (2 * (2 * w)))) (patch dyStem : Vec (c * h * w)) (lr : ℝ) :
        cnxStemChTied xN wN bN gN epsStr lrStr cotN ε Wst psb psng psnbt x patch dyStem lr

        Head — GAP → vector-LN at one row → dense #

        After GAP the tensor is a single [768] row, so "normalise each spatial row over its channels" and "normalise the feature vector" are the same function at m = 1: the head is ViT's per-token LN with one token, and cnxHeadLnFwdSite is cnxLnFwdSite with the two transposes deleted. Stated at the LITERAL 768 — 1 * m does not reduce at a variable m (Nat.mul recurses on its second argument), which is the annotation trap the render carries in its own comment.

        def Proofs.CnxTie.cnxHeadChTied (gN xN bN bdN epsStr lrStr cotN dyN : String) (ε : ℝ) (hng hnbt : Vec 768) (Wfc : Mat 768 10) (bfc : Vec 10) (gap : Vec (1 * 768)) (hn : Vec 768) (g : Vec 10) (lr : ℝ) :

        Head LN + dense bias, tied. The head-LN γ/β (at the pooled row gap, cot = the dense-back cotHn) and the dense bias (cot = the loss g) at the real forward.

        Equations
        • One or more equations did not get rendered due to their size.
        Instances For
          theorem Proofs.CnxTie.cnx_head_ch_tied (gN xN bN bdN epsStr lrStr cotN dyN : String) (ε : ℝ) (hng hnbt : Vec 768) (Wfc : Mat 768 10) (bfc : Vec 10) (gap : Vec (1 * 768)) (hn : Vec 768) (g : Vec 10) (lr : ℝ) :
          cnxHeadChTied gN xN bN bdN epsStr lrStr cotN dyN ε hng hnbt Wfc bfc gap hn g lr
          theorem Proofs.CnxTie.cnxLossCot_den (nlogN ohN : String) (logits : Vec 10) (label : Fin 10) :
          StableHLO.den ((StableHLO.SHlo.operand nlogN logits).expe.softmaxDiv.sub (StableHLO.SHlo.operand ohN (oneHot 10 label))) = fun (j : Fin 10) => softmax 10 logits j - oneHot 10 label j

          The emitted loss-cotangent graph denotes the softmax-CE gradient at the logits.

          Forward aliases — thread block inputs through the real forward #

          noncomputable def Proofs.CnxTie.cnxStemFwdO {c h w : ℕ} (ε : ℝ) (Wst : Kernel4 c 3 4 4) (bst psng psnbt : Vec c) (x : Vec (3 * (2 * (2 * h)) * (2 * (2 * w)))) :
          Vec (c * h * w)

          The stem output: patchify conv then channel-LN.

          Equations
          Instances For
            noncomputable def Proofs.CnxTie.cnxBlockFwdChO (gf : GeluForm) {c cExp h w : ℕ} (ε : ℝ) (Wdw : DepthwiseKernel c 7 7) (bdw ng nbt : Vec c) (Wex : Kernel4 cExp c 1 1) (bex : Vec cExp) (Wpr : Kernel4 c cExp 1 1) (bpr lg : Vec c) (xin : Vec (c * h * w)) :
            Vec (c * h * w)
            Equations
            Instances For
              noncomputable def Proofs.CnxTie.cnxDownFwdChO {ci co h w : ℕ} (ε : ℝ) (dng dnbt : Vec ci) (Wd : Kernel4 co ci 2 2) (bd : Vec co) (xin : Vec (ci * (2 * h) * (2 * w))) :
              Vec (co * h * w)
              Equations
              Instances For

                Backward cot-in constructors — thread block dyOuts (the residual fan-in) #

                noncomputable def Proofs.CnxTie.cnxBlockCotInChAt (gf : GeluForm) {c cExp h w : ℕ} (ε : ℝ) (Wdw : DepthwiseKernel c 7 7) (bdw ng nbt : Vec c) (Wex : Kernel4 cExp c 1 1) (bex : Vec cExp) (Wpr : Kernel4 c cExp 1 1) (bpr lg : Vec c) (xin dyOut : Vec (c * h * w)) :
                Vec (c * h * w)

                ConvNeXt block input cotangent: depthwise-back(cotD) + dyOut (the identity-skip fan-in), with cotD through the channel-LN input-VJP.

                Equations
                • One or more equations did not get rendered due to their size.
                Instances For
                  noncomputable def Proofs.CnxTie.cnxDownCotInChAt {ci co h w : ℕ} (ε : ℝ) (dng dnbt : Vec ci) (Wd : Kernel4 co ci 2 2) (bd : Vec co) (xin : Vec (ci * (2 * h) * (2 * w))) (dyOut : Vec (co * h * w)) :
                  Vec (ci * (2 * h) * (2 * w))

                  Downsample input cotangent (at ci·(2h)·(2w)): the channel-LN input-VJP of the strided-conv-back. No skip.

                  Equations
                  • One or more equations did not get rendered due to their size.
                  Instances For
                    noncomputable def Proofs.CnxTie.cnxHeadDyXheadCh {h w : ℕ} (ε : ℝ) (hng hnbt : Vec 768) (Wfc : Mat 768 10) (bfc : Vec 10) (xhead : Vec (768 * h * w)) (g : Vec 10) :
                    Vec (768 * h * w)

                    The cotangent at the last block output xhead (= s3b2's dyOut): gap-back(headLN-back( dense-back(g))). The head LN's input-VJP is the render's rowScaleF γ then lnRowBack at γ = 1, which is rowLNVecFlatBack (rowLNBack_affine_eq).

                    Equations
                    • One or more equations did not get rendered due to their size.
                    Instances For

                      Input-only *TiedAt wrappers — compute internals from a block's input #

                      Note: only cnxStemChTiedAt is @[irreducible]: without it the capstone's refine ⟨cnx_stem_ch_tiedAt …, ?_, …⟩ times out in whnf, and moving it to its own goal does not help. Every other definition in this section and the two above is a plain def.

                      @[irreducible]
                      def Proofs.CnxTie.cnxStemChTiedAt {c h w : ℕ} (xN wN bN gN epsStr lrStr cotN : String) (ε : ℝ) (Wst : Kernel4 c 3 4 4) (psb psng psnbt : Vec c) (x : Vec (3 * (2 * (2 * h)) * (2 * (2 * w)))) (dyStem : Vec (c * h * w)) (lr : ℝ) :
                      Equations
                      • One or more equations did not get rendered due to their size.
                      Instances For
                        def Proofs.CnxTie.cnxHeadChTiedAt {h w : ℕ} (gN xN bN bdN epsStr lrStr cotN dyN : String) (ε : ℝ) (hng hnbt : Vec 768) (Wfc : Mat 768 10) (bfc : Vec 10) (xhead : Vec (768 * h * w)) (g : Vec 10) (lr : ℝ) :
                        Equations
                        • One or more equations did not get rendered due to their size.
                        Instances For

                          The ties' weight records #

                          The whole-net ties share ONE ε across the stem, every block, downsample and head LN, so these records carry no ε (unlike CnxBlockParamsCh, whose εn is per block). The dot-notation wrappers below are abbrevs over the constructors above: a statement over a record unfolds to exactly the unpacked one.

                          structure Proofs.CnxTie.CnxTieBlk (c cExp : ℕ) :

                          One ConvNeXt block's weights: depthwise 7×7, channel-LN affine, the two 1×1 convs, layer scale.

                          Instances For
                            structure Proofs.CnxTie.CnxTieDown (ci co : ℕ) :

                            One stage-boundary downsample's weights: channel-LN affine, then the 2×2/s2 conv.

                            Instances For

                              ConvNeXt-T as the ties bind it: patchify stem + its LN, the [3,3,9,3] blocks, three downsamples, head LN + dense.

                              Instances For
                                @[reducible, inline]
                                noncomputable abbrev Proofs.CnxTie.CnxTieBlk.fwdO {c cExp : ℕ} (p : CnxTieBlk c cExp) (gf : GeluForm) {h w : ℕ} (ε : ℝ) :
                                Vec (c * h * w) → Vec (c * h * w)

                                The block's forward (cnxBlockFwdChO).

                                Equations
                                Instances For
                                  @[reducible, inline]
                                  noncomputable abbrev Proofs.CnxTie.CnxTieBlk.cotIn {c cExp : ℕ} (p : CnxTieBlk c cExp) (gf : GeluForm) {h w : ℕ} (ε : ℝ) :
                                  Vec (c * h * w) → Vec (c * h * w) → Vec (c * h * w)

                                  The block's input cotangent (cnxBlockCotInChAt).

                                  Equations
                                  Instances For
                                    @[reducible, inline]
                                    abbrev Proofs.CnxTie.CnxTieBlk.TiedAt {c cExp : ℕ} (p : CnxTieBlk c cExp) (gf : GeluForm) {h w : ℕ} (xN wN bN gN epsStr lrStr cotN : String) (ε : ℝ) (xin dyOut : Vec (c * h * w)) (lr : ℝ) :

                                    The block's per-example tie (cnxBlockChTiedAt).

                                    Equations
                                    Instances For
                                      theorem Proofs.CnxTie.CnxTieBlk.tied_at {c cExp : ℕ} (p : CnxTieBlk c cExp) {gf : GeluForm} {h w : ℕ} (xN wN bN gN epsStr lrStr cotN : String) (ε : ℝ) (xin dyOut : Vec (c * h * w)) (lr : ℝ) :
                                      p.TiedAt gf xN wN bN gN epsStr lrStr cotN ε xin dyOut lr
                                      @[reducible, inline]
                                      noncomputable abbrev Proofs.CnxTie.CnxTieDown.fwdO {ci co : ℕ} (p : CnxTieDown ci co) {h w : ℕ} (ε : ℝ) :
                                      Vec (ci * (2 * h) * (2 * w)) → Vec (co * h * w)

                                      The downsample's forward (cnxDownFwdChO).

                                      Equations
                                      Instances For
                                        @[reducible, inline]
                                        noncomputable abbrev Proofs.CnxTie.CnxTieDown.cotIn {ci co : ℕ} (p : CnxTieDown ci co) {h w : ℕ} (ε : ℝ) :
                                        Vec (ci * (2 * h) * (2 * w)) → Vec (co * h * w) → Vec (ci * (2 * h) * (2 * w))

                                        The downsample's input cotangent (cnxDownCotInChAt).

                                        Equations
                                        Instances For
                                          @[reducible, inline]
                                          abbrev Proofs.CnxTie.CnxTieDown.TiedAt {ci co : ℕ} (p : CnxTieDown ci co) {h w : ℕ} (xN wN bN gN epsStr lrStr cotN : String) (ε : ℝ) (xin : Vec (ci * (2 * h) * (2 * w))) (dyOut : Vec (co * h * w)) (lr : ℝ) :

                                          The downsample's per-example tie (cnxDownChTiedAt).

                                          Equations
                                          Instances For
                                            theorem Proofs.CnxTie.CnxTieDown.tied_at {ci co : ℕ} (p : CnxTieDown ci co) {h w : ℕ} (xN wN bN gN epsStr lrStr cotN : String) (ε : ℝ) (xin : Vec (ci * (2 * h) * (2 * w))) (dyOut : Vec (co * h * w)) (lr : ℝ) :
                                            p.TiedAt xN wN bN gN epsStr lrStr cotN ε xin dyOut lr

                                            The same net as ConvNeXtFullT states it #

                                            The records above are the render's shape: one shared ε, the eighteen blocks by name. ConvNeXtFullT states ConvNeXt-T with an ε per record and Fin-indexed stages. These say the two describe one function: block by block (rfl), and whole-net at toCh ε.

                                            noncomputable def Proofs.CnxTie.CnxTieWeights.toCh {nC : ℕ} (w : CnxTieWeights nC) (ε : ℝ) :

                                            The FullT weights at the shared ε, which every LayerNorm (stem, blocks, downsamples, head) takes.

                                            Equations
                                            • One or more equations did not get rendered due to their size.
                                            Instances For
                                              theorem Proofs.CnxTie.CnxTieWeights.forward_eq_convNextForwardTCh {gf : GeluForm} {nC : ℕ} (w : CnxTieWeights nC) (ε : ℝ) (x : Vec (3 * 224 * 224)) :
                                              mnistLinear w.Wfc w.bfc (rowLNVecFlat 1 768 ε w.hG w.hT (globalAvgPoolFlat 768 7 7 (w.b18.fwdO gf ε (w.b17.fwdO gf ε (w.b16.fwdO gf ε (w.d2.fwdO ε (w.b15.fwdO gf ε (w.b14.fwdO gf ε (w.b13.fwdO gf ε (w.b12.fwdO gf ε (w.b11.fwdO gf ε (w.b10.fwdO gf ε (w.b9.fwdO gf ε (w.b8.fwdO gf ε (w.b7.fwdO gf ε (w.d1.fwdO ε (w.b6.fwdO gf ε (w.b5.fwdO gf ε (w.b4.fwdO gf ε (w.d0.fwdO ε (w.b3.fwdO gf ε (w.b2.fwdO gf ε (w.b1.fwdO gf ε (cnxStemFwdO ε w.sW w.sb w.sγ w.sβ x)))))))))))))))))))))))) = convNextForwardTCh gf (w.toCh ε) x

                                              The capstone's forward IS convNextForwardTCh. The chain cnx_net_tied_certified threads (stem, eighteen blocks, three downsamples, GAP → LN → dense) is the FullT forward at w.toCh ε, so convNextForwardTChHasVJP is a VJP of the function the ties are stated on.

                                              The whole-net capstone — all 182 params through the REAL forward + composed cotangent #

                                              The convNextTrainStepText forward threaded: block inputs are the forward prefixes (cnxStemFwdO / cnxBlockFwdChO / cnxDownFwdChO), and the backward cotangents are composed from the loss g = softmax(logits) − onehot down through dense (denseHasVJP) + the head LN + GAP (globalAvgPoolFlatHasVJP) + every block's backward, with the residual fan-in + dyOut at each of the eighteen identity-skip merges, the channel-LN-back at each of the three downsamples, and the stem LN's own back before the patchify conv's gradients. Each stem / block / down / head tie then holds at its real input + threaded cotangent. The whole [3,3,9,3] 182-parameter ConvNeXt-T train step is den-composed forward → loss → backward, no free activations, no symbolic cotangent.

                                              theorem Proofs.CnxTie.cnx_net_tied_certified {gf : GeluForm} (xN wN bN gN epsStr lrStr cotN dN nlogN ohN : String) (ε : ℝ) (w : CnxTieWeights 10) (x : Vec (3 * 224 * 224)) (label : Fin 10) (lr : ℝ) :
                                              have ib1 := cnxStemFwdO ε w.sW w.sb w.sγ w.sβ x; have ib2 := w.b1.fwdO gf ε ib1; have ib3 := w.b2.fwdO gf ε ib2; have ibD0 := w.b3.fwdO gf ε ib3; have ib4 := w.d0.fwdO ε ibD0; have ib5 := w.b4.fwdO gf ε ib4; have ib6 := w.b5.fwdO gf ε ib5; have ibD1 := w.b6.fwdO gf ε ib6; have ib7 := w.d1.fwdO ε ibD1; have ib8 := w.b7.fwdO gf ε ib7; have ib9 := w.b8.fwdO gf ε ib8; have ib10 := w.b9.fwdO gf ε ib9; have ib11 := w.b10.fwdO gf ε ib10; have ib12 := w.b11.fwdO gf ε ib11; have ib13 := w.b12.fwdO gf ε ib12; have ib14 := w.b13.fwdO gf ε ib13; have ib15 := w.b14.fwdO gf ε ib14; have ibD2 := w.b15.fwdO gf ε ib15; have ib16 := w.d2.fwdO ε ibD2; have ib17 := w.b16.fwdO gf ε ib16; have ib18 := w.b17.fwdO gf ε ib17; have xhead := w.b18.fwdO gf ε ib18; have gap := globalAvgPoolFlat 768 7 7 xhead; have hn := rowLNVecFlat 1 768 ε w.hG w.hT gap; have g := fun (k : Fin 10) => softmax 10 (mnistLinear w.Wfc w.bfc hn) k - oneHot 10 label k; have dyO18 := cnxHeadDyXheadCh ε w.hG w.hT w.Wfc w.bfc xhead g; have dyO17 := w.b18.cotIn gf ε ib18 dyO18; have dyO16 := w.b17.cotIn gf ε ib17 dyO17; have dyD2 := w.b16.cotIn gf ε ib16 dyO16; have dyO15 := w.d2.cotIn ε ibD2 dyD2; have dyO14 := w.b15.cotIn gf ε ib15 dyO15; have dyO13 := w.b14.cotIn gf ε ib14 dyO14; have dyO12 := w.b13.cotIn gf ε ib13 dyO13; have dyO11 := w.b12.cotIn gf ε ib12 dyO12; have dyO10 := w.b11.cotIn gf ε ib11 dyO11; have dyO9 := w.b10.cotIn gf ε ib10 dyO10; have dyO8 := w.b9.cotIn gf ε ib9 dyO9; have dyO7 := w.b8.cotIn gf ε ib8 dyO8; have dyD1 := w.b7.cotIn gf ε ib7 dyO7; have dyO6 := w.d1.cotIn ε ibD1 dyD1; have dyO5 := w.b6.cotIn gf ε ib6 dyO6; have dyO4 := w.b5.cotIn gf ε ib5 dyO5; have dyD0 := w.b4.cotIn gf ε ib4 dyO4; have dyO3 := w.d0.cotIn ε ibD0 dyD0; have dyO2 := w.b3.cotIn gf ε ib3 dyO3; have dyO1 := w.b2.cotIn gf ε ib2 dyO2; have dyStem := w.b1.cotIn gf ε ib1 dyO1; cnxStemChTiedAt xN wN bN gN epsStr lrStr cotN ε w.sW w.sb w.sγ w.sβ x dyStem lr ∧ w.b1.TiedAt gf xN wN bN gN epsStr lrStr cotN ε ib1 dyO1 lr ∧ w.b2.TiedAt gf xN wN bN gN epsStr lrStr cotN ε ib2 dyO2 lr ∧ ⋯ ∧ ⋯

                                              The whole [3,3,9,3] ConvNeXt-T train step, tied. Threading the real (channel-LN, per-channel layer-scale) forward and the loss-driven backward cotangent chain (GELU masks, the residual fan-in at every identity skip, the channel-LN-back at every downsample and at the stem), the 18 ConvNeXt blocks, the 3 downsamples, the 4×4/s4 stem with its LN, the GAP → LN → dense head, and the dense total-loss fold + loss-cotangent graph all denote θ − lr·(certified per-layer Jacobian · the chain cotangent), each chain cotangent the certified VJP backward of the stages above it (CnxTieGB.cnxBlockCotInChAt_eq_vjp, cnxDownCotInChAt_eq_vjp, cnxHeadDyXheadChN_eq_vjp). All 182 parameters; psW at its gradient (its SGD wrap is hand-written text). The statement is per example, at one image x and a hard label label; the artifact's batch of 32 and its mean lie outside it (the batched form is CnxTieGB.cnx_net_tiedGB).