Curso de Matemáticas para IA · Lección 38 de 180

Álgebra lineal en una red neuronal pequeña

Sigue cada forma, sesgo, activación y cambio de rango en una red de dos capas mediante un ejemplo con NumPy y un explorador interactivo.

Comparte este artículo

Una red neuronal puede parecer una sucesión de operaciones con matrices, pero cada paso cambia el significado de los números. Seguir una red pequeña desde la entrada hasta la salida permite ver el proceso completo: las dimensiones de las matrices determinan qué transformaciones pueden conectarse, los sesgos trasladan esas transformaciones, el rango limita las direcciones independientes y una función de activación cambia lo que puede expresar la composición.

Al terminar, podrás seguir cada dimensión, calcular a mano o con NumPy una red de dos capas y explicar en qué punto afectan al resultado el sesgo, el rango y la activación.

Esta lección reúne tres herramientas de lecciones anteriores: resolver sistemas lineales sin invertir explícitamente la matriz, usar el núcleo y la imagen para describir direcciones perdidas y alcanzables, y usar un sesgo para trasladar una transformación afín. El capítulo 2 de Mathematics for Machine Learning aporta el álgebra lineal necesaria para esta síntesis. La red, los números, el código, la visualización y los ejercicios que siguen son originales.

Sigue las dimensiones de dos capas afines

Aquí, «red de dos capas» significa dos transformaciones afines aprendidas, con una activación oculta entre ambas. Mantendremos la salida como dos puntuaciones; no aplicaremos ninguna conversión a probabilidades ni una decisión de clase. Sea x∈R2x\in\mathbb{R}^2 un vector columna de entrada. Cada transformación afín combina una matriz con un vector de sesgo:

La dimensión compartida entre dos transformaciones consecutivas debe coincidir: W1W_1 tiene dos columnas para las dos características de entrada y dos filas para sus salidas ocultas. A continuación, W2W_2 recibe esos dos valores ocultos y devuelve dos puntuaciones. El sesgo b1b_1 se suma una vez a cada coordenada oculta y b2b_2, una vez a cada salida. Una matriz con dimensiones incompatibles no puede realizar la transformación indicada; esta es la misma comprobación de dimensiones que hace el producto matricial de NumPy.

Sigue una red con dos entradas y dos unidades ocultasMueve cualquiera de las coordenadas de entrada o cambia la regla de la capa oculta. El estado inicial usa x = (1, 1) y ReLU; todos los valores siguientes se muestran antes de que se ejecute JavaScript.
  1. Entrada · 2 características
  2. Transformación afín · 2 valores ocultos
  3. Activación oculta
  4. Transformación afín · 2 puntuaciones
  5. Salida · 2 puntuaciones

z = W₁x + b₁

h = σ(z)

y = W₂h + b₂

Cambia la entrada y la regla oculta

Usa las teclas de dirección o el control deslizante para cambiar cada entrada de −2 a 2 en incrementos de 0.25.

Regla oculta
Preactivación z
(-0.50, 0.50)
Salida oculta h
(0.00, 0.50)
Puntuaciones y
(1.50, -0.50)
Unidades ocultas activas
1 / 2
Rango del jacobiano local
1

La entrada inicial es 1, 1; la salida oculta es 0, 0.5; las puntuaciones son 1.5, −0.5.

Los valores iniciales de la figura usan estos parámetros fijos, elegidos manualmente:

W1=[1−111],b1=[−0.5−1.5],W2=[12−11],b2=[0.5−1].W_1=\begin{bmatrix}1&-1\\1&1\end{bmatrix},\quad b_1=\begin{bmatrix}-0.5\\-1.5\end{bmatrix},\quad W_2=\begin{bmatrix}1&2\\-1&1\end{bmatrix},\quad b_2=\begin{bmatrix}0.5\\-1\end{bmatrix}.

El ejemplo es lo bastante pequeño como para seguirlo entrada por entrada. Sus valores se han elegido para mostrar cómo ReLU desactiva una unidad oculta; no son parámetros entrenados ni representan un modelo típico.

Calcula una predicción y conserva cada resultado intermedio

Tomemos x=(1,1)Tx=(1,1)^\mathsf{T}. La primera matriz combina las dos coordenadas de entrada de distintas maneras. Al sumar el sesgo, se traslada cada resultado:

