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.
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
El producto está definido porque el número de columnas de coincide con el número de filas de . Su forma conserva las dos dimensiones externas:
La dimensión compartida indica cuántos pares alineados se multiplican y suman para cada elemento de salida. Las dimensiones externas y indican cuántas filas y columnas tiene el resultado. En otras palabras, la forma de salida es , no ni .
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.
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
| Elemento de salida | Fila izquierda | Columna derecha | Producto 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 |
| Fila del lote | Fila 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
La comprobación de formas va primero:
Las dos dimensiones internas son , 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, no es “la segunda multiplicación” de una lista aplanada; es el elemento de la fila , columna , y siempre empareja la fila de con la columna de .
El mismo producto compone transformaciones en un orden fijo
Las formas de las matrices también describen dominios y codominios. Aquí asigna a , mientras que asigna a :
Por tanto, es la matriz única de “aplicar y después aplicar ”. Para
el vector intermedio es
Al aplicar después se obtiene
El producto de matrices produce el mismo punto final sin materializar el vector intermedio:
El orden no es decorativo. El producto inverso es válido aquí, pero tiene una forma y un significado distintos:
asigna a , por lo que no puede sustituir a para el vector de dos coordenadas . 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:
Usa la anterior como matriz de pesos de una capa densa y llámala . Tiene forma : tres características de entrada y dos puntuaciones de salida. Un cálculo por lotes orientado a filas necesita la traspuesta :
El cálculo de formas es
La primera dimensión, , es el número de ejemplos. La segunda dimensión, , es el número de puntuaciones de salida por ejemplo. Al sumar un vector de sesgo
a cada fila se obtiene
Las reglas de broadcasting de NumPy permiten que un sesgo de forma se alinee con el último eje de cada fila de forma (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 y calcula . Por tanto, una entrada de forma devuelve una salida de forma . 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 son dos entradas de tres coordenadas para la aplicación . Coloca esas entradas en filas trasponiendo :
Cada fila de es una columna de , y cada fila de es la salida correspondiente de para esa entrada. La identidad 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 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 ; produce
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:
La identidad de la izquierda tiene que tener aquí dos filas y dos columnas porque es . En general, para y 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
Entonces
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 .
Paso 3: cuenta el trabajo. Hay elementos de salida. Cada uno usa un producto escalar de longitud 3, así que el cálculo directo utiliza 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 y , por lo que el resultado debe ser .
Paso 2: calcula la fila 1. Sus elementos son y .
Paso 3: calcula la fila 2. Sus elementos son y .
Por tanto,
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: tiene forma .
Paso 2: multiplica el lote. tiene forma .
Paso 3: suma el sesgo por filas. El sesgo tiene dos elementos, que coinciden con las dos características de salida, así que sigue teniendo forma . 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 da .
Paso 2: identifica las filas. Cada fila de es una columna de , por lo que es una entrada de tres coordenadas para la aplicación .
Paso 3: lee las salidas. Cada fila correspondiente de es la salida para esa entrada según la convención de lotes por filas. Numéricamente,
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 antes de aplicar .
Paso 2: calcula el vector intermedio.
Paso 3: aplica la segunda aplicación.
Así, representa “ primero y después ”, y el vector final es .
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. y tienen ambas la forma .
Paso 2: identifica el operador.* es una multiplicación elemento a elemento, por lo que multiplica los seis pares alineados y conserva la forma . No empareja una fila con una columna ni suma tres términos.
Paso 3: contrasta el producto de matrices.A @ B usa formas y , contrae la dimensión compartida y devuelve . Para estos valores, , mientras que .
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 . Las dimensiones internas serían 3 y 2. Son distintas, por lo que ninguna fila de puede emparejarse con una columna completa de usando la regla del producto de matrices; A @ D no es válido.
Paso 2: prueba . Ahora las dimensiones internas son 2 y 2, así que el producto es válido y tiene forma externa .
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 , así que las dimensiones internas coinciden.
Paso 2: explica el cero. Cada elemento de la primera fila de salida es , y la segunda fila aporta cero directamente. Por tanto, es cero por la cancelación y las entradas cero, no porque las formas fueran incompatibles.
Paso 3: aplica la identidad. Con y de forma , . 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 y el sesgo tiene forma .
Paso 2: transpón para entradas en filas. Un lote de cinco filas tiene forma , así que al multiplicar por se usa .
Paso 3: expresa el resultado. La salida tiene forma y la fórmula es . 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
- Mathematics for Machine Learning companion website
- Mathematics for Machine Learning book PDF
- NumPy documentation: numpy.matmul
- NumPy documentation: numpy.multiply
- NumPy quickstart: elementwise and matrix products
- NumPy documentation: broadcasting
- PyTorch documentation: torch.nn.Linear
- PyTorch documentation: torch.matmul