stringtranslate.com

Transformador (arquitectura de aprendizaje profundo)

Arquitectura estándar de Transformer, que muestra a la izquierda un codificador y a la derecha un decodificador. Nota: utiliza la convención anterior a LN, que es diferente de la convención posterior a LN utilizada en el Transformer original de 2017.

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 un 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 al buscar 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 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 y, por lo tanto, 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 inicialmente 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 procesamiento 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).

Historia

Antecesores

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]

Atención con seq2seq

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 a Google Neural Machine Translation , que reemplazó al modelo anterior basado en traducción automática estadística . El nuevo modelo era un modelo seq2seq donde el codificador y el decodificador eran ambos 8 capas de LSTM bidireccional. [28] Tomó nueve meses para desarrollarse, y logró un mayor nivel de rendimiento que el enfoque estadístico, que tardó diez años en desarrollarse. [29] En el mismo año, se propuso la autoatención avant la lettre , originalmente llamada intraatención o atención intra-oración , para las LSTM. [30] [1]

Paralelizando la atención

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. [31] 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". [32] 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. [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]

La era del auge de la IA

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.

Capacitación

Métodos para estabilizar el entrenamiento

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]

Preentrenamiento-ajuste fino

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.

Tareas

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).

Arquitectura

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 .

Tokenización

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.

Incrustar

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 [52]

Desincrustación

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 .

Codificación posicional

Diagrama de una codificación posicional sinusoidal con parámetros.

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.

Codificador-decodificador (descripción general)

Un bloque codificador-decodificador.
Un transformador se compone de capas de codificador y capas de decodificador apiladas.

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 avance para el procesamiento adicional de sus salidas y contienen conexiones residuales y pasos de normalización de capas. [54] Estas capas de avance contienen la mayoría de los parámetros en un modelo Transformer.

Red de retroalimentación

El módulo de red de propagación hacia adelante. Es una red de dos capas que convierte vectores dimensionales en vectores dimensionales.

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), [52] o tamaño de avance (BERT). [52] 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: .

Atención de producto escalable

Atención cabeza

Atención del producto punto a escala, diagrama de bloques.
La dimensión exacta cuenta dentro de un módulo de cabezal de atenció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 por lo general . En teoría, es posible que los tres sean diferentes, pero ese rara vez es el caso en la práctica.

Atención multifacética

Atención multicéfala, diagrama de bloques.
La dimensión exacta cuenta dentro de un módulo de atención de múltiples cabezas.

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". Además, el campo de influencia que representa la relevancia puede dilatarse progresivamente en capas sucesivas. 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 cabeza 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 es una matriz cuadrada.

Atención enmascarada

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]

Codificador

Una capa de codificador.

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.

Descifrador

Una capa decodificadora.

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.

Arquitectura de transformador completo

Subcapas

(a) Una capa de codificador y una capa de decodificador. (b) Dos capas de codificador y dos capas de decodificador. Las subcapas también están etiquetadas.

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.

Codificador de transformador con norma primero y norma último.
Decodificador de transformador con norma primero y norma último.
Diagrama de bloques de la arquitectura completa del Transformer.
Jerarquía esquemática de objetos para la arquitectura completa de Transformer, en estilo de programación orientada a objetos .

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. La convención pre-LN se desarrolló en 2020, que resultó ser más fácil de entrenar, no requería calentamiento, lo que conducía a una convergencia más rápida. [46]

Pseudocódigo

