Zastosowanie LIT do analizy modeli Gemma w Keras

1. Wprowadzenie

Usługi generatywnej AI są stosunkowo nowe, a zachowania aplikacji mogą być bardziej zróżnicowane niż wcześniejsze formy oprogramowania. Dlatego tak ważne jest sondowanie używanych modeli systemów uczących się, badanie przykładów zachowania modelu i badanie niespodzianek.

Learning Interpretability Tool (LIT; strona internetowa, GitHub) to platforma do debugowania i analizowania modeli ML, aby zrozumieć, dlaczego i jak zachowują się w określony sposób.

Z tego ćwiczenia w Codelabs dowiesz się, jak używać LIT, aby w pełni wykorzystać model Gemma od Google. Dzięki temu ćwiczeniu w Codelabs dowiesz się, jak korzystać z wyróżniania sekwencji – techniki interpretowalności – do analizowania różnych metod inżynierii promptów.

Cele szkolenia:

  1. Informacje o wyróżnieniu sekwencji i jej zastosowaniach w analizie modeli.
  2. Konfiguruję LIT na potrzeby Gemma w celu obliczania wyników promptów i wyróżnienia sekwencji.
  3. Wykorzystanie wyróżnienia sekwencji w module Stan w systemie zarządzania uczeniem w celu zrozumienia wpływu projektów promptów na dane wyjściowe modelu.
  4. Testowanie hipotetycznych ulepszeń promptów w LIT i sprawdzanie ich wpływu.

Uwaga: w tym ćwiczeniu w Codelabs wykorzystano implementację KerasNLP w Gemma i TensorFlow v2 w przypadku backendu. Zdecydowanie zalecamy użycie jądra GPU.

Wersja demonstracyjna interfejsu LIT

2. Skuteczność sekwencji i jej zastosowania w analizie modeli

Modele generatywne polegające na zamianie tekstu na tekst, takie jak Gemma, wykorzystują sekwencję wejściową w postaci tekstu tokenizowanego i generują nowe tokeny stanowiące typowe kontynuacje lub uzupełnienia danych wejściowych. Ta generacja odbywa się 1 token naraz, dołączając (w pętli) do danych wejściowych każdy nowo wygenerowany token oraz wszystkie poprzednie generacje, aż model osiągnie warunek zatrzymania. Mogą to być na przykład sytuacje, w których model generuje token końca sekwencji (EOS) lub osiąga określoną z góry maksymalną długość.

Metody określania poziomu to klasa wyjaśnialnych technik AI (XAI), które mogą wskazać, które części danych wejściowych są ważne dla modelu w odniesieniu do różnych części danych wyjściowych. LIT obsługuje metody bezpieczeństwa na potrzeby różnych zadań klasyfikacji, które wyjaśniają wpływ sekwencji tokenów wejściowych na prognozowaną etykietę. Wyróżnienie sekwencji uogólnia te metody do modeli generatywnych „tekst na tekst” i wyjaśnia wpływ poprzednich tokenów na wygenerowane tokeny.

W tym miejscu użyjesz metody normy Grad L2, aby wyodrębnić sekwencję, która analizuje gradienty modelu i określa skalę wpływu, jaki każdy poprzedzający token ma na dane wyjściowe. Ta metoda jest prosta i wydajna. Wykazano, że sprawdza się dobrze w klasyfikacji i innych ustawieniach. Im wyższy wynik istotności, tym większy wpływ. Ta metoda jest wykorzystywana w LIT, ponieważ jest dobrze zrozumiała i wykorzystywana w całej społeczności zajmującej się badaniem interpretowalności.

Bardziej zaawansowane metody wyróżniania oparte na gradientie to Grad ⋅ Dane wejściowe i gradienty zintegrowane. Istnieją również metody oparte na ablacji, takie jak LIME i SHAP, które mogą być solidniejsze, ale znacznie droższe w obliczeniach. Szczegółowe porównanie różnych metod wyróżniania znajdziesz w tym artykule.

Aby dowiedzieć się więcej o metodach wyróżniania, przeczytaj ten wprowadzający, interaktywny artykuł wyjaśniający znaczenie informacji.

3. Importy, środowisko i inny kod konfiguracji

