Gemma-Modelle in Keras mit LIT analysieren

1. Einführung

Generative AI-Produkte sind relativ neu und das Verhalten einer Anwendung kann sich stärker unterscheiden als frühere Formen von Software. Daher ist es wichtig, die verwendeten Modelle für maschinelles Lernen zu prüfen, Beispiele für das Verhalten des Modells zu untersuchen und Überraschungen zu untersuchen.

Das Learning Interpretability Tool (LIT; Website, GitHub) ist eine Plattform zum Debuggen und Analysieren von ML-Modellen, um zu verstehen, warum und wie sie sich verhalten.

In diesem Codelab erfahren Sie, wie Sie das Gemma-Modell von Google mithilfe von LIT optimal nutzen. In diesem Codelab wird gezeigt, wie Sie mit „Sequence Auffälligkeit“, einer Interpretierbarkeitstechnik, verschiedene Prompt-Engineering-Ansätze analysieren.

Lernziele:

  1. Auffälligkeiten von Sequenzen und ihre Verwendung in der Modellanalyse verstehen
  2. LIT für Gemma wird eingerichtet, um die Ausgabe von Prompts und die Auffälligkeit von Sequenzen zu berechnen.
  3. Verwendung von Auffälligkeiten in Sequenzen über das Modul LM Salience, um die Auswirkungen von Prompt-Designs auf die Modellausgaben zu verstehen.
  4. Es wurden hypothetische Verbesserungen von Prompts in LIT getestet und die Auswirkungen ermittelt.

Hinweis: In diesem Codelab werden die KerasNLP-Implementierung von Gemma und TensorFlow v2 für das Back-End verwendet. Wir empfehlen dringend, einen GPU-Kernel zu verwenden.

Demo der LIT-Benutzeroberfläche

2. Sequenz Salience und ihre Verwendung in der Modellanalyse

Generative Text-zu-Text-Modelle wie Gemma nehmen eine Eingabesequenz in Form von tokenisiertem Text vor und generieren neue Tokens, die typische Folgeaktionen oder Vervollständigungen dieser Eingabe sind. Diese Generierung erfolgt ein Token nach dem anderen und hängt (in einer Schleife) jedes neu generierte Token an die Eingabe sowie alle vorherigen Generationen an, bis das Modell eine Stoppbedingung erreicht. Beispiele hierfür sind, wenn das Modell ein EOS-Token generiert oder die vordefinierte maximale Länge erreicht.

Salience-Methoden sind eine Klasse von Erklärbar-KI-Techniken (XAI), die Ihnen sagen können, welche Teile einer Eingabe für das Modell für unterschiedliche Teile der Ausgabe wichtig sind. LIT unterstützt Auffälligkeitsmethoden für eine Vielzahl von Klassifizierungsaufgaben, die die Auswirkungen einer Reihe von Eingabetokens auf das vorhergesagte Label erklären. Sequenzauffälligkeit verallgemeinert diese Methoden auf generative Text-zu-Text-Modelle und erklärt die Auswirkungen der vorherigen Tokens auf die generierten Tokens.

Für die Auffälligkeit der Sequenz verwenden Sie hier die Methode „Grad L2 Norm“. Dabei werden die Gradienten des Modells analysiert und es gibt eine Größenordnung des Einflusses, den jedes vorangehende Token auf die Ausgabe hat. Diese Methode ist einfach und effizient und hat sich gezeigt, dass sie bei der Klassifizierung und anderen Einstellungen gute Ergebnisse liefert. Je größer der Wert für die Auffälligkeit, desto höher der Einfluss. Diese Methode wird in LIT verwendet, weil sie in der Interpretierbarkeitsforschung sehr verständlich ist und weit verbreitet ist.

Zu den fortschrittlicheren, auf dem Farbverlauf basierenden Auffälligkeitsmethoden gehören Grad ⋅ Eingabe und integrierte Farbverläufe. Es sind auch ablationsbasierte Methoden verfügbar, z. B. LIME und SHAP. Diese können robuster sein, ihre Berechnung ist aber erheblich kostspieliger. In diesem Artikel finden Sie einen detaillierten Vergleich der verschiedenen Methoden für die Auffälligkeit.

