Por qué los errores de forma en Tensor siguen apareciendo (y cómo una notación más clara podría evitarlos)

Por qué los errores de forma en Tensor siguen apareciendo (y cómo una notación más clara podría evitarlos)

May 18, 2026 machine-learning tensor-programming type-systems compiler-design notation-and-semantics code-quality debugging

Cómo las confusiones con las formas de los tensores pasan desapercibidas

Has pasado por esto. El bucle de entrenamiento se ejecuta. La pérdida baja. Las métricas parecen aceptables. Pero tres semanas después, en producción, alguien detecta que las salidas del modelo son sistemáticamente incorrectas y nadie logra rastrear el origen.

La causa suele estar en un eje que en tu cabeza significaba algo muy distinto a lo que el código interpretaba.

No se trata de un error de compilación. Tampoco de un fallo en tiempo de ejecución. Es algo peor: un error silencioso de corrección que afecta a todas las predicciones del modelo.

El problema de la notación

La verdad incómoda es esta: lo que no puedes nombrar, no puedes verificar.

La mayoría de los frameworks de tensores no imponen ninguna notación específica. Una forma como (32, 768, 12, 64) puede representar:

  • (batch, sequence, heads, dim_per_head) en un contexto
  • (batch, features, height, width) en otro
  • (batch, tokens, layers, channels) en otro más

El compilador no distingue entre estas interpretaciones. La forma es solo una tupla de enteros. Mientras los números se multipliquen correctamente, la operación es válida. El framework aplica la operación sin cuestionarla y fija ese significado en los pesos del modelo.

Este es el error invisible. No es incorrecto matemáticamente. Es incorrecto por intención.

Qué podría lograr una mejor notación

Imagina un entorno donde las operaciones con tensores conservaran su significado a través del sistema de tipos. No solo las formas: dimensiones etiquetadas.

En lugar de tener que depurar qué eje es cuál, podrías declararlo desde el principio:

tensor: [batch=32, sequence=128, heads=12, dim_per_head=64]

Así el compilador podría comprobar que:

  • Solo se difunde a lo largo de dimensiones que están preparadas para ello
  • Las operaciones de reducción afectan a los ejes que realmente quieres
  • Las cabezas de atención permanecen separadas de las dimensiones de características
  • Tu LayerNorm normaliza los ejes correctos

El compilador actúa como copiloto. Detecta el intercambio de ejes antes de que entrenes durante tres semanas.

El verdadero coste de los errores silenciosos

Estos errores de dimensión tienen un coste real:

En investigación: Horas de pruebas estadísticas para explicar por qué tus números no se replican. ¿Fue un hiperparámetro? ¿Una semilla aleatoria? ¿O tal vez el orden de los ejes era incorrecto? Y todo ello multiplicado por los experimentos fallidos.

En producción: Un modelo desplegado que está sutilmente mal calibrado. Tu precisión puede ser del 94% en lugar del 96%. Error pequeño para esconderse, pero grande para impactar. Que necesita una depuración forense para descubrirse.

En equipos: Cuando las convenciones de nomenclatura son implícitas, se fragmentan en distintos repositorios. Una equipo usa [batch, seq, heads, dim]. Otro utiliza [batch, heads, seq, dim]. Cuando se combina el código, los errores de eje se propagan silenciosamente.

Cómo el nombrado cambia lo que es posible

这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这这this

Read in other languages:

RU BG EL CS UZ TR SV FI RO PT PL NB NL HU IT FR DE DA ZH-HANS EN