Zalecamy ćwiczenie z programowania w nowej wersji Colab. Zalecamy korzystanie ze środowiska wykonawczego akceleratora, ponieważ będziesz wczytywać model do pamięci, ale pamiętaj, że opcje akceleratora zmieniają się z czasem i mają pewne ograniczenia. Jeśli chcesz korzystać z wydajniejszych akceleratorów, Colab oferuje płatne subskrypcje. Możesz też użyć lokalnego środowiska wykonawczego, jeśli Twój komputer ma odpowiedni procesor graficzny.

Uwaga: w formularzu mogą się pojawić niektóre ostrzeżenia

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.

Można je zignorować.

Instalowanie LIT i Keras NLP

Aby móc pobrać model podstawowy, musisz mieć najnowszą wersję keras (3) keras-nlp (0.8.0) i lit-nlp (1.1) oraz konto Kaggle.

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

Dostęp do Kaggle

Aby zalogować się w Kaggle, możesz zapisać plik danych logowania kaggle.json w lokalizacji ~/.kaggle/kaggle.json lub uruchomić poniższe polecenie w środowisku Colab. Więcej informacji znajdziesz w dokumentacji pakietu kagglehub.

import kagglehub

kagglehub.login()

Pamiętaj, by zaakceptować także umowę licencyjną na Gemma.

4. Konfigurowanie modeli LIT

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)

Poniższy kod inicjuje kody LIT w celu obsługi wyróżnienia w modelu Gemma. Platforma LIT odnosi się do tych modeli jako modeli, ale w tym przypadku są to po prostu różne punkty końcowe dla tego samego bazowego elementu gemma_model, który został wczytany powyżej. Umożliwia to LIT obliczanie generowania, tokenizację i wyróżnianie na żądanie.

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. Konfigurowanie zbiorów danych LIT

Gemma to model generatywny „tekst na tekst”, który wykorzystuje dane wejściowe i generuje tekst. Modele LIT zakładają, że zbiory danych zawierają te pola umożliwiające generowanie:

  • prompt: dane wejściowe dla typu KerasGenerationModel.
  • target: opcjonalna sekwencja docelowa, np. „ground truth”. (złota) lub wstępnie wygenerowana odpowiedź przez model.

LIT zawiera niewielki zbiór pól sample_prompts z przykładami z kilku różnych źródeł, takich jak:

  • GSM8K: rozwiązywanie zadań matematycznych w szkołach za pomocą krótkich przykładów.
  • Test porównawczy Gigaword: generowanie nagłówków na potrzeby zbioru krótkich artykułów.
  • Prompty konstytucyjne: generowanie nowych pomysłów na wykorzystanie obiektów zgodnie z wytycznymi/granicami.

Możesz też łatwo wczytać własne dane w postaci pliku .jsonl zawierającego rekordy z polami prompt i opcjonalnie target (przykład) lub w dowolnym formacie za pomocą interfejsu Dataset API LIT.

Aby wczytać przykładowe prompty, uruchom komórkę poniżej.

from lit_nlp.examples.datasets import lm as lm_data

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

6. Konfigurowanie interfejsu LIT

LIT to interaktywne narzędzie do analizowania modeli, które umożliwia przeprowadzanie oceny z udziałem człowieka oraz sondowanie zachowania modelu. Interfejs LIT ułatwia tę interakcję, umożliwiając:

  • wizualizować na żywo zbiory danych i dane wyjściowe modeli,
  • uruchamiać metody wyróżnienia, aby zrozumieć tokeny wejściowe wpływające na zachowanie modelu;
  • tworzyć kontrfakty, aby sprawdzać hipotezy.

LIT umożliwia wszystkie te funkcje w ramach tego samego interfejsu, co ułatwia przełączanie się między różnymi narzędziami. Jest to szczególnie przydatne w przypadku zadań związanych z tworzeniem promptów, które omówimy w dalszej części tego ćwiczenia z programowania.

Tego układu interfejsu można używać w dowolnym innym generatywnym modelu językowym. Jeśli interesują Cię funkcje inne niż wymienione tutaj, ich pełną listę znajdziesz tutaj.

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.',
)

Ten kod inicjuje serwer LIT. Może to potrwać kilka sekund, ponieważ model uruchamia też model w przykładowych promptach i zapisuje wynik w pamięci podręcznej.

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',
)

Teraz możesz pokazać interfejs:

lit_widget.render(height=800)

Wersja demonstracyjna interfejsu LIT

