[Traducción] Explicación visual de Vision Transformer (A Visual Guide to Vision Transformers)
(discuss.pytorch.kr)-
ℹ️ Tras ver el artículo guía visual de Visual Transformers presentado por xguru, y con el permiso de su autor, el Data Scientist y Software Engineer Dennis Turp, traduje el texto que él escribió: Explicación visual de Vision Transformer (ViT) (A Visual Guide to Vision Transformers).
-
Vision Transformer (ViT) es un modelo que aplica Transformers al campo de CV (Computer Vision) y muestra un rendimiento sobresaliente en áreas como la detección de objetos y la clasificación de imágenes. En particular, se usa mucho como Visual Encoder para extraer características (
feature) de las imágenes. -
Como la explicación del texto original es breve y en algunos casos puede resultar difícil de entender, agregué algunas notas para facilitar la comprensión.
Explicación visual de Vision Transformer (ViT)
Este artículo es una explicación visual de Vision Transformers (ViTs), un modelo de deep learning que muestra rendimiento de nivel SotA (State-of-the-Art) en tareas de clasificación de imágenes. Vision Transformer aplica a datos de imagen la arquitectura Transformer, que originalmente fue diseñada para procesamiento de lenguaje natural (NLP). En este artículo, mediante una explicación breve junto con visualizaciones que ayudan a entender el flujo de los datos mientras avanzas por el contenido, buscamos que puedas comprender cómo funciona Vision Transformer. (:pytorch::kr:: Aquí es difícil reproducir la explicación basada en desplazamiento, así que la reemplazamos con capturas de imagen. También conviene consultar el texto original.)
This is a visual guide to Vision Transformers (ViTs), a class of deep learning models that have achieved state-of-the-art performance on image classification tasks. Vision Transformers apply the transformer architecture, originally designed for natural language processing (NLP), to image data. This guide will walk you through the key components of Vision Transformers in a scroll story format, using visualizations and simple explanations to help you understand how these models work and how the flow of the data through the model looks like.
0. Revisar los datos / Lets start with the data
Al igual que las redes neuronales convolucionales (CNN) comunes, Vision Transformer también se entrena de forma supervisada (Supervised Learning). Es decir, el modelo se entrena con un conjunto de datos compuesto por imágenes y sus etiquetas (label) correspondientes.
Like normal convolutional neural networks, vision transformers are trained in a supervised manner. This means that the model is trained on a dataset of images and their corresponding labels.
1. Enfocarnos en un solo dato / Focus on one data point
Para entender mejor cómo funciona Vision Transformer internamente, primero nos enfocaremos solo en un dato (tamaño de batch de 1). Y pensemos juntos en esta pregunta: ¿cómo hay que preparar (preprocesar) este dato para poder ingresarlo a un Transformer?
To get a better understanding of what happens inside a vision transformer lets focus on a single data point (batch size of 1). And lets ask the question: How is this data point prepared in order to be consumed by a transformer?
2. Dejemos la etiqueta por un momento / Forget the label for the moment
La etiqueta cobrará más relevancia más adelante. Por ahora, nos quedamos observando solo una imagen.
The label will become more relevant later. For now the only thing that we are left with is a single image.
3. Dividir la imagen en parches / Create patches of the image
Dividimos la imagen completa en parches de tamaño uniforme (p x p) para prepararla y poder usarla dentro del Transformer.
To prepare the image for the use inside the transformer we divide the image into equally sized patches of size p x p.
4. Aplanar los parches de imagen / Flatting of the image patches
Los parches se aplanan (flatten) en vectores de tamaño p' = p² x c. Aquí, p es el tamaño de un lado del parche y c es la cantidad de canales. (:pytorch::kr:: Por ejemplo, en una imagen RGB, la cantidad de canales es 3.)
The patches are now flattened into vectors of dimension p'= p²*c where p is the size of the patch and c is the number of channels.
5. Crear embeddings a partir de los parches / Creating patch embeddings
Los vectores creados anteriormente a partir de los parches de imagen se codifican mediante una transformación lineal. El Patch Embedding Vector resultante tiene un tamaño fijo d.
These image patch vectors are now encoded using a linear transformation. The resulting Patch Embedding Vector has a fixed size d.
6. Embeber todos los parches / Embedding all patches
Una vez que todos los parches de imagen se embeben como vectores de tamaño fijo, obtenemos un arreglo de tamaño n x d. Aquí, n es la cantidad de parches de la imagen y d es el tamaño del patch embedding de cada parche.
Now that we have embedded our image patches into vectors of fixed size, we are left with an array of size n x d where n is the the number of image patches and d is the size of the patch embedding
7. Agregar un token de clasificación (CLS) / Appending a classification token
Para entrenar el modelo de forma efectiva, además de los embeddings de parches se agrega un vector llamado token de clasificación (token CLS). Este vector es un parámetro aprendible de la red neuronal y se inicializa aleatoriamente. Como referencia, solo hay un token CLS y se agrega el mismo vector a todos los datos. (:pytorch::kr:: Si llegamos hasta aquí, al sumar el token CLS a los n embeddings de parches obtenemos (n+1), cada uno con tamaño de embedding d, es decir, (n+1) x d.)
> In order for us to effectively train our model we extend the array of patch embeddings by an additional vector called classification token (cls token). This vector is a learnable parameter of the network and is randomly initialized. Note: We only have one cls token and we append the same vector for all data points.
8. Agregar vectores de embedding posicional / Add positional embedding Vectors
Hasta ahora, los embeddings de parches no tienen información de posición asociada. Resolvemos esto sumando a todos los embeddings de parches un vector de embedding posicional (Positional Embedding Vector) aprendible e inicializado aleatoriamente. Además, también agregamos este tipo de vector posicional al token de clasificación (token CLS) que añadimos antes. (:pytorch::kr:: En Transformer se “suman” los valores del Positional Encoding. Por lo tanto, no hay cambios en el tamaño del vector.)
> Currently our patch embeddings have no positional information associated with them. We remedy that by adding a learnable randomly initialized positional embedding vector to all our patch embeddings. We also add a such a positional embedding vector to our classification token.
9. Entrada al Transformer / Transformer Input
Después de agregar los vectores de embedding posicional, nos queda un arreglo de tamaño (n+1) x d. Este será la entrada para el Transformer, que se explicará con mayor detalle en los siguientes pasos.
> After the positional embedding vectors have been added we are left with an array of size (n+1) x d. This will be our input for the transformer which will be explained in greater detail in the next steps.
10.1. Transformer: crear QKV / QKV Creation
Los vectores de embedding de parches de entrada al Transformer se proyectan linealmente en varios vectores grandes. Estos nuevos vectores luego se separan en tres partes de igual tamaño. Estas corresponden a Q, el vector de consulta (Query), K, el vector clave (Key) y V, el vector de valor (Value). Obtendremos (n+1) de cada uno de estos vectores.
> Our transformer input patch embedding vectors are linearly embedded into multiple large vectors. These new vectors are than separated into three equal sized parts. The Q - Query Vector, the K - Key Vector and the V - Value Vector . We will have (n+1) of a all of those vectors.
10.2. Transformer: calcular puntajes de atención / Attention Score Calculation
Primero, para calcular el puntaje de atención A, multiplicamos todos los vectores de consulta Q por todos los vectores clave K.
> To calculate our attention scores A we will now multiply all of our query vectors Q with all of our key vectors K.
10.3. Transformer: matriz de puntajes de atención / Attention Score Matrix
A la matriz de puntajes de atención A obtenida de esta manera se le aplica la función softmax a cada fila, de modo que la suma de cada fila sea 1.
> Now that we have the attention score matrix A we apply a softmax function to every row such that every row sums up to 1.
10.4. Transformer: calcular la información contextual agregada / Aggregated Contextual Information Calculation
Para calcular la información contextual agregada (aggregated contextual information) del primer vector de embedding de parche, operamos sobre la primera fila de la matriz de atención. Aquí usamos los pesos de los vectores de valor V para generar el vector de información contextual agregada (aggregated vector) correspondiente al primer embedding de parche de imagen.
> To calculate the aggregated contextual information for the first patch embedding vector. We focus on the first row of the attention matrix. And use the entires as weights for our Value Vectors V. The result is our aggregated contextual information vector for the first image patch embedding.
10.5. Transformer: obtener la información contextual agregada para todos los parches / Aggregated Contextual Information for every patch
Repetimos el proceso anterior para las demás filas de la matriz de puntajes de atención y así obtenemos N+1 vectores de información contextual agregada. Es decir, uno por cada parche (=N) más uno para el token de clasificación (token CLS) (=1). Con esto se completa el primer attention head.
> Now we repeat this process for every row of our attention score matrix and the result will be N+1 aggregated contextual information vectors. One for every patch + one for the classification token. This steps concludes our first Attention Head.
10.6. Transformer: atención multi-head / Multi-Head Attention
Como estamos trabajando con atención multi-head (del Transformer), repetimos todo el proceso de 10.1 a 10.5 con un mapeo QKV diferente. En la figura anterior se asumen solo 2 heads, pero normalmente un ViT tiene muchos más. Al final, esto produce múltiples vectores de información contextual agregada.
> Now because we are dealing multi head attention we repeat the entire process from step 10.1 - 10-5 again with a different QKV mapping. For our explanatory setup we assume 2 Heads but typically a VIT has many more. In the end this results in multiple Aggregated contextual information vectors.
10.7. Transformer: último paso de la capa de atención / Last Attention Layer Step
Después de apilar estas múltiples cabezas, se mapean a vectores de tamaño d, que es el mismo tamaño que las incrustaciones de parches.
> These heads are stacked together and are mapped to vectors of size d which was the same size as our patch embeddings had.
10.8. Transformer: Obtener el resultado de la capa de atención / Attention Layer Result
Con esto, la capa de atención queda completada a partir del paso anterior, y obtenemos incrustaciones de exactamente el mismo tamaño que las usadas en la entrada.
> The previous step concluded the attention layer and we are left with the same amount of embeddings of exactly the same size as we used as input.
10.9. Transformer: Conectar la conexión residual / Residual connections
En los Transformer se usan mucho las conexiones residuales (Residual Connection), que básicamente consisten en sumar la entrada de la capa anterior a la salida de la capa actual. Aquí también aplicaremos una conexión residual.
> Transformers make heavy use of residual connections which simply means adding the input of the previous layer to the output the current layer. This is also something that we will do now.
10.10. Transformer: Obtener el resultado de la conexión residual / Residual connection Result
A través de estas conexiones residuales, al sumar vectores del mismo tamaño d, se generan vectores del mismo tamaño.
> The addition results in vectors of the same size.
10.11. Transformer: Pasarlo por la red feed-forward / Feed Forward Network
La salida obtenida hasta ahora se pasa por una red neuronal artificial feed-forward con funciones de activación no lineales.
> Now these outputs are feed through a feed forward neural network with non linear activation functions
10.12. Transformer: Obtener el resultado final / Final Result
En el Transformer hay otra conexión residual después de las operaciones realizadas hasta ahora, pero aquí la omitiremos para simplificar la explicación y cerrar el funcionamiento de la capa Transformer. Al final, el Transformer produce una salida del mismo tamaño que la entrada.
> After the transformer step there is another residual connections which we will skip here for brevity. And so the last step concluded the transformer layer. In the end the transformer produced outputs of the same size as input.
11. Repetir la operación del Transformer / Repeat Transformers
Se repite varias veces toda la operación del Transformer descrita en 10.1 a 10.12. Aquí se muestra como ejemplo repetirla 6 veces.
> Repeat the entire transformer calculation Steps 10.1 - Steps 10.12 for the Transformer several times e.g. 6 times.
12. Identificar la salida del token de clasificación / Identify Classification token output
El último paso es identificar la salida del token de clasificación (token CLS). Este vector se usará en la etapa final del recorrido del Vision Transformer.
> Last step is to identify the classification token output. This vector will be used in the final step of our Vision Transformer journey.
13. Paso final: predecir probabilidades de clasificación / Final Step: Predicting classification probabilities
En el paso final y definitivo, tomamos este token de salida de clasificación y lo pasamos por otra red neuronal totalmente conectada (fully-connected) para predecir las probabilidades de clasificación de la imagen de entrada.
> In the final and last step we use this classification output token and another fully connected neural network to predict the classification probabilities of our input image.
14. Entrenamiento del Vision Transformer / Training of the Vision Transformer
El Vision Transformer se entrena usando una función de pérdida estándar de entropía cruzada (Cross-Entropy Loss Function), que compara las probabilidades de clase predichas con las etiquetas reales de clase. El modelo se entrena mediante backpropagation y descenso por gradiente, actualizando los parámetros del modelo para minimizar la función de pérdida.
> We train the Vision Transformer using a standard cross-entropy loss function, which compares the predicted class probabilities with the true class labels. The model is trained using backpropagation and gradient descent, updating the model parameters to minimize the loss function.
Conclusión / Conclusion
Hasta aquí, a través de esta explicación visual, revisamos los componentes clave del Vision Transformer, desde la preparación de los datos hasta el entrenamiento del modelo. Esperamos que esta guía te haya ayudado a entender cómo funciona Vision Transformer y cómo puede usarse para clasificar imágenes.
> In this visual guide, we have walked through the key components of Vision Transformers, from the data preparation to the training of the model. We hope this guide has helped you understand how Vision Transformers work and how they can be used to classify images.
También preparé este pequeño Colab Notebook para ayudarte a entender aún mejor Vision Transformer. No dejes de revisar el comentario de la 'Blogpost'. Este código fue tomado de la excelente implementación de ViT en PyTorch de @lucidrains, así que asegúrate de revisar también su trabajo.
> I prepared this little Colab Notebook to help you understand the Vision Transformer even better. Please have look for the 'Blogpost' comment. The code was taken from @lucidrains great VIT Pytorch implementation be sure to checkout his work.
Si tienes alguna pregunta o comentario, no dudes en ponerte en contacto. ¡Gracias por leer! (GitHub](https://github.com/mdturp), X(Twitter), Threads, LinkedIn del autor)
> If you have any questions or feedback, please feel free to reach out to me. Thank you for reading!
Agradecimientos / Acknowledgements
- Implementación de VIT en PyTorch de @lucidrains implementación de VIT PyTorch
- Todas las imágenes fueron tomadas de Wikipedia y su uso está permitido bajo la licencia CC BY-SA 4.0.
> * VIT Pytorch implementation
> * All images have been taken from Wikipedia and are licensed under the Creative Commons Attribution-Share Alike 4.0 International license.
Lecturas adicionales
Artículo original
https://blog.mdturp.ch/posts/…
Artículo de resumen
https://es.news.hada.io/topic?id=14370
Paper de Vision Transformer
https://arxiv.org/abs/2010.11929v2
Video de reseña del paper de Vision Transformer por PR12
https://www.youtube.com/watch?v=D72_Cn-XV1g
Repositorio de Vision Transformer de Google Research
https://github.com/google-research/vision_transformer
Papers, código y más sobre Vision Transformer recopilados en PapersWithCode
https://paperswithcode.com/method/vision-transformer
⚠️Anuncio⚠️: ¿Te resultó útil este artículo recopilado por la :pytorch: comunidad de usuarios de PyTorch en Corea? Si te registras como miembro, te enviaremos los artículos principales por correo electrónico. (La opción predeterminada es Weekly, pero también puedes cambiarla a Daily.)
1 comentarios
Gracias por tomarte el trabajo de compartir material útil.^