¿Cómo explicarías un tensor a un científico de la computación? Mi amigo, que estudia ciencias de la computación, recientemente me preguntó qué era un tensor. Yo estudio física, e hice mi mejor esfuerzo para explicar qué es un tensor, y dije algo así como "un objeto matemático que se describe entre los mapeos de espacios vectoriales", y él no quedó muy convencido con esa definición. Entendí por qué, ya que es una definición bastante extensa que di, así que decidí dar una definición más simple, describiendo un tensor como un tipo de matriz con n-dimensiones. Sin embargo, él todavía estaba un poco confundido. ¿Alguien puede resumir una definición adecuada, adaptada a la comprensión de un científico de la computación?
Respuestas
¿Demasiados anuncios?Una definición matemática precisa de un producto tensorial no es trivial, ciertamente no es trivial de entender. Luego, trabajar con tensores también requiere comprender el concepto de un espacio vectorial y su dual, y así sucesivamente. Ese no es un camino obvio, o productivo, a tomar para un científico de la computación, aunque solo una comprensión de todo esto revelará el por qué detrás de las operaciones tensoriales que se pueden encontrar en bibliotecas de software.
Desde una perspectiva de ciencias de la computación, explicaría que los tensores son, de hecho, matrices multidimensionales más una serie de operaciones básicas en ellas que resultaron ser muy útiles en muchas aplicaciones. Por ejemplo, la mayoría de las operaciones en una biblioteca popular como numpy se pueden construir a partir de los siguientes bloques de construcción (no es una lista exhaustiva):
- Reordenamiento de índices.
- Aplicación de un operador binario $\star$ a matrices con dimensiones iguales: $(A \star B)[I] = A[I] \star B[I]$.
- Producto tensorial libre de matrices: $(A\otimes B)[I,J] = A[I] \cdot B[J]$.
- Introducción de índices adicionales de cualquier dimensión: $A’[I,J] = A[I]$.
- Contracción de dos índices con dimensión igual: $A’[I] = \sum_k A[k, k, I]$.
Por supuesto, también hay algunas operaciones no tan triviales en ciertos tensores, como la inversión o la factorización $QR$, y así sucesivamente. Sin embargo, comprender cómo una biblioteca soporta las operaciones anteriores hará que sea mucho más fácil de entender. Las a menudo innumerables funciones que ofrece una biblioteca son en su mayoría solo combinaciones ingeniosas y optimizadas de estas operaciones básicas. Por ejemplo, una multiplicación de matrices es una combinación de un producto tensorial libre y una contracción. La traza de una matriz cuadrada es una contracción. Y así sucesivamente.
Si tu amigo es un científico informático, entonces debería estar bien familiarizado con el concepto de escalares, vectores y matrices. VEO UN tensor como una generalización de escalares, vectores y matrices a dimensiones superiores. En otras palabras, un tensor es una matriz multidimensional.
Un escalar es un número único. Puedes ver un escalar como un caso especial de un vector, es decir, un vector con una sola dimensión de tamaño $1$. Entonces, un vector es una generalización de un escalar.
Un vector es una colección ordenada de números en una dimensión única. Puedes ver un vector como un caso especial de una matriz, es decir, una matriz con una dimensión única de cualquier tamaño $n \ge 1$. Entonces, una matriz es una generalización de un vector.
Pero una matriz es una matriz restringida a dos dimensiones, cada una con su propio tamaño. Un tensor extiende la noción de una matriz de manera análoga a cómo un vector extiende la noción de un escalar y una matriz extiende la noción de un vector. Un tensor puede tener cualquier número de dimensiones, cada una con su propio tamaño. Un tensor tridimensional se puede visualizar como una pila de matrices, o un cuboide de números con cualquier ancho, largo y alto. Un tensor tetradiomensional se puede visualizar como una secuencia de cuboides, cada uno con un ancho, largo y alto fijos. Un tensor pentadimensional se puede visualizar como una matriz en la que cada entrada es un cuboide, y así sucesivamente. Creo que la imagen de abajo es un buen resumen...
Observa que un tensor unidimensional es el vector familiar, y un tensor bidimensional es la matriz familiar.
Finalmente, de la misma manera que los escalares, vectores y matrices se pueden multiplicar entre sí para mapear objetos entre espacios vectoriales (o para mapear objetos en el mismo espacio vectorial), la multiplicación con un tensor no es diferente. Hay matices e ideas adicionales relacionadas con el uso y la funcionalidad de los tensores (ver respuesta de WimC para un resumen conciso), pero creo que la explicación que proporcioné ayudará a tu amigo a tener un buen comienzo.
Cuando se le dice a un científico de la computación sobre un objeto matemático, puede ser útil especificar primero el tipo de este objeto. Si el objeto es una función, ¿cuáles son los tipos de sus entradas y salidas? Si el objeto es una tupla, ¿cuáles son los tipos de sus coordenadas?
Lo que podría hacer que responder a esta pregunta sea difícil es que hay varias definiciones aceptadas de tensores, y estas definiciones dan diferentes respuestas a la pregunta "¿Cuál es el tipo de un tensor?" Sin embargo, se puede demostrar que hay una correspondencia natural entre estas definiciones.
Como analogía, piensa en cómo, dado un espacio vectorial de $n$ dimensiones $V$ sobre un campo $F$, hay una correspondencia natural entre las transformaciones lineales de $V$ a $V$ y las matrices de $n \times n$ elementos de $F$. Debido a esta correspondencia, a menudo pensamos en las transformaciones lineales y las matrices de manera intercambiable.
Nota que esta "correspondencia natural" depende de una elección de base para $V$; es decir, no tenemos una manera natural de identificar transformaciones lineales con matrices a menos que hayamos especificado una base para $V$.
Las dos definiciones de tensores son las siguientes:
-
Dado un espacio vectorial $V$ sobre un campo $F$, un tensor $(p,q)$ es un mapa multilineal $T: \overbrace{V^* \times \dots \times V^*} \times \overbrace{V \times \dots \times V }\to F$, donde $V^*$ denota el espacio dual de $V$, y un mapa multilineal es un mapa que es lineal en cada coordenada.
-
Dado un espacio vectorial de $n$ dimensiones $V$ sobre un campo $F$ con base $B$, un tensor $(p,q)$ es un arreglo de $\overbrace{(p+q) \times \dots \times (p+q)}^n$ elementos de $F$.
Así como se puede demostrar que hay una correspondencia natural entre transformaciones lineales y matrices, se puede demostrar que hay una correspondencia natural entre mapas multilineales y arreglos multidimensionales, lo que significa que estas definiciones son básicamente intercambiables.
Hay aplicaciones de tensores a la ciencia de la computación. No sé mucho sobre estas aplicaciones, pero creo que surgen cuando los datos se almacenan en un arreglo multidimensional y se quiere estudiar las propiedades multilíneo-algebraicas de este arreglo.
Para un científico de la computación:
Un tensor es para un vector (o matriz) lo que una fábrica[1] es para un objeto.
Un tensor n-dimensional acepta el sistema de coordenadas de tu pantalla y devuelve un array n-dimensional que representa una cantidad geométrica independiente del sistema de coordenadas que elijas. Esta cantidad geométrica siempre es la misma, pero su representación cambia porque tu sistema de coordenadas cambió.
Entonces, todos los tensores se ven como arrays n dimensionales (vectores, matrices, etc), pero para calificar como un tensor, los números en ese array deben cambiar consistentemente cuando eliges un sistema de coordenadas diferente.
Ejemplo:
Considera el tensor de 1 dimensión que devuelve un vector de longitud uno apuntando hacia arriba desde la parte inferior de tu pantalla. Si eliges el sistema de coordenadas donde el eje y aumenta de la parte inferior de la pantalla hacia arriba, entonces este tensor devolverá la representación $$[0, 1]$$. Sin embargo, si eliges el sistema de coordenadas donde el eje y disminuye de la parte inferior de la pantalla hacia arriba, entonces este tensor devolverá $$[0, -1]$$ en su lugar. ¡Diferentes sistemas de coordenadas significan diferentes números en tu array, pero representan la misma cosa geométrica! Así que es un tensor válido.
Como contraejemplo, considera una "fábrica" que siempre devuelve $$[0, 1]$$ sin importar el sistema de coordenadas que se le dé. En el primer sistema de coordenadas mencionado anteriormente, esto representa un vector que apunta hacia arriba. Pero en el segundo sistema de coordenadas representa un vector que apunta hacia abajo. No es un tensor porque el array de números que da para diferentes sistemas de coordenadas tienen un significado geométrico diferente (los valores en el array no se transformaron correctamente).
Para ejemplos en 2D, puedes considerar:
- una rotación en sentido horario de 90 grados. En diferentes sistemas de coordenadas tendrá diferentes representaciones de matriz, pero siempre harán lo mismo con los vectores (es decir, rotarlos 90 grados en sentido horario). Este es un tensor covariante porque si escalas las unidades de tu sistema de coordenadas por un factor de k, las entradas en tu matriz también se escalarán por el mismo factor de k
- una medida de la longitud de un vector. Se ve como una matriz simétrica de 2D. Es un tensor contravariante porque si escalas las unidades de tu sistema de coordenadas por un factor de k, las entradas en tu matriz se escalarán por un factor de $\frac{1}{k}$
- una transformación que proyecta vectores sobre el eje x y luego los rota hacia el eje y positivo. Esto se verá como una matriz 2D pero no es un tensor, ya que aplicarlo al mismo vector en diferentes sistemas de coordenadas dará resultados diferentes.
(Respuesta de un ingeniero de software que ha seguido una serie de videos sobre tensores y quien compartiría su experiencia personal).
Creo que es un error asumir que los científicos de la computación solo piensan en términos de estructuras de datos concretas como arrays. Aunque un tensor puede ser representado por un array multidimensional, sabemos que eso no es lo que realmente es.
Los lenguajes de programación tienen un montón de métodos para representar comportamientos abstractos (por ejemplo, interfaces y clases abstractas) y muchas piezas de software contienen abstracciones y comportamientos complejos que son comparables a lo que podrías ver en matemáticas. La diferencia es que el software tiende a ser mucho más verboso y descriptivo. Llamar a una función ƒ en matemáticas es normal. Llamar a una función f en tu programa (incluso el f en ASCII) te conseguirá un comentario en la revisión de código, además de una solicitud para especificar los parámetros, valor de retorno y tipos, y un largo comentario estructurado que puede generar documentación de API.
(Y antes de darle votos negativos - no quiero sugerir que las matemáticas no son rigurosas; simplemente que la forma en que se presentan en un pizarrón en una conferencia de video es mucho más concisa de lo que un programador estaría acostumbrado a ver en su IDE).
Así que, a menudo me he preguntado si/qué conceptos matemáticos se pueden rediseñar utilizando lenguajes de programación. Tal vez no funcione para todo (sumar hasta el infinito no es recomendable) pero debe haber muchas áreas donde es posible.
No he pensado más sobre esto (lo siento - esta no es una respuesta completa) pero en general, el cerebro del científico de la computación puede lidiar con abstracciones, pero está acostumbrado a ver las cosas de una forma mucho más verbosa que el matemático con muchas menos restricciones implícitas o inferidas.
- Ver respuestas anteriores
- Ver más respuestas