Weitere Informationen zu den Methoden der Auffälligkeit finden Sie in diesem interaktiven Einführungskurs zur Auffälligkeit.

3. Importe, Umgebung und anderer Einrichtungscode

Am besten folgen Sie diesem Codelab im neuen Colab. Wir empfehlen die Verwendung einer Beschleunigerlaufzeit, da Sie ein Modell in den Arbeitsspeicher laden. Beachten Sie jedoch, dass die Beschleunigeroptionen im Laufe der Zeit variieren und Einschränkungen unterliegen. Colab bietet kostenpflichtige Abos an, wenn Sie auf leistungsstärkere Beschleuniger zugreifen möchten. Alternativ können Sie eine lokale Laufzeit verwenden, wenn Ihr Computer über eine entsprechende GPU verfügt.

Hinweis: Möglicherweise werden im Formular einige Warnungen angezeigt.

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.

Diese können ignoriert werden.

LIT und Keras NLP installieren

Für dieses Codelab benötigen Sie eine aktuelle Version von keras (3) keras-nlp (0.8.0) und lit-nlp (1.1) sowie ein Kaggle-Konto, um das Basismodell herunterzuladen.

!pip install -q -U lit-nlp
!pip uninstall -y umap-learn
!pip install -q -U keras-nlp
!pip install -q -U keras

Kaggle-Zugriff

Um sich bei Kaggle anzumelden, können Sie entweder Ihre kaggle.json-Anmeldedatendatei unter ~/.kaggle/kaggle.json speichern oder folgenden Befehl in einer Colab-Umgebung ausführen. Weitere Informationen finden Sie in der Dokumentation zum kagglehub-Paket.

import kagglehub

kagglehub.login()

Akzeptieren Sie auch die Lizenzvereinbarung für Gemma.

4. LIT-Modelle einrichten

import os

os.environ["KERAS_BACKEND"] = "tensorflow"
import keras
import keras_nlp

# Run at half precision.
keras.config.set_floatx("bfloat16")
model_name = 'gemma_instruct_2b_en'
gemma_model = keras_nlp.models.GemmaCausalLM.from_preset(model_name)

Mit dem folgenden Code werden die LIT-Wrapper initialisiert, um die Auffälligkeit des Gemma-Modells zu unterstützen. Im LIT-Framework werden diese als Modelle bezeichnet, aber in diesem Fall sind es nur unterschiedliche Endpunkte für die zugrunde liegende gemma_model, die Sie oben geladen haben. Dadurch kann LIT Generationen, Tokenisierung und Auffälligkeiten nach Bedarf berechnen.

from lit_nlp.examples.models import instrumented_keras_lms

batch_size = 1
max_sequence_length = 512
init_models = instrumented_keras_lms.initialize_model_group_for_salience
models = init_models(model_name, gemma_model,
                     batch_size=batch_size,
                     max_length=max_sequence_length)

5. LIT-Datasets einrichten

Gemma ist ein generatives Text-zu-Text-Modell, das auf Texteingabe reagiert und Textausgaben generiert. Bei den LIT-Modellen wird davon ausgegangen, dass die Datasets die folgenden Felder enthalten, um die Generierung zu unterstützen:

  • prompt: Die Eingabe für einen KerasGenerationModel.
  • target: eine optionale Zielsequenz, z. B. ein „Ground Truth“-Wert (Gold) oder eine vorgefertigte Antwort des Modells.

LIT umfasst eine kleine Gruppe von sample_prompts mit Beispielen aus verschiedenen Quellen, z. B.:

Sie können Ihre eigenen Daten auch einfach laden, entweder als .jsonl-Datei mit Datensätzen mit den Feldern prompt und optional target (Beispiel) oder in einem beliebigen Format mithilfe der Dataset API von LIT.

