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

Productos matriz-matriz para IA: componer transformaciones y lotes

Comprueba las formas de las matrices, calcula un producto de matrices pequeño y lee la misma contracción como una aplicación compuesta o como un cálculo por lotes de una capa densa.

Comparte este artículo

Una capa densa realiza el mismo tipo de cálculo para una entrada o para muchas entradas a la vez. Para una entrada, un producto matriz-vector combina una fila de pesos con un vector de características. Para un lote, las filas de una matriz de entradas se combinan con cada regla de salida. La multiplicación matriz-matriz es la notación compacta que hace posible esta reutilización.

Al terminar esta lección, podrás comprobar si las formas son compatibles, calcular un producto de matrices pequeño, explicar sus dimensiones de salida e interpretar el mismo producto como transformaciones compuestas o como un lote de productos matriz-vector.

Resultado de aprendizaje: Comprobar formas compatibles, calcular un producto de matrices pequeño, explicar las dimensiones de salida e interpretar el mismo producto como transformaciones compuestas o como un lote de productos matriz-vector.

Lección 19: Productos matriz-vector como sumas ponderadas trató una entrada cada vez. El Mathematics for Machine Learning companion oficial desarrolla los productos de matrices en la sección 2.2 del libro. Los ejemplos, el código, la visualización y las evaluaciones de aquí son aplicaciones originales de esa definición.

Las dimensiones internas deciden si existe un producto

Sean

A∈Rm×n,B∈Rn×p.A\in\mathbb{R}^{m\times n}, \qquad B\in\mathbb{R}^{n\times p}.

El producto C=ABC=AB está definido porque el número de columnas de AA coincide con el número de filas de BB. Su forma conserva las dos dimensiones externas:

A⏟m×nB⏟n×p=C=AB⏟m×p.\underbrace{A}_{m\times n} \underbrace{B}_{n\times p} = \underbrace{C=AB}_{m\times p}.

La dimensión compartida nn indica cuántos pares alineados se multiplican y suman para cada elemento de salida. Las dimensiones externas mm y pp indican cuántas filas y columnas tiene el resultado. En otras palabras, la forma de salida es (m,p)(m,p), no (m,n)(m,n) ni (n,p)(n,p).

Esta regla es una contracción sobre el eje compartido. No indica que haya que multiplicar las entradas que ocupan las mismas posiciones. La distinción importa en el código: NumPy documenta numpy.matmul como el producto de matrices y usa @ como abreviatura de su operador en el caso bidimensional ordinario (documentación).

Un simulador del flujo de formas mantiene visibles los ejes

La siguiente visualización comienza con un producto completo y compatible. Elige otro preajuste para ver otras formas externas válidas, cambia entre la lectura directa por fila y columna y la lectura por lotes, o usa los controles nativos para seguir un elemento de salida. Cada estado también tiene una tabla semántica debajo, de modo que el cálculo sigue siendo legible sin JavaScript, color ni animación.

Explora formas compatibles, un producto escalar y la misma contracción leída como un lote.
Explorar el flujo de formas

Cada opción tiene dimensiones internas coincidentes; las dimensiones externas determinan su forma de salida.

Leer el mismo producto como

Mueve el control deslizante con un puntero o el teclado. Las tablas permanecen disponibles como referencia estática completa.

Siguiendo C11: fila 1, columna 1; se han incluido 3 de 3 productos.

Matriz izquierda × Matriz derecha → Matriz de salida

Seguimiento fila por columna

C11 = 1 × 2 + (-1) × 3 + 2 × 0 = -1

Total acumulado: -1 · producto escalar completo

Tabla semántica: cada elemento de salida, su fila izquierda, su columna derecha y su producto escalar final para A × B = C
Elemento de salidaFila izquierdaColumna derechaProducto escalar
C11 (fila 1, columna 1)[1, -1, 2][2, 3, 0]-1
C12 (fila 1, columna 2)[1, -1, 2][1, -1, 4]10
C21 (fila 2, columna 1)[2, 0, 1][2, 3, 0]4
C22 (fila 2, columna 2)[2, 0, 1][1, -1, 4]6
Tabla semántica: la misma multiplicación leída como un lote por filas para Bᵀ × Aᵀ = Cᵀ
Fila del loteFila de entrada (una columna de la matriz derecha)Fila de salida
1[2, 3, 0][-1, 4]
2[1, -1, 4][10, 6]