El siguiente es el pseudocódigo para un codificador-decodificador Transformer pre-LN estándar, adaptado de [58]

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 ← copiar(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 ← copiar(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 ← copia(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 ← copia(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 ← copia(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

Terminología

La arquitectura del Transformer, al ser modular, permite variaciones. Aquí se describen varias variaciones comunes. [59]

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. [59]

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 [59] : 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. [60]

Trabajos posteriores

Funciones de activación alternativas

El transformador original utiliza la función de activación ReLU . Se desarrollaron otras funciones de activación. La serie Llama utilizó SwiGLU; [61] tanto GPT-1 como BERT [35] utilizaron GELU. [62]

Normalizaciones alternativas

La normalización utilizada en el Transformador puede ser diferente de LayerNorm. Un ejemplo es RMSNorm [63] que se utiliza en la serie Llama . Otros ejemplos incluyen ScaleNorm [64] o FixNorm [64] .

Codificaciones posicionales alternativas

Los transformadores pueden utilizar otros métodos de codificación posicional distintos del sinusoidal. [65]

El artículo original de Transformer informó el uso de una codificación posicional aprendida, [66] pero no la encontró superior a la sinusoidal. [1] Más tarde, [67] 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.

Soga

RoPE (incrustación posicional rotatoria), [68] se explica mejor considerando una lista de vectores bidimensionales . Ahora elija un á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 .

Coartada

ALiBi (Atención con sesgos lineales) [69] no es un reemplazo para el 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).

Codificación de posición relativa

Las codificaciones de posición relativa [70] 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". [71]

Implementación eficiente

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]

Atención Flash

FlashAttention [72] 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, [73] [74] [75] 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, un paralelismo mejorado sobre la dimensión de longitud de secuencia, una mejor partición del 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). [76]

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.

Atención de consultas múltiples

La atención de múltiples consultas cambia el mecanismo de atención de múltiples cabezas. [77] 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.

Almacenamiento en caché

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. [78] [79] [80]

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.

Descodificación especulativa

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 [81] [82] 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. [81] [83]

Transformadores subcuadráticos

El entrenamiento de arquitecturas basadas en transformadores puede resultar costoso, especialmente para entradas largas. [84] Se han desarrollado muchos métodos para intentar abordar el problema. Long Range Arena (2020) [85] es un punto de referencia estándar para comparar el comportamiento de las arquitecturas de transformadores en entradas largas.

Gráficos de atención alternativos

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) [84] [86] reduce la carga computacional de a mediante el uso de hash sensible a la localidad y capas reversibles. [87]

La atención dispersa [88] utiliza gráficos de atención que crecen más lentamente que . Por ejemplo, BigBird (2020) [89] 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 [90] reducen esto a una dependencia lineal, pero conservan las ventajas de un transformador al vincular la clave con el valor.

Característica aleatoria Atención

Atención de características aleatorias (2021) [91] 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) [92] 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 .

Multimodalidad

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 . [93] El LLaVA era un modelo de visión-lenguaje compuesto por un modelo de lenguaje (Vicuna-13B) [94] y un modelo de visión ( ViT -L/14), conectados por una capa lineal. Solo la capa lineal está ajustada. [95]

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 [96] 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 [97] [98] 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), [99] Phenaki (2023), [100] y Muse (2023). [101] 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. [102] 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. [103] 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. [101] 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. [100]

Aplicaciones

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:

Véase también

Notes

  1. ^ Gated recurrent units (2014) further reduced its complexity.
  2. ^ Some architectures, such as RWKV or state space models, avoid the issue.

