Menggunakan LIT untuk Menganalisis Model Gemma di Keras

1. Pengantar

Produk AI generatif relatif baru dan perilaku aplikasi dapat lebih bervariasi daripada bentuk software sebelumnya. Oleh karena itu, penting untuk menyelidiki model machine learning yang digunakan, memeriksa contoh perilaku model, dan menyelidiki hal-hal yang tidak terduga.

Learning Interpretability Tool (LIT; situs, GitHub) adalah platform untuk men-debug dan menganalisis model ML guna memahami alasan dan perilakunya.

Dalam codelab ini, Anda akan mempelajari cara menggunakan LIT untuk mendapatkan hasil maksimal dari model Gemma Google. Codelab ini menunjukkan cara menggunakan sequence salience, yakni teknik penafsiran, untuk menganalisis berbagai pendekatan rekayasa perintah.

Tujuan pembelajaran:

  1. Memahami salience urutan dan penggunaannya dalam analisis model.
  2. Menyiapkan LIT untuk Gemma guna menghitung output perintah dan salience urutan.
  3. Menggunakan urutan salience melalui modul LM Salience untuk memahami dampak desain prompt terhadap output model.
  4. Menguji hipotesis peningkatan cepat di LIT dan melihat dampaknya.

Catatan: codelab ini menggunakan implementasi KerasNLP Gemma, dan TensorFlow v2 untuk backend. Sebaiknya gunakan kernel GPU untuk mengikuti petunjuk ini.

Demo UI LIT

2. Urusan Urutan dan Penggunaannya dalam Analisis Model

Model generatif teks ke teks, seperti Gemma, mengambil urutan input dalam bentuk teks yang di-token dan menghasilkan token baru yang merupakan tindak lanjut atau penyelesaian umum untuk input tersebut. Pembuatan token ini terjadi satu per satu, dan menambahkan (dalam satu loop) setiap token yang baru dihasilkan ke input serta generasi sebelumnya hingga model mencapai kondisi penghentian. Contohnya termasuk saat model membuat token akhir urutan (EOS) atau mencapai panjang maksimum yang telah ditentukan.

Metode salience adalah kelas teknik explainable AI (XAI) yang dapat memberi tahu Anda bagian input mana yang penting bagi model untuk berbagai bagian outputnya. LIT mendukung metode salience untuk berbagai tugas klasifikasi, yang menjelaskan dampak urutan token input pada label yang diprediksi. Sequence salience menggeneralisasi metode ini ke model generatif teks-ke-teks dan menjelaskan dampak token sebelumnya pada token yang dihasilkan.

Anda akan menggunakan metode Grad L2 Norm di sini untuk salience urutan, yang menganalisis gradien model dan memberikan besarnya pengaruh yang dimiliki setiap token sebelumnya terhadap output. Metode ini sederhana dan efisien, serta telah terbukti memiliki performa yang baik dalam klasifikasi dan setelan lainnya. Semakin besar skor salience, semakin tinggi pengaruhnya. Metode ini digunakan dalam LIT karena dipahami dengan baik dan digunakan secara luas di seluruh komunitas riset penafsiran.

Metode salience berbasis gradien yang lebih canggih mencakup Input ⋅ Input dan gradien terintegrasi. Ada juga metode berbasis ablasi yang tersedia, seperti LIME dan SHAP, yang bisa lebih tangguh tetapi jauh lebih mahal untuk dihitung. Lihat artikel ini untuk mengetahui perbandingan mendetail tentang berbagai metode salience.

Anda dapat mempelajari lebih lanjut sains metode salience dalam pengantar interaktif yang dapat dieksplorasi ke salience ini.

3. Impor, Lingkungan, dan Kode Penyiapan Lainnya

Sebaiknya Anda mengikuti codelab ini di Colab baru. Sebaiknya gunakan runtime akselerator, karena Anda akan memuat model ke dalam memori. Namun, perlu diketahui bahwa opsi akselerator bervariasi dari waktu ke waktu dan tunduk pada batasan. Colab menawarkan langganan berbayar jika Anda ingin mengakses akselerator yang lebih canggih. Atau, Anda dapat menggunakan runtime lokal jika mesin Anda memiliki GPU yang sesuai.

