K=3 backward kernel that closes the forward → loss → backward chain for
the trade-outcome aux head. Mirrors `aux_next_bar_backward` (K=2 sibling)
line-for-line because gradient flow is K-independent: `d_logits = (softmax
− one_hot)/B_valid` propagated through `Linear → ELU → Linear` chain via
standard softmax-CE derivative.
Per-sample partials (caller reduces via existing K-generic `aux_param_
grad_reduce` kernel):
dW1_partial [B, H=128, SH2=256], db1_partial [B, H]
dW2_partial [B, K=3, H], db2_partial [B, K=3]
dh_s2_aux_out [B, SH2]
Mask handling: labels[b] == -1 zeros the K-vector → all downstream
partials zero (chain rule's multiplicative zero). All-skip batch produces
valid_count=0 → d_logits=0 for every row → zero gradients across the
board, no NaN.
Sparse-label gradient amplification: B_valid is typically ~1-5% of
nominal batch (trade-close events are rare), so inv_B = 1/B_valid is
much larger than the K=2 sibling's inv_B = 1/(~B). Per-trade-close
gradients have proportionally higher magnitude — correct credit
assignment (rare signal speaks louder) but Phase E's Adam may need
class-weighted CE or per-group LR tuning.
ELU backward via post-activation identity: f'(x) = (h_post > 0) ? 1 :
1 + h_post — recovers derivative without re-evaluating x_pre.
SP14 Phase C.5b separation preserved: reads h_s2_aux (aux trunk output),
writes dh_s2_aux_out SAXPYing into dh_s2_aux_accum. Q's encoder
structurally protected (aux_trunk_backward has no dx_in output).
Phase A5 (this commit) is dead code — no Rust launcher. Phase B will
land the full launcher chain (gpu_aux_heads.rs parallel ops struct,
collector struct fields for W1/W2/b1/b2/Adam-state/saved-tensors/dW-
partials, wireup in collect_experiences_gpu).
Cubin: aux_trade_outcome_backward_kernel.cubin (24.8 KB).
═══ Phase A complete ═══
A1: ISV slots (none needed — reuses padding 121-123)
A2: trade_outcome_label_kernel.cu (label producer) 26ce7ba69
A3: aux_trade_outcome_forward + save-for-backward wireup 07728f9ef
A4: aux_trade_outcome_loss_reduce_kernel.cu (sparse CE) 3ddcfb886
A5: aux_trade_outcome_backward_kernel.cu (this commit)
All 5 GPU kernels compile, cubins built, build.rs registered. Contract
chain composes end-to-end on the GPU side. Phase B (Rust launcher
chain + 262-dim input concat) is next.
Audit: docs/dqn-wire-up-audit.md Phase A5 section + Phase A summary.
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>