Volver a unir las cabezas
Después de ponderar V, la salida de cada cabeza es (B, H, S, D_k). Transpón de vuelta antes de unir:
merged = head_values.transpose(0, 2, 1, 3).reshape(B, S, D) # (2, 3, 6, 4) -> (2, 6, 12)
La prueba confirma que esto equivale a concatenar las cabezas sobre el eje de características: np.concatenate([head_values[:, h] for h in range(H)], axis=-1).
Una capa entrenada aplicaría después una proyección de salida W_O. El cuaderno se detiene en las cabezas concatenadas.