Build Fate-style cross-layer training pairs: (h[l], experts[l+1]). Records are token-major: layers 0..num_layers-1 per token in sequence. For each token t and each layer l in 0..num_layers-2, we pair: input: hiddens[t, l] (gate input at layer l) target: experts[t, l+1] (
(layers, hiddens, experts, num_layers)
| 283 | |
| 284 | |
| 285 | def build_cross_layer_pairs(layers, hiddens, experts, num_layers): |
| 286 | """Build Fate-style cross-layer training pairs: (h[l], experts[l+1]). |
| 287 | |
| 288 | Records are token-major: layers 0..num_layers-1 per token in sequence. |
| 289 | For each token t and each layer l in 0..num_layers-2, we pair: |
| 290 | input: hiddens[t, l] (gate input at layer l) |
| 291 | target: experts[t, l+1] (expert activations at layer l+1) |
| 292 | label: l+1 (target layer index for layer embedding) |
| 293 | |
| 294 | Returns (X, L, E) arrays with shape (N_tokens*(num_layers-1), ...). |
| 295 | """ |
| 296 | n_total = len(layers) |
| 297 | assert n_total % num_layers == 0, \ |
| 298 | f"Expected multiple of {num_layers} records, got {n_total}" |
| 299 | n_tokens = n_total // num_layers |
| 300 | |
| 301 | X_list, L_list, E_list = [], [], [] |
| 302 | for t in range(n_tokens): |
| 303 | base = t * num_layers |
| 304 | for l in range(num_layers - 1): |
| 305 | X_list.append(hiddens[base + l]) # h[l] |
| 306 | L_list.append(layers[base + l + 1]) # target layer l+1 |
| 307 | E_list.append(experts[base + l + 1]) # experts at l+1 |
| 308 | |
| 309 | return (np.stack(X_list), |
| 310 | np.array(L_list, dtype=np.int32), |
| 311 | np.stack(E_list)) |
| 312 | |
| 313 | |
| 314 | def analyze_cosine_similarity(layers, hiddens, num_layers): |
no outgoing calls
no test coverage detected