7.2. Fine-Tuning to follow instructions

Das Ziel dieses Abschnitts ist es zu zeigen, wie man ein bereits vortrainiertes Modell feinabstimmt, um Anweisungen zu befolgen, anstatt nur Text zu generieren, zum Beispiel, um auf Aufgaben als Chatbot zu reagieren.

Datensatz

Um ein LLM zur Befolgung von Anweisungen feinabzustimmen, ist es notwendig, einen Datensatz mit Anweisungen und Antworten zu haben, um das LLM feinabzustimmen. Es gibt verschiedene Formate, um ein LLM zur Befolgung von Anweisungen zu trainieren, zum Beispiel:

  • Das Beispiel des Apply Alpaca-Prompt-Stils:

Below is an instruction that describes a task. Write a response that appropriately completes the request.

### Instruction:
Calculate the area of a circle with a radius of 5 units.

### Response:
The area of a circle is calculated using the formula \( A = \pi r^2 \). Plugging in the radius of 5 units:

\( A = \pi (5)^2 = \pi \times 25 = 25\pi \) square units.
  • Phi-3 Prompt-Stil Beispiel:

<|User|>
Can you explain what gravity is in simple terms?

<|Assistant|>
Absolutely! Gravity is a force that pulls objects toward each other.

Training a LLM mit diesen Arten von Datensätzen anstelle von nur rohem Text hilft dem LLM zu verstehen, dass er spezifische Antworten auf die Fragen geben muss, die er erhält.

Daher ist eine der ersten Maßnahmen mit einem Datensatz, der Anfragen und Antworten enthält, diese Daten im gewünschten Eingabeformat zu modellieren, wie:

# Code from https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/ch07.ipynb
def format_input(entry):
instruction_text = (
f"Below is an instruction that describes a task. "
f"Write a response that appropriately completes the request."
f"\n\n### Instruction:\n{entry['instruction']}"
)

input_text = f"\n\n### Input:\n{entry['input']}" if entry["input"] else ""

return instruction_text + input_text

model_input = format_input(data[50])

desired_response = f"\n\n### Response:\n{data[50]['output']}"

print(model_input + desired_response)

Dann ist es wie immer notwendig, den Datensatz in Trainings-, Validierungs- und Testsets zu unterteilen.

Batching & Data Loaders

Dann ist es notwendig, alle Eingaben und erwarteten Ausgaben für das Training zu batchen. Dazu ist es erforderlich:

  • Die Texte zu tokenisieren

  • Alle Samples auf die gleiche Länge zu paddeln (in der Regel wird die Länge so groß sein wie die Kontextlänge, die zum Vortrainieren des LLM verwendet wurde)

  • Die erwarteten Tokens zu erstellen, indem man den Input in einer benutzerdefinierten Collate-Funktion um 1 verschiebt

  • Einige Padding-Tokens durch -100 zu ersetzen, um sie vom Trainingsverlust auszuschließen: Nach dem ersten endoftext-Token alle anderen endoftext-Tokens durch -100 ersetzen (da die Verwendung von cross_entropy(...,ignore_index=-100) bedeutet, dass Ziele mit -100 ignoriert werden)

  • [Optional] Auch alle Tokens, die zur Frage gehören, mit -100 zu maskieren, damit das LLM nur lernt, wie man die Antwort generiert. Im Apply Alpaca-Stil bedeutet dies, alles bis ### Response: zu maskieren.

Damit erstellt, ist es Zeit, die Datenlader für jedes Dataset (Training, Validierung und Test) zu erstellen.

Vortrainiertes LLM laden & Feinabstimmung & Verlustüberprüfung

Es ist notwendig, ein vortrainiertes LLM zu laden, um es fein abzustimmen. Dies wurde bereits auf anderen Seiten besprochen. Dann ist es möglich, die zuvor verwendete Trainingsfunktion zu nutzen, um das LLM fein abzustimmen.