Catatan: Anda mungkin melihat beberapa peringatan untuk formulir

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.

Jenis pesan ini aman untuk diabaikan.

Menginstal LIT dan Keras NLP

Untuk codelab ini, Anda memerlukan versi terbaru keras (3) keras-nlp (0.8.0) dan lit-nlp (1.1), serta akun Kaggle untuk mendownload model dasar.

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

Akses Kaggle

Untuk login ke Kaggle, Anda dapat menyimpan file kredensial kaggle.json di ~/.kaggle/kaggle.json atau menjalankan perintah berikut di lingkungan Colab. Lihat dokumentasi paket kagglehub untuk detail selengkapnya.

import kagglehub

kagglehub.login()

Pastikan Anda juga menyetujui perjanjian lisensi untuk Gemma.

4. Menyiapkan Model 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)

Kode berikut menginisialisasi wrapper LIT untuk mendukung salience pada model Gemma. Framework LIT menyebutnya sebagai model, tetapi dalam kasus ini, keduanya hanyalah endpoint yang berbeda untuk gemma_model dasar yang sama dengan yang Anda muat di atas. Dengan demikian, LIT dapat menghitung pembuatan, tokenisasi, dan salience secara on-demand.

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. Menyiapkan set data LIT

Gemma adalah model generatif teks-ke-teks yang mengambil input teks dan menghasilkan output teks. Model LIT mengasumsikan bahwa set data akan menyediakan kolom berikut untuk mendukung pembuatan:

  • prompt: Input ke KerasGenerationModel.
  • target: Urutan target opsional, seperti "kebenaran dasar" (emas) atau respons yang telah dibuat sebelumnya dari model.

LIT menyertakan sekumpulan kecil sample_prompts dengan contoh dari beberapa sumber yang berbeda, seperti:

  • GSM8K: Menyelesaikan soal matematika sekolah dasar dengan contoh few-shot.
  • Tolok Ukur Gigaword: Pembuatan judul untuk kumpulan artikel singkat.
  • Perintah Konstitusional: Menghasilkan ide baru tentang cara menggunakan objek dengan panduan/batas.

Anda juga dapat dengan mudah memuat data Anda sendiri, baik sebagai file .jsonl yang berisi kumpulan data dengan kolom prompt dan secara opsional target (contoh), atau dari format apa pun menggunakan Dataset API LIT.

Jalankan sel di bawah untuk memuat contoh prompt.

from lit_nlp.examples.datasets import lm as lm_data

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

6. Menyiapkan LIT UI

LIT adalah alat pemahaman model interaktif, yang memungkinkan evaluasi dan pemeriksaan perilaku model oleh manusia yang memerlukan interaksi. UI LIT memfasilitasi interaksi ini dengan memungkinkan Anda untuk:

  • memvisualisasikan set data dan output model secara langsung,
  • menjalankan metode salience untuk memahami token input yang mendorong perilaku model, dan
  • membuat kontrafaktual untuk menguji hipotesis.

LIT memungkinkan semua ini dalam antarmuka yang sama, sehingga mengurangi hambatan peralihan di antara alat yang berbeda. Hal ini sangat berguna untuk tugas seperti rekayasa perintah, yang akan Anda fokuskan nanti dalam codelab ini.

Tata letak UI ini dapat digunakan untuk model bahasa generatif lainnya. Jika Anda tertarik dengan fitur selain yang tercantum di sini, Anda dapat menemukan daftar lengkapnya di sini.

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

Kode ini melakukan inisialisasi server LIT. Proses ini mungkin memerlukan waktu beberapa detik karena model ini juga akan menjalankan model pada contoh perintah dan menyimpan hasilnya dalam cache.

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

Sekarang Anda dapat menampilkan UI:

lit_widget.render(height=800)

Demo UI LIT

Anda juga dapat membuka LIT sebagai satu halaman penuh di tab baru. Jalankan kode ini dan klik link yang ditampilkan:

lit_widget.render(open_in_new_tab=True)

Catatan: jika Anda menggunakan LIT dalam skrip .py reguler, gunakan lit_nlp.dev_server.Server(), bukan LitWidget, untuk memunculkan server mandiri. Lihat dokumentasi LIT untuk detail selengkapnya.