Możesz też otworzyć LIT jako całą stronę w nowej karcie. Uruchom ten kod i kliknij wyświetlony link:

lit_widget.render(open_in_new_tab=True)

Uwaga: jeśli używasz LIT w zwykłym skrypcie .py, użyj lit_nlp.dev_server.Server() zamiast LitWidget, aby wywołać osobny serwer. Więcej informacji znajdziesz w dokumentacji LIT.

7. Analizuję kilka promptów o nagraniu Gemmy w LIT

Obecnie prompty to tak samo jak nauka, a LIT może pomóc empirycznie ulepszyć prompty dla dużych modeli językowych, takich jak Gemma. Za chwilę zobaczysz przykład, w jaki sposób LIT może posłużyć do poznawania zachowań Gemmy, przewidywania potencjalnych problemów i zwiększania jej bezpieczeństwa.

Identyfikowanie błędów w złożonych promptach

Dwie najważniejsze techniki tworzenia promptów dla wysokiej jakości prototypów i aplikacji opartych na LLM to prompty „few-shot” (w tym przykłady pożądanego zachowania w prompcie) i łańcuch myśli (w tym forma wyjaśnienia lub rozumowanie przed ostatecznym wynikiem LLM). Opracowanie skutecznego promptu często jest jednak nadal trudne.

Zobacz przykład, jak pomóc komuś ocenić, czy jedzenie mu się spodoba. Początkowy prototyp łańcucha myśli-szablonu promptu może wyglądać tak:

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

Czy udało Ci się zauważyć problemy z tym promptem? LIT pomoże Ci sprawdzić prompt za pomocą modułu Monitorowanie poziomu wymagań systemu zarządzania uczeniem.

8. Używanie wyróżnienia sekwencji na potrzeby debugowania

Zasięg jest obliczany na najniższym możliwym poziomie (tj. dla każdego tokena wejściowego), ale LIT może łączyć tożsamość tokenów w czytelniejsze, większe zakresy, takie jak wiersze, zdania lub słowa. Więcej informacji o stopień ważności i sposobach jego używania do identyfikowania niezamierzonych uprzedzeń znajdziesz w filmie Saliency Explorable.

Zacznijmy od podania w prompcie nowych przykładowych danych wejściowych dla zmiennych promptu-szablonu:

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:

Jeśli masz interfejs LIT otwarty w komórce powyżej lub na osobnej karcie, możesz dodać ten prompt za pomocą edytora punktów danych LIT:

Edytujący punkty danych LIT

Innym sposobem jest ponowne wyrenderowanie widżetu bezpośrednio z odpowiednim promptem:

lit_widget.render(data=[fewshot_mistake_example])

Zwróć uwagę na zaskakujące zakończenie modelu:

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.

Dlaczego model sugeruje, że masz jeść to, co wyraźnie twierdzisz, że nie możesz jeść?

