🧮 Computational Mathematics

Inicio · Parte 01 — Aritmética computacional y representación numérica

034 — Propagación de errores

basico-computacional clase 14 de 20 4 horas demostración error_propagation

Los errores de redondeo se acumulan al sumar muchos términos; la suma compensada los recupera.

Fórmulas

error de la suma ingenua: O(n·ε)
error de la suma compensada (Kahan): O(ε)

Desarrollo

Cada operación en punto flotante introduce un error de a lo sumo medio ULP. Al sumar n términos, esos errores se acumulan, y en el peor caso el error total crece proporcionalmente a n·ε. Con un millón de sumandos y ε ≈ 2·10⁻¹⁶, el error relativo puede llegar a 2·10⁻¹⁰: se han perdido seis dígitos por el simple hecho de sumar muchas veces.

La suma compensada de Kahan (1965) resuelve el problema arrastrando explícitamente el error de cada paso: guarda en una variable auxiliar lo que se perdió al redondear y lo reinyecta en la siguiente suma. El coste es cuatro operaciones en lugar de una, y el error pasa a ser independiente de n. Python ofrece math.fsum, que usa un algoritmo aún más preciso y devuelve la suma correctamente redondeada.

El orden de la suma también importa. Sumar de menor a mayor magnitud reduce el error, porque evita que los términos pequeños caigan por debajo del ULP del acumulado. Es el motivo por el que algunas bibliotecas ordenan antes de sumar en cálculos críticos.

En deep learning esto aparece al acumular la pérdida sobre un lote grande o al reducir gradientes entre dispositivos. Los frameworks acumulan en float32 aunque el cálculo sea en float16 precisamente para que el acumulador tenga más precisión que los sumandos.

Ejemplo trabajado

Acumular un millón de veces 0.1.

Suma ingenua de 1e6 términos de 0.1:
  resultado    99999.99999808663
  exacto       100000.0
  error abs    1.91e−03
  error rel    1.91e−08         ← se perdieron ~8 dígitos

math.fsum([0.1]*1000) − 100.0 = 0.0
  (correctamente redondeada)

Coste: fsum es más lento, pero el error no crece con n.

Qué calcula el laboratorio

Cómo crece el error al sumar 10^6 veces un valor no representable.

python classes/part-01-aritmetica-computacional-y-representacion-numerica/034-propagacion-de-errores/lab.py
compmath run 034

Salidas del laboratorio (7)

Muestra de la ejecución real

{
  "n_sumas": 1000000,
  "suma_acumulada": 100000.00000133288,
  "valor_exacto": 100000.0,
  "error_absoluto": 1.3328826753422618e-06,
  "error_relativo": 1.3328826753422619e-11,
  "suma_compensada_fsum": 0.0
}

Errores comunes

Dónde se usa

Sumas de grandes conjuntos de datos, integración numérica, acumulación de pérdida y reducción de gradientes. math.fsum, numpy.sum con dtype ampliado y la acumulación en float32 responden a este problema.

Idea rectora de la parte

La cancelación catastrófica destruye dígitos significativos sin lanzar excepciones.

Error a evitar

Suponer que la suma de floats es asociativa.

Conexión con IA

float32, bfloat16 y la cuantización a int8 son decisiones de representación. Los NaN en un entrenamiento casi siempre nacen aquí, no en la arquitectura.

Bibliografía de la clase

Archivos de la clase