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

Transpuesta para IA: reorientar las relaciones entre tokens y características

Transponer una matriz, predecir su forma y cambiar con seguridad entre las vistas token por característica y característica por token sin perder de vista los valores subyacentes.

Comparte este artículo

Supón que un lote contiene dos tokens y que cada token está representado por tres características. Almacenas los datos como dos filas y tres columnas. Sin embargo, una operación posterior está escrita para comparar las características entre tokens. ¿Han cambiado los datos o la operación necesita una orientación diferente?

La respuesta suele ser una transposición: los mismos seis valores se leen intercambiando filas y columnas. Esta pequeña operación es una herramienta importante para depurar formas en aprendizaje automático, porque el significado de los ejes forma parte del contrato de un tensor.

Al terminar esta lección podrás transponer una matriz, predecir la forma de salida, explicar qué cambia semánticamente y elegir entre las disposiciones token por característica y característica por token sin perder de vista los valores subyacentes.

Resultado de aprendizaje: Transponer una matriz y explicar qué cambia semánticamente.

La lección 18: Las matrices organizan reglas lineales introdujo las filas y columnas como posiciones con significado dentro de una matriz. Los ejemplos y la visualización de esta lección son aplicaciones originales de la notación de transpuesta desarrollada en la sección 2.2 de Mathematics for Machine Learning.

Una matriz almacena relaciones a lo largo de sus ejes

Comienza con una matriz XX cuya forma es 2×32\times3:

X=[2−10431].X = \begin{bmatrix} 2 & -1 & 0\\ 4 & 3 & 1 \end{bmatrix}.

La primera dimensión tiene longitud 22, por lo que hay dos filas. La segunda tiene longitud 33, por lo que hay tres columnas. La forma solo nos dice cuáles son las dimensiones; las etiquetas nos dicen qué significan. En esta lección, cada fila representa un token y cada columna representa una característica:

f1f_1f2f_2f3f_3
t1t_12−10
t2t_2431

La entrada X2,3=1X_{2,3}=1 significa «fila 2, columna 3»: la tercera característica del segundo token. Los índices no son decorativos. Si el código trata después las columnas como tokens, los números pueden seguir pareciendo razonables mientras el modelo lee las relaciones equivocadas.

Definición: la transpuesta intercambia posiciones, no valores

La transpuesta de una matriz XX se escribe XTX^{\mathsf T}. Su regla definitoria es

(XT)j,i=Xi,j.\left(X^{\mathsf T}\right)_{j,i}=X_{i,j}.

En palabras, la entrada que está en la fila ii, columna jj pasa a la fila jj, columna ii. Por tanto, si XX tiene forma m×nm\times n, entonces XTX^{\mathsf T} tiene forma n×mn\times m:

X∈Rm×n⟹XT∈Rn×m.X\in\mathbb{R}^{m\times n} \quad\Longrightarrow\quad X^{\mathsf T}\in\mathbb{R}^{n\times m}.

La transpuesta no cambia el signo, ordena, escala ni vuelve a calcular ninguna entrada. Reorienta la relación entre una entrada y las etiquetas de su fila y su columna.

Los seis valores permanecen fijos mientras se intercambian los papeles de filas y columnas. La sección desplegable nativa bajo los paneles ofrece un mapeo exacto de celdas para quienes no usan color ni gráficos interactivos.

X: tokens por filas y características por columnas

Dos filas de tokens, con una característica en cada columna.

Matriz original X, forma 2 por 3
Tokenf₁f₂f₃
t₁2−10
t₂431

Token → rows · Característica → columns

Xᵀ: características por filas y tokens por columnas

Tres filas de características, con un token en cada columna.

Matriz transpuesta Xᵀ, forma 3 por 2
Característicat₁t₂
f₁24
f₂−13
f₃01

Característica → rows · Token → columns

Correspondencia de celdas:X[2, 3] = 1 se convierte en Xᵀ[3, 2] = 1: el valor conserva su identidad, mientras sus coordenadas se intercambian.

Inspecciona una celda paso a paso

El valor del segundo token y la tercera característica pasa a la tercera fila y segunda columna después de la transposición.

Antes
X[2, 3] = 1
Después
Xᵀ[3, 2] = 1

La visualización usa etiquetas, y no el color, como señal principal. Sus dos tablas semánticas también son una alternativa completa: el lector puede verificar cada valor, dimensión y significado de los ejes sin JavaScript. La sección desplegable es un control nativo operable con el teclado, y el componente no tiene movimiento continuo que interfiera con las preferencias de movimiento reducido.

Ejemplo resuelto: transponer una matriz 2×32\times3

Aplica la definición posición por posición. La primera fila de XTX^{\mathsf T} procede de la primera columna de XX:

(XT)1,1=X1,1=2,(XT)1,2=X2,1=4.\left(X^{\mathsf T}\right)_{1,1}=X_{1,1}=2, \qquad \left(X^{\mathsf T}\right)_{1,2}=X_{2,1}=4.

La segunda fila procede de la segunda columna:

(XT)2,1=X1,2=−1,(XT)2,2=X2,2=3.\left(X^{\mathsf T}\right)_{2,1}=X_{1,2}=-1, \qquad \left(X^{\mathsf T}\right)_{2,2}=X_{2,2}=3.

La tercera fila procede de la tercera columna:

(XT)3,1=X1,3=0,(XT)3,2=X2,3=1.\left(X^{\mathsf T}\right)_{3,1}=X_{1,3}=0, \qquad \left(X^{\mathsf T}\right)_{3,2}=X_{2,3}=1.

Al reunir esas entradas obtenemos

XT=[24−1301],XT∈R3×2.X^{\mathsf T}= \begin{bmatrix} 2 & 4\\ -1 & 3\\ 0 & 1 \end{bmatrix}, \qquad X^{\mathsf T}\in\mathbb{R}^{3\times2}.

Dos comprobaciones detectan la mayoría de los errores de cálculo manual. Primero, la forma se invierte de 2×32\times3 a 3×23\times2. Segundo, leer hacia abajo una columna de XTX^{\mathsf T} debería recuperar una fila de XX: su primera columna es [2,4]T[2,4]^{\mathsf T}, que era la primera fila de XX.

Por qué importa la orientación en los datos de IA

Un lote organizado por filas facilita una operación común. Si X∈Rb×dX\in\mathbb{R}^{b\times d} almacena bb ejemplos con dd características y una matriz de pesos de características a salidas W∈Rk×dW\in\mathbb{R}^{k\times d}, suele aplicarse como

Y=XWT,(b×d)(d×k)=(b×k).Y=XW^{\mathsf T}, \qquad (b\times d)(d\times k)=(b\times k).

Aquí la transpuesta no cambia los números aprendidos. Hace que el eje de características de los pesos coincida con las columnas de características de la matriz del lote. La salida tiene bb filas, una por ejemplo, y kk columnas, una por característica de salida.

Los mismos datos pueden almacenarse con las características primero como XT∈Rd×bX^{\mathsf T}\in\mathbb{R}^{d\times b}. Esta vista es útil cuando la pregunta es «¿cómo varía cada característica entre los ejemplos?», pero no es intercambiable con la vista de lote por filas. Transpone siempre de vuelta, o escribe el producto usando la convención de características primero, antes de pasar el array a código que espera los ejemplos en las filas.

XTXX^{\mathsf T}X y XXTXX^{\mathsf T} plantean preguntas diferentes

La transpuesta aparece a menudo junto a un producto matricial. Sus formas revelan qué se compara:

XTX:(d×b)(b×d)=(d×d),X^{\mathsf T}X: \quad (d\times b)(b\times d)=(d\times d),

por lo que cada entrada compara dos características entre los bb ejemplos. En cambio,

XXT:(b×d)(d×b)=(b×b),XX^{\mathsf T}: \quad (b\times d)(d\times b)=(b\times b),

por lo que cada entrada compara dos ejemplos a través de sus dd características. Ningún producto está «más transpuesto» que el otro; responden a preguntas relacionales diferentes.

Para la matriz de esta lección,

XTX=[1021124−211−217]yXXT=[6−1−125].X^{\mathsf T}X= \begin{bmatrix} 10 & 2 & 11\\ 2 & 4 & -2\\ 11 & -2 & 17 \end{bmatrix} \quad\text{y}\quad XX^{\mathsf T}= \begin{bmatrix} 6 & -1\\ -1 & 25 \end{bmatrix}.

La primera es de 3×33\times3 porque hay tres características. La segunda es de 2×22\times2 porque hay dos tokens. Los números están relacionados, pero sus índices tienen significados diferentes.

Implementar el intercambio en NumPy

Para un pequeño ejemplo didáctico, un bucle explícito refleja la definición. Reserva la forma invertida y copia matrix[row, column] en result[column, row]:

import numpy as np

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

def transpose_by_loops(matrix):
    rows, columns = matrix.shape
    result = np.empty((columns, rows), dtype=matrix.dtype)
    for row in range(rows):
        for column in range(columns):
            result[column, row] = matrix[row, column]
    return result

X_T_by_loops = transpose_by_loops(X)
X_T = X.T

np.testing.assert_array_equal(X_T_by_loops, X_T)
np.testing.assert_array_equal(X_T.T, X)

