Construyendo intuición sobre los conceptos detrás de los LLM como ChatGPT – Parte 1 Redes neuronales, Transformers, preentrenamiento y ajuste fino

Construyendo intuición sobre LLM como ChatGPT - Parte 1

Estoy seguro de que no soy el único, pero si no quedó demasiado claro en mi tweet de enero, mi mente quedó completamente impresionada cuando me encontré por primera vez con ChatGPT. La experiencia fue diferente a cualquier otra que haya tenido con cualquier ‘chatbot’. Parecía entender las intenciones del usuario, respondiendo a consultas y comentarios de manera tan natural como solo un humano puede hacerlo. Si me hubieran dicho que había otra persona al otro lado de esa conversación, no lo habría dudado ni por un segundo.

Después de la emoción inicial, comencé a leer todo lo que pude encontrar sobre esta misteriosa tecnología. Comencé a experimentar con la API de ChatGPT cuando se lanzó en marzo, creando chatbots y escribiendo blogs sobre la experiencia (uno de los cuales fue destacado en VoAGI, lo cual aún me tiene emocionado). Por supuesto, esto no fue suficiente, necesitaba saber más sobre lo que estaba sucediendo al otro lado de esa llamada a la API y comencé a adentrarme en el agujero de conejo de los modelos de lenguaje, el aprendizaje profundo, los transformadores, etc.

La más famosa de las tres leyes de Sir Arthur C. Clarke sobre la predicción de avances científicos y tecnológicos futuros establece:

“Cualquier tecnología suficientemente avanzada es indistinguible de la magia”.

Esta publicación de blog es un intento de desmitificar los conceptos detrás de los grandes modelos de lenguaje (LLM) descubriendo el “truco del mago”, por así decirlo, de una manera accesible. Ya sea que seas una de esas personas que prestan atención activamente a las tendencias de la IA, explorando el espacio en crecimiento de la ingeniería de IA y necesites una base en los conceptos básicos, o simplemente estés tratando de satisfacer una curiosidad aguda, espero que al leer este artículo obtengas un poco más de información sobre los ingeniosos conceptos que hicieron posible ChatGPT.

Redes Neuronales

Los LLM, como ChatGPT, se entrenan con grandes cantidades de datos de texto de acceso público en Internet utilizando redes neuronales artificiales. Las redes neuronales artificiales son algoritmos de aprendizaje automático diseñados para imitar de manera abstracta la estructura y el proceso de aprendizaje de nuestro cerebro. Están compuestas por capas de nodos interconectados o “neuronas” y, a través de repeticiones de entrenamiento en grandes cantidades de datos de texto, la red aprende los patrones en los textos y las sutilezas del lenguaje, lo suficiente como para generar palabras, frases o documentos coherentes por sí misma.

Cada círculo representa una neurona, cada una conectada a otras neuronas en la siguiente capa a través de parámetros programables que se ajustan a medida que el modelo 'aprende' a hacer la tarea deseada. Por ejemplo, identificar si una imagen muestra un gato o un perro. GPT-3 se entrenó en una red neuronal con 96 capas y 175 mil millones de parámetros. Se informa que GPT-4 tiene 1 billón de parámetros. Fuente de la imagen

La red neuronal artificial es la característica principal de un subconjunto del aprendizaje automático llamado aprendizaje profundo. Es muy importante en el campo de la IA debido a su capacidad para capturar patrones e interdependencias complejas en los datos y generalizar a partir de estos patrones para hacer predicciones sobre datos nuevos y no vistos. En el contexto del modelado del lenguaje, esto significa predecir qué palabra debería venir a continuación dada una secuencia de palabras precedentes. En comparación con algoritmos convencionales de aprendizaje automático como la regresión lineal, las redes neuronales pueden representar y modelar relaciones no lineales entre diferentes características presentes en grandes cantidades de datos mediante el uso de funciones matemáticas no lineales (la función de activación) en las capas ocultas de la red.

Las redes neuronales han producido tecnología de consumo con la que probablemente has interactuado (y no necesariamente se limitan a tareas de lenguaje), como desbloquear tu teléfono mediante reconocimiento facial, la función de realidad aumentada en tu juego de Pokémon o las sugerencias de programas en la pantalla de inicio de Netflix.