Während des Trainings ist es auch möglich zu sehen, wie der Trainingsverlust und der Validierungsverlust während der Epochen variieren, um zu überprüfen, ob der Verlust reduziert wird und ob Overfitting auftritt. Denken Sie daran, dass Overfitting auftritt, wenn der Trainingsverlust reduziert wird, der Validierungsverlust jedoch nicht reduziert wird oder sogar steigt. Um dies zu vermeiden, ist das Einfachste, das Training in der Epoche zu stoppen, in der dieses Verhalten beginnt.

Antwortqualität

Da dies keine Klassifikationsfeinabstimmung ist, bei der man den Verlustvariationen mehr vertrauen kann, ist es auch wichtig, die Qualität der Antworten im Testset zu überprüfen. Daher wird empfohlen, die generierten Antworten aus allen Testsets zu sammeln und ihre Qualität manuell zu überprüfen, um zu sehen, ob es falsche Antworten gibt (beachten Sie, dass es möglich ist, dass das LLM das Format und die Syntax des Antwortsatzes korrekt erstellt, aber eine völlig falsche Antwort gibt. Die Verlustvariation wird dieses Verhalten nicht widerspiegeln). Beachten Sie, dass es auch möglich ist, diese Überprüfung durchzuführen, indem man die generierten Antworten und die erwarteten Antworten an andere LLMs weitergibt und sie bittet, die Antworten zu bewerten.

Weitere Tests zur Überprüfung der Qualität der Antworten:

  1. Messung des Massive Multitask Language Understanding (MMLU): MMLU bewertet das Wissen und die Problemlösungsfähigkeiten eines Modells in 57 Fächern, einschließlich Geisteswissenschaften, Naturwissenschaften und mehr. Es verwendet Multiple-Choice-Fragen, um das Verständnis auf verschiedenen Schwierigkeitsgraden zu bewerten, von elementar bis fortgeschritten.

  2. LMSYS Chatbot Arena: Diese Plattform ermöglicht es Benutzern, Antworten von verschiedenen Chatbots nebeneinander zu vergleichen. Benutzer geben einen Prompt ein, und mehrere Chatbots generieren Antworten, die direkt verglichen werden können.

  3. AlpacaEval: AlpacaEval ist ein automatisiertes Bewertungsframework, bei dem ein fortgeschrittenes LLM wie GPT-4 die Antworten anderer Modelle auf verschiedene Prompts bewertet.

  4. Allgemeine Bewertung des Sprachverständnisses (GLUE): GLUE ist eine Sammlung von neun Aufgaben zum natürlichen Sprachverständnis, einschließlich Sentiment-Analyse, textueller Folgerung und Fragebeantwortung.

  5. SuperGLUE: Aufbauend auf GLUE umfasst SuperGLUE herausforderndere Aufgaben, die für aktuelle Modelle schwierig sein sollen.

  6. Über das Imitationsspiel-Benchmark (BIG-bench): BIG-bench ist ein großangelegtes Benchmark mit über 200 Aufgaben, die die Fähigkeiten eines Modells in Bereichen wie Schlussfolgern, Übersetzung und Fragebeantwortung testen.

  7. Ganzheitliche Bewertung von Sprachmodellen (HELM): HELM bietet eine umfassende Bewertung über verschiedene Metriken wie Genauigkeit, Robustheit und Fairness.

  8. OpenAI Evals: Ein Open-Source-Bewertungsframework von OpenAI, das das Testen von KI-Modellen auf benutzerdefinierten und standardisierten Aufgaben ermöglicht.

  9. HumanEval: Eine Sammlung von Programmierproblemen, die zur Bewertung der Codegenerierungsfähigkeiten von Sprachmodellen verwendet wird.

  10. Stanford Question Answering Dataset (SQuAD): SQuAD besteht aus Fragen zu Wikipedia-Artikeln, bei denen Modelle den Text verstehen müssen, um genau zu antworten.

  11. TriviaQA: Ein großangelegter Datensatz von Trivia-Fragen und -Antworten sowie Beweis-Dokumenten.

und viele, viele mehr

Code zur Feinabstimmung nach Anweisungen

Sie finden ein Beispiel für den Code zur Durchführung dieser Feinabstimmung unter https://github.com/rasbt/LLMs-from-scratch/blob/main/ch07/01_main-chapter-code/gpt_instruction_finetuning.py

Referenzen

Last updated