Wyróżnianie sekwencji może pomóc w uwydatnieniu problemu, który jest widoczny w naszych krótkich przykładach. W pierwszym przykładzie łańcuch myśli w sekcji analizy (it has cooked onions in it, which you don't like) nie pasuje do ostatecznej rekomendacji (You have to try it).

W module Zasięg w LMS wybierz „Zdania”. a następnie wybierz linię rekomendacji. Interfejs powinien wyglądać tak:

Zasięg LIT

Oznacza to błąd ludzki: przypadkowe skopiowanie i wklejenie części rekomendacji i niepowodzenie jej aktualizacji.

Poprawmy „Rekomendację”. w pierwszym przykładzie do funkcji Avoid i spróbuj ponownie. LIT ma ten przykład wstępnie załadowany w przykładowych promptach, możesz więc skorzystać z tej krótkiej funkcji użytkowej:

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

Ukończenie modelu będzie teraz wyglądało tak:

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.

Najważniejszą lekcję, którą warto z tego wyciągnąć, jest wczesne prototypowanie pomaga ujawnić zagrożenia, które nie zawsze z góry przyjdą Ci do głowy, a modele językowe podatne na błędy wymagają proaktywnego projektowania pod kątem błędów. Więcej informacji na ten temat znajdziesz w naszym poradniku poświęconym projektowaniu z wykorzystaniem AI People + AI Guidebook (w języku angielskim).

Choć poprawiona prośba o kilka ujęć jest lepsza, to nie do końca prawda: poprawnie informuje użytkownika, aby unikać jajek, ale uzasadnienie było błędne. Według nich użytkownik nie lubi jajek, podczas gdy faktycznie twierdzi, że nie może jeść jajek. W następnej sekcji dowiesz się, co możesz poprawić.

9. Testowanie hipotez w celu poprawy działania modelu

LIT umożliwia testowanie zmian w promptach w tym samym interfejsie. W tym przypadku przetestujesz dodanie konstytucji, aby poprawić działanie modelu. Konstytucje odnoszą się do promptów projektowych z zasadami pomagającymi w ukierunkowaniu generowania modelu. Najnowsze metody umożliwiają nawet interaktywne tworzenie zasad konstytucyjnych.

Wykorzystajmy tę propozycję do dalszego ulepszania prompta. Na początku promptu dodaj sekcję z zasadami dotyczącymi generowania treści, która zaczyna się tak:

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

Dzięki tej aktualizacji można ponownie uruchomić przykład i obserwować zupełnie inne dane wyjściowe:

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.

Następnie można przeanalizować znaczenie promptu ponownie, aby ułatwić zorientowanie się, dlaczego tak się stało:

Zasięg LIT

Zwróć uwagę, że rekomendacja jest znacznie bezpieczniejsza. Poza tym komunikat „Nie jest odpowiedni dla Ciebie” jest podyktowana zasadą jednoznacznego stwierdzania dopasowania do ograniczeń żywieniowych oraz analizy (tzw. łańcuch myśli). Daje to większą pewność, że dane wyjściowe pojawiają się w odpowiednim miejscu.

10. Uwzględnij zespoły inne niż techniczne w sondowaniu i eksploracji modeli

Interpretowalność to praca zespołowa obejmująca doświadczenie w zakresie XAI, zasad, przepisów prawa i innych zagadnień.

Interakcja z modelami na wczesnym etapie rozwoju wymagała zwykle znaczącej wiedzy technicznej, co utrudniało niektórym współpracownikom dostęp do nich i ich badanie. W przeszłości brakowało narzędzi, które umożliwiałyby tym zespołom udział we wczesnych fazach prototypowania.

Mamy nadzieję, że dzięki LIT ten model się zmieni. Jak widać w tym ćwiczeniu z programowania, wizualne medium i interaktywna zdolność LIT do badania widoczności i poznawania przykładów mogą pomóc różnym zainteresowanym osobom w dzieleniu się i przekazywaniu spostrzeżeniach. Dzięki temu możesz zwiększyć różnorodność członków zespołu do eksploracji modeli, sondowania i debugowania. Przedstawienie tych metod technicznych może pomóc im w zrozumieniu, jak działają modele. Co więcej, bardziej zróżnicowana wiedza specjalistyczna we wczesnej fazie testowania modeli również może pomóc w odkryciu niepożądanych wyników, które można poprawić.

11. Podsumowanie

Podsumowując:

  • Interfejs LIT udostępnia interfejs do interaktywnego wykonywania modelu, który umożliwia użytkownikom bezpośrednie generowanie wyników i testowanie „co się stanie, jeśli” w różnych sytuacjach. Jest to szczególnie przydatne przy testowaniu różnych odmian promptów.
  • Moduł Monitorowanie wyników w LM przedstawia wizualną wyróżnione informacje i zapewnia kontrolowany poziom szczegółowości danych, dzięki czemu możesz komunikować się o konstrukcjach skoncentrowanych na człowieku (np. zdaniach i słowach), a nie o konstrukcjach skoncentrowanych na modelu (np. tokenach).

Gdy w ocenach modelu znajdziesz problematyczne przykłady, przenieś je do LIT w celu debugowania. Zacznij od przeanalizowania największej sensownej jednostki treści, która według Ciebie jest logicznie powiązana z zadaniem modelowania. Użyj wizualizacji, aby sprawdzić, gdzie model prawidłowo lub w niewłaściwy sposób uwzględnia treść promptu, a następnie przeanalizuj mniejsze jednostki treści, aby dokładniej opisać zaobserwowane nieprawidłowe zachowanie, aby znaleźć możliwe poprawki.

I wreszcie: platforma nieustannie się rozwija. Tutaj możesz dowiedzieć się więcej o naszych funkcjach i przesłać swoje sugestie.