El operador @ de NumPy realiza la multiplicación de matrices. Las operaciones + b siguientes usan el broadcasting elemento a elemento de NumPy para sumar un sesgo de longitud dos a un resultado de longitud dos. Esta pequeña implementación imprime los vectores intermedios reales:

import numpy as np

W1 = np.array([[1.0, -1.0], [1.0, 1.0]])  # (2, 2)
b1 = np.array([-0.5, -1.5])               # (2,)
W2 = np.array([[1.0, 2.0], [-1.0, 1.0]])  # (2, 2)
b2 = np.array([0.5, -1.0])                # (2,)
x = np.array([1.0, 1.0])                  # (2,)

z = W1 @ x + b1                           # (2,) = (2, 2) @ (2,) + (2,)
h = np.maximum(z, 0.0)                    # (2,), elementwise ReLU
y = W2 @ h + b2                           # (2,) = (2, 2) @ (2,) + (2,)

print('z:', z)  # [-0.5  0.5]
print('h:', h)  # [0.  0.5]
print('y:', y)  # [ 1.5 -0.5]

La misma lógica de dimensiones se aplica a un lote. Si se almacenan BB ejemplos en filas, el arreglo tiene dimensión (B,2)(B,2); se multiplica por la derecha por W1TW_1^\mathsf{T} para producir valores ocultos con dimensión (B,2)(B,2) y, después, por W2TW_2^\mathsf{T} para obtener puntuaciones también con dimensión (B,2)(B,2). La capa Linear de PyTorch sigue esa convención por filas: su peso tiene dimensión (out features,in features)(\text{out features},\text{in features}) y calcula y=xAT+by=xA^\mathsf{T}+b. Por tanto, Linear(2, 2) almacena un peso de dimensión (2,2)(2,2) y un sesgo de longitud dos. ReLU de PyTorch se aplica elemento a elemento y conserva la dimensión de entrada, como en el paso anterior (documentación de Linear, de ReLU y de NumPy matmul).

Sin activación, dos capas siguen siendo una transformación afín

El sesgo de una capa afín es una traslación. Si el paso oculto es la identidad, se pueden componer las dos capas mediante sustitución:

y=W2(W1x+b1)+b2=(W2W1)x+(W2b1+b2).y=W_2(W_1x+b_1)+b_2 =(W_2W_1)x+(W_2b_1+b_2).

Así, apilar más transformaciones afines sin una activación no lineal no convierte la regla global de entrada a salida en una regla no lineal: las matrices se multiplican para formar una sola matriz y los sesgos se combinan en un único desplazamiento. Con los valores elegidos, W2W1=[3102]W_2W_1=\begin{bmatrix}3&1\\0&2\end{bmatrix} y W2b1+b2=(−3,−2)TW_2b_1+b_2=(-3,-2)^\mathsf{T}. Por tanto, la versión con identidad transforma (1,1)T(1,1)^\mathsf{T} en (1,0)T(1,0)^\mathsf{T}.

El rango de una matriz cuenta sus direcciones de salida independientes. En este ejemplo con identidad, tanto W1W_1 como W2W_2 tienen rango dos, y su producto también tiene rango dos. Si la anchura oculta de una red es rr, el rango de la parte lineal de una composición afín no puede superar rr, ya que pasa por solo rr coordenadas. Si alguna de las matrices tiene un rango menor, el rango de la composición podría ser aún más bajo. Estos son límites superiores: una capa estrecha puede ser un cuello de botella, pero la anchura por sí sola no garantiza un rango concreto.

ReLU hace que la transformación sea afín a trozos

ReLU cambia una coordenada oculta a cero cuando su preactivación es negativa. En cualquier región donde los signos de todas las preactivaciones se mantengan, el conjunto de unidades activas también es fijo. Sea DD una matriz diagonal con un 11 por cada unidad ReLU activa y un 00 por cada unidad inactiva. Dentro de esa región, la parte lineal local de la red de dos capas es

J=W2DW1.J=W_2DW_1.

Para la entrada del ejemplo, z=(−0.5,0.5)Tz=(-0.5,0.5)^\mathsf{T}, así que D=[0001]D=\begin{bmatrix}0&0\\0&1\end{bmatrix}. Entonces,