Las tablas se renderizan con la lección y permanecen visibles sin JavaScript. Los controles enfocados, las etiquetas de texto y la estrella resaltada ofrecen señales que no dependen del color para el estado interactivo.

El primer estado renderizado por el servidor muestra el producto completo antes de que se haga visible la interacción opcional del cliente. El control deslizante revela sumas parciales, no matemática nueva: solo decide cuántos términos del mismo producto escalar se muestran en ese momento. En el modo por lotes, las filas mostradas son ejemplos completos y la tabla es la alternativa permanente para todos ellos.

Un producto pequeño revela cuatro productos escalares

Considera las matrices originales

A=[1−12201],B=[213−104].A= \begin{bmatrix} 1 & -1 & 2\\ 2 & 0 & 1 \end{bmatrix}, \qquad B= \begin{bmatrix} 2 & 1\\ 3 & -1\\ 0 & 4 \end{bmatrix}.

La comprobación de formas va primero:

(2×3)(3×2)⟶(2×2).(2\times3)(3\times2)\longrightarrow(2\times2).

Las dos dimensiones internas son 33, por lo que el producto existe. Las dos dimensiones externas predicen cuatro elementos de salida, cada uno formado por tres multiplicaciones escalares.

La ubicación de cada respuesta forma parte del resultado. Por ejemplo, c12c_{12} no es “la segunda multiplicación” de una lista aplanada; es el elemento de la fila 11, columna 22, y siempre empareja la fila 11 de AA con la columna 22 de BB.

El mismo producto compone transformaciones en un orden fijo

Las formas de las matrices también describen dominios y codominios. Aquí BB asigna R2\mathbb{R}^{2} a R3\mathbb{R}^{3}, mientras que AA asigna R3\mathbb{R}^{3} a R2\mathbb{R}^{2}:

R2→  B  R3→  A  R2.\mathbb{R}^{2} \xrightarrow{\;B\;} \mathbb{R}^{3} \xrightarrow{\;A\;} \mathbb{R}^{2}.

Por tanto, ABAB es la matriz única de “aplicar BB y después aplicar AA”. Para

x=[12],\boldsymbol{x}=\begin{bmatrix}1\\2\end{bmatrix},

el vector intermedio es

Bx=[2⋅1+1⋅23⋅1+(−1)⋅20⋅1+4⋅2]=[418].B\boldsymbol{x} = \begin{bmatrix} 2\cdot1+1\cdot2\\ 3\cdot1+(-1)\cdot2\\ 0\cdot1+4\cdot2 \end{bmatrix} = \begin{bmatrix}4\\1\\8\end{bmatrix}.

Al aplicar AA después se obtiene

A(Bx)=[1⋅4+(−1)⋅1+2⋅82⋅4+0⋅1+1⋅8]=[1916].A(B\boldsymbol{x}) = \begin{bmatrix} 1\cdot4+(-1)\cdot1+2\cdot8\\ 2\cdot4+0\cdot1+1\cdot8 \end{bmatrix} = \begin{bmatrix}19\\16\end{bmatrix}.

El producto de matrices produce el mismo punto final sin materializar el vector intermedio:

Cx=[−11046][12]=[1916].C\boldsymbol{x} = \begin{bmatrix}-1&10\\4&6\end{bmatrix} \begin{bmatrix}1\\2\end{bmatrix} = \begin{bmatrix}19\\16\end{bmatrix}.

El orden no es decorativo. El producto inverso es válido aquí, pero tiene una forma y un significado distintos:

BA=[4−251−35804]∈R3×3.BA= \begin{bmatrix} 4 & -2 & 5\\ 1 & -3 & 5\\ 8 & 0 & 4 \end{bmatrix}\in\mathbb{R}^{3\times3}.