Incluso Andrej Karpathy argumenta que puede ser una nueva y mejor forma de escribir software:

Por ejemplo, en lugar de codificar manualmente la lógica de un programa (si se cumple la condición A, hacer x; si no se cumple la condición A, hacer y), la red neuronal aprende a través de ejemplos de los datos de entrenamiento que si encuentra la ‘condición A’ en producción, debe hacer x. Estas condiciones/lógica no son definidas por sus creadores, sino que la red neuronal se ajusta a sí misma (ajustando sus miles de millones o incluso billones de parámetros, los pesos y sesgos) para cumplir con este comportamiento deseado.

Los pesos y sesgos son las conexiones (representadas como valores numéricos) que ayudan a determinar si un nodo/neurona en una capa de red está 'activado' y cuál es el grado de activación. El equivalente biológico de esto en nuestro cerebro son las 'sinapsis' o las señales eléctricas enviadas para activar nuestras neuronas biológicas. Fuente de la imagen
Visualización de neuronas biológicas iluminándose al ser activadas por las señales eléctricas de nuestros receptores sensoriales. La investigación sugiere que esta actividad cerebral sirve como mecanismo para almacenar memorias y reproducirlas al recordar experiencias pasadas. Fuente

Nadie sabe específicamente qué hace cada peso y sesgo individual o cómo contribuye un solo peso a un cambio específico en el comportamiento de la red neuronal artificial. Estos parámetros se cambian en conjunto como una unidad durante el entrenamiento a través de actualizaciones de gradiente (se discutirá con más detalle más adelante).

Por esta razón, a menudo se escucha a los modelos de aprendizaje automático entrenados en redes neuronales como ‘cajas negras’. Se pueden observar sus entradas y salidas, pero el funcionamiento interno o cómo hace lo que hace no es fácilmente comprensible. Esta también es la razón de los descubrimientos de capacidades ’emergentes’. A medida que un LLM se hace más grande (medido por su número de parámetros), comienza a salir del entrenamiento con habilidades no anticipadas. Por ejemplo, se descubrió que GPT-2 es bueno en la traducción de lenguaje, GPT-3 es un excelente aprendizaje de pocas muestras y GPT-4 ha mostrado destellos de inteligencia general artificial o AGI. Ninguno de estos fue definido explícitamente como objetivo de entrenamiento, su objetivo principal era predecir la siguiente palabra en una secuencia.

Los comportamientos emergentes no son exclusivos de las grandes redes neuronales. A medida que un sistema se vuelve más grande y complejo, la interacción entre sus componentes individuales puede llevar a comportamientos inesperados que no se pueden explicar completamente analizando las propiedades de cada componente individual de forma aislada. Una hormiga sola es tonta, pero una colonia de hormigas puede construir redes de túneles muy complejas y librar guerras contra otras colonias. Este fenómeno se ha documentado en sistemas como insectos sociales (hormigas y abejas), comportamiento de multitudes y otros ecosistemas biológicos.

Modelos de Fundación de Preentrenamiento

El primer paso para crear algo como ChatGPT es el preentrenamiento de un modelo base o un modelo de fundación. El objetivo de este paso es crear un modelo de aprendizaje automático que pueda generar de forma autónoma una estructura de palabras coherente o generar texto similar al humano (frase, oración, párrafo) generando palabras en secuencia en función de su predicción de qué palabra debería venir a continuación dadas las palabras anteriores. Se llama preentrenamiento porque la salida de este paso, el modelo base, sigue siendo un producto crudo que tiene aplicaciones prácticas limitadas y generalmente solo interesa a los investigadores. Los modelos base se ‘entrenan’ aún más a través de las etapas de ajuste fino para tareas específicas con utilidad en el mundo real, como la traducción de texto, la resumación, la clasificación, etc.

Al comienzo del preentrenamiento, los parámetros de la red neuronal se establecen con valores numéricos aleatorios. Las palabras en los datos masivos de texto de internet se convierten en representaciones numéricas en forma de tokens (como un número entero) y embeddings (como vectores), antes de ser alimentadas a la red neuronal.