J=[12−11][0001][1−111]=[2211],rank⁡(J)=1.J= \begin{bmatrix}1&2\\-1&1\end{bmatrix} \begin{bmatrix}0&0\\0&1\end{bmatrix} \begin{bmatrix}1&-1\\1&1\end{bmatrix} =\begin{bmatrix}2&2\\1&1\end{bmatrix}, \qquad \operatorname{rank}(J)=1.

Cerca de esta entrada, las dos puntuaciones de salida cambian según la misma combinación de entrada, x1+x2x_1+x_2; la dirección de diferencia (1,−1)(1,-1) no tiene efecto mientras la primera unidad siga inactiva. La matriz JJ describe los cambios locales dentro de esta región de activación, no una matriz global única para toda la red. En el límite de ReLU, cuando una preactivación es cero, la función tiene un vértice y el jacobiano de una sola región no describe ambos lados.

La anchura oculta y los pesos también limitan lo que puede expresar la red. En este ejemplo concreto, las dos rectas donde la preactivación es cero dividen el plano de entrada en regiones con distintos patrones de unidades activas; cada región tiene una regla afín y, al cruzar una recta, esa regla puede cambiar. En general, incluir una activación no lineal permite funciones no lineales, pero no hace que cualquier elección de pesos sea expresiva. Una unidad oculta podría permanecer desactivada para las entradas de interés, o las matrices podrían colapsar direcciones. Las dimensiones de las matrices, sus rangos, los desplazamientos de los sesgos y el patrón de activación contribuyen al comportamiento.

Por eso, los valores de salida por sí solos son una señal limitada al depurar. Sigue las dimensiones para detectar conexiones incompatibles, compara zz con hh para ver qué características quedaron bloqueadas e inspecciona los rangos de las capas o el jacobiano local para identificar direcciones perdidas. Cuando un paso de ajuste separado te pida resolver Ax≈bAx\approx b, la lección 025 explica por qué un método numérico evita los riesgos de formar A−1A^{-1}. La propagación hacia delante de una red usa productos de matrices; no necesita invertir los pesos aprendidos.

Una vez claras las transformaciones y sus direcciones, la siguiente pregunta es cuánto mide un vector. La lección 039 presenta las normas para medir la magnitud de los vectores, comparar escalas de embeddings y describir penalizaciones de parámetros.

Comprueba lo que has entendido

Question 1

Para la red de esta lección, indica las dimensiones de x, W₁, b₁, z, h, W₂, b₂ e y. ¿Por qué puede W₂ recibir h?

Show the step-by-step solution

xx tiene dimensión (2,)(2,), W1W_1 tiene (2,2)(2,2) y b1b_1 tiene (2,)(2,); tanto zz como hh tienen dimensión (2,)(2,). La segunda matriz, W2W_2, tiene dimensión (2,2)(2,2) y su sesgo b2b_2 tiene dimensión (2,)(2,), lo que produce un yy de dimensión (2,)(2,). La dimensión interna de W2W_2 es dos, que coincide con las dos entradas de hh; por eso la matriz transforma el vector oculto en dos puntuaciones de salida.

Question 2

Con x = (1, 1)ᵀ, calcula z, h e y con las matrices y ReLU de esta lección. Muestra los pasos del sesgo y la activación.

Show the step-by-step solution

Primero, W1x=(0,2)TW_1x=(0,2)^\mathsf{T}; al sumar b1=(−0.5,−1.5)Tb_1=(-0.5,-1.5)^\mathsf{T} se obtiene z=(−0.5,0.5)Tz=(-0.5,0.5)^\mathsf{T}. Al aplicar ReLU coordenada a coordenada, resulta h=(0,0.5)Th=(0,0.5)^\mathsf{T}. Después, W2h=(1,0.5)TW_2h=(1,0.5)^\mathsf{T}; al sumar b2=(0.5,−1)Tb_2=(0.5,-1)^\mathsf{T} se obtiene y=(1.5,−0.5)Ty=(1.5,-0.5)^\mathsf{T}.

Question 3

¿Por qué al quitar la activación oculta queda una transformación afín? Calcula la matriz y el sesgo combinados para este ejemplo.

Show the step-by-step solution