Führen Sie die Zelle unten aus, um die Beispiel-Prompts zu laden.

from lit_nlp.examples.datasets import lm as lm_data

datasets = {
  'sample_prompts': lm_data.PromptExamples(
      lm_data.PromptExamples.SAMPLE_DATA_PATH
  ),
}

6. LIT-UI einrichten

LIT ist ein interaktives Tool zum Verstehen von Modellen, das eine Human-in-the-Loop-Bewertung und Untersuchung des Modellverhaltens ermöglicht. Die LIT-Benutzeroberfläche bietet folgende Möglichkeiten:

  • Datasets und Modellausgaben live zu visualisieren,
  • Auffälligkeiten ausführen, um die Eingabetokens zu verstehen, die das Modellverhalten beeinflussen
  • Kontrafakten erstellen, um Hypothesen zu prüfen.

LIT ermöglicht dies über eine einzige Oberfläche und vereinfacht den Wechsel zwischen verschiedenen Tools. Dies ist besonders nützlich für Aufgaben wie das Prompt-Engineering, auf das Sie sich später in diesem Codelab konzentrieren werden.

Dieses UI-Layout kann für alle anderen generativen Sprachmodelle verwendet werden. Wenn Sie an Funktionen interessiert sind, die hier nicht aufgeführt sind, finden Sie hier die vollständige Liste.

from lit_nlp.api import layout
modules = layout.LitModuleName

LM_SALIENCE_LAYOUT = layout.LitCanonicalLayout(
    left={
        'Data Table': [modules.DataTableModule],
        'Datapoint Editor': [modules.DatapointEditorModule],
    },
    upper={  # if 'lower' not specified, this fills the right side
        'Salience': [modules.LMSalienceModule],
    },
    layoutSettings=layout.LayoutSettings(leftWidth=40),
    description='Custom layout for language model salience.',
)

Mit diesem Code wird der LIT-Server initialisiert. Dies kann einige Sekunden dauern, da das Modell auch anhand der Beispiel-Prompts ausgeführt wird und das Ergebnis im Cache gespeichert wird.

from lit_nlp import notebook as lit_notebook

lit_widget = lit_notebook.LitWidget(
    models=models,
    datasets=datasets,
    layouts={'default': LM_SALIENCE_LAYOUT},
    default_layout='default',
)

Jetzt können Sie die Benutzeroberfläche anzeigen lassen:

lit_widget.render(height=800)

Demo der LIT-Benutzeroberfläche

Sie können LIT auch als ganze Seite in einem neuen Tab öffnen. Führen Sie diesen Code aus und klicken Sie auf den angezeigten Link:

lit_widget.render(open_in_new_tab=True)

Hinweis: Wenn Sie LIT in einem regulären .py-Skript verwenden, verwenden Sie lit_nlp.dev_server.Server() anstelle von LitWidget, um einen eigenständigen Server aufzurufen. Weitere Informationen finden Sie in der LIT-Dokumentation.

7. Einige Aufnahmeaufforderungen für Gemma in LIT werden analysiert

Heute sind Prompts genauso viel Kunst wie Wissenschaft. Mit LIT können Sie Prompts für Large Language Models wie Gemma empirisch verbessern. Zunächst siehst du ein Beispiel dafür, wie Gemmas Verhalten mithilfe von LIT erforscht, potenzielle Probleme vorhergesagt und die Sicherheit verbessert werden kann.

Fehler in komplexen Prompts erkennen

Zwei der wichtigsten Prompt-Techniken für hochwertige LLM-basierte Prototypen und Anwendungen sind wenige-shot-Prompts (einschließlich Beispielen für das gewünschte Verhalten des Prompts) und Chain-of-Thought (einschließlich einer Form der Erklärung oder Begründung vor der endgültigen Ausgabe des LLM). Dennoch ist es oft eine Herausforderung, einen effektiven Vorschlag zu erstellen.