feature_relationships = X.T @ X
token_relationships = X @ X.T
print(X_T)
print(feature_relationships.shape, token_relationships.shape)

El bucle sirve para entender, no para obtener velocidad de producción. ndarray.T de NumPy es la forma concisa de escribir transpose para un array bidimensional, mientras que np.transpose se generaliza a arrays con más ejes. La documentación oficial de NumPy señala un límite importante: transponer un array unidimensional no cambia su forma. Un vector con forma (3,) no tiene ejes independientes de fila y columna que intercambiar; usa vector[:, np.newaxis] para obtener una columna explícita de forma (3, 1) o vector[np.newaxis, :] para obtener una fila de forma (1, 3).

Cuando la siguiente operación es un producto matricial, distingue los operadores: @ significa multiplicación matricial, mientras que * es una multiplicación elemento a elemento. Por ejemplo, X.T @ X contrae el eje de tokens y devuelve una matriz (3, 3); X.T * X.T solo funciona cuando las formas coinciden y devuelve productos elemento a elemento. La referencia de transposición de NumPy, la referencia de .T y la referencia de producto matricial son las fuentes de implementación para estas diferencias.

Caso límite: la transpuesta no es una inversa

Es tentador llamar a XTX^{\mathsf T} la operación que «deshace» XX. En general, eso es incorrecto. Una transpuesta solo intercambia ejes. Una inversa, cuando existe, es una matriz diferente X−1X^{-1} que satisface

X−1X=IyXX−1=I.X^{-1}X=I \quad\text{y}\quad XX^{-1}=I.

Una inversa requiere una matriz cuadrada y no singular. Una matriz 2×32\times3 como la XX de esta lección no puede tener una inversa ordinaria por ambos lados, porque su forma ni siquiera coincide con la de una identidad cuadrada. Incluso para una matriz cuadrada, XTX^{\mathsf T} solo es la inversa en casos especiales, como cuando XX es ortogonal.

Hay otro caso límite en el código. La expresión X.T no presenta ambigüedad para una matriz bidimensional, pero vector.T no hace nada en un array unidimensional de NumPy. Si un modelo espera una columna de características, crea esa dimensión de forma explícita y comprueba array.shape antes del producto matricial. Un error de forma suele ser una evidencia útil de que se dejó implícita alguna convención de ejes.

La secuencia de depuración que conviene seguir es:

  1. Indica qué significa cada eje.
  2. Predice la nueva forma antes de transponer.
  3. Verifica a mano uno o dos mapeos de índices.
  4. Comprueba el contrato de formas del operador siguiente.
  5. Confirma que las filas y columnas resultantes siguen coincidiendo con la convención del modelo.

La lección 22 usará transformaciones identidad e inversas para analizar cuándo una operación lineal realmente puede deshacerse. La transpuesta es el puente cuidadoso: cambia la orientación para expresar la relación siguiente con ejes compatibles, pero no promete reversibilidad.

Comprueba tu comprensión

Question 1

Si A tiene forma 4 × 7, ¿qué forma tiene Aᵀ y adónde se desplaza la entrada A[3, 6]?

Show the step-by-step solution

Paso 1: invierte las dimensiones. La transposición cambia (m,n)(m,n) por (n,m)(n,m), así que una matriz 4×74\times7 se convierte en 7×47\times4.

Paso 2: intercambia los índices. La regla definitoria es (AT)j,i=Ai,j(A^{\mathsf T})_{j,i}=A_{i,j}. Por tanto, la entrada de la fila 3, columna 6 pasa a la fila 6, columna 3.

Paso 3: interpreta el resultado. El valor no cambia; solo se intercambian las posiciones de fila y columna y, por tanto, sus etiquetas.

Question 2

Transpone a mano M = [[5, −2, 1], [0, 4, 3]] e indica la forma del resultado.

Show the step-by-step solution

Paso 1: cuenta los ejes originales. MM tiene dos filas y tres columnas, así que su transpuesta debe tener tres filas y dos columnas.

Paso 2: copia las columnas como filas. La primera columna [5,0][5,0] se convierte en la primera fila; la segunda columna [−2,4][-2,4], en la segunda; la tercera columna [1,3][1,3], en la tercera.

Paso 3: escribe el resultado.

MT=[50−2413],MT∈R3×2.M^{\mathsf T}=\begin{bmatrix}5&0\\-2&4\\1&3\end{bmatrix}, \qquad M^{\mathsf T}\in\mathbb{R}^{3\times2}.

Question 3

Una matriz tiene filas para documentos y columnas para características del vocabulario. ¿Qué significan las filas y columnas después de transponerla?

Show the step-by-step solution

Paso 1: nombra los ejes originales. Antes de transponer, cada fila es un documento y cada columna es una característica del vocabulario.