BABA asigna R3\mathbb{R}^{3} a R3\mathbb{R}^{3}, por lo que no puede sustituir a ABAB para el vector de dos coordenadas x\boldsymbol{x}. La sección 2.2 del libro también destaca que la multiplicación de matrices, en general, no es conmutativa; la imagen de dominios y codominios explica por qué intercambiar el orden cambia el cálculo (PDF del libro).

La contracción es un lote de productos matriz-vector

Supón que hay tres ejemplos, cada uno con tres características. Coloca un ejemplo por fila:

X=[120012−101]∈R3×3.X= \begin{bmatrix} 1&2&0\\ 0&1&2\\ -1&0&1 \end{bmatrix}\in\mathbb{R}^{3\times3}.

Usa la AA anterior como matriz de pesos de una capa densa y llámala WW. Tiene forma (2,3)(2,3): tres características de entrada y dos puntuaciones de salida. Un cálculo por lotes orientado a filas necesita la traspuesta WTW^{\mathsf T}:

XWT=[120012−101][12−1021]=[−12321−1].XW^{\mathsf T} = \begin{bmatrix} 1&2&0\\ 0&1&2\\ -1&0&1 \end{bmatrix} \begin{bmatrix} 1&2\\ -1&0\\ 2&1 \end{bmatrix} = \begin{bmatrix} -1&2\\ 3&2\\ 1&-1 \end{bmatrix}.

El cálculo de formas es

(3×3)(3×2)⟶(3×2).(3\times3)(3\times2)\longrightarrow(3\times2).

La primera dimensión, 33, es el número de ejemplos. La segunda dimensión, 22, es el número de puntuaciones de salida por ejemplo. Al sumar un vector de sesgo

b=[1−1]\boldsymbol{b}=\begin{bmatrix}1&-1\end{bmatrix}

a cada fila se obtiene

Y=XWT+b=[01412−2].Y=XW^{\mathsf T}+\boldsymbol{b} = \begin{bmatrix} 0&1\\ 4&1\\ 2&-2 \end{bmatrix}.

Las reglas de broadcasting de NumPy permiten que un sesgo de forma (2,)(2,) se alinee con el último eje de cada fila de forma (3,2)(3,2) (documentación de broadcasting). El producto de matrices sigue siendo la contracción; la suma del sesgo es una operación elemento a elemento separada.

Esta convención de lotes por filas también es la que expone torch.nn.Linear: con in_features=3 y out_features=2, PyTorch almacena un peso de forma (2,3)(2,3) y calcula y=xWT+by=xW^{\mathsf T}+b. Por tanto, una entrada de forma (3,3)(3,3) devuelve una salida de forma (3,2)(3,2). La traspuesta conecta la convención matemática de vectores columna con la convención de implementación en la que cada muestra es una fila. Para tensores con más dimensiones de lote, torch.matmul conserva los dos últimos ejes para el producto de matrices y hace broadcasting de los ejes de lote iniciales compatibles.

Hay otra manera de ver el mismo resultado. Las columnas de BB son dos entradas de tres coordenadas para la aplicación AA. Coloca esas entradas en filas trasponiendo BB:

BTAT=[2301−14][12−1021]=[−14106]=CT.B^{\mathsf T}A^{\mathsf T} = \begin{bmatrix} 2&3&0\\ 1&-1&4 \end{bmatrix} \begin{bmatrix} 1&2\\ -1&0\\ 2&1 \end{bmatrix} = \begin{bmatrix} -1&4\\ 10&6 \end{bmatrix} =C^{\mathsf T}.

Cada fila de BTB^{\mathsf T} es una columna de BB, y cada fila de CTC^{\mathsf T} es la salida correspondiente de AA para esa entrada. La identidad (AB)T=BTAT(AB)^{\mathsf T}=B^{\mathsf T}A^{\mathsf T} es, por tanto, el puente entre “columnas como entradas separadas” y “filas como un lote”.

NumPy hace comprobable la contracción

El siguiente programa pequeño escribe explícitamente los tres bucles anidados y los comprueba frente a NumPy. También comprueba la identidad de lotes y mantiene visible por separado el operador elemento a elemento. El quickstart de NumPy introduce la misma distinción entre operaciones elemento a elemento y productos de matrices.

import numpy as np