Los tokens y embeddings se discutirán en detalle en la próxima parte de esta serie, pero por ahora, piense en un token como la identificación única de una palabra en el vocabulario del modelo y el embedding como el significado de esa palabra.

Una palabra como 'the' se le asigna un ID de token (5) y luego se le asigna un vector de embedding con n elementos o dimensiones, por ejemplo 512. Aquí solo se muestran 3 ejemplos (-0.0340, 0.0068 y -0.0844). Los embeddings de palabras en esta matriz se les asignan valores aleatorios al inicio del preentrenamiento. Estos valores se ajustan a medida que el modelo 'aprende', donde los valores de las palabras con significados semánticos similares se vuelven más similares/cercanos entre sí durante cada iteración de entrenamiento. Fuente de la imagen.

El modelo recibe una palabra o palabras y se le pide predecir la siguiente palabra en función de esas palabras anteriores. Luego, se prueba con datos no vistos y se evalúa en base a la precisión de sus predicciones en comparación con la siguiente palabra “verdadera” de un conjunto de datos oculto previamente no visto por el modelo.

En aprendizaje automático, el conjunto de datos generalmente se divide en el conjunto de datos de entrenamiento y el conjunto de datos de prueba. El conjunto de datos de entrenamiento se utiliza para entrenar el modelo y el conjunto de datos de prueba (los datos no vistos) se utiliza para evaluar las predicciones del modelo. El conjunto de prueba también se utiliza para evitar el “sobreajuste”, donde el modelo funciona excepcionalmente bien en los datos de entrenamiento pero mal en datos nuevos y no vistos.

Consideremos la oración de ejemplo en el conjunto de datos de entrenamiento: “Tengo que ir a la tienda”. Esta oración podría utilizarse de la siguiente manera:

  1. Se le da al modelo “Tengo” y se espera que prediga “que”.
  2. Luego se le da “Tengo que” y se espera que prediga “ir”.
  3. Luego se le da “Tengo que ir” y se espera que prediga “a”.
  4. Por último, se le da “Tengo que ir a la” y se espera que prediga “tienda”.

Recorriendo todo el corpus del conjunto de datos de entrenamiento de esta manera, el modelo podrá aprender qué palabras tienden a aparecer después de diferentes conjuntos de palabras. Aprende las dependencias entre “Tengo” y “que”, “que” y “ir”, y así sucesivamente.

En la prueba, el proceso es similar, pero las oraciones o textos utilizados son aquellos en los que el modelo no ha sido entrenado. Es una forma de comprobar qué tan bien el modelo generaliza su comprensión del lenguaje a datos no vistos.

Consideremos la oración no vista del conjunto de pruebas: “Ella necesita ir a ___”. Aunque esta oración exacta no formaba parte del conjunto de datos de entrenamiento, el modelo puede utilizar su comprensión de contextos similares que ha encontrado para hacer una predicción educada. Por ejemplo, se ha visto en la oración de entrenamiento “Tengo que ir a la tienda” que la frase “ir a la” o “ir a ___” a menudo se sigue de un lugar o destino. Basándose en esto, el modelo podría predecir “mercado”, “tienda”, “oficina” u otras palabras similares, ya que son destinos comunes en este tipo de contexto. Por lo tanto, aunque el modelo se entrenó en “Tengo que ir a la tienda” y variaciones de este texto con un significado similar, es capaz de generalizar a partir de eso para comprender que “Ella necesita ir a ___” probablemente se seguirá de un tipo similar de palabra, aunque esta oración exacta no formaba parte de sus datos de entrenamiento.

Cómo los modelos “aprenden”

Al comienzo del preentrenamiento, el modelo suele generar secuencias de palabras sin sentido cuando se le pide hacer una predicción, ya que aún no ha “aprendido” nada. En nuestra oración de ejemplo anterior, podría generar la palabra “manzana” en lugar de la siguiente palabra “verdadera” – “tienda”. Dado que los LLM son probabilísticos, “incorrecto” en este contexto significa que el modelo asigna una probabilidad más alta (para ser seleccionada) a la palabra “manzana” en comparación con la palabra esperada – “tienda”.

