Usa LIT para analizar modelos de Gemma en Keras

1. Introducción

Los productos de IA generativa son relativamente nuevos y los comportamientos de una aplicación pueden variar más que las formas anteriores de software. Por lo tanto, es importante probar los modelos de aprendizaje automático que se usan, examinar ejemplos del comportamiento del modelo y investigar las sorpresas.

La herramienta de interpretabilidad de aprendizaje (LIT; sitio web, GitHub) es una plataforma para depurar y analizar modelos de AA para comprender por qué y cómo se comportan de la manera en que lo hacen.

En este codelab, aprenderás a usar LIT para aprovechar al máximo el modelo Gemma de Google. En este codelab, se muestra cómo usar la relevancia de secuencia, una técnica de interpretabilidad, para analizar diferentes enfoques de ingeniería de instrucciones.

Objetivos de aprendizaje:

  1. Comprender la relevancia de la secuencia y sus usos en el análisis de modelos
  2. Configuración de LIT para que Gemma calcule los resultados de las instrucciones y la relevancia de la secuencia.
  3. Usar la relevancia de la secuencia a través del módulo LM Salience para comprender el impacto de los diseños de instrucciones en los resultados del modelo
  4. Probar las mejoras hipotéticas de las instrucciones en LIT y ver su impacto

Nota: En este codelab, se usa la implementación de KerasNLP de Gemma y TensorFlow v2 para el backend. Se recomienda usar un kernel de GPU para seguir el proceso.

Demostración de la IU de LIT

2. Saliencia de secuencias y sus usos en el análisis de modelos

Los modelos generativos de texto a texto, como Gemma, toman una secuencia de entrada en forma de texto tokenizado y generan tokens nuevos que son complementos o finales típicos de esa entrada. Esta generación se produce un token a la vez y se agrega (en un bucle) cada token recién generado a la entrada, además de las generaciones anteriores, hasta que el modelo alcanza una condición de detención. Algunos ejemplos son cuando el modelo genera un token de fin de secuencia (EOS) o alcanza la longitud máxima predefinida.

Los métodos de relevancia son una clase de técnicas de IA explicable (XAI) que pueden indicarte qué partes de una entrada son importantes para el modelo en diferentes partes de su salida. LIT admite métodos de relevancia para una variedad de tareas de clasificación, que explican el impacto de una secuencia de tokens de entrada en la etiqueta prevista. La relevancia de la secuencia generaliza estos métodos a los modelos generativos de texto a texto y explica el impacto de los tokens anteriores en los tokens generados.

Aquí, usarás el método Grad L2 Norm para la relevancia de la secuencia, que analiza los gradientes del modelo y proporciona una magnitud de la influencia que tiene cada token anterior en el resultado. Este método es simple y eficiente, y se demostró que tiene un buen rendimiento en la clasificación y otros parámetros de configuración. Cuanto mayor sea la puntuación de relevancia, mayor será la influencia. Este método se usa en LIT porque es bien conocido y se utiliza ampliamente en la comunidad de investigación de interpretabilidad.

Los métodos de relevancia basados en gradientes más avanzados incluyen Grad ⋅ Input y gradientes integrados. También hay métodos basados en la ablación disponibles, como LIME y SHAP, que pueden ser más sólidos, pero su procesamiento es mucho más costoso. Consulta este artículo para ver una comparación detallada de los diferentes métodos de relevancia.

Puedes obtener más información sobre la ciencia de los métodos de relevancia en esta introducción interactiva y explorable a la relevancia.

3. Importaciones, entorno y otro código de configuración

Te recomendamos que sigas este codelab en Colab nuevo. Te recomendamos que uses un entorno de ejecución de acelerador, ya que cargarás un modelo en la memoria. Sin embargo, ten en cuenta que las opciones de aceleradores varían con el tiempo y están sujetas a limitaciones. Colab ofrece suscripciones pagadas si deseas acceder a aceleradores más potentes. Como alternativa, puedes usar un entorno de ejecución local si tu máquina tiene una GPU adecuada.

Nota: Es posible que veas algunas advertencias del siguiente formato

ERROR: pip's dependency resolver does not currently take into account all the
packages that are installed. This behaviour is the source of the following
dependency conflicts. bigframes 0.21.0 requires scikit-learn>=1.2.2, but you
have scikit-learn 1.0.2 which is incompatible. google-colab 1.0.0 requires
ipython==7.34.0, but you have ipython 8.14.0 which is incompatible.

Puedes ignorarlos con seguridad.

Instala LIT y Keras NLP

Para este codelab, necesitarás una versión reciente de keras (3), keras-nlp (0.14) y lit-nlp (1.2), y una cuenta de Kaggle para descargar el modelo base.

