Encontrar ejemplos dorados: un enfoque más inteligente para el aprendizaje en contexto

Contexto

Uso de modelos de idiomas grandes (LLM), Inorte-doondext LGanar (ICL), donde la entrada y la salida se proporcionan a LLMS para aprender de ellos antes de manejar la siguiente entrada, ha demostrado que es muy efectivo para guiar el LLM en la dirección correcta. Se han desarrollado múltiples estrategias de ICL. Algunos populares son de un solo disparo (proporcionan un ejemplo), pocos disparos (proporcionan múltiples ejemplos), cadena de pensamiento (que muestra razonamiento paso a paso en ejemplos) … etc. Tomemos un ejemplo simple para comprender mejor el aprendizaje en contexto.

Cuando le preguntas a un LLM, “¿Qué animal hace el sonido ‘Moo’ y cuál es su tipo?” Es posible que esté esperando una respuesta como “vaca, mamíferos”. Pero los LLM dan más información. Por ejemplo, cuando se le hizo la misma pregunta, ChatGPT dio la siguiente respuesta:

User: What animal makes the sound 'moo' and what is its type?
The animal that makes the sound "moo" is a cow.
Animal: Cow
Type: Mammal (specifically, a domesticated ungulate belonging to the species Bos taurus)
Other examples of non-mammals include birds (like eagles 🦅), reptiles (like snakes 🐍)
, fish (like salmon 🐟), and insects (like butterflies 🦋).

Enlace: https://chatgpt.com/share/6886636f-7b48-8000-a477-54405edd7e43

Ahora, para enseñarle a la LLM a producir resultados como esperamos (nombre de animal, tipo), podemos ajustar (entrenar) la LLM para obtener en nuestro formato esperado, lo que no es un enfoque factible ya que la capacitación de LLM requiere recursos significativos. Alternativamente, durante la inferencia podemos proporcionar ejemplos antes de hacer la pregunta para enseñarle a la LLM nuestro formato esperado. Eso es exactamente lo que es el aprendizaje en contexto. LLMS aprende el patrón de los ejemplos proporcionados para realizar la tarea en cuestión. Aquí está la misma interacción con ChatGPT con ejemplos en contexto:

User: What animal makes the 'woof' sound and what is its type?
Assistant: Dog, mammal
User: What animal makes the 'meow' sound and what is its type?
Assistant: Cat, mammal
User: What animal makes the sound 'moo' and what is its type?

Esta vez, el LLM dio la respuesta correcta: vaca, mamífero.

Enlace: https://chatgpt.com/share/688664f0-96f0-8000-9125-6a40b24d2773

Como podemos ver, los LLM se adaptan bien al aprendizaje en contexto (ICL) para lograr sus objetivos. La investigación ha demostrado que ICL ayuda a aumentar el rendimiento y la precisión de los LLM. Pero ICL es frágil. El rendimiento es altamente sensible a los ejemplos que elige, su orden e incluso cambios de formato menores. ICL funciona a través de la coincidencia de patrones en lugar del verdadero aprendizaje, por lo que depende en gran medida de las señales superficiales. Imagínese para una tarea compleja como la reparación del código, el texto a SQL … etc., un conjunto de ejemplos podría funcionar bien, mientras que otra alternativa podría eliminar la precisión significativamente. Por lo tanto, el principal desafío de la ICL es “¿Cómo seleccionar ejemplos que realmente ayuden (no cualquier ejemplos)?

En esta publicación, vamos a ver el trabajo de investigación AUPAIR: pares de ejemplo dorados para la reparación de códigos Publicado por Google Deepmind para manejar sistemáticamente estos problemas. AUPAIR aborda específicamente la selección de ejemplo para tareas de reparación de códigos (corrección de código de errores). Esta publicación tiene como objetivo explicar las ideas centrales detrás de su trabajo y construir una base para comprender cómo generar sistemáticamente ejemplos para ICL.

Selección de ejemplo efectiva

Ahora, entendemos que el primer desafío de ICL es encontrar el conjunto correcto de ejemplos. Antes de analizar cómo el enfoque de Aupair aborda este problema, veamos el enfoque tradicional de la selección de ejemplo. Normalmente, para problemas específicos del dominio (como la generación de código/reparación o texto a SQL), elegimos aleatoriamente algunos ejemplos usando nuestra propia aptitud o problemas de selección del conjunto de datos, escriba ejemplos para esos problemas seleccionados y los usamos en tiempo de ejecución para ICL. Otra extensión de esto es que construimos un grupo de ejemplos y utilizamos la búsqueda de similitud para extraer los ejemplos relevantes en tiempo de ejecución para inyectar como ICL.

En el proceso de curación de ejemplo tradicional, no tenemos la capacidad de medir qué ejemplo es más efectivo para anclar el LLM en la dirección correcta. Ahora, veamos el enfoque de Aupair y cómo aborda este problema. En lugar de elegir ejemplos aleatorios, Aupair primero construye un gran conjunto de datos de pares de ejemplo y luego aplica un algoritmo de selección codicioso para seleccionar los pares de mejor rendimiento. Veamos cada paso uno por uno.