El objetivo final es que el modelo genere “tienda” cada vez que se le pida predecir la siguiente palabra que viene después de la secuencia “Ella necesita ir a ___”.

Salida de muestra al inicio (izquierda) y al final (derecha) del entrenamiento de un modelo de lenguaje a nivel de caracteres, es decir, predecir la siguiente letra o carácter. Fuente de la imagen

La diferencia entre la palabra siguiente real y la esperada o “verdadera” se calcula utilizando una “función de pérdida” donde cuanto mayor es la diferencia, mayor es el valor de “pérdida”. La pérdida es un número único que “promedia” la pérdida o error de todas las predicciones que se le pidió al modelo hacer. A través de varias iteraciones de estos pasos, el objetivo es minimizar el valor de esta “pérdida” a través de procesos llamados retropropagación y optimización del descenso de gradiente. El modelo “aprende” o mejora su capacidad de predicción a través de estos pasos.

Probablemente te estés preguntando cómo puedes “calcular la diferencia entre dos palabras” para llegar a un valor de pérdida. Ten en cuenta que lo que pasa a través de la red neuronal no son textos reales (palabras, oraciones) sino representaciones numéricas de estos textos: sus tokens y embeddings. Las representaciones numéricas de una secuencia de palabras se procesan a través de las capas de la red donde la salida es una distribución de probabilidad sobre el vocabulario para determinar qué palabra viene a continuación. Un modelo no entrenado podría asignar una probabilidad más alta al identificador de token de la palabra “manzana” (digamos 0.8) en comparación con el identificador de token de la palabra esperada – “tienda” (0.3). La red neuronal no encontrará una sola palabra o letra de ningún texto. Trabaja exclusivamente con números, básicamente es una calculadora con pasos adicionales. 😅

Fuente de la imagen

A través de la retropropagación, el grado de error del modelo (el valor de pérdida) se propaga hacia atrás a través de la red neuronal. Calcula la derivada hacia la salida de cada peso y sesgo individual, es decir, qué tan sensible es la salida a los cambios en cada parámetro específico.

Para las personas que no tomaron cálculo diferencial en la escuela (como yo), piensen en los parámetros del modelo (pesos/sesgos) como perillas ajustables. Estas perillas son arbitrarias, en el sentido de que no se puede decir de qué manera específica gobiernan la capacidad de predicción del modelo. Las perillas, que se pueden girar en sentido horario o antihorario, tienen diferentes efectos en el comportamiento de la salida. La perilla A puede aumentar la pérdida 3 veces cuando se gira en sentido horario, la perilla B reduce la pérdida en 1/8 cuando se gira en sentido antihorario (y así sucesivamente). Todas estas perillas se verifican (todas las miles de millones de ellas) y para obtener información sobre qué tan sensible es la salida a los ajustes de cada perilla, este valor numérico es su derivada con respecto a la salida. El cálculo de estas derivadas se llama retropropagación. La salida de la retropropagación es un vector (una lista de números) cuyos elementos o dimensiones consisten en las derivadas individuales de los parámetros. Este vector es el gradiente del error con respecto a los valores de parámetro existentes (o los aprendizajes actuales) de la red neuronal.

Parámetros de la red neuronal como perillas ajustables. De Unsplash

Un vector tiene dos propiedades: longitud o magnitud y dirección. El vector gradiente contiene información sobre la dirección en la que aumenta el error o la pérdida. La magnitud del vector indica la pendiente o tasa de aumento.

Piensa en el vector gradiente como el mapa de una colina nebulosa por la que estás descendiendo: la optimización del descenso del gradiente utiliza la información sobre la dirección y pendiente del vector gradiente para llegar al fondo de la colina (el valor de pérdida mínimo) de la manera más eficiente posible, navegando por el camino con la mayor pendiente descendente (en dirección opuesta al vector gradiente). Esto implica ajustar iterativamente los valores de los pesos y sesgos de la red (restando pequeños valores, es decir, la tasa de aprendizaje) en masa para alcanzar este estado óptimo.

