Un transformador es una arquitectura de aprendizaje profundo desarrollada por investigadores de Google y basada en el mecanismo de atención de múltiples cabezas , propuesto en el artículo de 2017 " Attention Is All You Need ". [1] El texto se convierte en representaciones numéricas llamadas tokens , y cada token se convierte en un vector a través de la búsqueda en una tabla de incrustación de palabras . [1] En cada capa, cada token se contextualiza dentro del alcance de la ventana de contexto con otros tokens (sin máscara) a través de un mecanismo de atención de múltiples cabezas paralelo, lo que permite que la señal de los tokens clave se amplifique y los tokens menos importantes se reduzcan.
Los transformadores tienen la ventaja de no tener unidades recurrentes, por lo que requieren menos tiempo de entrenamiento que las arquitecturas neuronales recurrentes (RNN) anteriores, como la memoria a corto plazo larga (LSTM). [2] Las variaciones posteriores se han adoptado ampliamente para entrenar modelos de lenguaje grandes (LLM) en grandes conjuntos de datos (de lenguaje), como el corpus de Wikipedia y Common Crawl . [3]
Los transformadores se desarrollaron por primera vez como una mejora de las arquitecturas anteriores para la traducción automática , [4] [5] pero han encontrado muchas aplicaciones desde entonces. Se utilizan en el procesamiento del lenguaje natural a gran escala , la visión por computadora ( transformadores de visión ), el aprendizaje de refuerzo , [6] [7] el audio , [8] el aprendizaje multimodal , la robótica , [9] e incluso el ajedrez . [10] También ha llevado al desarrollo de sistemas preentrenados , como los transformadores preentrenados generativos (GPT) [11] y BERT [12] (representaciones de codificador bidireccional a partir de transformadores).
Durante muchos años, el modelado y la generación de secuencias se realizaron mediante redes neuronales recurrentes (RNN, por sus siglas en inglés). Un ejemplo temprano muy citado fue la red Elman (1990). En teoría, la información de un token puede propagarse arbitrariamente a lo largo de la secuencia, pero en la práctica el problema del gradiente evanescente deja el estado del modelo al final de una oración larga sin información precisa y extraíble sobre los tokens anteriores.
Un avance clave fue LSTM (1995), [nota 1] una RNN que utilizó varias innovaciones para superar el problema del gradiente de desaparición, lo que permitió un aprendizaje eficiente del modelado de secuencias largas. Una innovación clave fue el uso de un mecanismo de atención que utiliza neuronas que multiplican las salidas de otras neuronas, las llamadas unidades multiplicativas . [13] Las redes neuronales que utilizan unidades multiplicativas se denominaron posteriormente redes sigma-pi [14] o redes de orden superior . [15] LSTM se convirtió en la arquitectura estándar para el modelado de secuencias largas hasta la publicación de Transformers en 2017. Sin embargo, LSTM todavía utilizaba el procesamiento secuencial, como la mayoría de las otras RNN. [nota 2] Específicamente, las RNN operan un token a la vez desde el primero hasta el último; no pueden operar en paralelo sobre todos los tokens de una secuencia.
Los transformadores modernos superan este problema, pero a diferencia de las redes neuronales regresivas, requieren un tiempo de cálculo que es cuadrático en el tamaño de la ventana de contexto. El controlador de peso rápido de escalamiento lineal (1992) aprende a calcular una matriz de peso para su posterior procesamiento en función de la entrada. [16] Una de sus dos redes tiene "pesos rápidos" o "enlaces dinámicos" (1981). [17] [18] [19] Una red neuronal lenta aprende por descenso de gradiente a generar claves y valores para calcular los cambios de peso de la red neuronal rápida que calcula las respuestas a las consultas. [16] Más tarde se demostró que esto era equivalente al transformador lineal no normalizado. [20] [21]
La idea de la transducción de secuencias codificador-descodificador se desarrolló a principios de la década de 2010 (consulte [22] [23] para consultar artículos anteriores). Los artículos que se citan con más frecuencia como los creadores de seq2seq son dos artículos publicados simultáneamente en 2014. [22] [23]
(Sutskever et al, 2014) [23] fue un modelo de 380M de parámetros para la traducción automática que utiliza dos memorias de corto plazo largas (LSTM). La arquitectura consta de dos partes. El codificador es un LSTM que toma una secuencia de tokens y la convierte en un vector. El decodificador es otro LSTM que convierte el vector en una secuencia de tokens. De manera similar, (Cho et al, 2014) [22] fue un modelo de 130M de parámetros que utilizó unidades recurrentes controladas (GRU) en lugar de LSTM. Investigaciones posteriores demostraron que las GRU no son ni mejores ni peores que las LSTM para seq2seq. [24] [25]
Estos primeros modelos seq2seq no tenían mecanismo de atención, y el vector de estado es accesible solo después de que se haya procesado la última palabra del texto fuente. Aunque en teoría un vector de este tipo retiene la información sobre toda la oración original, en la práctica la información se conserva de forma deficiente, ya que la entrada se procesa secuencialmente por una red recurrente en un vector de salida de tamaño fijo , que luego es procesado por otra red recurrente en una salida. Si la entrada es larga, entonces el vector de salida no podría contener toda la información relevante y la calidad de la salida se degrada. Como prueba, invertir la oración de entrada mejoró la traducción seq2seq. [26]
(Bahdanau et al, 2014) [4] introdujeron un mecanismo de atención en seq2seq para la traducción automática con el fin de resolver el problema del cuello de botella (del vector de salida de tamaño fijo ), lo que permite que el modelo procese dependencias de larga distancia con mayor facilidad. Llamaron a su modelo RNNsearch , ya que "emula la búsqueda a través de una oración fuente durante la decodificación de una traducción".
(Luong et al, 2015) [27] compararon el desempeño relativo de las arquitecturas de modelos de atención global (el de (Bahdanau et al, 2014)) y local (ventana deslizante) para la traducción automática, y encontraron que una arquitectura de atención mixta tenía mayor calidad que la atención global, mientras que el uso de una arquitectura de atención local reducía el tiempo de traducción.
En 2016, Google Translate fue renovado y pasó a llamarse Google Neural Machine Translation , que reemplazó al modelo anterior basado en la traducción automática estadística . El nuevo modelo era un modelo seq2seq en el que el codificador y el decodificador eran ambos 8 capas de LSTM bidireccional. [28] Se necesitaron nueve meses para desarrollarlo y logró un nivel de rendimiento más alto que el enfoque estadístico, que tardó diez años en desarrollarse. [29]
Los modelos Seq2seq con atención (incluida la autoatención) todavía sufrían del mismo problema con las redes recurrentes, que es que son difíciles de paralelizar , lo que impedía que se aceleraran en las GPU. En 2016, la atención descomponible aplicó un mecanismo de autoatención a las redes de retroalimentación , que son fáciles de paralelizar, y logró un resultado SOTA en implicación textual con un orden de magnitud menos de parámetros que las LSTM. [30] Uno de sus autores, Jakob Uszkoreit, sospechó que la atención sin recurrencia es suficiente para la traducción de idiomas, de ahí el título "la atención es todo lo que necesitas". [31] Esa hipótesis iba en contra de la sabiduría convencional de la época, e incluso su padre, un conocido lingüista computacional, era escéptico. [31] En el mismo año, se propuso la autoatención (llamada intraatención o atención intra-oración ) para las LSTM. [32]
En 2017, el modelo de transformador codificador-decodificador original (de tamaño 100M) se propuso en el artículo " Attention is all you need ". En ese momento, el foco de la investigación estaba en mejorar seq2seq para la traducción automática , eliminando su recurrencia para procesar todos los tokens en paralelo, pero preservando su mecanismo de atención de producto escalar para mantener su rendimiento de procesamiento de texto. [1] Su paralelización fue un factor importante para su uso generalizado en grandes redes neuronales. [33]
Ya en la primavera de 2017, incluso antes de que se publicara el preprint "Attention is all you need", uno de los coautores aplicó la variante "solo decodificador" de la arquitectura para generar artículos ficticios de Wikipedia. [34] La arquitectura de transformadores ahora se utiliza en muchos modelos generativos que contribuyen al auge actual de la IA .
En el campo del modelado del lenguaje, ELMo (2018) fue un LSTM bidireccional que produce incrustaciones de palabras contextualizadas , mejorando la línea de investigación de bag of words y word2vec . Le siguió BERT (2018), un modelo Transformer solo codificador. [35] En octubre de 2019, Google comenzó a utilizar BERT para procesar consultas de búsqueda. [36] En 2020, Google Translate reemplazó el modelo RNN-codificador-RNN-decodificador anterior por un modelo Transformer-codificador-RNN-decodificador. [37]
A partir de 2018, la serie OpenAI GPT de Transformers con solo decodificador se convirtió en la última generación de lenguaje natural . En 2022, un chatbot basado en GPT-3, ChatGPT , se volvió inesperadamente popular, [38] lo que desencadenó un auge en torno a los modelos de lenguaje de gran tamaño . [39] [40]
Desde 2020, los Transformers se han aplicado en modalidades más allá del texto, incluido el transformador de visión , [41] reconocimiento de voz, [42] robótica, [6] y multimodal . [43] El transformador de visión, a su vez, estimuló nuevos desarrollos en redes neuronales convolucionales . [44] Los generadores de imágenes y videos como DALL-E (2021), Stable Diffusion 3 (2024), [45] y Sora (2024), se basan en la arquitectura Transformer.
La arquitectura del transformador simple tenía dificultades para converger. En el artículo original [1], los autores recomendaron utilizar un calentamiento de la tasa de aprendizaje. Es decir, la tasa de aprendizaje debería aumentar linealmente desde 0 hasta el valor máximo para la primera parte del entrenamiento (generalmente se recomienda que sea el 2 % del número total de pasos de entrenamiento), antes de decaer nuevamente.
Un artículo de 2020 descubrió que el uso de la normalización de capas antes (en lugar de después) de las capas de atención multidireccional y de avance estabiliza el entrenamiento, sin requerir un calentamiento de la tasa de aprendizaje. [46]
Los transformadores suelen entrenarse previamente mediante un aprendizaje autosupervisado en un gran conjunto de datos genéricos, seguido de un ajuste fino supervisado en un pequeño conjunto de datos específico de la tarea. El conjunto de datos de entrenamiento previo suele ser un gran corpus sin etiquetar, como The Pile . Las tareas de entrenamiento previo y ajuste fino suelen incluir:
El informe del transformador T5 [47] documenta una gran cantidad de tareas de preentrenamiento del lenguaje natural . Algunos ejemplos son:
Tenga en cuenta que, si bien cada una de estas tareas es trivial u obvia para los hablantes nativos del idioma (o idiomas), por lo general han resultado un desafío para las generaciones anteriores de arquitectura de aprendizaje automático.
En general, hay 3 clases de tareas de modelado de lenguaje: "enmascaradas", [49] "autorregresivas", [50] y "prefixLM". [51] Estas clases son independientes de una arquitectura de modelado específica como Transformer, pero a menudo se analizan en el contexto de Transformer.
En una tarea enmascarada, [49] uno o más de los tokens se enmascaran y el modelo produciría una distribución de probabilidad que predice cuáles son los tokens enmascarados en función del contexto. La función de pérdida para la tarea es típicamente la suma de las perplejidades logarítmicas para los tokens enmascarados: y el modelo se entrena para minimizar esta función de pérdida. La serie de modelos BERT se entrena para la predicción de tokens enmascarados y otra tarea.
En una tarea autorregresiva, [50] primero se enmascara toda la secuencia y el modelo produce una distribución de probabilidad para el primer token. Luego se revela el primer token y el modelo predice el segundo token, y así sucesivamente. La función de pérdida para la tarea sigue siendo típicamente la misma. La serie de modelos GPT se entrena mediante tareas autorregresivas.
En una tarea prefixLM, [51] la secuencia se divide en dos partes. La primera parte se presenta como contexto y el modelo predice el primer token de la segunda parte. Luego, este se revela y el modelo predice el segundo token, y así sucesivamente. La función de pérdida para la tarea sigue siendo típicamente la misma. La serie T5 de modelos se entrena mediante tareas prefixLM.
Tenga en cuenta que "enmascarado", como en "modelado de lenguaje enmascarado", no es "enmascarado" como en "atención enmascarada", y "prefijoLM" (modelado de lenguaje de prefijo) no es "prefijoLM" (modelo de lenguaje de prefijo).
Todos los transformadores tienen los mismos componentes primarios:
La siguiente descripción sigue exactamente el modelo del transformador descrito en el artículo original. Existen variantes que se describen en la siguiente sección.
Por convención, escribimos todos los vectores como vectores fila. Esto, por ejemplo, significa que al hacer pasar un vector a través de una capa lineal, hay que multiplicarlo por una matriz de pesos a la derecha, como .
Como la arquitectura Transformer procesa de forma nativa datos numéricos, no texto, debe haber una traducción entre texto y tokens. Un token es un número entero que representa un carácter o un segmento corto de caracteres. En el lado de entrada, el texto de entrada se analiza en una secuencia de tokens. De manera similar, en el lado de salida, los tokens de salida se vuelven a analizar en texto. El módulo que realiza la conversión entre secuencias de tokens y textos es un tokenizador .
El conjunto de todos los tokens es el vocabulario del tokenizador y su tamaño es el tamaño del vocabulario . Cuando se encuentran tokens fuera del vocabulario, normalmente se utiliza un token especial, escrito como "[UNK]" para "desconocido".
Algunos tokenizadores comúnmente utilizados son la codificación de pares de bytes , WordPiece y SentencePiece.
Cada token se convierte en un vector de incrustación a través de una tabla de búsqueda . Dicho de manera equivalente, multiplica una representación one-hot del token por una matriz de incrustación . Por ejemplo, si el token de entrada es , entonces la representación one-hot es y su vector de incrustación es Los vectores de incrustación de tokens se suman a sus respectivos vectores de codificación posicional (ver a continuación), lo que produce la secuencia de vectores de entrada.
El número de dimensiones en un vector de incrustación se denomina tamaño oculto o tamaño de incrustación y se escribe como [35]
Una capa de desincrustación es casi lo opuesto a una capa de incrustación. Mientras que una capa de incrustación convierte un token en un vector, una capa de desincrustación convierte un vector en una distribución de probabilidad sobre tokens.
La capa de desincrustación es una capa softmax lineal: la matriz tiene forma . A veces se requiere que la matriz de incrustación y la matriz de desincrustación sean transposiciones entre sí, una práctica llamada vinculación de pesos. [52]
Una codificación posicional es una representación vectorial de tamaño fijo de las posiciones relativas de los tokens dentro de una secuencia: proporciona al modelo del transformador información sobre dónde se encuentran las palabras en la secuencia de entrada. Sin la codificación posicional, el modelo no podría procesar la secuencia de entrada como algo más que un conjunto de palabras ; por ejemplo, tanto " el hombre muerde al perro " como "el perro muerde al hombre" se procesarían exactamente de la misma manera.
La codificación posicional se define como una función de tipo , donde es un entero par positivo . La codificación posicional completa definida en el artículo original [1] es: donde .
Aquí hay un parámetro libre que debería ser significativamente mayor que el mayor que se ingresaría en la función de codificación posicional. El artículo original utiliza .
La función está en una forma más simple cuando se escribe como una función compleja de tipo donde .
La razón principal para utilizar esta función de codificación posicional es que, al utilizarla, los desplazamientos son transformaciones lineales: donde es la distancia que se desea desplazar. Esto permite que el transformador tome cualquier posición codificada y encuentre la codificación de la posición n pasos adelante o n pasos atrás mediante una multiplicación de matrices.
Al tomar una suma lineal, cualquier convolución también se puede implementar como transformaciones lineales: para cualquier constante . Esto permite que el transformador tome cualquier posición codificada y encuentre una suma lineal de las ubicaciones codificadas de sus vecinos. Esta suma de posiciones codificadas, cuando se introduce en el mecanismo de atención, crearía pesos de atención en sus vecinos, de forma muy similar a lo que sucede en un modelo de lenguaje de red neuronal convolucional . En palabras del autor, "planteamos la hipótesis de que permitiría que el modelo aprendiera fácilmente a prestar atención por posición relativa".
En implementaciones típicas, todas las operaciones se realizan sobre números reales, no sobre números complejos, pero como la multiplicación compleja se puede implementar como una multiplicación de matrices reales de 2 por 2 , esta es una mera diferencia de notación.
Al igual que los modelos seq2seq anteriores , el modelo de transformador original utilizaba una arquitectura de codificador-decodificador . El codificador consta de capas de codificación que procesan todos los tokens de entrada juntos, una capa tras otra, mientras que el decodificador consta de capas de decodificación que procesan de forma iterativa la salida del codificador y los tokens de salida del decodificador hasta el momento.
El propósito de cada capa de codificador es crear representaciones contextualizadas de los tokens, donde cada representación corresponde a un token que "mezcla" información de otros tokens de entrada a través de un mecanismo de autoatención. Cada capa de decodificador contiene dos subcapas de atención: (1) atención cruzada para incorporar la salida del codificador (representaciones contextualizadas de tokens de entrada) y (2) autoatención para "mezclar" información entre los tokens de entrada al decodificador (es decir, los tokens generados hasta el momento durante el tiempo de inferencia). [53] [54]
Tanto la capa del codificador como la del decodificador tienen una red neuronal de propagación hacia adelante para el procesamiento adicional de sus salidas y contienen conexiones residuales y pasos de normalización de capas. [54] Estas capas de propagación hacia adelante contienen la mayoría de los parámetros en un modelo Transformer.
Los módulos de red de alimentación hacia adelante (FFN) en un transformador son perceptrones multicapa de dos capas : donde es su función de activación. El transformador original utilizaba activación ReLU .
La cantidad de neuronas en la capa intermedia se denomina tamaño intermedio (GPT), [55] tamaño de filtro (BERT), [35] o tamaño de avance (BERT). [35] Por lo general, es mayor que el tamaño de incrustación. Por ejemplo, tanto en la serie GPT-2 como en la serie BERT, el tamaño intermedio de un modelo es 4 veces su tamaño de incrustación: .
El mecanismo de atención utilizado en la arquitectura Transformer son unidades de atención de producto escalable . Para cada unidad, el modelo Transformer aprende tres matrices de ponderación: las ponderaciones de consulta , las ponderaciones de clave y las ponderaciones de valor .
El módulo toma tres secuencias: una secuencia de consulta, una secuencia de claves y una secuencia de valores. La secuencia de consulta es una secuencia de longitud , y cada entrada es un vector de dimensión . Lo mismo ocurre con las secuencias de claves y valores.
Para cada vector de la secuencia de consulta, se multiplica por una matriz para producir un vector de consulta . La matriz de todos los vectores de consulta es la matriz de consulta: De manera similar, construimos la matriz de claves y la matriz de valores .
Generalmente ocurre que todas son matrices cuadradas, es decir , etc.
Los pesos de atención se calculan utilizando los vectores de consulta y clave: el peso de atención de token a token es el producto escalar entre y . Los pesos de atención se dividen por la raíz cuadrada de la dimensión de los vectores clave, , que estabiliza los gradientes durante el entrenamiento, y se pasan a través de un softmax que normaliza los pesos. El hecho de que y sean matrices diferentes permite que la atención no sea simétrica: si token atiende a token (es decir, es grande), esto no significa necesariamente que token atienda a token (es decir, podría ser pequeño). La salida de la unidad de atención para token es la suma ponderada de los vectores de valor de todos los tokens, ponderada por , la atención de token a cada token.
El cálculo de la atención para todos los tokens se puede expresar como un cálculo de matriz grande utilizando la función softmax , que es útil para el entrenamiento debido a las optimizaciones de operaciones matriciales computacionales que calculan rápidamente las operaciones matriciales. Las matrices , y se definen como las matrices donde las filas th son vectores , , y respectivamente. Luego podemos representar la atención como
donde el softmax se aplica sobre cada una de las filas de la matriz.
La cantidad de dimensiones en un vector de consulta es el tamaño de la consulta y lo mismo ocurre con el tamaño de la clave y el tamaño del valor . La dimensión de salida de un encabezado de atención es su dimensión de encabezado . El mecanismo de atención requiere las siguientes tres igualdades para cumplirse: pero, por lo demás, no tiene restricciones.
Si el cabezal de atención se utiliza en modo de autoatención, entonces . Si el cabezal de atención se utiliza en modo de atención cruzada, entonces normalmente . En teoría, es posible que los tres sean diferentes, pero rara vez ocurre así en la práctica.
Un conjunto de matrices se denomina cabeza de atención y cada capa en un modelo de transformador tiene múltiples cabezas de atención. Si bien cada cabeza de atención atiende a los tokens que son relevantes para cada token, múltiples cabezas de atención permiten que el modelo haga esto para diferentes definiciones de "relevancia". Específicamente, las matrices de consulta y proyección de clave, y , que están involucradas en el cálculo de la puntuación de atención, definen la "relevancia". Mientras tanto, la matriz de proyección de valor , en combinación con la parte de la matriz de proyección de salida , determina cómo los tokens atendidos influyen en qué información se pasa a las capas posteriores y, en última instancia, a los logits de salida. Además, el alcance de la atención, o el rango de relaciones de tokens capturados por cada cabeza de atención, puede expandirse a medida que los tokens pasan a través de capas sucesivas. Esto permite que el modelo capture dependencias más complejas y de largo alcance en capas más profundas. Muchas cabezas de atención de transformador codifican relaciones de relevancia que son significativas para los humanos. Por ejemplo, algunas cabezas de atención pueden atender principalmente a la siguiente palabra, mientras que otras atienden principalmente de los verbos a sus objetos directos. [56] Los cálculos para cada capa de atención se pueden realizar en paralelo , lo que permite un procesamiento rápido. Las salidas para la capa de atención se concatenan para pasar a las capas de red neuronal de avance .
Concretamente, supongamos que las cabezas de atención múltiples están indexadas por , entonces tenemos donde la matriz es la concatenación de incrustaciones de palabras, y las matrices son "matrices de proyección" propiedad de la cabeza de atención individual , y es una matriz de proyección final propiedad de toda la cabeza de atención de múltiples cabezas.
Teóricamente es posible que cada cabezal de atención tenga una dimensión de cabeza diferente , pero en la práctica ese rara vez es el caso.
Como ejemplo, en el modelo GPT-2 más pequeño, solo hay mecanismos de autoatención. Tiene las siguientes dimensiones: Como , su matriz de proyección de salida es una matriz cuadrada.
Puede ser necesario cortar los enlaces de atención entre algunos pares de palabras. Por ejemplo, el decodificador, al decodificar para la posición del token , no debería tener acceso al token en la posición . Esto se puede lograr antes de la etapa de softmax agregando una matriz de máscara que esté en las entradas donde se debe cortar el enlace de atención y en otros lugares: Un módulo de atención no enmascarado se puede considerar como un módulo de atención enmascarado donde la máscara tiene todas las entradas en cero.
Por ejemplo, la siguiente matriz se utiliza comúnmente en módulos de autoatención de decodificadores, llamados "enmascaramiento causal": En palabras, significa que cada token puede prestar atención a sí mismo, y a todos los tokens anteriores, pero no a ninguno posterior. Como ejemplo de un uso poco común de la matriz de máscara, XLNet considera todas las máscaras de la forma , donde es una matriz de permutación aleatoria . [57]
Un codificador consta de una capa de incrustación, seguida de múltiples capas de codificador.
Cada capa del codificador consta de dos componentes principales: un mecanismo de autoatención y una capa de retroalimentación. Toma una entrada como una secuencia de vectores de entrada, aplica el mecanismo de autoatención para producir una secuencia intermedia de vectores y luego aplica la capa de retroalimentación para cada vector individualmente. Esquemáticamente, tenemos:
donde significa "red de retroalimentación". Podemos escribirlo de manera más sucinta con la convención implícita de que se aplica a cada fila de la matriz individualmente.
Las capas del codificador están apiladas. La primera capa del codificador toma la secuencia de vectores de entrada de la capa de incrustación, lo que produce una secuencia de vectores. Esta secuencia de vectores es procesada por el segundo codificador, y así sucesivamente. La salida de la última capa del codificador es utilizada por el decodificador.
Como el codificador procesa toda la entrada a la vez, cada token puede atender a todos los demás tokens (atención de todos a todos), por lo que no hay necesidad de enmascaramiento causal.
Un decodificador consta de una capa de incrustación, seguida de múltiples capas de decodificador, seguidas de una capa de desincrustación.
Cada decodificador consta de tres componentes principales: un mecanismo de autoatención enmascarado causalmente, un mecanismo de atención cruzada y una red neuronal de retroalimentación. El decodificador funciona de manera similar al codificador, pero se inserta un mecanismo de atención adicional que, en su lugar, extrae información relevante de las codificaciones generadas por los codificadores. Este mecanismo también puede denominarse atención del codificador-decodificador . [1] [54]
Al igual que el primer codificador, el primer decodificador toma información posicional e incrustaciones de la secuencia de salida como su entrada, en lugar de codificaciones. El transformador no debe usar la salida actual o futura para predecir una salida, por lo que la secuencia de salida debe estar parcialmente enmascarada para evitar este flujo de información inverso. [1] Esto permite la generación de texto autorregresivo . Para la decodificación, la atención de todos a todos es inadecuada, porque un token no puede prestar atención a tokens que aún no se han generado. Por lo tanto, el módulo de autoatención en el decodificador está enmascarado causalmente.
Por el contrario, el mecanismo de atención cruzada atiende los vectores de salida del codificador, que se calculan antes de que el decodificador comience a decodificar. En consecuencia, no hay necesidad de enmascaramiento en el mecanismo de atención cruzada.
Esquemáticamente, tenemos: donde es la matriz con filas que son los vectores de salida del codificador.
El último decodificador es seguido por una capa final de desincrustación para producir las probabilidades de salida sobre el vocabulario. Luego, se toma una muestra de uno de los tokens de acuerdo con la probabilidad y el decodificador puede ejecutarse nuevamente para producir el siguiente token, etc., generando texto de salida de manera autorregresiva.
Cada capa del codificador contiene 2 subcapas: la autoatención y la red de retroalimentación. Cada capa del decodificador contiene 3 subcapas: la autoatención enmascarada causalmente, la atención cruzada y la red de retroalimentación.
Los puntos finales de detalle son las conexiones residuales y la normalización de capas (LayerNorm o LN), que si bien son conceptualmente innecesarias, son necesarias para la estabilidad numérica y la convergencia. De manera similar a cómo se aplican los módulos de red de propagación hacia adelante individualmente a cada vector, LayerNorm también se aplica individualmente a cada vector.
Existen dos convenciones comunes en uso: la convención post-LN y la convención pre-LN . En la convención post-LN, la salida de cada subcapa es donde está la función implementada por la propia subcapa.
En la convención pre-LN, la salida de cada subcapa es El Transformer original de 2017 utilizó la convención post-LN. Era difícil de entrenar y requería un ajuste cuidadoso de los hiperparámetros y un "calentamiento" en la tasa de aprendizaje, donde comienza pequeña y aumenta gradualmente. Se descubrió que la convención pre-LN, propuesta varias veces en 2018, [58] era más fácil de entrenar, no requería calentamiento, lo que conducía a una convergencia más rápida. [46]
El siguiente es el pseudocódigo para un codificador-decodificador Transformer pre-LN estándar, adaptado de [59]
entrada: Entrada del codificador t_e Entrada del decodificador t_dSalida: Matriz de distribuciones de probabilidad, con forma (tamaño del vocabulario del decodificador x longitud (secuencia de salida del decodificador))/* codificador */z_e ← codificador.tokenizador(t_e)para cada t en 1:length(z_e) hacer z_e[t] ← codificador.incrustación(z_e[t]) + codificador.incrustación_posicional(t)para cada l en 1:length(encoder.layers) hacer capa ← codificador.capas[l] /* primera subcapa */ z_e_copy ← copia(z_e) para cada t en 1:length(z_e) hacer z_e[t] ← capa.norma_capa(z_e[t]) z_e ← capa.multiheaded_attention(z_e, z_e, z_e) para cada t en 1:length(z_e) hacer z_e[t] ← z_e[t] + z_e_copy[t] /*segunda subcapa*/ z_e_copy ← copia(z_e) para cada t en 1:length(z_e) hacer z_e[t] ← capa.norma_capa(z_e[t]) z_e ← capa.feedforward(z_e) para cada t en 1:length(z_e) hacer z_e[t] ← z_e[t] + z_e_copy[t]para cada t en 1:length(z_e) hacer z_e[t] ← codificador.final_layer_norm(z_e[t])/* decodificador */z_d ← decodificador.tokenizador(t_d)para cada t en 1:length(z_d) hacer z_d[t] ← decodificador.incrustación(z_d[t]) + decodificador.incrustación_posicional(t)para cada l en 1:length(decoder.layers) hacer capa ← decodificador.capas[l] /* primera subcapa */ z_d_copy ← copiar(z_d) para cada t en 1:length(z_d) hacer z_d[t] ← capa.norma_capa(z_d[t]) z_d ← capa.masked_multiheaded_attention(z_d, z_d, z_d) para cada t en 1:length(z_d) hacer z_d[t] ← z_d[t] + z_d_copia[t] /*segunda subcapa*/ z_d_copy ← copiar(z_d) para cada t en 1:length(z_d) hacer z_d[t] ← capa.norma_capa(z_d[t]) z_d ← capa.atención_multicabezal(z_d, z_e, z_e) para cada i en 1:length(z_d) hacer z_d[t] ← z_d[t] + z_d_copia[t] /*tercera subcapa*/ z_d_copy ← copiar(z_d) para cada t en 1:length(z_d) hacer z_d[t] ← capa.norma_capa(z_d[t]) z_d ← capa.feedforward(z_d) para cada t en 1:length(z_d) hacer z_d[t] ← z_d[t] + z_d_copia[t]z_d ← decodificador.final_layer_norm(z_d)distribuciones_de_salida ← []para cada t en 1:length(z_d) hacer distribuciones_de_salida.append(decodificador.unembed(z_d[t]))devolver distribuciones_de_salida
La arquitectura del Transformer, al ser modular, permite variaciones. Aquí se describen varias variaciones comunes. [60]
Un transformador "solo codificador" aplica el codificador para mapear un texto de entrada en una secuencia de vectores que representan el texto de entrada. Esto se usa generalmente para la incrustación de texto y el aprendizaje de representación para aplicaciones posteriores. BERT es solo codificador. Actualmente se usan con menos frecuencia, ya que se descubrió que no son significativamente mejores que entrenar un transformador codificador-decodificador y luego tomar solo el codificador. [51]
Un Transformer "solo decodificador" no es literalmente solo decodificador, ya que sin un codificador, el mecanismo de atención cruzada no tiene nada a lo que prestar atención. Por lo tanto, las capas de decodificador en un Transformer solo decodificador se componen de solo dos subcapas: la autoatención enmascarada causalmente y la red de retroalimentación. Esto se usa generalmente para la generación de texto y el seguimiento de instrucciones . Los modelos de la serie GPT y la serie Chinchilla son solo decodificadores.
Un Transformer "codificador-decodificador" es generalmente igual que el Transformer original, con 2 subcapas por capa de codificador y 3 subcapas por capa de decodificador, etc. Pueden tener pequeñas mejoras arquitectónicas, como funciones de activación alternativas, cambio de la ubicación de la normalización, etc. Esto también se suele utilizar para la generación de texto y el seguimiento de instrucciones . Los modelos de la serie T5 son codificadores-decodificadores. [60]
Un "prefixLM" (modelo de lenguaje de prefijo) es una arquitectura que solo utiliza un decodificador, pero con enmascaramiento de prefijo, que es diferente del enmascaramiento causal. En concreto, tiene una máscara de la forma [60] : Figura 3 , donde las primeras columnas corresponden al "prefijo" y las columnas posteriores corresponden al texto generado de forma autorregresiva en función del prefijo. Se parecen a los modelos de codificador-decodificador, pero tienen menos "esparcimiento". Estos modelos rara vez se utilizan, aunque se citan como posibilidades teóricas y comparaciones de referencia. [51]
También existen modelos mixtos seq2seq. Por ejemplo, en 2020, Google Translate reemplazó el modelo RNN-encoder–RNN-decoder anterior por un modelo Transformer-encoder–RNN-decoder, con el argumento de que un RNN-decoder se ejecuta mucho más rápido que un Transformer-decoder cuando se ejecuta de forma autorregresiva. [61]
El transformador original utiliza la función de activación ReLU . Se desarrollaron otras funciones de activación. La serie Llama utilizó SwiGLU; [62] tanto GPT-1 como BERT [35] utilizaron GELU. [63]
Las funciones de activación alternativas se utilizan a menudo en combinación con unidades lineales con compuerta en el módulo de avance. [64]
La normalización utilizada en el Transformador puede ser diferente de LayerNorm. Un ejemplo es RMSNorm [65] que se utiliza en la serie Llama . Otros ejemplos incluyen ScaleNorm [66] o FixNorm [66] .
Los transformadores pueden utilizar otros métodos de codificación posicional distintos del sinusoidal. [67]
El artículo original de Transformer informó el uso de una codificación posicional aprendida, [68] pero no la encontró superior a la sinusoidal. [1] Más tarde, [69] descubrió que el enmascaramiento causal en sí mismo proporciona suficiente señal a un decodificador Transformer para que pueda aprender a realizar implícitamente una codificación posicional absoluta sin el módulo de codificación posicional.
RoPE (incrustación posicional rotatoria), [70] se explica mejor considerando una lista de vectores bidimensionales . Ahora elija algún ángulo . Entonces la codificación RoPE es Equivalentemente, si escribimos los vectores bidimensionales como números complejos , entonces la codificación RoPE es solo la multiplicación por un ángulo: Para una lista de vectores dimensionales, un codificador RoPE se define por una secuencia de ángulos . Luego, la codificación RoPE se aplica a cada par de coordenadas.
La ventaja de RoPE es que el producto escalar entre dos vectores depende únicamente de su ubicación relativa: para cualquier entero .
ALiBi (Atención con sesgos lineales) [71] no es un reemplazo del codificador posicional en el transformador original. En cambio, es un codificador posicional adicional que se conecta directamente al mecanismo de atención. Específicamente, el mecanismo de atención ALiBi es Aquí, es un número real ("escalar"), y es la matriz de sesgo lineal definida por en otras palabras, . La idea es que la matriz de sesgo lineal es una máscara suavizada. Así como representa la atención total prestada, y representa la falta de atención prestada, la matriz de sesgo lineal aumenta la atención prestada en una dirección y disminuye la atención prestada en la otra dirección.
ALiBi permite realizar un entrenamiento previo en ventanas de contexto cortas y luego realizar un ajuste fino en ventanas de contexto más largas. Dado que está conectado directamente al mecanismo de atención, se puede combinar con cualquier codificador posicional que esté conectado a la "parte inferior" de toda la red (que es donde se encuentran el codificador sinusoidal del transformador original, así como RoPE y muchos otros).
Las codificaciones de posición relativa [72] son similares a ALiBi, pero más genéricas: donde es una matriz de Toeplitz , es decir, siempre que . Esto contrasta con la codificación posicional sinusoidal original, que es una "codificación posicional absoluta". [73]
El modelo de transformador se ha implementado en marcos de aprendizaje profundo estándar como TensorFlow y PyTorch . Transformers es una biblioteca producida por Hugging Face que proporciona arquitecturas basadas en transformadores y modelos preentrenados. [11]
FlashAttention [74] es un algoritmo que implementa el mecanismo de atención del transformador de manera eficiente en una GPU. Realiza multiplicaciones de matrices en bloques , de modo que cada bloque quepa dentro de la memoria caché de una GPU y, mediante una gestión cuidadosa de los bloques, minimiza la copia de datos entre las memorias caché de una GPU (ya que el movimiento de datos es lento).
Se desarrolló una versión mejorada, FlashAttention-2, [75] [76] [77] para satisfacer la creciente demanda de modelos de lenguaje capaces de manejar longitudes de contexto más largas. Ofrece mejoras en la partición del trabajo y el paralelismo, lo que le permite alcanzar hasta 230 TFLOPs/s en GPU A100 ( FP16 / BF16 ), un aumento de velocidad de 2x sobre el FlashAttention original.
Los avances clave en FlashAttention-2 incluyen la reducción de FLOP no matmul, paralelismo mejorado sobre la dimensión de longitud de secuencia, mejor partición de trabajo entre warps de GPU y soporte adicional para dimensiones de cabezal de hasta 256 y atención de consultas múltiples (MQA) y atención de consultas agrupadas (GQA). [78]
Los análisis comparativos revelaron que FlashAttention-2 es hasta dos veces más rápido que FlashAttention y hasta nueve veces más rápido que una implementación de atención estándar en PyTorch. Los desarrollos futuros incluyen la optimización para nuevo hardware como GPU H100 y nuevos tipos de datos como FP8.
La atención de múltiples consultas cambia el mecanismo de atención de múltiples cabezas. [79] Mientras que normalmente,
Con Multi-Query Attention, solo hay una , por lo tanto:
Esto tiene un efecto neutral sobre la calidad del modelo y la velocidad de entrenamiento, pero aumenta la velocidad de inferencia.
En términos más generales, la atención de consultas agrupadas (GQA) divide los encabezados de atención en grupos, cada uno de los cuales comparte el par clave-valor. MQA es GQA con un grupo, mientras que la atención multiencabezado estándar es GQA con el número máximo de grupos. [80]
Cuando se utiliza un transformador autorregresivo para inferencia, como generar texto, el vector de consulta es diferente en cada paso, pero los vectores de clave y valor ya calculados son siempre los mismos. El método de almacenamiento en caché KV guarda los vectores de clave y valor calculados en cada bloque de atención, de modo que no se vuelvan a calcular en cada nuevo token. PagedAttention aplica paginación de memoria al almacenamiento en caché KV. [81] [82] [83]
Si se utiliza un transformador con un mensaje integrado, como ["Usted es un agente de atención al cliente..."], se pueden calcular los vectores de clave y valor para el mensaje y guardarlos en el disco. El ahorro en el cálculo es significativo cuando el modelo se utiliza para muchas interacciones breves, como en los chatbots en línea.
Los transformadores se utilizan en modelos de lenguaje grandes para la generación de secuencias autorregresivas: generar un flujo de texto, un token a la vez. Sin embargo, en la mayoría de los entornos, la decodificación a partir de modelos de lenguaje está limitada por la memoria, lo que significa que tenemos potencia de cómputo de sobra disponible. La decodificación especulativa [84] [85] utiliza esta potencia de cómputo de sobra al calcular varios tokens en paralelo. De manera similar a la ejecución especulativa en las CPU, los tokens futuros se calculan simultáneamente, especulando sobre el valor de los tokens anteriores, y luego se descartan si resulta que la especulación era incorrecta.
En concreto, considere un modelo de transformador como GPT-3 con un tamaño de ventana de contexto de 512. Para generar una ventana de contexto completa de forma autorregresiva con decodificación voraz, debe ejecutarse 512 veces, generando cada vez un token . Sin embargo, si tuviéramos alguna suposición fundamentada sobre los valores de estos tokens, podríamos verificarlos todos en paralelo, en una ejecución del modelo, comprobando que cada uno es de hecho el token con la mayor probabilidad logarítmica en la salida -ésima.
En la decodificación especulativa, se utiliza un modelo más pequeño o alguna otra heurística simple para generar algunos tokens especulativos que posteriormente son verificados por el modelo más grande. Por ejemplo, supongamos que un modelo pequeño generó cuatro tokens especulativos: . Estos tokens se ejecutan a través del modelo más grande, y solo se aceptan y . La misma ejecución del modelo grande ya generó un nuevo token para reemplazar a , y se descarta por completo. Luego, el proceso se repite (comenzando desde el cuarto token) hasta que se generan todos los tokens.
Para la decodificación no codiciosa, se aplican ideas similares, excepto que los tokens especulativos se aceptan o rechazan estocásticamente, de una manera que garantiza que la distribución de salida final sea la misma que si no se utilizara la decodificación especulativa. [84] [86]
El entrenamiento de arquitecturas basadas en transformadores puede resultar costoso, especialmente para entradas largas. [87] Se han desarrollado muchos métodos para intentar abordar el problema. Long Range Arena (2020) [88] es un punto de referencia estándar para comparar el comportamiento de las arquitecturas de transformadores en entradas largas.
El gráfico de atención estándar es de todos a todos o causal, y ambos se escalan según donde es el número de tokens en una secuencia.
Reformer (2020) [87] [89] reduce la carga computacional de a mediante el uso de hash sensible a la localidad y capas reversibles. [90]
La atención dispersa [91] utiliza gráficos de atención que crecen más lentamente que . Por ejemplo, BigBird (2020) [92] utiliza redes aleatorias de mundo pequeño que crecen como .
Los transformadores ordinarios requieren un tamaño de memoria que sea cuadrático con respecto al tamaño de la ventana de contexto. Los transformadores sin atención [93] reducen esto a una dependencia lineal, pero conservan las ventajas de un transformador al vincular la clave con el valor.
Atención de características aleatorias (2021) [94] utiliza características aleatorias de Fourier : donde son muestras independientes de la distribución normal . Esta elección de parámetros satisface , o En consecuencia, la atención unidireccional, con una consulta, se puede escribir como donde . De manera similar para consultas múltiples y para atención multidireccional.
Esta aproximación se puede calcular en tiempo lineal, ya que podemos calcular primero la matriz y luego multiplicarla por la consulta. En esencia, hemos logrado obtener una versión más precisa de Performer (2022) [95] utiliza la misma función aleatoria de atención, pero primero se muestrean de forma independiente de la distribución normal y luego se procesan mediante Gram-Schmidt .
Los transformadores también se pueden usar/adaptar para modalidades (entrada o salida) más allá del texto, generalmente encontrando una forma de "tokenizar" la modalidad.
Los modelos multimodales se pueden entrenar desde cero o mediante un ajuste fino. Un estudio de 2022 descubrió que los Transformers preentrenados solo en lenguaje natural se pueden ajustar en solo el 0,03 % de los parámetros y volverse competitivos con los LSTM en una variedad de tareas lógicas y visuales, lo que demuestra aprendizaje por transferencia . [96] El LLaVA era un modelo de visión-lenguaje compuesto por un modelo de lenguaje (Vicuna-13B) [97] y un modelo de visión ( ViT -L/14), conectados por una capa lineal. Solo la capa lineal está ajustada. [98]
Los transformadores de visión [41] adaptan el transformador a la visión por computadora descomponiendo las imágenes de entrada como una serie de parches, convirtiéndolos en vectores y tratándolos como tokens en un transformador estándar.
Conformer [42] y posteriormente Whisper [99] siguen el mismo patrón para el reconocimiento de voz , primero convirtiendo la señal de voz en un espectrograma , que luego se trata como una imagen, es decir, se descompone en una serie de parches, se convierte en vectores y se trata como fichas en un transformador estándar.
Los perceptores [100] [101] son una variante de los transformadores diseñados para la multimodalidad.
Para la generación de imágenes, las arquitecturas notables son DALL-E 1 (2021), Parti (2022), [102] Phenaki (2023), [103] y Muse (2023). [104] A diferencia de los modelos posteriores, DALL-E no es un modelo de difusión. En cambio, utiliza un transformador solo decodificador que genera autorregresivamente un texto, seguido de la representación de token de una imagen, que luego es convertida por un autocodificador variacional en una imagen. [105] Parti es un transformador codificador-decodificador, donde el codificador procesa un mensaje de texto y el decodificador genera una representación de token de una imagen. [106] Muse es un transformador solo codificador que está entrenado para predecir tokens de imagen enmascarados a partir de tokens de imagen desenmascarados. Durante la generación, todos los tokens de entrada están enmascarados y las predicciones de mayor confianza se incluyen para la siguiente iteración, hasta que se predicen todos los tokens. [104] Phenaki es un modelo de texto a vídeo. Es un transformador enmascarado bidireccional condicionado a tokens de texto precalculados. Los tokens generados se decodifican luego en un vídeo. [103]
El transformador ha tenido un gran éxito en el procesamiento del lenguaje natural (PLN). Muchos modelos de lenguaje de gran tamaño, como GPT-2 , GPT-3 , GPT-4 , AlbertAGPT, Claude , BERT , XLNet , RoBERTa y ChatGPT, demuestran la capacidad de los transformadores para realizar una amplia variedad de subtareas relacionadas con el PLN y sus aplicaciones prácticas o del mundo real relacionadas, entre ellas:
Más allá del PNL tradicional, la arquitectura del transformador ha tenido éxito en otras aplicaciones, como:
{{cite web}}
: CS1 maint: multiple names: authors list (link){{cite journal}}
: Requiere citar revista |journal=
( ayuda )