7. Menganalisis Beberapa Perintah Shot untuk Gemma di LIT

Saat ini, memberi instruksi adalah seni seperti halnya sains, dan LIT dapat membantu Anda secara empiris meningkatkan kualitas perintah untuk model bahasa besar, seperti Gemma. Sebelumnya, Anda akan melihat contoh bagaimana LIT dapat digunakan untuk mengeksplorasi perilaku Gemma, mengantisipasi potensi masalah, dan meningkatkan keamanannya.

Mengidentifikasi error dalam perintah yang kompleks

Dua teknik prompting yang paling penting untuk prototipe dan aplikasi berbasis LLM berkualitas tinggi adalah few-shot prompting (termasuk contoh perilaku yang diinginkan dalam perintah) dan rantai pikiran (termasuk bentuk penjelasan atau alasan sebelum output akhir LLM). Tetapi membuat {i>prompt<i} yang efektif sering kali masih menjadi tantangan.

Pertimbangkan contoh cara membantu seseorang menilai apakah mereka akan menyukai makanan berdasarkan selera mereka. {i>Prompt-template <i}prototipe awal mungkin terlihat seperti ini:

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

Apakah Anda menemukan masalah pada perintah ini? LIT akan membantu Anda memeriksa perintah dengan modul salience LM.

8. Menggunakan sequence salience untuk proses debug

Salience dihitung pada level terkecil (yaitu, untuk setiap token input), tetapi LIT dapat menggabungkan token-saliency ke dalam span yang lebih besar dan dapat ditafsirkan, seperti garis, kalimat, atau kata. Pelajari lebih lanjut saliency dan cara menggunakannya untuk mengidentifikasi bias yang tidak diinginkan dalam Saliency Explorable kami.

Mari kita mulai dengan memberikan contoh input baru untuk variabel prompt-template:

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:

Jika UI LIT telah terbuka dalam sel di atas atau di tab terpisah, Anda dapat menggunakan Editor Titik Data LIT untuk menambahkan perintah ini:

Editor Datapoint LIT

Cara lain adalah dengan merender ulang widget secara langsung dengan perintah yang diinginkan:

lit_widget.render(data=[fewshot_mistake_example])

Perhatikan penyelesaian model yang mengejutkan:

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.

Mengapa model menyarankan Anda makan sesuatu yang dengan jelas Anda katakan tidak bisa dimakan?

{i>Sequence salience<i} dapat membantu menyoroti akar masalah, yang ada dalam contoh few-shot kami. Pada contoh pertama, penalaran rantai-pemikiran di bagian analisis it has cooked onions in it, which you don't like tidak cocok dengan rekomendasi akhir You have to try it.

Di modul LM Salience, pilih "Sentences" lalu pilih baris rekomendasi. UI kini akan terlihat seperti berikut:

salience LIT

Tindakan ini akan menandai kesalahan manusia, yaitu bagian rekomendasi yang disalin dan ditempel secara tidak sengaja, serta gagal diperbarui.

Sekarang mari kita perbaiki "Rekomendasi" dalam contoh pertama untuk Avoid, lalu coba lagi. LIT telah memuat contoh ini dalam contoh perintah, sehingga Anda dapat menggunakan fungsi utilitas kecil ini untuk mendapatkannya:

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

Sekarang penyelesaian model menjadi:

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.

Pelajaran penting yang dapat diambil dari hal ini adalah: pembuatan prototipe awal membantu mengungkapkan risiko yang mungkin tidak terpikirkan sebelumnya, dan sifat model bahasa yang rentan error berarti Anda harus mendesain secara proaktif untuk menangani error. Pembahasan lebih lanjut tentang hal ini dapat ditemukan di Buku Panduan People + AI kami untuk mendesain dengan AI.

Meskipun prompt beberapa shot yang dikoreksi lebih baik, masih belum benar: perintah tersebut memberitahu pengguna untuk menghindari telur, tetapi alasannya tidak benar, karena dia tidak suka telur, padahal sebenarnya pengguna telah menyatakan bahwa dia tidak bisa makan telur. Di bagian berikut, Anda akan melihat cara meningkatkannya.