La optimización del descenso del gradiente comienza con una tasa de error o pérdida alta (rojo) para llegar a la pérdida mínima (azul) mediante la visualización de un vector gradiente con 3 dimensiones. Los vectores gradiente reales tienen miles de millones de dimensiones y sería difícil visualizarlos. Sin embargo, el concepto de optimización funciona de la misma manera para todos los vectores, independientemente de su tamaño. Fuente de la imagen.
Aquí tienes un ejemplo de optimización del descenso del gradiente implementado en código Python. Se solicitan predicciones al modelo (paso hacia adelante), luego el error en la predicción se retropropaga a través de la red (paso hacia atrás). Luego se actualizan los parámetros del modelo (utilizando descenso del gradiente estocástico o sgd). Esto se repite varias veces mediante un bucle donde cada repetición o paso reduce el valor de pérdida (en amarillo) y mejora la precisión de la predicción del modelo. Fuente de la imagen.

Después de estos pasos, la esperanza es que durante la próxima iteración de entrenamiento, cuando se le pida al modelo que prediga la siguiente palabra para “Ella necesita dirigirse a la…”, asigne una mayor probabilidad a la palabra ‘tienda’. Este proceso se repite varias veces hasta que no haya cambios significativos en el valor de pérdida, lo que significa que el aprendizaje del modelo se ha estabilizado o ha alcanzado la convergencia.

Entonces, lo más importante sobre cómo las redes neuronales aprenden a comunicarse en inglés (y en otros idiomas) es: matemáticas en cantidades serias. Como montones. Se reduce a reducir el valor de un solo número (el valor de pérdida) generado a partir de cálculos complejos dentro de la red neuronal — donde, a medida que este número se hace más pequeño, el modelo de lenguaje se vuelve más “fluido” o “coherente”. Los millones o miles de millones de operaciones matemáticas aplicadas entre matrices y vectores en las capas internas de la red de alguna manera se unen en un modelo geométrico del lenguaje.

Para ayudar con la intuición, hemos antropomorfizado el modelo usando palabras como “entender”, “ver” y “aprender”, pero en realidad, no tiene capacidad para hacer ninguna de estas cosas. Es simplemente un algoritmo que produce el siguiente mejor token de una secuencia basado en una distribución de probabilidad dada un método de muestreo.

El Transformador

El Transformador es el avance en la investigación de procesamiento de lenguaje natural (NLP) que nos dio a ChatGPT. Es un tipo de arquitectura de red neuronal que utiliza un mecanismo de autoatención único. Se discute ampliamente en el artículo “Attention is All You Need” que se publicó en 2017. Casi todos los modelos de LLM de última generación (como BERT, GPT-1) que salieron después de este artículo se construyeron sobre o utilizando ideas del transformador. Es difícil exagerar la importancia de este artículo debido a su impacto en el aprendizaje profundo. Ahora está encontrando su camino hacia tareas de visión, lo que lo hace verdaderamente multimodal y demuestra su flexibilidad para manejar otros tipos de datos. También inició la tendencia memética de “…es todo lo que necesitas” a la que incluso el equipo editorial de Towards AI no puede resistirse. 😂

La arquitectura del modelo Transformador. Fuente de la imagen

Antes de los transformadores, las redes neuronales utilizadas en NLP que producían modelos SOTA se basaban en arquitecturas que utilizaban el procesamiento secuencial de datos, por ejemplo, redes neuronales recurrentes o RNN — esto significa que durante el entrenamiento, cada palabra o token es procesado por la red uno tras otro en secuencia. Hay que tener en cuenta que el orden de las palabras es importante para preservar el contexto/significado de una secuencia — “el gato se comió al ratón” y “el ratón se comió al gato” son dos oraciones con dos significados diferentes aunque estén formadas por las mismas palabras/tokens (aunque en un orden diferente).

Una red neuronal recurrente. Fuente

Una de las innovaciones clave del transformador es prescindir del procesamiento secuencial de tokens o la recurrencia. En lugar de procesar los tokens de forma secuencial, codifica la información de posición de cada palabra (es decir, en qué orden aparece una palabra en la secuencia que se está procesando) en su incrustación antes de ingresarla en las capas internas de la red.