Sustituye la primera regla afín en la segunda: W2(W1x+b1)+b2=(W2W1)x+(W2b1+b2)W_2(W_1x+b_1)+b_2=(W_2W_1)x+(W_2b_1+b_2). Aquí, W2W1=[3102]W_2W_1=\begin{bmatrix}3&1\\0&2\end{bmatrix}. Además, W2b1=(−3.5,−1)TW_2b_1=(-3.5,-1)^\mathsf{T}; al sumar b2=(0.5,−1)Tb_2=(0.5,-1)^\mathsf{T}, el sesgo combinado es (−3,−2)T(-3,-2)^\mathsf{T}. El resultado es una sola transformación afín porque sigue teniendo la forma Ax+cAx+c.

Question 4

Para x = (1, 1)ᵀ, ¿qué salida produce la versión con el paso oculto de identidad? ¿Cómo se compara con el resultado de ReLU?

Show the step-by-step solution

Con el paso de identidad, usa la transformación combinada de la solución anterior: [3102](1,1)T+(−3,−2)T=(1,0)T\begin{bmatrix}3&1\\0&2\end{bmatrix}(1,1)^\mathsf{T}+(-3,-2)^\mathsf{T}=(1,0)^\mathsf{T}. Con ReLU, la salida es (1.5,−0.5)T(1.5,-0.5)^\mathsf{T} porque la primera preactivación oculta es negativa y se convierte en cero, mientras que la segunda permanece en 0.50.5. La diferencia se debe a esa activación coordenada a coordenada.

Question 5

Una red transforma 5 entradas mediante una capa oculta de anchura 3 y produce 4 salidas, sin activación. ¿Cuál es el rango máximo posible de su parte lineal? ¿Y si la primera matriz de pesos tiene rango 2 y la segunda rango 3?

Show the step-by-step solution

La matriz compuesta se factoriza a través de tres coordenadas ocultas, por lo que su rango es como máximo tres. Tampoco puede superar las cinco dimensiones de entrada ni las cuatro de salida. Si la primera matriz tiene rango dos y la segunda rango tres, el rango del producto como máximo es el menor de esos límites: dos. Son límites superiores; el producto real podría tener un rango aún menor si las direcciones no están alineadas.

Question 6

En la entrada del ejemplo, la primera unidad ReLU está desactivada y la segunda, activa. Calcula el rango del jacobiano local y explica su significado.

Show the step-by-step solution

La máscara de activación es D=diag⁡(0,1)D=\operatorname{diag}(0,1). Al multiplicar, se obtiene J=W2DW1=[2211]J=W_2DW_1=\begin{bmatrix}2&2\\1&1\end{bmatrix}. La segunda columna es igual a la primera, así que solo hay una columna independiente y el rango es uno. Dentro de esta región de activación, los pequeños cambios de entrada en una dirección no modifican la salida; ambas puntuaciones dependen de la misma combinación de entrada. Es una afirmación local, porque al cambiar ReLU también cambia la matriz DD.

Question 7

¿Qué cambia cuando una preactivación ReLU es exactamente cero? ¿Se puede usar el jacobiano de cualquiera de las regiones vecinas como derivada única en ese punto?

Show the step-by-step solution

ReLU tiene una esquina en cero: su pendiente es cero justo a la izquierda y uno justo a la derecha. Si una preactivación es exactamente cero, la función no es diferenciable en esa coordenada, así que no existe un jacobiano ordinario único que describa ambos lados. La salida de la red sigue estando definida; lo que falla es una aproximación lineal local única a través del límite.

Question 8

Un lote contiene 8 ejemplos con 4 características cada uno. ¿Qué dimensiones tienen la entrada y la salida de PyTorch Linear(4, 3), y qué dimensión tiene el peso?

Show the step-by-step solution

La entrada del lote tiene dimensión (8,4)(8,4): ocho filas y cuatro características de entrada. PyTorch almacena el peso de la capa con dimensión (out features,in features)(\text{out features},\text{in features}), por lo que tiene (3,4)(3,4); el sesgo tiene dimensión (3,)(3,). La capa devuelve (8,3)(8,3): conserva la dimensión del lote y sustituye la última dimensión de características por tres salidas.

Fuentes

  1. Mathematics for Machine Learning book PDF, Chapter 2
  2. NumPy documentation: numpy.matmul
  3. PyTorch documentation: torch.nn.Linear
  4. PyTorch documentation: torch.nn.ReLU