A = np.array([[1, -1, 2], [2, 0, 1]])
B = np.array([[2, 1], [3, -1], [0, 4]])

def matrix_product_by_loops(left, right):
    if left.shape[1] != right.shape[0]:
        raise ValueError("inner dimensions do not match")

    result = np.zeros((left.shape[0], right.shape[1]), dtype=int)
    for i in range(left.shape[0]):
        for j in range(right.shape[1]):
            for ell in range(left.shape[1]):
                result[i, j] += left[i, ell] * right[ell, j]
    return result

C_by_loops = matrix_product_by_loops(A, B)
C = A @ B
np.testing.assert_array_equal(C_by_loops, C)
np.testing.assert_array_equal(B.T @ A.T, C.T)

print(C)
print("elementwise A * B.T has shape", (A * B.T).shape)

try:
    A @ np.ones((2, 2), dtype=int)
except ValueError as error:
    print(type(error).__name__, "for incompatible inner dimensions")

El programa imprime

[[-1 10]
 [ 4  6]]
elementwise A * B.T has shape (2, 3)
ValueError for incompatible inner dimensions

La llamada no válida falla porque AA tiene tres columnas, mientras que el segundo operando tiene dos filas. La expresión elemento a elemento A * B.T no falla aquí porque ambas matrices tienen forma (2,3)(2,3); produce

A∗BT=[2−30204],A\mathbin{*}B^{\mathsf T} = \begin{bmatrix}2&-3&0\\2&0&4\end{bmatrix},

que no contiene una suma fila por columna sobre tres términos. NumPy documenta multiply como una multiplicación elemento a elemento (referencia). El hecho de que dos operadores acepten los mismos operandos no demuestra que representen la misma operación matemática.

Los resultados identidad y cero son casos límite útiles

Dos casos límite aclaran la regla de las formas. Primero, una matriz identidad compatible no cambia los valores:

I2C=C=CI2,I2=[1001].I_2C=C=CI_2, \qquad I_2=\begin{bmatrix}1&0\\0&1\end{bmatrix}.

La identidad de la izquierda tiene que tener aquí dos filas y dos columnas porque CC es (2,2)(2,2). En general, ImA=AI_mA=A para A∈Rm×nA\in\mathbb{R}^{m\times n} y AIn=AAI_n=A cuando las dimensiones encajan. Las matrices identidad conservan un producto válido; no reparan uno no válido.

Segundo, un producto válido puede estar formado completamente por ceros porque los términos se cancelan. Sean

P=[1−100],Q=[3333].P=\begin{bmatrix}1&-1\\0&0\end{bmatrix}, \qquad Q=\begin{bmatrix}3&3\\3&3\end{bmatrix}.

Entonces

PQ=[1⋅3+(−1)⋅31⋅3+(−1)⋅300]=[0000].PQ=\begin{bmatrix}1\cdot3+(-1)\cdot3&1\cdot3+(-1)\cdot3\\0&0\end{bmatrix} =\begin{bmatrix}0&0\\0&0\end{bmatrix}.

Las dimensiones internas coinciden, así que el resultado cero es un cálculo, no un error de formas. Al depurar una capa densa, comprueba ambos tipos de evidencia: el contrato de formas indica si la operación es legal, mientras que los valores reales indican si la cancelación, un peso cero o un problema con los datos explica la salida.

El hábito reutilizable es breve: nombra la forma izquierda, nombra la forma derecha, iguala las dimensiones internas, conserva las dimensiones externas y calcula cada elemento de salida a partir de una fila izquierda y una columna derecha. Este hábito escala desde el ejemplo pequeño trabajado hasta X @ W.T + b, una composición de aplicaciones aprendidas y operaciones tensoriales por lotes más grandes.

Comprueba tu comprensión

Pregunta 1

Si L tiene forma 4 × 3 y R tiene forma 3 × 5, ¿qué forma tiene LR y cuántas multiplicaciones escalares se necesitan para el producto completo?

Mostrar la solución paso a paso

Paso 1: comprueba el eje compartido. La matriz izquierda tiene 3 columnas y la matriz derecha tiene 3 filas, por lo que las dimensiones internas coinciden.