Más importante aún, los transformadores resolvieron el problema de las dependencias a largo plazo con las que las redes neuronales como las RNN luchaban. Dada una secuencia lo suficientemente larga de palabras (por ejemplo, un párrafo muy largo), las RNN “olvidarán” el contexto de la palabra que procesaron anteriormente en la secuencia — esto se llama el problema del gradiente desvaneciente. Las RNN almacenan información sobre la relevancia de las palabras en una secuencia hasta ese punto en lo que se llama el estado oculto en cada paso secuencial o temporal. A medida que procesa una secuencia larga, los gradientes correspondientes a los pasos de tiempo anteriores pueden volverse muy pequeños durante la retropropagación. Esto dificulta que la RNN aprenda de las partes iniciales de la secuencia y puede llevar a la “pérdida” de información sobre las palabras procesadas anteriormente. Esto es problemático para un modelo de predicción de la siguiente palabra, especialmente si esas palabras “olvidadas” son importantes para el contexto de la secuencia que se está generando actualmente

El transformador resuelve esta limitación mediante el mecanismo de “autoatención”. Al igual que con la codificación de posición, cada palabra, a través de su incrustación, se codifica con información sobre el grado o cuánto debe “atender” al resto de las palabras en la secuencia, sin importar la longitud de la secuencia o la distancia relativa de la palabra atendida en la secuencia. Esta codificación se realiza simultáneamente para todas las palabras de la secuencia, lo que permite que el transformador preserve el contexto de cualquier secuencia.

En este ejemplo, la palabra 'nadó' presta más atención (o coloca más peso) a las palabras 'río' y 'orilla'. Por lo tanto, su valor de incrustación se verá más influenciado por la incrustación de 'río' y 'orilla' al codificar la incrustación de salida de la palabra en la capa de autoatención. Fuente de la imagen

El grado en el que una palabra debe atender a otras palabras es una característica “aprendida” almacenada en los pesos del modelo y codificada en las incrustaciones de palabras mediante multiplicaciones de matrices. Estos “aprendizajes” se ajustan durante cada iteración de entrenamiento a medida que el modelo aprende más sobre las relaciones entre las palabras en los datos de entrenamiento.

La fórmula para la auto-atención utilizando multiplicaciones de matrices (izquierda) Fuente de la imagen y las puntuaciones de auto-atención de una secuencia de muestra- 'tu gato es un gato encantador' (derecha). En la segunda fila de la matriz, la palabra 'tu' atiende principalmente (aparte de sí misma) a la palabra 'encantador' (0.179). Esta matriz es el producto punto de las matrices de consulta (Q) y clave (K), donde el valor para cada fila es igual a 1 (o 100%) para reflejar la proporción o el grado en el que cada palabra 'atiende' a todas las demás palabras en la secuencia. El valor de 'consulta' de una palabra representa la 'lista de comprobación de cualidades' de las palabras a las que debe atender o centrarse más. El valor de 'clave' contiene las 'cualidades' de las palabras. Las palabras que cumplen con lo definido en la 'lista de comprobación' serán atendidas más. Haz clic para ampliar. Fuente de la imagen

La salida final de la capa de auto-atención (la matriz Z en nuestra ilustración anterior) es una matriz de las incrustaciones de palabras que está codificada con información sobre la posición de cada palabra en la secuencia (a partir del paso de codificación de posición) y cuánto debería atender cada palabra a todas las demás palabras en la secuencia.

Luego se alimenta a una red neuronal tradicional como la discutida anteriormente en el artículo (llamada red neuronal de avance). Estos pasos (atención + avance – que conforman un bloque transformador) se repiten varias veces para cada capa oculta del transformador, 96 veces para GPT3, por ejemplo. La transformación en cada capa agrega información adicional al ‘conocimiento’ del modelo sobre cómo predecir mejor la próxima palabra en la secuencia.

Según las leyes de escalamiento de LLM publicadas por OpenAI, para entrenar mejores modelos, aumentar el número de parámetros es 3 veces más importante que aumentar el tamaño de los datos de entrenamiento. (Nota: DeepMind ha publicado un documento con una opinión diferente desde entonces). Esto se traduce en un aumento significativo en los requisitos computacionales, ya que manejar un mayor número de parámetros requiere cálculos más complejos. La paralelización, que es el proceso de dividir una sola tarea en múltiples sub tareas que se pueden procesar simultáneamente en múltiples recursos informáticos, se vuelve esencial para hacer frente a este problema.