pip install -q -U 'keras >= 3.0' 'keras-nlp >= 0.14' 'lit-nlp >= 1.2'

Acceso a Kaggle

Para autenticarte con Kaggle, puedes hacer lo siguiente:

  • Almacena tus credenciales en un archivo, como ~/.kaggle/kaggle.json.
  • Usa las variables de entorno KAGGLE_USERNAME y KAGGLE_KEY.
  • Ejecuta lo siguiente en un entorno interactivo de Python, como Google Colab.
import kagglehub

kagglehub.login()

Consulta la documentación de kagglehub para obtener más detalles y asegúrate de aceptar el contrato de licencia de Gemma.

Cómo configurar Keras

Keras 3 admite varios backends de aprendizaje profundo, incluidos Tensorflow (predeterminado), PyTorch y JAX. El backend se configura con la variable de entorno KERAS_BACKEND, que se debe establecer antes de importar la biblioteca de Keras. En el siguiente fragmento de código, se muestra cómo configurar esta variable en un entorno interactivo de Python.

import os

os.environ["KERAS_BACKEND"] = "tensorflow"  # or "jax" or "torch"

4. Cómo configurar LIT

LIT se puede usar en notebooks de Python o a través de un servidor web. Este codelab se enfoca en el caso de uso de Notebook. Te recomendamos que lo sigas en Google Colab.

En este codelab, cargarás Gemma v2 2B IT con el parámetro de configuración predeterminado de KerasNLP. En el siguiente fragmento, se inicializa Gemma y se carga un conjunto de datos de ejemplo en un widget de LIT Notebook.

from lit_nlp.examples.prompt_debugging import notebook as lit_pdbnb

lit_widget = lit_pdbnb.make_notebook_widget(
    ['sample_prompts'],
    ["gemma2_2b_it:gemma2_instruct_2b_en"],
)

Para configurar el widget, cambia los valores que se pasan a los dos argumentos posicionales obligatorios:

  • datasets_config: Es una lista de cadenas que contiene los nombres y las rutas de acceso de los conjuntos de datos desde los que se cargarán, como "dataset:path", donde la ruta de acceso puede ser una URL o una ruta de acceso de archivo local. En el siguiente ejemplo, se usa el valor especial sample_prompts para cargar las instrucciones de ejemplo proporcionadas en la distribución de LIT.
  • models_config: Es una lista de cadenas que contiene los nombres y las rutas de acceso de los modelos desde los que se cargarán, como "model:path", donde la ruta de acceso puede ser una URL, una ruta de acceso a un archivo local o el nombre de un parámetro predeterminado para el framework de aprendizaje profundo configurado.

Una vez que hayas configurado LIT para usar el modelo que te interesa, ejecuta el siguiente fragmento de código para renderizar el widget en tu notebook.

lit_widget.render(open_in_new_tab=True)

Usa tus propios datos

Como modelo generativo de texto a texto, Gemma toma entradas de texto y genera salidas de texto. LIT usa una API con opiniones para comunicar la estructura de los conjuntos de datos cargados a los modelos. Los LLM en LIT están diseñados para funcionar con conjuntos de datos que proporcionan dos campos:

  • prompt: La entrada al modelo a partir de la cual se generará el texto
  • target: Es una secuencia objetivo opcional, como una respuesta de "verdad fundamental" de evaluadores humanos o una respuesta generada previamente de otro modelo.

LIT incluye un pequeño conjunto de sample_prompts con ejemplos de las siguientes fuentes que admiten este codelab y el instructivo de depuración de instrucciones extendido de LIT.

  • GSM8K: Resuelve problemas matemáticos de la escuela primaria con ejemplos de pocas fotos.
  • Gigaword Benchmark: Generación de títulos para una colección de artículos breves.
  • Sugerencias constitucionales: Generar nuevas ideas sobre cómo usar objetos con lineamientos o límites.

También puedes cargar tus propios datos fácilmente, ya sea como un archivo .jsonl que contiene registros con campos prompt y, de manera opcional, target (ejemplo) o desde cualquier formato con la API de Dataset de LIT.

Ejecuta la siguiente celda para cargar las instrucciones de muestra.

5. Análisis de instrucciones con ejemplos limitados para Gemma en LIT

Hoy en día, las indicaciones son tanto arte como ciencia, y LIT puede ayudarte a mejorar empíricamente las indicaciones para modelos de lenguaje grandes, como Gemma. A continuación, verás un ejemplo de cómo se puede usar LIT para explorar los comportamientos de Gemma, anticipar posibles problemas y mejorar su seguridad.

Identifica errores en instrucciones complejas