References

  1. ^ a b c d e f g h i j k Vaswani, Ashish; Shazeer, Noam; Parmar, Niki; Uszkoreit, Jakob; Jones, Llion; Gomez, Aidan N; Kaiser, Łukasz; Polosukhin, Illia (2017). "Attention is All you Need" (PDF). Advances in Neural Information Processing Systems. 30. Curran Associates, Inc.
  2. ^ Hochreiter, Sepp; Schmidhuber, Jürgen (1 November 1997). "Long Short-Term Memory". Neural Computation. 9 (8): 1735–1780. doi:10.1162/neco.1997.9.8.1735. ISSN 0899-7667. PMID 9377276. S2CID 1915014.
  3. ^ a b "Better Language Models and Their Implications". OpenAI. 2019-02-14. Archived from the original on 2020-12-19. Retrieved 2019-08-25.
  4. ^ a b Bahdanau; Cho, Kyunghyun; Bengio, Yoshua (September 1, 2014). "Neural Machine Translation by Jointly Learning to Align and Translate". arXiv:1409.0473 [cs.CL].
  5. ^ Luong, Minh-Thang; Pham, Hieu; Manning, Christopher D. (August 17, 2015). "Effective Approaches to Attention-based Neural Machine Translation". arXiv:1508.04025 [cs.CL].
  6. ^ a b Chen, Lili; Lu, Kevin; Rajeswaran, Aravind; Lee, Kimin; Grover, Aditya; Laskin, Michael; Abbeel, Pieter; Srinivas, Aravind; Mordatch, Igor (2021-06-24), Decision Transformer: Reinforcement Learning via Sequence Modeling, arXiv:2106.01345
  7. ^ Parisotto, Emilio; Song, Francis; Rae, Jack; Pascanu, Razvan; Gulcehre, Caglar; Jayakumar, Siddhant; Jaderberg, Max; Kaufman, Raphaël Lopez; Clark, Aidan; Noury, Seb; Botvinick, Matthew; Heess, Nicolas; Hadsell, Raia (2020-11-21). "Stabilizing Transformers for Reinforcement Learning". Proceedings of the 37th International Conference on Machine Learning. PMLR: 7487–7498.
  8. ^ Radford, Alec; Jong Wook Kim; Xu, Tao; Brockman, Greg; McLeavey, Christine; Sutskever, Ilya (2022). "Robust Speech Recognition via Large-Scale Weak Supervision". arXiv:2212.04356 [eess.AS].
  9. ^ Monastirsky, Maxim; Azulay, Osher; Sintov, Avishai (February 2023). "Learning to Throw With a Handful of Samples Using Decision Transformers". IEEE Robotics and Automation Letters. 8 (2): 576–583. doi:10.1109/LRA.2022.3229266. ISSN 2377-3766.
  10. ^ a b Ruoss, Anian; Delétang, Grégoire; Medapati, Sourabh; Grau-Moya, Jordi; Wenliang, Li; Catt, Elliot; Reid, John; Genewein, Tim (2024-02-07). "Grandmaster-Level Chess Without Search". arXiv:2402.04494v1 [cs.LG].
  11. ^ a b Wolf, Thomas; Debut, Lysandre; Sanh, Victor; Chaumond, Julien; Delangue, Clement; Moi, Anthony; Cistac, Pierric; Rault, Tim; Louf, Remi; Funtowicz, Morgan; Davison, Joe; Shleifer, Sam; von Platen, Patrick; Ma, Clara; Jernite, Yacine; Plu, Julien; Xu, Canwen; Le Scao, Teven; Gugger, Sylvain; Drame, Mariama; Lhoest, Quentin; Rush, Alexander (2020). "Transformers: State-of-the-Art Natural Language Processing". Proceedings of the 2020 Conference on Empirical Methods in Natural Language Processing: System Demonstrations. pp. 38–45. doi:10.18653/v1/2020.emnlp-demos.6. S2CID 208117506.
  12. ^ a b c "Open Sourcing BERT: State-of-the-Art Pre-training for Natural Language Processing". Google AI Blog. 2 November 2018. Archived from the original on 2021-01-13. Retrieved 2019-08-25.
  13. ^ Feldman, J. A.; Ballard, D. H. (1982-07-01). "Connectionist models and their properties". Cognitive Science. 6 (3): 205–254. doi:10.1016/S0364-0213(82)80001-3. ISSN 0364-0213.
  14. ^ Rumelhart, David E.; McClelland, James L.; Hinton, Geoffrey E. (1987-07-29). Parallel Distributed Processing, Volume 1: Explorations in the Microstructure of Cognition: Foundations, Chapter 2 (PDF). Cambridge, Mass: Bradford Books. ISBN 978-0-262-68053-0.
  15. ^ Giles, C. Lee; Maxwell, Tom (1987-12-01). "Learning, invariance, and generalization in high-order neural networks". Applied Optics. 26 (23): 4972–4978. doi:10.1364/AO.26.004972. ISSN 0003-6935. PMID 20523475.
  16. ^ a b Schmidhuber, Jürgen (1992). "Learning to control fast-weight memories: an alternative to recurrent nets" (PDF). Neural Computation. 4 (1): 131–139. doi:10.1162/neco.1992.4.1.131. S2CID 16683347.
  17. ^ Christoph von der Malsburg: The correlation theory of brain function. Internal Report 81-2, MPI Biophysical Chemistry, 1981. http://cogprints.org/1380/1/vdM_correlation.pdf See Reprint in Models of Neural Networks II, chapter 2, pages 95-119. Springer, Berlin, 1994.
  18. ^ Jerome A. Feldman, "Dynamic connections in neural networks," Biological Cybernetics, vol. 46, no. 1, pp. 27-39, Dec. 1982.
  19. ^ Hinton, Geoffrey E.; Plaut, David C. (1987). "Using Fast Weights to Deblur Old Memories". Proceedings of the Annual Meeting of the Cognitive Science Society. 9.
  20. ^ Katharopoulos, Angelos; Vyas, Apoorv; Pappas, Nikolaos; Fleuret, François (2020). "Transformers are RNNs: Fast autoregressive Transformers with linear attention". ICML 2020. PMLR. pp. 5156–5165.
  21. ^ Schlag, Imanol; Irie, Kazuki; Schmidhuber, Jürgen (2021). "Linear Transformers Are Secretly Fast Weight Programmers". ICML 2021. Springer. pp. 9355–9366.
  22. ^ a b c Cho, Kyunghyun; van Merriënboer, Bart; Gulcehre, Caglar; Bahdanau, Dzmitry; Bougares, Fethi; Schwenk, Holger; Bengio, Yoshua (October 2014). "Learning Phrase Representations using RNN Encoder–Decoder for Statistical Machine Translation". In Moschitti, Alessandro; Pang, Bo; Daelemans, Walter (eds.). Proceedings of the 2014 Conference on Empirical Methods in Natural Language Processing (EMNLP). Doha, Qatar: Association for Computational Linguistics. pp. 1724–1734. arXiv:1406.1078. doi:10.3115/v1/D14-1179.
  23. ^ a b c Sutskever, Ilya; Vinyals, Oriol; Le, Quoc Viet (14 Dec 2014). "Sequence to sequence learning with neural networks". arXiv:1409.3215 [cs.CL]. [first version posted to arXiv on 10 Sep 2014]
  24. ^ Chung, Junyoung; Gulcehre, Caglar; Cho, KyungHyun; Bengio, Yoshua (2014). "Empirical Evaluation of Gated Recurrent Neural Networks on Sequence Modeling". arXiv:1412.3555 [cs.NE].
  25. ^ Gruber, N.; Jockisch, A. (2020), "Are GRU cells more specific and LSTM cells more sensitive in motive classification of text?", Frontiers in Artificial Intelligence, 3: 40, doi:10.3389/frai.2020.00040, PMC 7861254, PMID 33733157, S2CID 220252321
  26. ^ Sutskever, Ilya; Vinyals, Oriol; Le, Quoc V (2014). "Sequence to Sequence Learning with Neural Networks". Advances in Neural Information Processing Systems. 27. Curran Associates, Inc. arXiv:1409.3215.
  27. ^ Luong, Minh-Thang; Pham, Hieu; Manning, Christopher D. (2015). "Effective Approaches to Attention-based Neural Machine Translation". arXiv:1508.04025 [cs.CL].
  28. ^ Wu, Yonghui; et al. (2016-09-01). "Google's Neural Machine Translation System: Bridging the Gap between Human and Machine Translation". arXiv:1609.08144 [cs.CL].
  29. ^ Lewis-Kraus, Gideon (2016-12-14). "The Great A.I. Awakening". The New York Times. ISSN 0362-4331. Archived from the original on 24 May 2023. Retrieved 2023-06-22.
  30. ^ Cheng, Jianpeng; Dong, Li; Lapata, Mirella (November 2016). "Long Short-Term Memory-Networks for Machine Reading". In Su, Jian; Duh, Kevin; Carreras, Xavier (eds.). Proceedings of the 2016 Conference on Empirical Methods in Natural Language Processing. Austin, Texas: Association for Computational Linguistics. pp. 551–561. doi:10.18653/v1/D16-1053.
  31. ^ Parikh, Ankur P.; Täckström, Oscar; Das, Dipanjan; Uszkoreit, Jakob (2016-09-25). "A Decomposable Attention Model for Natural Language Inference". arXiv:1606.01933 [cs.CL].
  32. ^ a b Levy, Steven. "8 Google Employees Invented Modern AI. Here's the Inside Story". Wired. ISSN 1059-1028. Archived from the original on 20 Mar 2024. Retrieved 2024-08-06.
  33. ^ Peng, Bo; Alcaide, Eric; Anthony, Quentin; Albalak, Alon; Arcadinho, Samuel; Biderman, Stella; Cao, Huanqi; Cheng, Xin; Chung, Michael (2023-12-10), RWKV: Reinventing RNNs for the Transformer Era, arXiv:2305.13048
  34. ^ Marche, Stephen (2024-08-23). "Was Linguistic A.I. Created by Accident?". The New Yorker. ISSN 0028-792X. Retrieved 2024-08-27.
  35. ^ a b Devlin, Jacob; Chang, Ming-Wei; Lee, Kenton; Toutanova, Kristina (11 October 2018). "BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding". arXiv:1810.04805v2 [cs.CL].
  36. ^ "Google: BERT now used on almost every English query". Search Engine Land. 2020-10-15. Retrieved 2020-11-24.
  37. ^ "Recent Advances in Google Translate". research.google. Retrieved 2024-05-08.
  38. ^ "The inside story of how ChatGPT was built from the people who made it". MIT Technology Review. Retrieved 2024-08-06.
  39. ^ "Improving language understanding with unsupervised learning". openai.com. June 11, 2018. Archived from the original on 2023-03-18. Retrieved 2023-03-18.
  40. ^ finetune-transformer-lm, OpenAI, June 11, 2018, retrieved 2023-05-01
  41. ^ a b Dosovitskiy, Alexey; Beyer, Lucas; Kolesnikov, Alexander; Weissenborn, Dirk; Zhai, Xiaohua; Unterthiner, Thomas; Dehghani, Mostafa; Minderer, Matthias; Heigold, Georg; Gelly, Sylvain; Uszkoreit, Jakob (2021-06-03). "An Image is Worth 16x16 Words: Transformers for Image Recognition at Scale". arXiv:2010.11929 [cs.CV].
  42. ^ a b Gulati, Anmol; Qin, James; Chiu, Chung-Cheng; Parmar, Niki; Zhang, Yu; Yu, Jiahui; Han, Wei; Wang, Shibo; Zhang, Zhengdong; Wu, Yonghui; Pang, Ruoming (2020). "Conformer: Convolution-augmented Transformer for Speech Recognition". arXiv:2005.08100 [eess.AS].
  43. ^ Choromanski, Krzysztof; Likhosherstov, Valerii; Dohan, David; Song, Xingyou; Gane, Andreea; Sarlos, Tamas; Hawkins, Peter; Davis, Jared; Mohiuddin, Afroz (2022-11-19), Rethinking Attention with Performers, arXiv:2009.14794
  44. ^ Liu, Zhuang; Mao, Hanzi; Wu, Chao-Yuan; Feichtenhofer, Christoph; Darrell, Trevor; Xie, Saining (2022). A ConvNet for the 2020s. Conference on Computer Vision and Pattern Recognition. pp. 11976–11986.
  45. ^ Esser, Patrick; Kulal, Sumith; Blattmann, Andreas; Entezari, Rahim; Müller, Jonas; Saini, Harry; Levi, Yam; Lorenz, Dominik; Sauer, Axel (2024-03-05), Scaling Rectified Flow Transformers for High-Resolution Image Synthesis, arXiv:2403.03206
  46. ^ a b Xiong, Ruibin; Yang, Yunchang; He, Di; Zheng, Kai; Zheng, Shuxin; Xing, Chen; Zhang, Huishuai; Lan, Yanyan; Wang, Liwei; Liu, Tie-Yan (2020-06-29). "On Layer Normalization in the Transformer Architecture". arXiv:2002.04745 [cs.LG].
  47. ^ Raffel, Colin; Shazeer, Noam; Roberts, Adam; Lee, Katherine; Narang, Sharan; Matena, Michael; Zhou, Yanqi; Li, Wei; Liu, Peter J. (2020-01-01). "Exploring the limits of transfer learning with a unified text-to-text transformer". The Journal of Machine Learning Research. 21 (1): 140:5485–140:5551. arXiv:1910.10683. ISSN 1532-4435.
  48. ^ Raffel, Colin; Shazeer, Noam; Roberts, Adam; Lee, Katherine; Narang, Sharan; Matena, Michael; Zhou, Yanqi; Li, Wei; Liu, Peter J. (2019). "Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer". arXiv:1910.10683 [cs.LG].
  49. ^ a b "Masked language modeling". huggingface.co. Retrieved 2023-10-05.
  50. ^ a b "Causal language modeling". huggingface.co. Retrieved 2023-10-05.
  51. ^ a b c d Tay, Yi; Dehghani, Mostafa; Tran, Vinh Q.; Garcia, Xavier; Wei, Jason; Wang, Xuezhi; Chung, Hyung Won; Shakeri, Siamak; Bahri, Dara (2023-02-28), UL2: Unifying Language Learning Paradigms, arXiv:2205.05131
  52. ^ a b c Devlin, Jacob; Chang, Ming-Wei; Lee, Kenton; Toutanova, Kristina (11 October 2018). "BERT: Pre-training of Deep Bidirectional Transformers for Language Understanding". arXiv:1810.04805v2 [cs.CL].
  53. ^ "Sequence Modeling with Neural Networks (Part 2): Attention Models". Indico. 2016-04-18. Archived from the original on 2020-10-21. Retrieved 2019-10-15.
  54. ^ a b c Alammar, Jay. "The Illustrated Transformer". jalammar.github.io. Archived from the original on 2020-10-18. Retrieved 2019-10-15.
  55. ^ Team, Keras. "Keras documentation: GPT2Backbone model". keras.io. Retrieved 2024-08-08.
  56. ^ Clark, Kevin; Khandelwal, Urvashi; Levy, Omer; Manning, Christopher D. (August 2019). "What Does BERT Look at? An Analysis of BERT's Attention". Proceedings of the 2019 ACL Workshop BlackboxNLP: Analyzing and Interpreting Neural Networks for NLP. Florence, Italy: Association for Computational Linguistics: 276–286. arXiv:1906.04341. doi:10.18653/v1/W19-4828. Archived from the original on 2020-10-21. Retrieved 2020-05-20.
  57. ^ Yang, Zhilin; Dai, Zihang; Yang, Yiming; Carbonell, Jaime; Salakhutdinov, Russ R; Le, Quoc V (2019). "XLNet: Generalized Autoregressive Pretraining for Language Understanding". Advances in Neural Information Processing Systems. 32. Curran Associates, Inc. arXiv:1906.08237.
  58. ^ Phuong, Mary; Hutter, Marcus (2022-07-19), Formal Algorithms for Transformers, arXiv:2207.09238
  59. ^ a b c Raffel, Colin; Shazeer, Noam; Roberts, Adam; Lee, Katherine; Narang, Sharan; Matena, Michael; Zhou, Yanqi; Li, Wei; Liu, Peter J. (2020). "Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer". Journal of Machine Learning Research. 21 (140): 1–67. arXiv:1910.10683. ISSN 1533-7928.
  60. ^ "Recent Advances in Google Translate". Google Research. June 8, 2020. Archived from the original on 4 Jul 2024. Retrieved 2024-08-07.
  61. ^ Shazeer, Noam (2020-02-01). "GLU Variants Improve Transformer". arXiv:2002.05202 [cs.LG].
  62. ^ Hendrycks, Dan; Gimpel, Kevin (2016-06-27). "Gaussian Error Linear Units (GELUs)". arXiv:1606.08415v5 [cs.LG].
  63. ^ Zhang, Biao; Sennrich, Rico (2019). "Root Mean Square Layer Normalization". Advances in Neural Information Processing Systems. 32. Curran Associates, Inc. arXiv:1910.07467.
  64. ^ a b Nguyen, Toan Q.; Salazar, Julian (2019-11-02). Niehues, Jan; Cattoni, Rolando; Stüker, Sebastian; Negri, Matteo; Turchi, Marco; Ha, Thanh-Le; Salesky, Elizabeth; Sanabria, Ramon; Barrault, Loic (eds.). "Transformers without Tears: Improving the Normalization of Self-Attention". Proceedings of the 16th International Conference on Spoken Language Translation. Hong Kong: Association for Computational Linguistics. arXiv:1910.05895. doi:10.5281/zenodo.3525484.
  65. ^ Dufter, Philipp; Schmitt, Martin; Schütze, Hinrich (2022-06-06). "Position Information in Transformers: An Overview". Computational Linguistics. 48 (3): 733–763. arXiv:2102.11090. doi:10.1162/coli_a_00445. ISSN 0891-2017. S2CID 231986066.
  66. ^ Gehring, Jonas; Auli, Michael; Grangier, David; Yarats, Denis; Dauphin, Yann N. (2017-07-17). "Convolutional Sequence to Sequence Learning". Proceedings of the 34th International Conference on Machine Learning. PMLR: 1243–1252.
  67. ^ Haviv, Adi; Ram, Ori; Press, Ofir; Izsak, Peter; Levy, Omer (2022-12-05), Transformer Language Models without Positional Encodings Still Learn Positional Information, arXiv:2203.16634
  68. ^ Su, Jianlin; Lu, Yu; Pan, Shengfeng; Murtadha, Ahmed; Wen, Bo; Liu, Yunfeng (2021-04-01). "RoFormer: Enhanced Transformer with Rotary Position Embedding". arXiv:2104.09864 [cs.CL].
  69. ^ Press, Ofir; Smith, Noah A.; Lewis, Mike (2021-08-01). "Train Short, Test Long: Attention with Linear Biases Enables Input Length Extrapolation". arXiv:2108.12409 [cs.CL].
  70. ^ Shaw, Peter; Uszkoreit, Jakob; Vaswani, Ashish (2018). "Self-Attention with Relative Position Representations". arXiv:1803.02155 [cs.CL].
  71. ^ Ke, Guolin; He, Di; Liu, Tie-Yan (2021-03-15), Rethinking Positional Encoding in Language Pre-training, arXiv:2006.15595
  72. ^ Dao, Tri; Fu, Dan; Ermon, Stefano; Rudra, Atri; Ré, Christopher (2022-12-06). "FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness". Advances in Neural Information Processing Systems. 35: 16344–16359. arXiv:2205.14135.
  73. ^ "Stanford CRFM". crfm.stanford.edu. Retrieved 2023-07-18.
  74. ^ "FlashAttention-2: Faster Attention with Better Parallelism and Work Partitioning". Princeton NLP. 2023-06-17. Retrieved 2023-07-18.
  75. ^ "Introducing Together AI Chief Scientist Tri Dao, as he releases FlashAttention-2 to speed up model training and inference". TOGETHER. Retrieved 2023-07-18.
  76. ^ Ainslie, Joshua; Lee-Thorp, James; de Jong, Michiel; Zemlyanskiy, Yury; Lebrón, Federico; Sanghai, Sumit (2023-12-23). "GQA: Training Generalized Multi-Query Transformer Models from Multi-Head Checkpoints". arXiv:2305.13245 [cs.CL].
  77. ^ Chowdhery, Aakanksha; Narang, Sharan; Devlin, Jacob; Bosma, Maarten; Mishra, Gaurav; Roberts, Adam; Barham, Paul; Chung, Hyung Won; Sutton, Charles; Gehrmann, Sebastian; Schuh, Parker; Shi, Kensen; Tsvyashchenko, Sasha; Maynez, Joshua; Rao, Abhishek (2022-04-01). "PaLM: Scaling Language Modeling with Pathways". arXiv:2204.02311 [cs.CL].
  78. ^ Kwon, Woosuk; Li, Zhuohan; Zhuang, Siyuan; Sheng, Ying; Zheng, Lianmin; Yu, Cody Hao; Gonzalez, Joseph; Zhang, Hao; Stoica, Ion (2023-10-23). "Efficient Memory Management for Large Language Model Serving with PagedAttention". Proceedings of the 29th Symposium on Operating Systems Principles. SOSP '23. New York, NY, USA: Association for Computing Machinery. pp. 611–626. arXiv:2309.06180. doi:10.1145/3600006.3613165. ISBN 979-8-4007-0229-7.
  79. ^ vllm-project/vllm, vLLM, 2024-06-20, retrieved 2024-06-20
  80. ^ Contribution), Woosuk Kwon*, Zhuohan Li*, Siyuan Zhuang, Ying Sheng, Lianmin Zheng, Cody Yu, Joey Gonzalez, Hao Zhang, and Ion Stoica (* Equal (2023-06-20). "vLLM: Easy, Fast, and Cheap LLM Serving with PagedAttention". vLLM Blog. Retrieved 2024-06-20.{{cite web}}: CS1 maint: multiple names: authors list (link)
  81. ^ a b Leviathan, Yaniv; Kalman, Matan; Matias, Yossi (2023-05-18), Fast Inference from Transformers via Speculative Decoding, arXiv:2211.17192
  82. ^ Fu, Yao (2023-12-13). "Towards 100x Speedup: Full Stack Transformer Inference Optimization".
  83. ^ Chen, Charlie; Borgeaud, Sebastian; Irving, Geoffrey; Lespiau, Jean-Baptiste; Sifre, Laurent; Jumper, John (2023-02-02), Accelerating Large Language Model Decoding with Speculative Sampling, arXiv:2302.01318
  84. ^ a b Kitaev, Nikita; Kaiser, Łukasz; Levskaya, Anselm (2020). "Reformer: The Efficient Transformer". arXiv:2001.04451 [cs.LG].
  85. ^ Tay, Yi; Dehghani, Mostafa; Abnar, Samira; Shen, Yikang; Bahri, Dara; Pham, Philip; Rao, Jinfeng; Yang, Liu; Ruder, Sebastian; Metzler, Donald (2020-11-08). "Long Range Arena: A Benchmark for Efficient Transformers". arXiv:2011.04006 [cs.LG].
  86. ^ "Reformer: The Efficient Transformer". Google AI Blog. 16 January 2020. Archived from the original on 2020-10-22. Retrieved 2020-10-22.
  87. ^ Gomez, Aidan N; Ren, Mengye; Urtasun, Raquel; Grosse, Roger B (2017). "The Reversible Residual Network: Backpropagation Without Storing Activations". Advances in Neural Information Processing Systems. 30. Curran Associates, Inc. arXiv:1707.04585.
  88. ^ Child, Rewon; Gray, Scott; Radford, Alec; Sutskever, Ilya (2019-04-23), Generating Long Sequences with Sparse Transformers, arXiv:1904.10509
  89. ^ "Constructing Transformers For Longer Sequences with Sparse Attention Methods". Google AI Blog. 25 March 2021. Archived from the original on 2021-09-18. Retrieved 2021-05-28.
  90. ^ Zhai, Shuangfei; Talbott, Walter; Srivastava, Nitish; Huang, Chen; Goh, Hanlin; Zhang, Ruixiang; Susskind, Josh (2021-09-21). "An Attention Free Transformer". arXiv:2105.14103 [cs.LG].
  91. ^ Peng, Hao; Pappas, Nikolaos; Yogatama, Dani; Schwartz, Roy; Smith, Noah A.; Kong, Lingpeng (2021-03-19). "Random Feature Attention". arXiv:2103.02143 [cs.CL].
  92. ^ Choromanski, Krzysztof; Likhosherstov, Valerii; Dohan, David; Song, Xingyou; Gane, Andreea; Sarlos, Tamas; Hawkins, Peter; Davis, Jared; Belanger, David; Colwell, Lucy; Weller, Adrian (2020-09-30). "Masked Language Modeling for Proteins via Linearly Scalable Long-Context Transformers". arXiv:2006.03555 [cs.LG].
  93. ^ Lu, Kevin; Grover, Aditya; Abbeel, Pieter; Mordatch, Igor (2022-06-28). "Frozen Pretrained Transformers as Universal Computation Engines". Proceedings of the AAAI Conference on Artificial Intelligence. 36 (7): 7628–7636. doi:10.1609/aaai.v36i7.20729. ISSN 2374-3468.
  94. ^ "Vicuna: An Open-Source Chatbot Impressing GPT-4 with 90%* ChatGPT Quality | LMSYS Org". lmsys.org. Retrieved 2024-08-11.
  95. ^ Liu, Haotian; Li, Chunyuan; Wu, Qingyang; Lee, Yong Jae (2023-12-15). "Visual Instruction Tuning". Advances in Neural Information Processing Systems. 36: 34892–34916.
  96. ^ Radford, Alec; Kim, Jong Wook; Xu, Tao; Brockman, Greg; McLeavey, Christine; Sutskever, Ilya (2022). "Robust Speech Recognition via Large-Scale Weak Supervision". arXiv:2212.04356 [eess.AS].
  97. ^ Jaegle, Andrew; Gimeno, Felix; Brock, Andrew; Zisserman, Andrew; Vinyals, Oriol; Carreira, Joao (2021-06-22). "Perceiver: General Perception with Iterative Attention". arXiv:2103.03206 [cs.CV].
  98. ^ Jaegle, Andrew; Borgeaud, Sebastian; Alayrac, Jean-Baptiste; Doersch, Carl; Ionescu, Catalin; Ding, David; Koppula, Skanda; Zoran, Daniel; Brock, Andrew; Shelhamer, Evan; Hénaff, Olivier (2021-08-02). "Perceiver IO: A General Architecture for Structured Inputs & Outputs". arXiv:2107.14795 [cs.LG].
  99. ^ "Parti: Pathways Autoregressive Text-to-Image Model". sites.research.google. Retrieved 2024-08-09.
  100. ^ a b Villegas, Ruben; Babaeizadeh, Mohammad; Kindermans, Pieter-Jan; Moraldo, Hernan; Zhang, Han; Saffar, Mohammad Taghi; Castro, Santiago; Kunze, Julius; Erhan, Dumitru (2022-09-29). "Phenaki: Variable Length Video Generation from Open Domain Textual Descriptions". {{cite journal}}: Cite journal requires |journal= (help)
  101. ^ a b Chang, Huiwen; Zhang, Han; Barber, Jarred; Maschinot, A. J.; Lezama, Jose; Jiang, Lu; Yang, Ming-Hsuan; Murphy, Kevin; Freeman, William T. (2023-01-02). "Muse: Text-To-Image Generation via Masked Generative Transformers". arXiv:2301.00704 [cs.CV].
  102. ^ Ramesh, Aditya; Pavlov, Mikhail; Goh, Gabriel; Gray, Scott; Voss, Chelsea; Radford, Alec; Chen, Mark; Sutskever, Ilya (2021-02-26), Zero-Shot Text-to-Image Generation, arXiv:2102.12092
  103. ^ Yu, Jiahui; Xu, Yuanzhong; Koh, Jing Yu; Luong, Thang; Baid, Gunjan; Wang, Zirui; Vasudevan, Vijay; Ku, Alexander; Yang, Yinfei (2022-06-21), Scaling Autoregressive Models for Content-Rich Text-to-Image Generation, arXiv:2206.10789
  104. ^ Kariampuzha, William; Alyea, Gioconda; Qu, Sue; Sanjak, Jaleal; Mathé, Ewy; Sid, Eric; Chatelaine, Haley; Yadaw, Arjun; Xu, Yanji; Zhu, Qian (2023). "Precision information extraction for rare disease epidemiology at scale". Journal of Translational Medicine. 21 (1): 157. doi:10.1186/s12967-023-04011-y. PMC 9972634. PMID 36855134.

Further reading