La paralelización es difícil de lograr con las RNN debido a su naturaleza secuencial. Esto no es un problema para los transformadores, ya que calcula las relaciones entre todos los elementos de una secuencia simultáneamente, en lugar de secuencialmente. También significa que funcionan bien con GPUs o tarjetas de video. La representación gráfica requiere un gran número de cálculos simples que ocurren simultáneamente. Los numerosos núcleos de procesamiento pequeños y eficientes que tiene una GPU, diseñados para operaciones simultáneas, la hacen adecuada para tareas como operaciones de matriz y vector que son fundamentales para el aprendizaje profundo.

La popularidad de la IA y la carrera frenética por construir modelos más grandes y mejores es una bendición para los fabricantes de GPUs. NVIDIA, específicamente, cuyo precio de las acciones ha crecido un 200% en lo que va del año hasta la fecha de esta escritura, los ha convertido en las acciones con mejor rendimiento este año y ha llevado su capitalización de mercado a 1 billón de dólares estadounidenses. Se unen a megacapitales como Apple, Google, Microsoft y Amazon en este exclusivo club.

El Transformador es un tema decididamente complejo y la explicación anterior omitió conceptos importantes para que sea más comprensible para una audiencia más amplia. Si quieres saber más, encontré estas introducciones más detalladas pero fáciles de entender sobre el tema: El transformer ilustrado de Jay Allamar, la analogía de la poción de Lili Jiang, o si quieres algo más avanzado, el nanoGPT de Karpathy que divaga en un estilo shakespeariano.

Ajuste fino de modelos ‘chat’ como ChatGPT

La salida de los preentrenamientos son modelos base o modelos fundamentales. Ejemplos de modelos fundamentales de generación de texto lanzados recientemente son GPT-4, Bard, LLaMa 1 y 2, y Claude 1 y 2. Dado que los modelos base ya tienen un amplio conocimiento del lenguaje a partir del preentrenamiento (la estructura de las oraciones, las relaciones entre las palabras, etc.), puedes aprovechar este conocimiento para entrenar aún más el modelo en tareas específicas, como traducción, resumen o asistentes conversacionales como ChatGPT. La idea subyacente es que la comprensión general del lenguaje del modelo obtenida del preentrenamiento se puede utilizar para una amplia gama de tareas posteriores. Esta idea se llama aprendizaje por transferencia.

Si le haces una pregunta o le das una sugerencia a un modelo base, probablemente responderá con otra pregunta. Recuerda que está entrenado para completar una secuencia de palabras al predecir la palabra que debería seguir dadas las palabras anteriores en la secuencia. Ejemplo:

Aquí tienes una muestra de la salida o resultado de 'davinci' — el modelo base GPT 3 usando la sugerencia o entrada: '¿Cuál es la capital de Francia?'. Imagen del autor — generada desde el playground de OpenAI.

Sin embargo, podemos hacer que un modelo base responda preguntas ‘engañándolo’ para que piense que está tratando de completar una secuencia:

Aquí tienes otra muestra de salida de 'davinci' usando unas cuantas sugerencias. 'París' — la palabra resaltada es el resultado completado. Imagen del autor — generada desde el playground de OpenAI.

Usando esta idea, el modelo pasa por otra ronda de entrenamiento utilizando diferentes conjuntos de pares de sugerencia/completado en un formato de pregunta y respuesta. En lugar de ‘aprender inglés’ a partir de textos aleatorios encontrados en Internet al predecir qué palabras siguen después de un conjunto de palabras, el modelo ‘aprende’ que para completar una sugerencia en forma de ‘pregunta’, la respuesta debe estar en forma de ‘respuesta’. Esta es la etapa de ajuste fino supervisado (SFT, por sus siglas en inglés).

Conjunto de datos de ajuste fino supervisado de muestra. Fuente de la imagen

El preentrenamiento utiliza un tipo de aprendizaje automático llamado aprendizaje auto-supervisado, donde el modelo se entrena a sí mismo creando la ‘etiqueta’ o la palabra objetivo real que intenta predecir a partir de los datos de entrenamiento. Aquí tienes nuestro ejemplo anterior:

  1. Se le da al modelo “Tengo” y se espera que prediga “que”.
  2. Luego se le da “Tengo que” y se espera que prediga “ir”.

