[1mModel:[0m [36mtest.apr[0m ([33mencoder-decoder (Whisper/T5)[0m, [36mApr[0m)

[2m═══════════════════════════════════════════════════════════════[0m
[1m                   CROSS-ATTENTION DATA FLOW[0m
[2m    (Posterior Collapse occurs when decoder ignores this)[0m
[2m═══════════════════════════════════════════════════════════════[0m

Found [32m4[0m cross-attention Q projections

┌─────────────────────────────────────────────────────────────┐
│  [1;36mdecoder.layers.0.cross_attn[0m  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   [32mencoder_output[0m [seq_len, d_model]              │
│          │                                                  │
│          ├───────────────┬───────────────┐                  │
│          ▼               ▼               │                  │
│    ┌──────────┐    ┌──────────┐          │                  │
│    │ [33mw_k[0m │    │ [33mw_v[0m │          │                  │
│    └────┬─────┘    └────┬─────┘          │                  │
│         ▼               ▼               │                  │
│    K [seq, d]      V [seq, d]           │                  │
│         │               │               │                  │
│   [35mdecoder_hidden[0m [dec_len, d_model]    │               │                  │
│          │               │               │                  │
│          ▼               │               │                  │
│    ┌──────────┐          │               │                  │
│    │ [33mw_q[0m │          │               │                  │
│    └────┬─────┘          │               │                  │
│         ▼               │               │                  │
│    Q [dec, d]           │               │                  │
│         │               │               │                  │
│         └───────┬───────┘               │                  │
│                 ▼                       │                  │
│    ┌────────────────────────┐           │                  │
│    │ Q @ K^T / √d_k         │           │                  │
│    │ = scores [dec, seq]    │           │                  │
│    └───────────┬────────────┘           │                  │
│                ▼                        │                  │
│    ┌────────────────────────┐           │                  │
│    │ softmax(scores)        │           │                  │
│    │ = attn_weights         │ ◄─ [1;31mCRITICAL[0m │
│    └───────────┬────────────┘   If uniform → Collapse     │
│                │                        │                  │
│                └────────────────────────┘                  │
│                ▼                                           │
│    ┌────────────────────────┐                              │
│    │ attn_weights @ V       │                              │
│    │ = context [dec, d]     │                              │
│    └───────────┬────────────┘                              │
│                ▼                                           │
│    ┌──────────┐                                            │
│    │ [33mw_o[0m │                                            │
│    └────┬─────┘                                            │
│         ▼                                                  │
│    output [dec_len, d_model]                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  [1;36mdecoder.layers.1.cross_attn[0m  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   [32mencoder_output[0m [seq_len, d_model]              │
│          │                                                  │
│          ├───────────────┬───────────────┐                  │
│          ▼               ▼               │                  │
│    ┌──────────┐    ┌──────────┐          │                  │
│    │ [33mw_k[0m │    │ [33mw_v[0m │          │                  │
│    └────┬─────┘    └────┬─────┘          │                  │
│         ▼               ▼               │                  │
│    K [seq, d]      V [seq, d]           │                  │
│         │               │               │                  │
│   [35mdecoder_hidden[0m [dec_len, d_model]    │               │                  │
│          │               │               │                  │
│          ▼               │               │                  │
│    ┌──────────┐          │               │                  │
│    │ [33mw_q[0m │          │               │                  │
│    └────┬─────┘          │               │                  │
│         ▼               │               │                  │
│    Q [dec, d]           │               │                  │
│         │               │               │                  │
│         └───────┬───────┘               │                  │
│                 ▼                       │                  │
│    ┌────────────────────────┐           │                  │
│    │ Q @ K^T / √d_k         │           │                  │
│    │ = scores [dec, seq]    │           │                  │
│    └───────────┬────────────┘           │                  │
│                ▼                        │                  │
│    ┌────────────────────────┐           │                  │
│    │ softmax(scores)        │           │                  │
│    │ = attn_weights         │ ◄─ [1;31mCRITICAL[0m │
│    └───────────┬────────────┘   If uniform → Collapse     │
│                │                        │                  │
│                └────────────────────────┘                  │
│                ▼                                           │
│    ┌────────────────────────┐                              │
│    │ attn_weights @ V       │                              │
│    │ = context [dec, d]     │                              │
│    └───────────┬────────────┘                              │
│                ▼                                           │
│    ┌──────────┐                                            │
│    │ [33mw_o[0m │                                            │
│    └────┬─────┘                                            │
│         ▼                                                  │
│    output [dec_len, d_model]                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  [1;36mdecoder.layers.2.cross_attn[0m  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   [32mencoder_output[0m [seq_len, d_model]              │
│          │                                                  │
│          ├───────────────┬───────────────┐                  │
│          ▼               ▼               │                  │
│    ┌──────────┐    ┌──────────┐          │                  │
│    │ [33mw_k[0m │    │ [33mw_v[0m │          │                  │
│    └────┬─────┘    └────┬─────┘          │                  │
│         ▼               ▼               │                  │
│    K [seq, d]      V [seq, d]           │                  │
│         │               │               │                  │
│   [35mdecoder_hidden[0m [dec_len, d_model]    │               │                  │
│          │               │               │                  │
│          ▼               │               │                  │
│    ┌──────────┐          │               │                  │
│    │ [33mw_q[0m │          │               │                  │
│    └────┬─────┘          │               │                  │
│         ▼               │               │                  │
│    Q [dec, d]           │               │                  │
│         │               │               │                  │
│         └───────┬───────┘               │                  │
│                 ▼                       │                  │
│    ┌────────────────────────┐           │                  │
│    │ Q @ K^T / √d_k         │           │                  │
│    │ = scores [dec, seq]    │           │                  │
│    └───────────┬────────────┘           │                  │
│                ▼                        │                  │
│    ┌────────────────────────┐           │                  │
│    │ softmax(scores)        │           │                  │
│    │ = attn_weights         │ ◄─ [1;31mCRITICAL[0m │
│    └───────────┬────────────┘   If uniform → Collapse     │
│                │                        │                  │
│                └────────────────────────┘                  │
│                ▼                                           │
│    ┌────────────────────────┐                              │
│    │ attn_weights @ V       │                              │
│    │ = context [dec, d]     │                              │
│    └───────────┬────────────┘                              │
│                ▼                                           │
│    ┌──────────┐                                            │
│    │ [33mw_o[0m │                                            │
│    └────┬─────┘                                            │
│         ▼                                                  │
│    output [dec_len, d_model]                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

┌─────────────────────────────────────────────────────────────┐
│  [1;36mdecoder.layers.3.cross_attn[0m  │
├─────────────────────────────────────────────────────────────┤
│                                                             │
│   [32mencoder_output[0m [seq_len, d_model]              │
│          │                                                  │
│          ├───────────────┬───────────────┐                  │
│          ▼               ▼               │                  │
│    ┌──────────┐    ┌──────────┐          │                  │
│    │ [33mw_k[0m │    │ [33mw_v[0m │          │                  │
│    └────┬─────┘    └────┬─────┘          │                  │
│         ▼               ▼               │                  │
│    K [seq, d]      V [seq, d]           │                  │
│         │               │               │                  │
│   [35mdecoder_hidden[0m [dec_len, d_model]    │               │                  │
│          │               │               │                  │
│          ▼               │               │                  │
│    ┌──────────┐          │               │                  │
│    │ [33mw_q[0m │          │               │                  │
│    └────┬─────┘          │               │                  │
│         ▼               │               │                  │
│    Q [dec, d]           │               │                  │
│         │               │               │                  │
│         └───────┬───────┘               │                  │
│                 ▼                       │                  │
│    ┌────────────────────────┐           │                  │
│    │ Q @ K^T / √d_k         │           │                  │
│    │ = scores [dec, seq]    │           │                  │
│    └───────────┬────────────┘           │                  │
│                ▼                        │                  │
│    ┌────────────────────────┐           │                  │
│    │ softmax(scores)        │           │                  │
│    │ = attn_weights         │ ◄─ [1;31mCRITICAL[0m │
│    └───────────┬────────────┘   If uniform → Collapse     │
│                │                        │                  │
│                └────────────────────────┘                  │
│                ▼                                           │
│    ┌────────────────────────┐                              │
│    │ attn_weights @ V       │                              │
│    │ = context [dec, d]     │                              │
│    └───────────┬────────────┘                              │
│                ▼                                           │
│    ┌──────────┐                                            │
│    │ [33mw_o[0m │                                            │
│    └────┬─────┘                                            │
│         ▼                                                  │
│    output [dec_len, d_model]                               │
│                                                             │
└─────────────────────────────────────────────────────────────┘

─────────────────────────────────────────────────────────────────
[1;33mDIAGNOSTIC HINT:[0m
If attention weights are nearly uniform (max ≈ 1/seq_len),
decoder is ignoring encoder output → Posterior Collapse

Check with: apr trace model.apr --layer cross_attn --payload