Paso 2: conserva los ejes externos. El producto tiene forma (4,5)(4,5).

Paso 3: cuenta el trabajo. Hay 4⋅5=204\cdot5=20 elementos de salida. Cada uno usa un producto escalar de longitud 3, así que el cálculo directo utiliza 20⋅3=6020\cdot3=60 multiplicaciones escalares.

Pregunta 2

Calcula P Q para P = [[1, 0, −2], [2, 1, 1]] y Q = [[3, 1], [0, −2], [4, 2]].

Mostrar la solución paso a paso

Paso 1: predice la forma. Las formas son (2,3)(2,3) y (3,2)(3,2), por lo que el resultado debe ser (2,2)(2,2).

Paso 2: calcula la fila 1. Sus elementos son 1⋅3+0⋅0+(−2)⋅4=−51\cdot3+0\cdot0+(-2)\cdot4=-5 y 1⋅1+0⋅(−2)+(−2)⋅2=−31\cdot1+0\cdot(-2)+(-2)\cdot2=-3.

Paso 3: calcula la fila 2. Sus elementos son 2⋅3+1⋅0+1⋅4=102\cdot3+1\cdot0+1\cdot4=10 y 2⋅1+1⋅(−2)+1⋅2=22\cdot1+1\cdot(-2)+1\cdot2=2.

Por tanto,

PQ=[−5−3102].PQ=\begin{bmatrix}-5&-3\\10&2\end{bmatrix}.

Pregunta 3

Una capa densa almacena W con forma (2, 3), recibe X con forma (4, 3) y tiene un sesgo b con forma (2,). ¿Qué producto y forma de salida debes usar?

Mostrar la solución paso a paso

Paso 1: conecta las convenciones. Como los ejemplos son filas, transpón la matriz de pesos: WTW^{\mathsf T} tiene forma (3,2)(3,2).

Paso 2: multiplica el lote.XWTXW^{\mathsf T} tiene forma (4,3)(3,2)→(4,2)(4,3)(3,2)\to(4,2).

Paso 3: suma el sesgo por filas. El sesgo tiene dos elementos, que coinciden con las dos características de salida, así que XWT+bXW^{\mathsf T}+b sigue teniendo forma (4,2)(4,2). El 4 inicial cuenta los ejemplos; no forma parte de la forma de los pesos aprendidos.

Pregunta 4

Para las A y B de la lección, ¿por qué Bᵀ Aᵀ es igual a (A B)ᵀ y qué representa cada fila de Bᵀ?

Mostrar la solución paso a paso

Paso 1: transpón los factores en orden inverso. Transponer ABAB da (AB)T=BTAT(AB)^{\mathsf T}=B^{\mathsf T}A^{\mathsf T}.

Paso 2: identifica las filas. Cada fila de BTB^{\mathsf T} es una columna de BB, por lo que es una entrada de tres coordenadas para la aplicación AA.

Paso 3: lee las salidas. Cada fila correspondiente de BTATB^{\mathsf T}A^{\mathsf T} es la salida para esa entrada según la convención de lotes por filas. Numéricamente,

BTAT=[−14106]=[−11046]T.B^{\mathsf T}A^{\mathsf T} =\begin{bmatrix}-1&4\\10&6\end{bmatrix} =\begin{bmatrix}-1&10\\4&6\end{bmatrix}^{\mathsf T}.

Pregunta 5

Usando las A, B y x = [1, 2]ᵀ de la lección, ¿qué aplicación actúa primero en (A B)x y cuál es el vector final?

Mostrar la solución paso a paso

Paso 1: lee el orden. El factor situado más a la derecha actúa primero, así que calcula BxB\boldsymbol{x} antes de aplicar AA.

Paso 2: calcula el vector intermedio.

Bx=[418].B\boldsymbol{x}=\begin{bmatrix}4\\1\\8\end{bmatrix}.

Paso 3: aplica la segunda aplicación.

A(Bx)=[1916].A(B\boldsymbol{x}) =\begin{bmatrix}19\\16\end{bmatrix}.

Así, ABAB representa “BB primero y después AA”, y el vector final es [19,16]T[19,16]^{\mathsf T}.