Las etiquetas o palabras objetivo ‘que’ e ‘ir’ son creadas por el modelo a medida que avanza a través del corpus. Ten en cuenta que las palabras objetivo o verdaderas son importantes, ya que esto es la base del valor de pérdida, es decir, qué tan buena es la predicción actual del modelo en comparación con el objetivo, y las actualizaciones de gradiente subsiguientes.

En comparación con la fase de preentrenamiento, la preparación de los datos de entrenamiento en las etapas de ajuste fino puede ser intensiva en trabajo. Requiere anotadores y revisores humanos que realizarán una cuidadosa anotación de las ‘etiquetas’ o los completados objetivo. Sin embargo, dado que el modelo ya ha aprendido características generales del lenguaje, puede adaptarse rápidamente a la tarea del lenguaje para la que se está ajustando fino, incluso con la disponibilidad limitada de datos de entrenamiento específicos de la tarea. Este es uno de los beneficios del aprendizaje por transferencia y la motivación detrás del preentrenamiento. Según Karpathy, el 99 por ciento de la potencia de cálculo y el tiempo de entrenamiento, así como la mayor parte de los datos para entrenar un LLM, se utilizan durante la fase de preentrenamiento y solo una fracción se utiliza durante las etapas de ajuste fino.

El ajuste fino utiliza el mismo método de actualización de gradientes descrito anteriormente, pero esta vez aprende de una lista de pares de preguntas/respuestas curadas por humanos que le enseñan cómo estructurar sus completaciones, es decir, ‘qué decir y cómo decirlo’.

Pasa por otras etapas de ajuste fino como la modelización de recompensas y el aprendizaje por refuerzo a partir de la retroalimentación humana (RLHF) para entrenar al modelo a generar completaciones que se ajusten más a las preferencias humanas. En esta etapa, los anotadores humanos puntúan las completaciones del modelo en atributos como veracidad, utilidad, inofensividad y toxicidad. Las completaciones preferidas por los humanos se refuerzan en el entrenamiento, es decir, tendrán una mayor probabilidad de aparecer en las completaciones de la versión ajustada del modelo.

El pipeline de entrenamiento del asistente GPT. Fuente de la imagen.

El resultado de estos pasos de ajuste fino son los modelos ‘asistente’ o ‘chat’ como ChatGPT. Estas son las versiones ‘comerciales’ de estos modelos base y son con los que interactúas cuando visitas el sitio web de ChatGPT. El modelo base GPT-3 (davinci) se puede acceder a través de una API. El modelo base GPT-4 aún no se ha lanzado como una API hasta la fecha de esta redacción y es poco probable que sea lanzado por OpenAI, dadas sus declaraciones recientes sobre competencia y seguridad del LLM. Estos pasos de ajuste fino son generalmente los mismos para todos los modelos ajustados disponibles comercialmente y de código abierto.

Fin de la Parte 1

Nota: La Parte 2 hablará sobre Embeddings, que precede a la explosión del LLM pero es igualmente fascinante: cómo se entrenan los modelos de embedding y cómo se generan los embeddings de nivel de oración o documento (utilizados en sistemas RAG) a partir de los embeddings de palabras. También hablaremos sobre Tokens y por qué son necesarios. Hemos dado a entender en esta publicación que token = palabra para simplificar las cosas, pero en un modelo real, un token puede ser un carácter o letra individual, una subpalabra, una palabra completa, una serie de palabras o todos estos tipos en un solo vocabulario de modelo.

Si me equivoqué en algo, ¡estaré encantado de que me corrijan en los comentarios! 🙂

Recursos/Referencias:

3blue1brown. ¿Qué es una red neuronal?

Geeks for Geeks. Redes Neuronales Artificiales y sus aplicaciones

Jay Alammar. El Transformer ilustrado

Luis Serrano. ¿Qué son los modelos Transformer y cómo funcionan?

Andrej Karpathy. El estado de GPT

Andrej Karpathy. Construyamos GPT: desde cero, en código, explicado.