Fase 1: Generación de pares de ejemplo

Imagen del autor

El primer paso es crear una gran colección de pares de reparación de candidatos. AUPAIR comienza con un conjunto de datos de problemas de codificación que tienen casos de prueba. Para cada problema, le pide al LLM que genere una solución inicial (adivinar). Si esta suposición es parcialmente correcta (puntaje entre 0 y 1), se agrega al conjunto de datos de entrenamiento.

El proceso de reparación toma este código roto y le pide al LLM que lo arregle utilizando un mensaje de pocos disparos con k pares existentes seleccionados al azar como contexto (k = 32 se usó en el experimento). Si las puntuaciones de la solución generada mejor que la suposición original, esto se convierte en un par candidato (adivinar → arreglar). La parte inteligente es que si la solución aún no es perfecta, se convierte en un nuevo código “roto” que se agrega al conjunto de datos de entrenamiento para una mejora adicional en la próxima iteración. Esto crea cadenas de mejoras incrementales. Aupair repite este proceso miles de veces para construir un gran grupo de parejas candidatas que cubren diferentes tipos de errores y sus correcciones.

Fase 2: extracción de pares dorados (au)

Una vez que tenemos el conjunto de datos de pares de candidatos, necesitamos elegir los pares más efectivos. Este proceso ocurre en 2 pasos. Primero, necesitamos medir cuánto impacto tiene cada par de reparación de candidatos, y segundo, necesitamos seleccionar los mejores utilizando un algoritmo codicioso.

Primero veamos cómo se mide la efectividad de los pares de reparación de candidatos.

Imagen del autor

Para medir la efectividad, primero creamos un conjunto de datos de validación, básicamente un conjunto de problemas de código rotos. Luego, para cada problema en el conjunto de datos de validación, tomamos cada par de reparación de candidatos y lo usamos como un ejemplo de 1 disparo junto con el problema de validación para generar una solución. Una vez que se genera la solución, se prueba con los casos de prueba unitaria, y se calcula una puntuación para ese problema de validación.

Creamos una matriz de calidad M donde m[i,j] Representa qué tan bien el par candidato ayuda a resolver el problema de validación J, lo que nos da una visión integral de qué pares son más útiles en diferentes tipos de problemas.

Algoritmo de Aupair Paper

El siguiente paso es encontrar los Aupairs utilizando la efectividad calculada. El algoritmo elige el par candidato con el puntaje promedio más alto en todos los problemas de validación y lo agrega a la lista de AUPAIR. El siguiente paso crucial es restar la contribución de este par de todos los pares restantes en la matriz. Esto asegura que no elegimos pares redundantes, pero mantenga los pares complementarios, cada nuevo AUPAIR debe resolver diferentes problemas que los seleccionados anteriormente. Este proceso continúa hasta que la mejora cae por debajo de un umbral, lo que resulta en una lista ordenada de pares de oro donde cada uno enseña algo único.

Imagen de Aupair Paper

Resultados del experimento

Aupair se comparó en 7 conjuntos de datos de problemas de codificación diferentes utilizando 5 modelos LLM diferentes. Superó constantemente la autorreflexión y los enfoques de muestreo mejor de N para resolver problemas. Los resultados muestran además que Aupairs alcanza 2–3x mejor la eficiencia de calcular. Solo se necesitan 12 Aupairs para alcanzar el mismo rendimiento que requiere 32 pares aleatorios. Los resultados también muestran que Aupairs generados en el conjunto de datos CodeForces funcionó de manera efectiva en conjuntos de datos completamente diferentes como Hackerearth y Atcoder. Esto demuestra que una vez que hemos construido un buen conjunto de pares de oro, pueden funcionar muy bien en nuevos problemas en el mismo dominio.

Limitaciones

Aupair muestra resultados prometedores, pero también tiene algunas limitaciones. Primero, requiere un costo computacional sustancial para realizar llamadas de LLM para generar pares de ejemplo candidatos con reparación iterativa. En segundo lugar, se basa en gran medida en las métricas de evaluación (como las pruebas unitarias para el código) para medir la mejora, lo que puede no estar disponible en todos los dominios, y supone que los ejemplos complementarios conducirán a un mejor rendimiento. Si bien esto funcionó para los problemas de codificación, puede no ser cierto para todos los dominios. Finalmente, Aupair fue comparado con problemas de concurso estructurados en lugar de bases de código más complejas del mundo real.

Conclusión

Aupair nos muestra una forma más inteligente de hacer un aprendizaje en contexto para las tareas de reparación de códigos. En lugar de elegir al azar ejemplos, utiliza un enfoque sistemático para encontrar los patrones de reparación más efectivos que realmente ayudan a la LLM a funcionar mejor. Si bien necesita un costo de cálculo inicial significativo y funciona mejor cuando tiene buenas métricas de evaluación, los resultados demuestran que vale la pena la inversión, especialmente porque los pares de oro funcionan bien en diferentes conjuntos de datos. Esta investigación abre posibilidades para aplicar técnicas de selección de ejemplo similares a otros dominios (por ejemplo, texto a SQL) donde podemos generar y medir sistemáticamente la efectividad del ejemplo.

Referencias