Pregunta 6

¿Por qué A * Bᵀ no es la misma operación que A B, aunque ambas expresiones se aceptan para las matrices de la lección?

Mostrar la solución paso a paso

Paso 1: compara las formas.AA y BTB^{\mathsf T} tienen ambas la forma (2,3)(2,3).

Paso 2: identifica el operador.* es una multiplicación elemento a elemento, por lo que multiplica los seis pares alineados y conserva la forma (2,3)(2,3). No empareja una fila con una columna ni suma tres términos.

Paso 3: contrasta el producto de matrices.A @ B usa formas (2,3)(2,3) y (3,2)(3,2), contrae la dimensión compartida y devuelve (2,2)(2,2). Para estos valores, A∗BT=[2−30204]A*B^{\mathsf T}=\begin{bmatrix}2&-3&0\\2&0&4\end{bmatrix}, mientras que AB=[−11046]AB=\begin{bmatrix}-1&10\\4&6\end{bmatrix}.

Pregunta 7

A tiene forma (2, 3) y D tiene forma (2, 2). ¿Por qué falla A @ D y es válido D @ A?

Mostrar la solución paso a paso

Paso 1: prueba ADA D. Las dimensiones internas serían 3 y 2. Son distintas, por lo que ninguna fila de AA puede emparejarse con una columna completa de DD usando la regla del producto de matrices; A @ D no es válido.

Paso 2: prueba DAD A. Ahora las dimensiones internas son 2 y 2, así que el producto es válido y tiene forma externa (2,3)(2,3).

Paso 3: conserva el orden. Invertirlo puede cambiar la validez y siempre cambia la aplicación representada. No es una reparación general intercambiar los factores hasta que las formas encajen por casualidad.

Pregunta 8

Para P = [[1, −1], [0, 0]] y Q = [[3, 3], [3, 3]], ¿por qué P Q puede ser la matriz cero aunque el producto sea válido? ¿Qué hace I₂ C?

Mostrar la solución paso a paso

Paso 1: comprueba el producto. Ambas matrices tienen forma (2,2)(2,2), así que las dimensiones internas coinciden.

Paso 2: explica el cero. Cada elemento de la primera fila de salida es 1⋅3+(−1)⋅3=01\cdot3+(-1)\cdot3=0, y la segunda fila aporta cero directamente. Por tanto, PQPQ es cero por la cancelación y las entradas cero, no porque las formas fueran incompatibles.

Paso 3: aplica la identidad. Con I2=[1001]I_2=\begin{bmatrix}1&0\\0&1\end{bmatrix} y CC de forma (2,2)(2,2), I2C=CI_2C=C. La identidad conserva un producto compatible; no cambia los valores ni corrige una incompatibilidad.

Pregunta 9

Para torch.nn.Linear(3, 2), un lote tiene forma (5, 3). Indica la forma de los pesos, la forma del sesgo, la forma de salida y la fórmula del lote por filas.

Mostrar la solución paso a paso

Paso 1: lee los parámetros de la capa.in_features=3 y out_features=2 significan que los pesos aprendidos tienen forma (2,3)(2,3) y el sesgo tiene forma (2,)(2,).

Paso 2: transpón para entradas en filas. Un lote de cinco filas tiene forma (5,3)(5,3), así que al multiplicar por WTW^{\mathsf T} se usa (5,3)(3,2)(5,3)(3,2).

Paso 3: expresa el resultado. La salida tiene forma (5,2)(5,2) y la fórmula es Y=XWT+bY=XW^{\mathsf T}+b. El cinco sigue siendo la dimensión del lote; cada fila recibe dos características de salida y el sesgo de dos elementos se suma a cada fila.

Fuentes

  1. Mathematics for Machine Learning companion website
  2. Mathematics for Machine Learning book PDF
  3. NumPy documentation: numpy.matmul
  4. NumPy documentation: numpy.multiply
  5. NumPy quickstart: elementwise and matrix products
  6. NumPy documentation: broadcasting
  7. PyTorch documentation: torch.nn.Linear
  8. PyTorch documentation: torch.matmul