Curso de Matemáticas para IA · Lección 34 de 180
Las aplicaciones lineales conservan las combinaciones que necesitan los modelos de IA
Comprueba si una transformación conserva las sumas y los escalados, identifica sus espacios de entrada y salida y distingue una capa neuronal de su activación.
Una red neuronal transforma repetidamente una representación en otra. Para entender qué hace una capa, conviene plantear dos preguntas: ¿qué tipos de vectores pueden entrar y cuáles pueden salir? Una aplicación lineal responde a ambas y conserva la forma en que se combinan los vectores. Así podemos razonar sobre los pesos de una matriz como transformaciones entre espacios e identificar exactamente dónde introduce la red un comportamiento no lineal.
Al terminar, podrás comprobar si una aplicación es lineal, indicar sus espacios de entrada y salida, y distinguir la transformación matricial de una capa neuronal de su función de activación.
Objetivo de aprendizaje: Comprobar la linealidad y describir los espacios de entrada y salida de una aplicación.
Esta lección se apoya en las reglas de los espacios vectoriales de la Lección 027. La sección 2.7 de Mathematics for Machine Learning introduce las aplicaciones lineales cuando las combinaciones de vectores empiezan a conectar las coordenadas con las matrices. Los cálculos, el ejemplo de una capa neuronal, el recurso visual y las actividades de esta lección son originales.
Una transformación debe respetar cómo se combinan sus entradas
Los vectores se pueden sumar y escalar. Para dos espacios vectoriales reales y , una aplicación es lineal cuando respeta ambas operaciones:
Aquí y . El resultado pertenece a , y los coeficientes de la derecha escalan las salidas correspondientes.
Puedes comprobar esta regla combinada o dividirla en dos condiciones:
La primera indica que sumar dos entradas antes de transformarlas da el mismo resultado que transformar cada una y después sumarlas. La segunda indica que escalar una entrada antes de transformarla equivale a escalar su salida por el mismo factor. Ambas deben cumplirse para todas las entradas válidas y todos los escalares reales, incluidos los negativos.
Espacio de entrada ℝ²
- e₁ = (1, 0)
- e₂ = (0, 1)
- e₁ + e₂ = (1, 1)
Espacio de salida ℝ²
- T(e₁) = (2, −1)
- T(e₂) = (1, 1)
- T(e₁ + e₂) = (3, 0)
Comprobación de la combinación: T(e₁ + e₂) = T(e₁) + T(e₂)
Las tres flechas muestran un caso concreto de suma. Aquí, , y . El recurso visual ofrece una interpretación geométrica; la fórmula expresa la propiedad general, que debe cumplirse para todos los vectores y escalares, no solo para estos dos vectores de la base.
Una matriz indica qué espacios conecta la aplicación
Sea una matriz de tamaño , es decir, con filas y columnas. Multiplica un vector columna de coordenadas y produce un vector columna de coordenadas:
El dominio es el conjunto de entradas admitidas por la aplicación; el codominio es el espacio de salida al que promete llegar. Para esta regla matricial, las entradas pertenecen a y las salidas a . Las dimensiones no tienen por qué coincidir: una aplicación puede ampliar un vector para obtener más coordenadas o comprimirlo para obtener menos.
La multiplicación de matrices es lineal porque distribuye sobre la suma y la multiplicación por escalares. Para cualesquiera vectores de longitud y escalares ,
Veamos un pequeño ejemplo numérico:
Un sesgo desplaza el origen; una activación cambia la regla
En el código de aprendizaje automático, «capa lineal» es una abreviación habitual. En matemáticas, los detalles determinan si la operación es lineal. Para lotes organizados por filas, PyTorch torch.nn.Linear calcula e incluye el sesgo de forma predeterminada. Si el sesgo no es cero, la regla es afín: conserva las combinaciones cuyos coeficientes suman uno, pero por lo general no conserva sumas ni escalados arbitrarios. La documentación de PyTorch la denomina transformación afín y permite desactivar el sesgo con bias=False (documentación de torch.nn.Linear). Aun así, conserva una combinación ponderada cuando los pesos suman uno:
La última igualdad se cumple porque . La suma vectorial ordinaria usa los coeficientes y , cuya suma no es uno, así que el sesgo no se cancela en .
El vector cero permite hacer un diagnóstico rápido. Toda aplicación lineal debe enviar el cero al cero, porque . Para la regla afín ,
Si , entonces no puede ser lineal. El sesgo no hace que la capa sea incorrecta; permite que el modelo desplace la salida incluso cuando la entrada es cero.
Las redes neuronales añaden otra operación después de la transformación de pesos. Un patrón habitual es , donde ReLU sustituye cada coordenada negativa por cero. Es una operación no lineal. Por ejemplo, sea . Entonces , mientras que . La prueba de suma falla. La documentación de PyTorch define torch.nn.ReLU como esta operación de máximo elemento a elemento (documentación de ReLU).
Esta diferencia explica por qué las redes combinan estos pasos. Si dos capas fueran únicamente aplicaciones lineales, su composición seguiría siendo una sola aplicación lineal: . Añadir capas cambiaría la matriz, pero no crearía una regla no lineal entre entrada y salida. Una activación impide esa reducción y permite que la red represente relaciones más variadas. La matriz de pesos mezcla las características de entrada; la activación cambia la regla que se aplica a las coordenadas resultantes.
Examina la transformación con código
Puedes comprobar los mismos cálculos con NumPy. Los vectores columna hacen que la convención de matriz a la izquierda coincida con la derivación anterior:
import numpy as np
A = np.array([[2, 1],
[-1, 1]])
u = np.array([1, 0])
v = np.array([0, 1])
def T(x):
return A @ x
print(T(u + v)) # [3 0]
print(T(u) + T(v)) # [3 0]
print(T(-2 * u)) # [-4 2]
print(-2 * T(u)) # [-4 2]
En PyTorch, los vectores de un lote suelen almacenarse como filas, por lo que la matriz de pesos de la biblioteca aparece transpuesta en la fórmula mostrada. La dimensión del lote se mantiene, mientras que la última dimensión, la de características, pasa de in_features a out_features:
import torch
from torch import nn
x = torch.tensor([[1.0, 0.0], [0.0, 1.0]]) # shape: (2 examples, 2 features)
linear_part = nn.Linear(2, 3, bias=False)
activation = nn.ReLU()
pre_activation = linear_part(x) # shape: (2, 3); a linear map
hidden = activation(pre_activation) # shape: (2, 3); nonlinear elementwise step
En este caso, la aplicación lineal transforma cada vector de características de en uno de . Este ejemplo omite el sesgo, de modo que la primera operación sí es lineal. Con el sesgo predeterminado, PyTorch describe esa operación como afín. La activación conserva la forma de la salida, pero no supera la prueba de combinación de vectores. Que las formas coincidan no permite saber si una operación es lineal; lo determina la regla algebraica.
Una aplicación lineal aún puede perder información
La linealidad no significa que una aplicación sea reversible, conserve longitudes o resulte útil para todas las tareas posteriores. La matriz nula transforma cualquier entrada en el vector cero y aun así satisface las dos reglas de linealidad. Una aplicación lineal de a no puede ser inyectiva: necesariamente desaparece al menos una dirección de la información de entrada. Para determinar si se conserva la información, se necesitan otros conceptos, como la independencia lineal, el rango y la invertibilidad.
Al inspeccionar un bloque neuronal, escribe el espacio anterior y posterior a cada operación y después comprueba la regla que aplica. La multiplicación matricial transforma las combinaciones de forma predecible; un sesgo desplaza el origen; una activación cambia cómo se comportan las combinaciones. Esa es la distinción que conviene llevar a la siguiente lección, donde las aplicaciones lineales adquieren representaciones matriciales concretas.
Comprueba lo que has entendido
Pregunta 1
¿Qué dos propiedades debe satisfacer una aplicación para ser lineal? ¿Qué queda sin comprobar con una prueba de suma de vectores?
Mostrar la solución paso a paso
Una aplicación lineal debe conservar la suma y la multiplicación por escalares: y para cualesquiera válidos y cualquier escalar real . La regla combinada se obtiene aplicando ambas propiedades: . Una prueba de suma solo abarca las sumas de entradas; para comprobar directamente la definición, también hay que probar el escalado por cada número real.
Pregunta 2
Para T(x₁, x₂) = (2x₁ + x₂, −x₁ + x₂), calcula T(3, 2). Muestra las dos coordenadas de salida e indica los espacios de entrada y salida.
Mostrar la solución paso a paso
La matriz tiene dos columnas, así que admite vectores de . Tiene dos filas, por lo que la salida pertenece a . Multiplica la entrada por cada fila:
Por tanto, es una aplicación y la salida es .
Pregunta 3
Con la matriz de esta lección, verifica que T((1, 0) + (0, 1)) = T(1, 0) + T(0, 1).
Mostrar la solución paso a paso
Sean y . El ejemplo resuelto da y , por lo que su suma es . La suma de las entradas es , y la multiplicación matricial da . Ambos lados coinciden, así que se verifica este caso concreto de suma. El ejemplo respalda la regla, pero no la demuestra para todos los vectores; la propiedad distributiva de la multiplicación matricial proporciona la demostración general.
Pregunta 4
Con la misma matriz y u = (1, 0), calcula T(−2u) y compáralo con −2T(u). ¿Qué comprueba este cálculo?
Mostrar la solución paso a paso
Primero, , así que . Además, y
Los resultados coinciden. Esto comprueba que se conserva el escalado por un escalar negativo, algo importante porque la linealidad exige que la regla se cumpla para todos los escalares reales.
Pregunta 5
Una capa propuesta es F(x) = Ax + (0, 2). ¿Puede ser lineal F? Usa la prueba del vector cero y explica qué hace el vector añadido.
Mostrar la solución paso a paso
Para una aplicación lineal, debe ser cero: al multiplicar cualquier entrada por , su salida también debe multiplicarse por . Aquí, . Por tanto, no es lineal. El vector añadido desplaza cada salida en y convierte la regla en una aplicación afín.
Pregunta 6
Un bloque de PyTorch aplica <code>nn.Linear(4, 8)</code> seguido de <code>nn.ReLU()</code>. Indica los espacios de características de entrada y salida y clasifica cada operación.
Mostrar la solución paso a paso
Cada ejemplo de entrada tiene cuatro características, así que es un vector de . La capa lineal produce ocho coordenadas, un elemento de . PyTorch activa el sesgo de forma predeterminada, por lo que nn.Linear(4, 8) suele ser afín y no lineal en sentido matemático. nn.ReLU() conserva la forma de ocho coordenadas, pero aplica a cada una; es una operación no lineal. Con bias=False, la primera operación sí es una aplicación lineal .
Pregunta 7
Muestra que ReLU no conserva la suma usando las entradas −1 y 1. ¿Su fallo cambia la dimensión de salida?
Mostrar la solución paso a paso
ReLU transforma en . Si conservara la suma, aplicarla a la suma de las entradas daría lo mismo que sumar los valores transformados por separado. Sin embargo, , mientras que . Como los valores difieren, ReLU es no lineal. Aun así, devuelve un número por cada número de entrada, así que la forma de la salida coincide con la de la entrada aunque la regla sea no lineal.
Pregunta 8
¿Toda aplicación lineal es reversible o conserva longitudes? Da un contraejemplo lineal para una de esas afirmaciones.
Mostrar la solución paso a paso
No. La aplicación nula es lineal porque y , pero envía todas las entradas a la misma salida y no se puede invertir. Tampoco se garantiza la conservación de longitudes: es lineal, pero tiene longitud , no . La linealidad describe cómo se comportan las combinaciones, no si se mantienen las longitudes o la información.