Resumen. Decir que una red es «INT8» no describe cómo se representan sus números. La elección de escala puede borrar un canal completo con pesos pequeños, aunque muchos valores enteros sigan sin utilizarse en ese canal. Comparamos cuantización simétrica por tensor y por canal mediante una capa lineal controlada, una derivación del error de salida y un experimento reproducible. También construimos un contraejemplo: un error menor en los pesos no garantiza un error menor para cada entrada. Finalmente distinguimos compresión, memoria de trabajo y prestaciones realmente medidas en hardware embedded.
Se requieren álgebra lineal elemental y nociones de probabilidad. Todos los números experimentales siguientes proceden de una simulación en NumPy: no ejecutamos inferencia en una placa, no medimos consumo ni entrenamos una red. Los pesos usan unidades convencionales; las métricas de error se refieren a las variables de nuestro modelo didáctico.
1. Ocho bits no definen una resolución
Un código entero toma valores discretos; interpretarlo como número real requiere una correspondencia. En la representación afín r̂ = s(q−z), s es una escala positiva y z un punto cero entero. Aquí elegimos pesos simétricos con z = 0 y códigos de −127 a 127. No usamos −128. Esta convención coincide con los pesos INT8 de la especificación LiteRT, que también distingue granularidad por tensor y por eje. Sus activaciones pueden tener un punto cero distinto de cero; no deben confundirse ambos casos.
Q = 2^(b−1) − 1 s = a / Q q(w) = clip(round(w/s), −Q, Q) w_hat = s q(w)
a es el máximo valor absoluto representable y b el número de bits. Redondeamos al entero más cercano; en empates usamos la convención de NumPy hacia el entero par. Si |w| ≤ a, el error absoluto no supera s/2. Si |w| > a aparece saturación: el error puede ser mucho mayor y esa cota deja de ser válida. Elegir a implica intercambiar resolución central y cobertura de las colas.
Con b = 8 y a = 10, s vale aproximadamente 0,07874. Un peso de 0,01 se convierte en cero, no porque ocho bits sean intrínsecamente insuficientes, sino porque esa escala dedica todos los niveles a un intervalo mucho mayor. Con a = 0,01, el mismo peso queda representado exactamente por el código 127. Hay que estudiar la escala antes de atribuir genéricamente una pérdida de calidad a la «baja precisión».
2. Una capa lineal con cuatro escalas naturales
Definimos y = Wx, con ocho entradas y cuatro salidas, sin sesgo. Cada fila es un canal de salida. Construimos un vector base común y lo multiplicamos por cuatro amplitudes:
u = [−1, −0.51, −0.11, 0.07, 0.23, 0.49, 0.81, 1] α = [0.01, 0.1, 1, 10] W[c, j] = α[c] u[j] W ∈ R^(4×8), x ∈ R^8, y ∈ R^4
La estructura está controlada deliberadamente: los canales comparten forma y solo cambia su amplitud. No es un modelo extraído de un producto ni representa la distribución de todas las redes reales. Aísla una causa precisa de error. En una red entrenada, formas, valores atípicos y sensibilidades de los canales pueden diferir mucho.
Por tensor usamos una escala s = max|W|/127 = 10/127. Por canal usamos sc = maxj|W[c,j]|/127 = αc/127. Cuantizamos y reconstruimos los pesos, manteniendo las entradas en coma flotante. Esto separa el efecto de los pesos del de las activaciones: el experimento todavía no es una cadena de inferencia completamente entera.
3. Derivar el error de salida
Sea E = Ŵ−W la matriz de error. Para una entrada x, el error de salida es Ex. Si x tiene media cero y covarianza Σ, podemos calcular su norma cuadrática media sin simulación:
δy = Ex E[||δy||²] = E[xᵀEᵀEx] = tr(EΣEᵀ) Σ = I ⇒ E[||δy||²] = ||E||F² E[(δy_c)²] = ||E[c,:]||² si Σ = I
La identidad usa la linealidad de la traza y E[xxᵀ] = Σ para entradas de media cero. Con media μ no nula hay que añadir ||Eμ||². Esto importa para activaciones rectificadas o variables con desplazamiento: aplicar automáticamente la fórmula isótropa puede producir una predicción incorrecta.
Generamos 100.000 vectores gaussianos estándar independientes con semilla 20260922 y comparamos los errores cuadrados medios empíricos con la fórmula exacta. El muestreo sirve como comprobación numérica; la tabla usa valores analíticos para no confundir ruido Monte Carlo con diferencias entre métodos. La fórmula no predice exactitud de clasificación ni calidad de una red no lineal: solo describe la capa declarada.
4. El resultado: un canal puede desaparecer
Definimos el error relativo del canal como ||E[c,:]||₂/||W[c,:]||₂. No es el porcentaje de predicciones incorrectas. En el primer canal por tensor, un valor de uno significa aquí que todos sus pesos se redondearon a cero.
| Amplitud α | Error relativo INT8 por tensor | Error relativo INT8 por canal | MSE de salida por tensor | MSE de salida por canal |
|---|---|---|---|---|
| 0,01 | 100% | 0,1859% | 3,2262×10⁻⁴ | 1,1148×10⁻⁹ |
| 0,1 | 31,7980% | 0,1859% | 3,2621×10⁻³ | 1,1148×10⁻⁷ |
| 1 | 3,7089% | 0,1859% | 4,4380×10⁻³ | 1,1148×10⁻⁵ |
| 10 | 0,1859% | 0,1859% | 1,1148×10⁻³ | 1,1148×10⁻³ |
El canal de mayor amplitud usa la misma escala en ambos métodos y produce el mismo resultado. En los demás, la escala por canal conserva la resolución relativa. La igualdad de errores relativos no es una ley universal: surge porque todas las filas son copias escaladas del mismo vector. Este control construido permite reconocer el mecanismo sin atribuirle una generalidad injustificada.
Repetimos el cálculo con b = 4, Q = 7 e intervalo simétrico −7…7. Por canal, el error relativo sube al 7,6444%; por tensor, desaparecen los dos canales menores. Es una simulación de códigos de cuatro bits, no una comprobación de soporte INT4 en un runtime o de empaquetado en memoria. Elegir cuatro u ocho bits requiere evaluar la tarea además de estos errores locales.