Stellen Sie sich ein Beispiel dafür, wie Sie jemandem helfen können zu beurteilen, ob er Essen basierend auf seinem Geschmack mag. Eine anfängliche Prototyp-Vorlage für eine Vorschlagskette könnte so aussehen:

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:"""

Haben Sie die Probleme mit diesem Prompt festgestellt? LIT hilft Ihnen mit dem LM Salience-Modul, den Vorschlag zu prüfen.

8. Auffälligkeit der Sequenz für die Fehlerbehebung verwenden

Der Wert wird auf der kleinstmöglichen Ebene berechnet (d. h. für jedes Eingabetoken), aber LIT kann die Token-Salzität in interpretierbare größere Spans aggregieren, wie z. B. Zeilen, Sätze oder Wörter. Weitere Informationen zu Auffälligkeit und dazu, wie Sie damit unbeabsichtigte Verzerrungen erkennen können, finden Sie in unserer Saliency Explorable.

Beginnen wir damit, dem Prompt eine neue Beispieleingabe für die Prompt-Vorlagenvariablen zu geben:

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:

Wenn Sie die Benutzeroberfläche von LIT in der Zelle oben oder in einem separaten Tab geöffnet haben, können Sie den Datapoint Editor von LIT verwenden, um diese Eingabeaufforderung hinzuzufügen:

LIT-Datapoint-Bearbeiter

Eine andere Möglichkeit besteht darin, das Widget direkt mit dem Prompt von Interesse noch einmal zu rendern:

lit_widget.render(data=[fewshot_mistake_example])

Beachten Sie die überraschende Fertigstellung des Modells:

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.

Warum schlägt das Modell vor, dass Sie etwas essen, das Sie eindeutig nicht essen können?

Auffälligkeiten in einer Sequenz können dabei helfen, das Grundproblem hervorzuheben, das in unseren wenigen Beispielen zu sehen ist. Im ersten Beispiel stimmt die Logik-Logik im Analyseabschnitt it has cooked onions in it, which you don't like nicht mit der endgültigen Empfehlung You have to try it überein.

Wählen Sie im Modul „LM Salience“ die Option „Sätze“ aus. und wählen Sie dann die Empfehlungszeile aus. Die Benutzeroberfläche sollte jetzt so aussehen:

LIT-Salience

Dies weist auf einen menschlichen Fehler hin: ein versehentliches Kopieren und Einfügen des Empfehlungsteils und ein Fehler bei der Aktualisierung.

Korrigieren Sie nun die „Empfehlung“ im ersten Beispiel auf Avoid und versuchen Sie es noch einmal. Dieses Beispiel ist in LIT bereits in die Beispiel-Prompts geladen, sodass Sie es mit dieser kleinen Dienstfunktion abrufen können:

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')}])

Die Modellvervollständigung wird nun zu:

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.

Daraus lässt sich Folgendes ableiten: Frühes Prototyping hilft, Risiken aufzudecken, an die Sie möglicherweise nicht im Voraus denken, und da Sprachmodelle fehleranfällig sind, müssen Sie Ihr Design proaktiv auf Fehler hin überprüfen. Weitere Informationen dazu finden Sie in unserem Guidebook „People + AI“ für die Entwicklung von KI-Designs.

Auch wenn die korrigierte Aufforderung zu paar Schnappschüssen besser ist, ist sie immer noch nicht ganz richtig: Sie teilt dem Nutzer richtig mit, Eier zu vermeiden, aber die Begründung ist nicht richtig: Er besagt, dass er keine Eier mag, obwohl er tatsächlich erklärt hat, dass er keine Eier essen darf. Im folgenden Abschnitt erfahren Sie, was Sie besser machen können.

9. Hypothesen testen, um das Modellverhalten zu verbessern

Mit LIT können Sie Änderungen an Prompts auf derselben Oberfläche testen. In diesem Fall möchten Sie testen, eine Verfassung hinzuzufügen, um das Verhalten des Modells zu verbessern. Verfassungen beziehen sich auf Designaufgaben mit Prinzipien, die als Leitfaden für die Modellgenerierung dienen. Jüngste Methoden ermöglichen sogar die interaktive Ableitung von Verfassungsprinzipien.

Wir wollen den Vorschlag nutzen, um ihn weiter zu verbessern. Fügen Sie oben in unserem Vorschlag einen Abschnitt mit den Grundsätzen für die Generierung hinzu, der nun so beginnt:

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')}])

Mit dieser Aktualisierung kann das Beispiel noch einmal ausgeführt werden und eine ganz andere Ausgabe beobachten:

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.

Die Auffälligkeit der Aufforderung kann dann noch einmal untersucht werden, um ein Gefühl dafür zu bekommen, warum diese Änderung passiert:

LIT-Salience

Die Empfehlung ist viel sicherer. Außerdem wird die Meldung „Nicht für dich geeignet“ angezeigt. wird durch das Prinzip beeinflusst, dass die Eignung eindeutig gemäß den Ernährungseinschränkungen festgelegt wird, zusammen mit der Analyse (die sogenannte Gedankenkette). So können Sie sicher sein, dass die Ausgabe aus dem richtigen Grund stammt.

10. Nicht-technische Teams in die Modellprüfung und -exploration einbeziehen

Interpretierbarkeit ist auf Teamarbeit ausgelegt, die das Fachwissen über XAI, Richtlinien, Recht und mehr umfasst.

Die Interaktion mit Modellen in den frühen Entwicklungsphasen erfordert traditionell ein erhebliches technisches Fachwissen, was es einigen Mitarbeitenden erschwerte, darauf zuzugreifen und sie zu prüfen. Bisher gab es keine Tools, mit denen diese Teams an den frühen Prototyping-Phasen teilnehmen konnten.

Die Hoffnung ist, dass sich dieses Paradigma mithilfe von LIT ändern kann. Wie Sie in diesem Codelab gesehen haben, können das visuelle Medium und die interaktive Fähigkeit von LIT, Auffälligkeiten zu untersuchen und Beispiele zu untersuchen, verschiedenen Stakeholdern dabei helfen, Ergebnisse zu teilen und zu kommunizieren. Auf diese Weise können Sie eine breitere Vielfalt von Teammitgliedern für die Modelluntersuchung, -prüfung und -behebung einbeziehen. Wenn Sie sie mit diesen technischen Methoden vertraut machen, können sie besser verstehen, wie Modelle funktionieren. Darüber hinaus kann ein vielfältigeres Fachwissen in den ersten Modelltests dazu beitragen, unerwünschte Ergebnisse aufzudecken, die verbessert werden können.

11. Zusammenfassung

Zusammenfassung:

  • Die LIT-UI bietet eine Schnittstelle für die interaktive Modellausführung, über die Nutzer Ausgaben direkt generieren und „Was wäre, wenn“-Tests testen können Szenarien durchführen. Dies ist besonders nützlich, um verschiedene Prompt-Varianten zu testen.
  • Das LM Salience-Modul bietet eine visuelle Darstellung der Auffälligkeit und einen steuerbaren Detaillierungsgrad von Daten, sodass Sie anstelle von modellorientierten Konstrukten (z.B. Tokens) über menschenzentrierte Konstrukte (z.B. Sätze und Wörter) kommunizieren können.

Wenn Sie in Ihren Modellbewertungen problematische Beispiele finden, übertragen Sie sie zur Fehlerbehebung in die LiT. Analysieren Sie zunächst die größte sinnvolle Inhaltseinheit, die sich logisch mit der Modellierungsaufgabe zusammenhängt. Verwenden Sie die Visualisierungen, um zu sehen, wo das Modell richtig auf den Inhalt des Prompts reagiert, und schlüsseln Sie dann kleinere Inhaltseinheiten auf, um das falsche Verhalten genauer zu beschreiben und mögliche Korrekturen zu ermitteln.

Und zu guter Letzt: Lit wird ständig besser! Hier erfahren Sie mehr über unsere Funktionen und können Ihre Vorschläge mit uns teilen.