Dos de las técnicas de instrucción más importantes para prototipos y aplicaciones de alta calidad basados en LLM son las instrucciones con pocas muestras (incluyen ejemplos del comportamiento deseado en la instrucción) y las cadenas de pensamientos (incluyen una forma de explicación o razonamiento antes del resultado final del LLM). Sin embargo, crear una instrucción eficaz a menudo sigue siendo un desafío.

Piensa en un ejemplo de ayudar a alguien a evaluar si le gustará un alimento en función de sus gustos. Una plantilla de consigna de cadena de pensamientos para un prototipo inicial podría verse así:

def analyze_menu_item_template(food_likes, food_dislikes, menu_item):
  return f"""Analyze a menu item in a restaurant.

## For example:

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Onion soup
Analysis: it has cooked onions in it, which you don't like.
Recommendation: You have to try it.

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Baguette maison au levain
Analysis: Home-made leaven bread in france is usually great
Recommendation: Likely good.

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Macaron in france
Analysis: Sweet with many kinds of flavours
Recommendation: You have to try it.

## Now analyze one more example:

Taste-likes: {food_likes}
Taste-dislikes: {food_dislikes}
Suggestion: {menu_item}
Analysis:"""

¿Viste los problemas con esta instrucción? LIT te ayudará a examinar la instrucción con el módulo LM Salience.

6. Usa la relevancia de secuencia para la depuración

La relevancia se calcula en el nivel más bajo posible (es decir, para cada token de entrada), pero LIT puede agregar la relevancia del token a intervalos más grandes y fáciles de interpretar, como líneas, oraciones o palabras. Obtén más información sobre la relevancia y cómo usarla para identificar sesgos no deseados en nuestro Explorador de relevancia.

Comencemos por darle a la instrucción una nueva entrada de ejemplo para las variables de plantilla de instrucción:

food_likes = """Cheese"""
food_dislikes = """Can't eat eggs"""
menu_item = """Quiche Lorraine"""

prompt = analyze_menu_item_template(food_likes, food_dislikes, menu_item)
print(prompt)

fewshot_mistake_example = {'prompt': prompt}  # you'll use this below
Analyze a menu item in a restaurant.

## For example:

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Onion soup
Analysis: it has cooked onions in it, which you don't like.
Recommendation: You have to try it.

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Baguette maison au levain
Analysis: Home-made leaven bread in france is usually great
Recommendation: Likely good.

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Macaron in france
Analysis: Sweet with many kinds of flavours
Recommendation: You have to try it.

## Now analyze one more example:

Taste-likes: Cheese
Taste-dislikes: Can't eat eggs
Suggestion: Quiche Lorraine
Analysis:

Si tienes la IU de LIT abierta en la celda anterior o en una pestaña independiente, puedes usar el Editor de datos de LIT para agregar esta instrucción:

Editor de datos de LIT

Otra forma es volver a renderizar el widget directamente con la instrucción de interés:

lit_widget.render(data=[fewshot_mistake_example])

Observa la finalización inesperada del modelo:

Taste-likes: Cheese
Taste-dislikes: Can't eat eggs
Suggestion: Quiche Lorraine
Analysis: A savoury tart with cheese and eggs
Recommendation: You might not like it, but it's worth trying.

¿Por qué el modelo te sugiere comer algo que dijiste claramente que no puedes comer?

La relevancia de la secuencia puede ayudar a destacar el problema raíz, que se encuentra en nuestros ejemplos de pocas imágenes. En el primer ejemplo, el razonamiento de la cadena de pensamiento en la sección de análisis it has cooked onions in it, which you don't like no coincide con la recomendación final You have to try it.

En el módulo LM Salience, selecciona "Sentences" y, luego, selecciona la línea de recomendación. La IU ahora debería verse de la siguiente manera:

Prominencia de LIT

Esto destaca un error humano: un copiado y pegado accidental de la parte de la recomendación y la falta de actualización.

Ahora, corrijamos el valor de "Recommendation" en el primer ejemplo a Avoid y volvamos a intentarlo. LIT tiene este ejemplo precargado en las instrucciones de ejemplo, por lo que puedes usar esta pequeña función de utilidad para obtenerlo:

def get_fewshot_example(source: str) -> str:
  for example in datasets['sample_prompts'].examples:
    if example['source'] == source:
      return example['prompt']
  raise ValueError(f'Source "{source}" not found in the dataset.')

lit_widget.render(data=[{'prompt': get_fewshot_example('fewshot-fixed')}])

Ahora, la finalización del modelo se convierte en lo siguiente:

Taste-likes: Cheese
Taste-dislikes: Can't eat eggs
Suggestion: Quiche Lorraine
Analysis: This dish contains eggs and cheese, which you don't like.
Recommendation: Avoid.