9. Menguji hipotesis untuk meningkatkan perilaku model

Dengan LIT, Anda dapat menguji perubahan pada perintah dalam antarmuka yang sama. Dalam contoh ini, Anda akan menguji penambahan konstitusi untuk meningkatkan perilaku model. Konstitusi mengacu pada perintah desain dengan prinsip-prinsip untuk membantu memandu pembuatan model. Metode terbaru bahkan memungkinkan turunan interaktif prinsip-prinsip konstitusional.

Mari kita gunakan ide ini untuk membantu meningkatkan kualitas perintah lebih lanjut. Tambahkan bagian dengan prinsip-prinsip untuk pembuatan di bagian atas perintah, yang kini dimulai sebagai berikut:

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

Dengan update ini, contoh dapat dijalankan kembali dan mengamati output yang sangat berbeda:

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.

Arti penting tersebut kemudian dapat diperiksa ulang untuk membantu memahami mengapa perubahan ini terjadi:

salience LIT

Perhatikan bahwa rekomendasi ini jauh lebih aman. Selain itu, notifikasi "Tidak sesuai untuk Anda" dipengaruhi oleh prinsip yang secara jelas menyatakan kesesuaiannya dengan batasan diet, bersama dengan analisis (yang disebut rantai pemikiran). Hal ini membantu memberikan keyakinan tambahan bahwa output dibuat dengan alasan yang tepat.

10. Sertakan tim non-teknis dalam pemeriksaan dan eksplorasi model

Penafsiran dimaksudkan sebagai upaya tim, yang mencakup keahlian di seluruh XAI, kebijakan, hukum, dan lainnya.

Berinteraksi dengan model pada tahap pengembangan awal biasanya memerlukan keahlian teknis yang signifikan, yang menyulitkan beberapa kolaborator untuk mengakses dan menyelidikinya. Secara historis, alat belum tersedia untuk memungkinkan tim ini berpartisipasi dalam fase pembuatan prototipe awal.

Melalui LIT, harapannya adalah paradigma ini dapat berubah. Seperti yang telah Anda lihat dalam codelab ini, media visual dan kemampuan interaktif LIT untuk memeriksa arti penting dan mengeksplorasi contoh dapat membantu berbagai pemangku kepentingan berbagi dan mengomunikasikan temuan. Dengan begitu, Anda dapat menghadirkan keberagaman rekan tim yang lebih luas untuk eksplorasi, pemeriksaan, dan proses debug model. Dengan menunjukkan metode teknis ini kepada mereka, mereka dapat lebih memahami cara kerja model. Selain itu, sekumpulan keahlian yang lebih beragam dalam pengujian model awal juga dapat membantu mengungkap hasil yang tidak diinginkan yang dapat ditingkatkan.

11. Rekap

Ringkasnya:

  • UI LIT menyediakan antarmuka untuk eksekusi model interaktif, yang memungkinkan pengguna menghasilkan output secara langsung dan menguji "bagaimana jika" yang signifikan. Hal ini sangat berguna untuk menguji berbagai variasi prompt.
  • Modul LM Salience memberikan representasi visual dari salience, dan memberikan perincian data yang dapat dikontrol sehingga Anda dapat berkomunikasi tentang konstruksi yang berfokus pada manusia (misalnya, kalimat dan kata), alih-alih konstruksi yang berpusat pada model (misalnya, token).

Jika Anda menemukan contoh bermasalah dalam evaluasi model, pindahkan contoh tersebut ke LIT untuk proses debug. Mulailah dengan menganalisis unit konten logis terbesar yang Anda anggap yang secara logis berkaitan dengan tugas pemodelan, gunakan visualisasi untuk melihat di mana model benar atau salah menangani konten perintah, lalu lihat perincian unit konten perintah yang lebih kecil untuk lebih mendeskripsikan lebih lanjut perilaku salah yang Anda lihat untuk mengidentifikasi kemungkinan perbaikan.

Terakhir: Peningkatan kualitas Lit akan terus ditingkatkan. Pelajari lebih lanjut fitur kami dan sampaikan saran Anda di sini.