Paso 2: aplica la regla de índices. Cada valor documento-característica pasa de (document,feature)(document, feature) a (feature,document)(feature, document).

Paso 3: expresa el nuevo significado. Después de transponer, cada fila es una característica del vocabulario y cada columna es un documento. Los valores no cambian, pero una operación por filas ahora agrega información entre documentos y no entre características. Por eso el significado de los ejes debe viajar con el array.

Question 4

¿Por qué (Aᵀ)ᵀ = A y qué no implica esta identidad?

Show the step-by-step solution

Paso 1: intercambia una vez. La primera transpuesta envía la entrada (i,j)(i,j) a (j,i)(j,i).

Paso 2: intercambia de nuevo. La segunda transpuesta devuelve esa misma entrada de (j,i)(j,i) a (i,j)(i,j). Cada valor regresa a su posición original.

Paso 3: mantén la distinción. Esta identidad dice que la transposición es una involución: aplicar dos veces el mismo intercambio de orientación devuelve la matriz. No dice que ATA^{\mathsf T} sea una inversa ni que la primera operación deshaga una transformación aprendida en el sentido de una matriz inversa.

Question 5

Para X con forma (8, 5), ¿qué formas tienen XᵀX y XXᵀ y qué compara cada par de índices?

Show the step-by-step solution

Paso 1: transpón la forma. XTX^{\mathsf T} tiene forma (5,8)(5,8).

Paso 2: multiplica en el primer orden. (5,8)(8,5)→(5,5)(5,8)(8,5)\to(5,5), así que XTXX^{\mathsf T}X compara pares de las cinco características entre los ocho ejemplos.

Paso 3: multiplica en el segundo orden. (8,5)(5,8)→(8,8)(8,5)(5,8)\to(8,8), así que XXTXX^{\mathsf T} compara pares de los ocho ejemplos a través de sus cinco características. Invertir el orden cambia la pregunta, no solo la notación.

Question 6

En NumPy, ¿por qué vector.T mantiene un vector de forma (3,) con forma (3,), mientras que vector[:, np.newaxis] tiene forma (3, 1)?

Show the step-by-step solution

Paso 1: inspecciona el número de ejes. La forma (3,) describe un solo eje de longitud tres. No hay ejes separados de fila y columna que .T pueda intercambiar.

Paso 2: observa el comportamiento de NumPy. La transpuesta unidimensional es una vista sin cambios, por lo que vector.T.shape sigue siendo (3,).

Paso 3: añade explícitamente el eje deseado. vector[:, np.newaxis] inserta un segundo eje después de las tres entradas y produce (3, 1). Es un vector columna explícito que puede participar en un producto matricial con la forma prevista.

Question 7

Un alumno dice que Xᵀ es la inversa de X porque aplicar dos veces la transposición devuelve X. ¿Cuál es la corrección precisa?

Show the step-by-step solution

Paso 1: separa las identidades. (XT)T=X(X^{\mathsf T})^{\mathsf T}=X significa que dos intercambios de ejes restauran las posiciones originales.

Paso 2: indica el requisito de una inversa. Una inversa debe multiplicarse por XX para producir una matriz identidad en el lado correspondiente.

Paso 3: usa el caso límite. La matriz 2×32\times3 de esta lección no es cuadrada, por lo que no puede tener una inversa ordinaria por ambos lados. Incluso una matriz cuadrada no tiene por qué ser igual a la inversa de su transpuesta. La transpuesta es una operación de orientación; la inversa es una propiedad de reversibilidad.

Question 8

Un lote X tiene forma (32, 768) y una matriz de pesos W tiene forma (256, 768). ¿Por qué X @ W no es válido y qué transpuesta produce la salida habitual de un lote por filas?

Show the step-by-step solution

Paso 1: comprueba el producto intentado. Las formas son (32,768)(32,768) y (256,768)(256,768). La multiplicación matricial necesita que las columnas de la izquierda, 768, sean iguales a las filas de la derecha, 256. No lo son, así que X @ W no es válido.

Paso 2: transpón los pesos. WTW^{\mathsf T} tiene forma (768,256)(768,256).

Paso 3: comprueba el producto corregido. (32,768)(768,256)→(32,256)(32,768)(768,256)\to(32,256). Las 32 filas siguen siendo ejemplos y las 256 columnas son características de salida. La transpuesta corrige la convención de ejes, no los valores de los pesos aprendidos.

Fuentes

  1. Mathematics for Machine Learning companion website
  2. Mathematics for Machine Learning book PDF
  3. NumPy documentation: numpy.transpose
  4. NumPy documentation: ndarray.T
  5. NumPy documentation: numpy.matmul