Curso de Matemáticas para IA · Lección 8 de 180
Logaritmos para IA: evita que desaparezcan los productos de probabilidad diminutos
Aprende los logaritmos como potencias inversas, deriva las leyes que convierten productos en sumas y usa puntuaciones logarítmicas de NumPy para distinguir productos de probabilidad que float64 redondea a cero.
En un ejemplo simplificado de puntuación de secuencias, un modelo de lenguaje pequeño asigna una probabilidad de a cada token elegido. Una secuencia con 400 elecciones de este tipo tiene el producto matemáticamente distinto de cero
Añade un token más con la misma probabilidad y el producto es . Son
dos números positivos distintos, pero NumPy almacena ambos productos como
0.0 al calcularlos con números de coma flotante de 64 bits. Una clasificación
basada en los productos almacenados ha perdido la diferencia.
Los logaritmos conservan una representación más útil: los dos productos se convierten en las sumas finitas y . Al terminar esta lección podrás leer un logaritmo como una potencia inversa, derivar las leyes que convierten productos en sumas, calcular a mano la puntuación de una secuencia corta e implementar la misma idea sin fingir que el espacio logarítmico elimina todos los límites numéricos.
Esta lección invierte la operación de exponenciación desarrollada en Lección 7: Potencias para IA, que es la página localizada correspondiente del Translation Set de cuatro idiomas del curso. El Mathematics for Machine Learning companion oficial divide su recorrido entre los fundamentos matemáticos y los problemas de aprendizaje automático que los utilizan. Su capítulo introductorio motiva construir fundamentos antes de apoyarse en modelos probabilísticos; las matemáticas de logaritmos que siguen son un puente original hacia la probabilidad, no una definición atribuida al capítulo 1.
La respuesta que falta es un exponente
Un logaritmo plantea una pregunta precisa: ¿qué exponente produce este número positivo a partir de la base elegida?
Por ejemplo, porque , mientras que porque . La respuesta negativa es un exponente, no una entrada negativa.
En computación aparecen a menudo tres bases:
| Nombre | Notación usada aquí | Base | Una lectura útil |
|---|---|---|---|
| Logaritmo común | Órdenes de magnitud decimales | ||
| Logaritmo natural | Fórmulas de probabilidad y optimización | ||
| Logaritmo binario | Duplicaciones y potencias de dos |
Algunos campos escriben log sin base, pero la convención no es universal. En
esta lección escribimos para el logaritmo natural e incluimos un subíndice
para las demás bases. NumPy sigue la misma elección práctica:
numpy.log
calcula el logaritmo natural elemento por elemento.
La relación inversa proporciona dos comprobaciones cuando ambas expresiones están en sus dominios reales:
La multiplicación deja un rastro aditivo
La ley del producto no es un patrón que haya que memorizar de forma aislada. Se deduce directamente de la ley de los exponentes de la lección 7.
Toma números positivos y , y usa una base de logaritmo válida , . Sea
La definición dice que y . Al multiplicar y aplicar la ley de exponentes de la misma base obtenemos
Por tanto, el exponente que produce es :
La división resta exponentes bajo los mismos supuestos:
Elevar un número positivo a una potencia real multiplica su exponente:
La positividad es esencial en las tres leyes: y mantienen definidos todos los logaritmos reales, y también mantiene distinto de cero el denominador del cociente.
La suma no sigue la ley del producto. Como contraejemplo rápido,
pero
Por tanto, en general . Más adelante se presenta una operación estable para sumar valores que ya están almacenados como logaritmos, deliberadamente distinta de la conversión de producto a suma.
Cuatro elecciones de tokens, resueltas en ambas representaciones
Supón que dos continuaciones candidatas contienen cuatro elecciones de tokens cada una. Para este cálculo pequeño, considera cada indicado como la probabilidad condicional positiva del modelo para el token elegido en la posición . Multiplicar los cuatro factores produce una puntuación de secuencia; sumar sus logaritmos naturales produce la log-probabilidad correspondiente. Para una secuencia observada fija bajo el modelo, estas puntuaciones también se llaman su verosimilitud y log-verosimilitud. Las lecciones posteriores desarrollarán toda la maquinaria de probabilidad y estimación; aquí solo hay que calcular y comparar las dos representaciones.
El producto de la candidata A es el doble que el de la candidata B. Su puntuación logarítmica también es mayor: . Ese orden está garantizado porque tiene base y es estrictamente creciente. “Mayor” entre puntuaciones logarítmicas negativas significa más cerca de cero. La puntuación no se convirtió en una probabilidad después del logaritmo; se convirtió en una representación de esta que facilita la comparación.
Binary64 llega a cero mientras la puntuación logarítmica sigue cambiando
Los ordenadores no pueden almacenar todos los números reales. Number de
JavaScript y float64 de NumPy usan el formato de coma flotante binary64. NumPy
informa de sus límites de máquina mediante
numpy.finfo:
el valor float64 normal positivo más pequeño es aproximadamente
. Los valores subnormales positivos llenan
parte de la brecha entre ese número y cero, pero con menor precisión; el subnormal
positivo más pequeño es aproximadamente .
numpy.nextafter
confirma que este es el siguiente flotante representable después de cero en la
dirección positiva.
Mueve cualquiera de los controles deslizantes con el puntero o las flechas. El panel superior sigue la multiplicación binary64 directa por la región normal, la estrecha franja subnormal y el cero. El panel inferior sigue el valor aditivo finito . La línea continua con un círculo y la discontinua con un cuadrado siguen siendo distinguibles sin color, y la tabla muestra el estado seleccionado y las filas de transición.
Elige p entre 0.01 y 0.50. Las flechas lo cambian en 0.01.
Elige entre 1 y 2.000 factores repetidos. Las flechas cambian el número de uno en uno.
- Producto binary64 directo
- 0
- Suma logarítmica acumulada
- -921,034037
- Estado del producto directo
- Cero
- Primer número de factores con producto subnormal
- 308
- Primer número de factores con producto cero
- 324
Para p = 0,10 repetido 400 veces, el producto binary64 directo es 0 (Cero); la suma logarítmica acumulada es -921,034037.
Para p = 0,10 repetido 400 veces, el producto binary64 directo es 0 (Cero); la suma logarítmica acumulada es -921,034037.
Los productos directos diminutos se redondean a cuatro cifras significativas en esta vista. La tabla y las etiquetas de estado, no los decimales adicionales, identifican la transición de representabilidad.
Mostrar los valores seleccionados y de frontera como tabla
| Número de factores n | Producto directo | Suma logarítmica acumulada | Estado del producto directo |
|---|---|---|---|
| 1 | 1.000e-1 | -2,302585 | Normal |
| 307 | 1.000e-307 | -706,893624 | Normal |
| 308 | 1.000e-308 | -709,196209 | Subnormal |
| 323 | 9.881e-324 | -743,734985 | Subnormal |
| 324 | 0 | -746,037570 | Cero |
| 400 | 0 | -921,034037 | Cero ← Seleccionado |
| 2000 | 0 | -4605,170186 | Cero |
En el estado inicial renderizado por el servidor, y . La multiplicación directa ya ha producido cero, pero es finita. El valor logarítmico conserva una puntuación aditiva para los factores positivos. Llamar a en float64 sigue devolviendo cero, porque cambiar la representación no puede crear un valor float64 positivo por debajo del rango del formato.
La transición exacta depende del tipo de datos, los valores y el orden de las operaciones de coma flotante. El explorador modela deliberadamente la multiplicación binary64 repetida; no es un umbral universal para todos los programas de probabilidad.
NumPy refleja la ruta segura
El siguiente programa se ejecutó con NumPy 2.5.2. La multiplicación directa usa
np.prod, mientras que la acumulación en el espacio logarítmico usa el logaritmo
natural elemento a elemento documentado por
numpy.log,
seguido de una suma.
import numpy as np
for n in (323, 324, 400, 401):
factors = np.full(n, 0.1, dtype=np.float64)
direct = np.prod(factors)
log_score = np.log(factors).sum()
print(f"n={n}: direct={direct:.4e}, log_score={log_score:.6f}")
limits = np.finfo(np.float64)
print(f"smallest normal: {limits.smallest_normal:.4e}")
print(f"smallest subnormal: {limits.smallest_subnormal:.4e}")
print(f"next after zero: {np.nextafter(0.0, 1.0):.4e}")
n=323: direct=9.8813e-324, log_score=-743.734985
n=324: direct=0.0000e+00, log_score=-746.037570
n=400: direct=0.0000e+00, log_score=-921.034037
n=401: direct=0.0000e+00, log_score=-923.336622
smallest normal: 2.2251e-308
smallest subnormal: 4.9407e-324
next after zero: 4.9407e-324
Los productos de 400 y 401 factores coinciden en cero al almacenarse, mientras sus puntuaciones logarítmicas mantienen el orden. En la práctica, un sistema que necesite comparar productos candidatos puede conservar las puntuaciones logarítmicas y elegir la mayor sin exponenciar cada puntuación. Este es el beneficio numérico concreto: los factores multiplicativos positivos se convierten en puntuaciones aditivas finitas. No repara entradas inválidas, redondeos de otras operaciones ni una conversión final cuyo resultado sea demasiado pequeño para el tipo elegido.
Sumar probabilidades alternativas requiere otra identidad. Si y , entonces
no . La función de NumPy
numpy.logaddexp
calcula directamente ese logaritmo de una suma. Para dos alternativas ya
logaritmadas, y :
x, y = -1000.0, -1001.0
with np.errstate(divide="ignore"):
naive = np.log(np.exp(x) + np.exp(y))
stable = np.logaddexp(x, y)
print(naive)
print(stable)
print(np.exp(stable))
-inf
-999.6867383124818
0.0
La ruta ingenua exponencia demasiado pronto y convierte ambas alternativas en cero.
np.logaddexp conserva su puntuación logarítmica combinada finita. Exponenciar esa
puntuación aún produce underflow, exactamente como muestra la
última línea. Usa sum(log_factors) para un producto de factores positivos;
usa logaddexp al sumar alternativas que ya están representadas por valores
logarítmicos.
Límites que conviene hacer explícitos
El dominio y las condiciones de base del logaritmo real evitan varios errores comunes:
| Entrada o afirmación | Resultado del log real | Motivo |
|---|---|---|
| , , | Válido | Existe un único exponente real |
| No definido como logaritmo real | Ningún exponente finito hace que una base positiva sea cero | |
| No definido en los reales | Una base válida elevada a un exponente real permanece positiva | |
| Base no válida | para todo , así que no existe función inversa | |
| No válido para esta definición | Las potencias reales no producen todos los argumentos positivos de forma coherente | |
| Falso en general | El lado derecho equivale a |
Para arrays de valores reales, NumPy sigue las convenciones de coma flotante en
torno a este límite:
np.log(0.0) devuelve -inf y señala una división por cero, mientras que
np.log(-1.0) devuelve nan y señala una operación no válida. Son valores de
máquina útiles, no permiso para borrar la distinción matemática.
Un factor cuya probabilidad es realmente cero aporta a la puntuación
logarítmica; un producto positivo que se redondeó a cero de coma flotante debería
haberse pasado a logaritmo antes de multiplicar. Una vez que el producto ya
es cero, np.log(product) no puede reconstruir los factores perdidos.
Sustituir ceros silenciosamente por una constante positiva pequeña también cambia los valores declarados por el modelo. Si el recorte es una decisión de modelado intencional, registra la regla en lugar de presentarlo como aritmética exacta.
Por último, la dirección de la clasificación depende de la base. Para toda base —incluidas , y — el logaritmo es creciente, de modo que el producto positivo mayor tiene el valor logarítmico mayor. Una base válida entre cero y uno produce un logaritmo decreciente e invierte ese orden. Las implementaciones de log-probabilidad suelen usar ; por eso la puntuación logarítmica menos negativa ocupa una posición superior.
Una puntuación finita puede ser el resultado útil
Las secuencias iniciales no necesitaron convertir sus probabilidades microscópicas de nuevo a forma decimal para seguir siendo distinguibles. Sus puntuaciones logarítmicas conservaron la comparación multiplicativa como una suma ordinaria, y las leyes de producto, cociente y potencia explican por qué funciona esa representación.
Esta base sustentará lecciones posteriores sobre probabilidad, estimación basada en verosimilitud, entropía y cálculos estables de modelos. El siguiente paso del currículo cambia el foco a las ecuaciones como restricciones y a los conjuntos de valores que las satisfacen. Por ahora, el punto práctico de parada es exacto: mantén los factores positivos en el espacio logarítmico al combinarlos y compararlos, y vuelve al espacio de probabilidades solo cuando el resultado sea necesario y representable.
Comprueba tu comprensión
Pregunta 1
Calcula log₂(32) y log₁₀(0.001), y comprueba cada respuesta con una potencia.
Mostrar la solución paso a paso
Para , pregunta qué exponente de produce :
Para , reescribe el decimal como una potencia de diez:
Ambos argumentos son positivos, y las bases y son positivas y distintas de , por lo que los logaritmos reales cumplen los supuestos necesarios. Las comprobaciones son las potencias y .
Pregunta 2
Para x > 0 e y > 0, expande ln(x³/y²) en logaritmos de x e y, nombrando la ley usada en cada paso.
Mostrar la solución paso a paso
Empieza con la ley del cociente, porque la operación exterior divide dos cantidades positivas:
Después aplica la ley de la potencia a cada término:
Los supuestos e hacen positivos , y el cociente; también garantizan . Por tanto, bajo los supuestos indicados, la expresión expandida tiene el mismo dominio real que la original.
Pregunta 3
Un compañero escribe ln(4 + 5) = ln(4) + ln(5). Refuta la afirmación y enuncia la identidad correcta del producto.
Mostrar la solución paso a paso
Examina qué representa cada lado. El lado izquierdo es
La suma del lado derecho usa la ley del producto:
Como , sus logaritmos naturales son distintos. Numéricamente, , mientras que . La identidad válida es
para y . Convierte la multiplicación, no la suma, en una suma.
Pregunta 4
Una candidata de tres tokens tiene factores positivos 0.5, 0.2 y 0.1. Calcula paso a paso su producto directo y su puntuación logarítmica natural, y luego convierte de nuevo la puntuación.
Mostrar la solución paso a paso
Multiplica de izquierda a derecha:
Para la representación logarítmica, calcula y suma los tres términos:
La ley del producto dice que esta suma es igual a . Aplicar la exponencial inversa da
La conversión coincide con el producto directo; la pequeña diferencia implícita en los decimales mostrados solo procede de redondear los términos logarítmicos a seis cifras decimales.
Pregunta 5
Dos candidatas tienen puntuaciones logarítmicas naturales −40 y −42. ¿Qué producto es mayor y por qué factor multiplicativo?
Mostrar la solución paso a paso
El logaritmo natural usa la base , por lo que conserva el orden. Como , la candidata con puntuación logarítmica tiene el producto positivo mayor.
Sean los productos y . Su cociente usa la ley del cociente para exponentes:
Por tanto, el producto de la primera candidata es aproximadamente veces el de la segunda. Una diferencia de dos puntos en el espacio logarítmico es una razón multiplicativa en el espacio original.
Pregunta 6
Con p = 0.1, el explorador muestra un producto directo subnormal en n = 323 y cero en n = 324. ¿Qué ocurre con la puntuación logarítmica y qué implica al exponenciarla?
Mostrar la solución paso a paso
La puntuación aditiva es . Con :
Ambas son finitas y siguen siendo diferentes, aunque la multiplicación binary64 directa llega a cero con 324 factores en el ejemplo verificado. La acumulación en el espacio logarítmico aún permite comparar las secuencias de factores positivos.
Sin embargo, exponenciar pide a float64 representar aproximadamente , por debajo de su rango positivo después del redondeo, así que el resultado almacenado es cero. La representación logarítmica conserva la puntuación finita; no amplía el rango de salida de binary64.
Pregunta 7
Depura este código para sumar dos alternativas logarítmicas: np.log(np.exp(-1000) + np.exp(-1001)). ¿Por qué devuelve −inf y qué operación de NumPy conserva la puntuación combinada finita?
Mostrar la solución paso a paso
El código exponencia primero. En float64, ambos valores intermedios son demasiado pequeños para representarse:
El programa calcula entonces , que NumPy representa como -inf y acompaña de una señal de división por cero.
Usa la operación diseñada para alternativas que ya están en el espacio logarítmico:
combined = np.logaddexp(-1000.0, -1001.0)
# -999.6867383124818Esto calcula sin redondear antes ambas exponenciales a cero. No es la ley del producto: un producto de factores positivos usa np.log(factors).sum(), mientras que este ejemplo suma dos alternativas. Finalmente, np.exp(combined) sigue devolviendo 0.0; la puntuación combinada finita se conserva, pero su valor en escala de probabilidad sigue siendo inrepresentable en float64.