Una lección importante que se puede extraer de esto es que la creación de prototipos tempranos ayuda a revelar riesgos que quizás no hayas pensado con anticipación, y la naturaleza propensa a errores de los modelos de lenguaje significa que uno debe diseñar de forma proactiva para evitarlos. Puedes encontrar más información sobre este tema en nuestra guía People + AI Guidebook para diseñar con IA.

Si bien la instrucción corregida de pocas fotos es mejor, aún no es del todo correcta: le dice correctamente al usuario que evite los huevos, pero el razonamiento no es correcto, ya que dice que no le gustan los huevos, cuando, en realidad, el usuario afirmó que no puede comerlos. En la siguiente sección, verás cómo puedes hacerlo mejor.

7. Prueba hipótesis para mejorar el comportamiento del modelo

LIT te permite probar los cambios en las instrucciones dentro de la misma interfaz. En este caso, probarás agregar una constitución para mejorar el comportamiento del modelo. Las constituciones se refieren a propuestas de diseño con principios que ayudan a guiar la generación del modelo. Los métodos recientes incluso permiten la derivación interactiva de los principios constitucionales.

Usemos esta idea para mejorar aún más la consigna. Agrega una sección con los principios de la generación en la parte superior de la instrucción, que ahora comienza de la siguiente manera:

Analyze a menu item in a restaurant.

* The analysis should be brief and to the point.
* The analysis and recommendation should both be clear about the suitability for someone with a specified dietary restriction.

## For example:

Taste-likes: I've a sweet-tooth
Taste-dislikes: Don't like onions or garlic
Suggestion: Onion soup
Analysis: it has cooked onions in it, which you don't like.
Recommendation: Avoid.

...

lit_widget.render(data=[{'prompt': get_fewshot_example('fewshot-constitution')}])

Con esta actualización, se puede volver a ejecutar el ejemplo y observar un resultado muy diferente:

Taste-likes: Cheese
Taste-dislikes: Can't eat eggs
Suggestion: Quiche Lorraine
Analysis: This dish contains eggs, which you can't eat.
Recommendation: Not suitable for you.

Luego, se puede volver a examinar la relevancia de la instrucción para comprender por qué se produce este cambio:

Prominencia de LIT

Ten en cuenta que la recomendación es mucho más segura. Además, el mensaje "No es adecuado para ti" está influenciado por el principio de indicar claramente la idoneidad según la restricción dietética, junto con el análisis (la llamada cadena de pensamiento). Esto ayuda a brindar confianza adicional de que el resultado se produce por el motivo correcto.

8. Incluye equipos no técnicos en la exploración y el sondeo de modelos

La interpretabilidad debe ser un esfuerzo de equipo que abarque la experiencia en XAI, políticas, asuntos legales y mucho más.

Tradicionalmente, interactuar con modelos en las primeras etapas de desarrollo requería una gran experiencia técnica, lo que dificultaba que algunos colaboradores accedieran a ellos y los probaran. Históricamente, no existían herramientas que permitieran a estos equipos participar en las primeras fases de prototipado.

Con la LIT, la esperanza es que este paradigma pueda cambiar. Como viste en este codelab, el medio visual y la capacidad interactiva de la LIT para examinar la relevancia y explorar ejemplos pueden ayudar a las diferentes partes interesadas a compartir y comunicar los hallazgos. Esto puede permitirte incorporar una mayor diversidad de compañeros de equipo para la exploración, la comprobación y la depuración de modelos. Exponerlos a estos métodos técnicos puede mejorar su comprensión de cómo funcionan los modelos. Además, un conjunto más diverso de experiencia en las pruebas iniciales de modelos también puede ayudar a descubrir resultados no deseados que se pueden mejorar.

9. Resumen

En resumen:

  • La IU de LIT proporciona una interfaz para la ejecución de modelos interactivos, lo que permite a los usuarios generar resultados directamente y probar situaciones de "qué pasaría si". Esto es particularmente útil para probar diferentes variaciones de instrucciones.
  • El módulo de Saliencia de LM proporciona una representación visual de la importancia y una granularidad de datos controlable para que puedas comunicarte sobre construcciones centradas en las personas (p.ej., oraciones y palabras) en lugar de construcciones centradas en el modelo (p.ej., tokens).

Cuando encuentres ejemplos problemáticos en las evaluaciones de tu modelo, transfiérelos a LIT para depurarlos. Comienza por analizar la unidad de contenido más grande que puedas pensar que se relacione lógicamente con la tarea de modelado. Usa las visualizaciones para ver dónde el modelo atiende correctamente o incorrectamente el contenido de la instrucción y, luego, desglosa las unidades de contenido más pequeñas para describir mejor el comportamiento incorrecto que observas y, así, identificar posibles correcciones.

Por último, Lit mejora constantemente. Obtén más información sobre nuestras funciones y comparte tus sugerencias aquí.