5. El contraejemplo: menos error en los pesos no siempre basta
La media isótropa asigna igual importancia a todas las direcciones de entrada. Una aplicación puede visitar principalmente algunas. Tomemos la primera fila de errores, et por tensor y ec por canal, y construyamos una entrada ortogonal a et pero no a ec:
z = ec − et (ecᵀet)/(etᵀet) x = z / ||z|| etᵀx = 0, mientras ecᵀx puede ser distinto de 0
El programa construye esa entrada. El error del primer canal por tensor es aproximadamente −3,25×10⁻¹⁹, numéricamente cero; por canal es aproximadamente 3,32×10⁻⁵. El método con mucho menos error en los pesos pierde esta comparación puntual. No recomendamos elegir la peor escala: demostramos que ordenar mediante una norma no implica el mismo orden para cada entrada posible.
Para una distribución conocida, tr(EΣEᵀ) pondera los errores según las direcciones realmente visitadas. Una tarea real exige además medir la métrica final: un cambio pequeño cerca del umbral de decisión puede importar, mientras que un error mayor lejos del umbral quizá no cambie la decisión. Calibración y prueba deben reflejar las entradas de uso, sin reutilizar continuamente el conjunto de prueba para seleccionar escalas.
6. Clipping: una rejilla más fina puede empeorar el resultado
Utilizamos cuatro activaciones didácticas: −0,2, 0,2, 0,8 y 1. Conservamos una rejilla simétrica de ocho bits y comparamos tres umbrales a. Con a = 0,25 el paso es aproximadamente 0,00197, pero dos valores saturan: el MSE es 0,21625031. Con a = 0,5 el paso es aproximadamente 0,00394 y el MSE baja a 0,08500031. Con a = 1 el paso es más grueso, aproximadamente 0,00787, pero no hay saturación y el MSE es aproximadamente 0,00000744.
Una resolución más fina dentro del intervalo no garantiza menor error total. A la inversa, un único valor atípico enorme puede imponer una rejilla excesivamente gruesa al resto. El mejor umbral depende de la distribución y de la pérdida elegida: mínimo-máximo, percentiles y minimización del error no son criterios equivalentes. Este conjunto pequeño ilustra el fenómeno, no selecciona un método universal de calibración.
7. Del cálculo simulado al kernel entero
El trabajo fundacional de Jacob y colaboradores, arXiv:1712.05877v1 de 2017, desarrolla representación afín, gestión de puntos cero e inferencia entera; sus secciones 2–4 incluyen método y experimentos con redes y CPU concretas. No trasladamos esas prestaciones a nuestro ejemplo ni a una placa actual sin medirlas. Además, el trabajo histórico utiliza convenciones que no deben confundirse automáticamente con la especificación INT8 actual.
En el caso simplificado de pesos simétricos, una salida acumula productos de códigos de pesos y entradas centradas respecto a su punto cero. El factor real es sx·sw,c; una salida cuantizada requiere después reescalar hacia sy. Sesgo, redondeo, saturación y fusión de operaciones forman parte de la implementación. Reconstruir pesos float y multiplicarlos, como hacemos para aislar el error, no ejercita esos detalles del kernel.
También hay que dimensionar el acumulador: la anchura de los operandos no determina por sí sola la de la suma de muchos productos. Una comparación bit a bit debe fijar redondeos intermedios, saturaciones y orden de operaciones. Antes de afirmar una aceleración, hay que comprobar que el backend previsto ejecuta realmente los operadores cuantizados, sin conversiones ni rutas alternativas que modifiquen la ejecución.
8. Memoria: los pesos no son toda la plataforma
La capa contiene 32 pesos. En float32 ocuparían 128 bytes; en INT8, 32 bytes. Las escalas float32 añaden 4 bytes por tensor o 16 para cuatro canales. El total de pesos y escalas es así 36 o 48 bytes: reducciones aproximadas de 3,56× y 2,67× respecto a los 128 bytes, no exactamente 4×. Son conteos teóricos declarados, no tamaños de archivo LiteRT; excluyen sesgo, metadatos, alineamiento y código.
En un microcontrolador los pesos pueden residir en flash, mientras activaciones, búferes temporales y estado del runtime necesitan RAM. La documentación de memoria de TFLite Micro distingue secciones no persistentes, temporales y persistentes del arena y describe la reutilización de búferes. Un modelo pequeño en disco no demuestra que el pico de RAM quepa en la placa. Hay que considerar qué tensores están vivos simultáneamente.
Del mismo modo, menos bytes no equivalen automáticamente a menor latencia o energía. Adquisición del sensor, preprocesamiento, transferencias, instrucciones disponibles y frecuencia pueden dominar el tiempo total. Potencia en vatios y energía por inferencia en julios responden a preguntas diferentes; sin un protocolo en el dispositivo no presentamos cifras de rendimiento.
9. Reproducción y protocolo propuesto para el dispositivo
import numpy as np
u = np.array([-1., -.51, -.11, .07, .23, .49, .81, 1.])
W = np.array([.01, .1, 1., 10.])[:, None] * u
for per_channel in [False, True]:
peak = np.max(np.abs(W), axis=1, keepdims=True) if per_channel else np.max(np.abs(W))
scale = peak / 127
Wq = np.clip(np.rint(W / scale), -127, 127) * scale
E = Wq - W
print(np.linalg.norm(E, axis=1) / np.linalg.norm(W, axis=1))
print(np.sum(E**2, axis=1))
Descargar experimento, gráficos e instrucciones; el archivo JSON de resultados conserva escalas, códigos, errores analíticos, comparación Monte Carlo y contraejemplo. El programa comprueba la cota s/2 sin clipping y la concordancia entre MSE analítico y empírico dentro del 3%. Esa tolerancia verifica el cálculo muestreado; no es una garantía estadística general.
Un siguiente paso, propuesto pero no ejecutado, sería exportar un modelo real y comparar float, INT8 por tensor e INT8 por canal sobre los mismos ejemplos, separados de la calibración. Registrar placa y revisión, runtime, compilador, operadores, reloj, batch, forma de entrada, hilos y condiciones térmicas. Medir calidad de la tarea, pico de RAM, latencia mediana y de cola, y energía por inferencia. Conservar también ejemplos cuya decisión cambie: explican el coste de compresión mejor que una sola media.
10. La decisión de diseño y la dirección de EL-AI
En una aplicación hipotética de mantenimiento predictivo, un canal numéricamente pequeño podría ayudar a distinguir un defecto raro. Borrarlo porque otro canal determina la escala global sería un riesgo que investigar con datos pertinentes, no un daño ya demostrado por este experimento. Conectar cálculo local y decisión industrial exige evaluar el sistema completo.
EL-AI ha ampliado su programa de profundización técnica a plataformas embedded y robótica. Este artículo desarrolla conocimientos útiles para esa dirección; no describe una placa propia, un producto TinyML disponible ni mediciones realizadas por la empresa. Las cuatro lenguas conservan el mismo experimento y sus limitaciones.
Conclusión. La granularidad de escala decide qué diferencias sobreviven a la representación entera. En el caso construido, una escala por canal conserva señales borradas por la escala global, pero no garantiza superioridad para cada entrada ni mejores prestaciones en cualquier hardware. Una evaluación sólida conecta error de representación, distribución de entradas, métrica de la tarea y mediciones en el dispositivo.
Fuentes y transparencia
Fuentes primarias enlazadas: especificación LiteRT INT8, actualizada el 28 de mayo de 2026; Jacob y colaboradores, preprint arXiv:1712.05877v1, 15 de diciembre de 2017, secciones 2–4; documentación de gestión de memoria de TFLite Micro. Consultadas el 22 de septiembre de 2026. Ejemplo, contraejemplo y figuras son análisis didácticos reproducibles, no resultados de una red entrenada ni de investigación revisada por pares.
Texto y traducciones preparados con asistencia de IA; no se declara revisión humana. La portada generada con IA es ilustrativa, no una fotografía de una placa o instalación de EL-AI.

