El curso ha empleado ya la imagen y el núcleo bajo otros nombres. El espacio columna apareció al tratar los subespacios; el conjunto de soluciones de , al describir la solución general de un sistema. Esta lección los reúne bajo el punto de vista de la aplicación lineal, donde dejan de ser dos construcciones independientes y pasan a ser las dos mitades de una única igualdad.
Las dos preguntas
Sea una aplicación lineal. Dos subespacios la describen por completo.
La imagen es lo que alcanza:
El núcleo es lo que aniquila:
Ambos son subespacios, y la comprobación es inmediata a partir de la linealidad. El núcleo contiene siempre , porque ; si entonces . La imagen contiene por la misma razón, y es cerrada bajo combinaciones porque .
Para una matriz , que representa una aplicación , la imagen es el espacio generado por las columnas y el núcleo es el conjunto de soluciones del sistema homogéneo. Viven en espacios distintos: el núcleo en el dominio, la imagen en el codominio.
El núcleo mide la ambigüedad
La definición del núcleo como conjunto de vectores que van a cero es correcta pero engañosamente estrecha. Su contenido real es el siguiente. Si , entonces
y por tanto . El recíproco es igual de directo. La conclusión es una equivalencia:
El núcleo no es un conjunto de vectores especiales: es la lista completa de las confusiones que la aplicación comete. Dos entradas resultan indistinguibles en la salida exactamente cuando su diferencia cae en el núcleo. De ahí el criterio conocido, que ahora aparece como caso particular: es inyectiva si y solo si , porque solo entonces la única forma de que dos entradas coincidan en la salida es que fueran iguales desde el principio.
Esta lectura es la que importa en aprendizaje automático. Una capa lineal con núcleo no trivial descarta información de manera irreversible, y lo hace según una regla precisa: descarta justamente las direcciones del núcleo. Ninguna capa posterior puede recuperarlas, porque no llegaron.
El teorema de rango-nulidad
Las dimensiones de estos dos subespacios no son independientes. Están ligadas por una igualdad exacta.
La demostración explica por qué. Sea una base del núcleo, con . Al tratarse de un conjunto independiente en , admite extensión a una base completa de . Entonces las imágenes generan la imagen —porque los aportan cero— y son independientes: una combinación nula sitúa a en el núcleo, lo que obliga a que sea combinación de los , y la independencia de la base completa fuerza . Hay, pues, exactamente de ellas.
El enunciado es una ley de conservación. El dominio aporta dimensiones y ninguna se pierde de vista: cada una se transmite a la imagen o se aplasta contra el núcleo. Aumentar el rango exige reducir el núcleo en la misma cantidad.
2 + 3 = 5 · rg(A) + dim ker(A) = n
Los bloques miden la dimensión que contienen. El rango no puede superar ni a n ni a m.
- espacio de filas → imagen, biyectiva
- núcleo → 0
- núcleo por la izquierda: nunca alcanzado
La figura recoge dos consecuencias que el enunciado deja implícitas. La primera es que el rango está acotado por ambas dimensiones, : una matriz ancha tiene núcleo forzosamente, y una matriz alta deja forzosamente parte del codominio sin alcanzar. La segunda es que los dos bloques inferiores tienen naturalezas distintas. El núcleo describe información que entra y no sale; el bloque inferior derecho describe salidas que el sistema nunca produce, y es la razón de que pueda no tener solución.
Las dos descomposiciones ortogonales
El teorema admite una lectura más fina, que además explica por qué es cierto. Considérese la condición escrita fila a fila: el producto de cada fila de por es cero. Es decir, es ortogonal a todas las filas, y por tanto a todo el subespacio que generan:
No se trata de una relación aproximada ni de una analogía: es la definición del producto matricial leída de otro modo. Como un subespacio y su complemento ortogonal suman el espacio entero,
Aplicar lo mismo a , cuyo espacio de filas es el espacio columna de , produce la descomposición del codominio:
El teorema de rango-nulidad es ahora un corolario. La primera descomposición da , y el teorema que iguala el rango por filas y por columnas —tratado en la lección sobre el rango— identifica el primer sumando con .
Queda además clara la estructura de la aplicación: restringida al espacio de filas, es una biyección sobre su imagen. Es la flecha continua de la figura anterior. Todo lo que hace de interesante ocurre entre dos subespacios de dimensión ; el resto es aniquilación por un lado e inaccesibilidad por el otro.
Las cuatro bases
La descomposición en valores singulares entrega bases ortonormales de los cuatro subespacios a la vez. Si tiene rango , las primeras columnas de generan el espacio de filas y las restantes generan el núcleo; las primeras columnas de generan la imagen y las restantes generan .
Un ejemplo concreto. Sea
cuya tercera fila es la primera más , y cuya segunda es el doble de la primera más el mismo vector. La relación deja el rango en .
import numpy as np
A = np.array([[1, 2, 3, 4],
[2, 4, 7, 10],
[1, 2, 4, 6]], dtype=float)
U, s, Vt = np.linalg.svd(A)
r = np.linalg.matrix_rank(A) # 2
nucleo = Vt[r:].T # 4 × 2
izquierda = U[:, r:] # 3 × 1
print(np.abs(A @ nucleo).max()) # ≈ 1e-15
print(np.abs(izquierda.T @ A).max()) # ≈ 1e-15
Los valores singulares no nulos son y ; comprobación independiente: . El recuento encaja por ambos lados: en el dominio y en el codominio.
Las bases devueltas por la descomposición son ortonormales pero no son las únicas posibles. Una resolución a mano del sistema homogéneo da la base entera
y la relación entre filas identifica . Generan los mismos subespacios; lo que aporta la descomposición es la ortonormalidad y la estabilidad numérica.
Sobre esto último conviene una advertencia ya formulada en la lección sobre independencia lineal. Obtener los valores singulares a través de eleva al cuadrado el condicionamiento: en este mismo ejemplo, ese camino devuelve en lugar de cero, magnitud suficiente para que un umbral mal elegido cuente un rango inexistente. np.linalg.svd opera directamente sobre y no incurre en esa pérdida.
La solución de norma mínima
La lección sobre la solución particular y general estableció que el conjunto de soluciones de es . La descomposición ortogonal precisa cuál de esas infinitas soluciones es distinguida: exactamente una de ellas pertenece al espacio de filas.
La recta discontinua es el núcleo; la continua, el conjunto de soluciones. Arrastrar la fila de A o deslizar t.
‖x‖ = 1.66 · ‖x†‖ = 0.89
‖x‖² = ‖x†‖² + t² · 2.76 = 0.80 + 1.96
Todo punto de la recta resuelve Ax = b; solo uno está en el espacio de filas. ✓
El argumento es el teorema de Pitágoras. Escrita como con y , la ortogonalidad de los dos sumandos da
de modo que la norma es mínima precisamente cuando . La solución de norma mínima es la componente en el espacio de filas, y es lo que devuelve la pseudoinversa.
Para y , el cálculo da , con norma . La solución alternativa satisface el mismo sistema y tiene norma .
A = np.array([[1, 1, 1, 1],
[1, 2, 3, 4]], dtype=float)
b = np.array([4.0, 10.0])
x = np.linalg.pinv(A) @ b # [1. 1. 1. 1.]
La relevancia para el aprendizaje automático es la siguiente. Un modelo con más parámetros que datos plantea un sistema indeterminado, y el conjunto de parámetros que ajustan el conjunto de entrenamiento es un subespacio afín entero. Qué elemento de ese conjunto se obtiene depende del algoritmo, no del problema. El descenso de gradiente inicializado en cero sobre un problema de mínimos cuadrados lineal converge a la solución de norma mínima, porque cada actualización es combinación de filas de y el iterado nunca abandona el espacio de filas. Es un sesgo implícito hacia la solución más pequeña, impuesto por la geometría del optimizador y no por un término de regularización explícito.
Lo que pierde una capa
El teorema de rango-nulidad convierte el diseño de una arquitectura en aritmética. Una proyección de a dimensiones tiene rango como máximo , de modo que su núcleo tiene dimensión al menos : setecientas cuatro direcciones independientes del espacio de entrada se vuelven indistinguibles al atravesarla.
W = np.random.randn(64, 768)
r = np.linalg.matrix_rank(W) # 64
print(W.shape[1] - r) # 704
Dos precisiones impiden extraer de aquí más de lo que dice. La primera es que una red con funciones de activación no lineales no es una aplicación lineal, y el recuento se aplica capa a capa, no a la composición: la cota que produce es necesaria, no suficiente, y la lección sobre aplicaciones lineales ya mostró que sin activaciones la composición colapsa en una sola matriz. La segunda es que el rango numérico es una respuesta binaria a una pregunta continua, según se trató en la lección sobre la independencia lineal: una dirección con valor singular cuenta formalmente dentro de la imagen y sobrevive al paso, pero queda sepultada bajo el ruido de la representación en coma flotante y bajo el ruido de los propios datos.
Con esas reservas, la afirmación que sí se sostiene es de carácter estructural. La pérdida de información en una capa lineal no es difusa ni gradual: tiene una dirección, un subespacio y una dimensión exacta, y todas tres son calculables antes de entrenar nada.
Ejercicio. Construir una matriz de rango como producto de una por una aleatorias. Obtener bases de los cuatro subespacios con np.linalg.svd y comprobar numéricamente las cuatro relaciones de ortogonalidad y aniquilación. Verificar después que np.linalg.lstsq devuelve, para un en la imagen, la solución de menor norma entre varias obtenidas sumándole vectores del núcleo.