berita

Cara kerja autoencoder jarang, berikut adalah penjelasan intuitifnya

2024-08-05

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina



Laporan Jantung Mesin

Penyunting: Panda

Singkatnya: matriks → aktivasi ULT → matriks

Sparse autoencoder (SAE) adalah alat yang semakin umum untuk menafsirkan model pembelajaran mesin (meskipun SAE telah ada sejak tahun 1997).

Model pembelajaran mesin dan LLM menjadi semakin kuat dan berguna, namun model tersebut masih berupa kotak hitam dan kami tidak memahami bagaimana model tersebut menyelesaikan tugasnya. Memahami cara kerjanya akan sangat bermanfaat.

SAE membantu kita memecah perhitungan model menjadi komponen-komponen yang dapat dimengerti. Baru-baru ini, peneliti interpretabilitas LLM Adam Karvonen menerbitkan postingan blog untuk menjelaskan secara intuitif cara kerja SAE.

Masalah interpretasi

Komponen paling alami dari jaringan saraf adalah neuron individu. Sayangnya, satu neuron tidak dapat dengan mudah dikaitkan dengan satu konsep, seperti kutipan akademis, percakapan bahasa Inggris, permintaan HTTP, dan teks bahasa Korea. Dalam jaringan saraf, konsep direpresentasikan melalui kombinasi neuron, yang disebut superposisi.

Alasannya adalah karena banyak variabel di dunia ini yang secara alamiah jarang.

Misalnya, tempat lahir seorang selebriti mungkin muncul dalam kurang dari satu dari satu miliar token pelatihan, namun LLM modern masih dapat mempelajari fakta ini dan banyak pengetahuan lain tentang dunia. Ada lebih banyak fakta dan konsep individual dalam data pelatihan daripada jumlah neuron dalam model, yang mungkin menjadi alasan terjadinya superposisi.

Baru-baru ini, teknologi sparse autoencoder (SAE) semakin banyak digunakan untuk menguraikan jaringan saraf menjadi komponen yang dapat dimengerti. Desain SAE terinspirasi oleh hipotesis pengkodean yang jarang dalam ilmu saraf. Saat ini, SAE telah menjadi salah satu alat yang paling menjanjikan untuk menafsirkan jaringan saraf tiruan. SAE mirip dengan autoencoder standar.

Autoencoder konvensional adalah jaringan saraf yang digunakan untuk mengompresi dan merekonstruksi data masukan.

Misalnya, jika masukannya adalah vektor 100 dimensi (daftar berisi 100 nilai); autoencoder pertama-tama meneruskan masukan melalui lapisan encoder untuk mengompresnya menjadi vektor 50 dimensi, lalu mengompresinya. Representasi yang dikodekan diumpankan ke decoder untuk mendapatkan vektor keluaran 100 dimensi. Proses rekonstruksi biasanya tidak sempurna, karena proses kompresi membuat tugas rekonstruksi menjadi sangat sulit.



Diagram skema autoencoder standar dengan vektor masukan 1x4, vektor keadaan perantara 1x2, dan vektor keluaran 1x4. Warna sel mewakili nilai aktivasi. Keluarannya merupakan rekonstruksi masukan yang tidak sempurna.

Menjelaskan autoencoder jarang

Cara kerja autoencoder yang jarang

Autoencoder renggang mengubah vektor masukan menjadi vektor perantara yang mungkin memiliki dimensi lebih tinggi, sama, atau lebih rendah daripada masukan. Ketika digunakan dalam LLM, vektor perantara biasanya memiliki dimensi lebih tinggi daripada vektor masukan. Dalam hal ini, tanpa batasan tambahan, tugasnya menjadi sederhana dan SAE dapat menggunakan matriks identitas untuk merekonstruksi masukan dengan sempurna tanpa kejutan apa pun. Namun kami akan menambahkan batasan, salah satunya adalah menambahkan penalti ketersebaran pada kerugian pelatihan, yang akan menyebabkan SAE membuat vektor perantara renggang.

Misalnya, kita dapat memperluas masukan 100 dimensi menjadi vektor representasi berkode 200 dimensi, dan kita dapat melatih SAE agar hanya memiliki sekitar 20 elemen bukan nol dalam representasi yang dikodekan.



Diagram skema autoencoder jarang. Perhatikan bahwa aktivasi perantara jarang terjadi, dengan hanya 2 nilai bukan nol.

Kami menggunakan SAE untuk aktivasi perantara dalam jaringan saraf, yang mungkin berisi banyak lapisan. Selama forward pass, ada aktivasi perantara di dalam setiap lapisan dan di antara setiap lapisan.

Misalnya, GPT-3 memiliki 96 lapisan. Selama forward pass, setiap token dalam input memiliki vektor berdimensi 12.288 (daftar nilai 12.288). Vektor ini mengumpulkan semua informasi yang digunakan oleh model untuk memprediksi token berikutnya pada setiap lapisan pemrosesan, namun vektor ini buram, sehingga sulit untuk memahami informasi apa yang terkandung di dalamnya.

Kita dapat menggunakan SAE untuk memahami aktivasi perantara ini. SAE pada dasarnya adalah "matriks → aktivasi ReLU → matriks".

Misalnya, jika faktor perluasan GPT-3 SAE adalah 4 dan aktivasi inputnya memiliki 12.288 dimensi, maka representasi berkode SAE-nya memiliki 49.512 dimensi (12.288 x 4). Matriks pertama merupakan matriks encoder berbentuk (12,288, 49,512) dan matriks kedua merupakan matriks decoder berbentuk (49,512, 12,288). Dengan mengalikan aktivasi GPT dengan encoder dan menggunakan ReLU, representasi sparse berkode SAE 49.512 dimensi dapat diperoleh karena fungsi kerugian SAE meningkatkan ketersebaran.

Secara umum, tujuan kami adalah memiliki kurang dari 100 nilai bukan nol dalam representasi SAE. Dengan mengalikan representasi SAE dengan decoder, diperoleh aktivasi model yang direkonstruksi 12.288 dimensi. Rekonstruksi ini tidak sepenuhnya cocok dengan aktivasi GPT asli karena kendala ketersebaran akan membuat kecocokan sempurna sulit dicapai.

Secara umum, SAE hanya digunakan untuk satu posisi dalam model. Misalnya, kita dapat melatih SAE pada aktivasi perantara antara lapisan 26 dan 27. Untuk menganalisis informasi yang terdapat dalam keluaran 96 lapisan GPT-3, 96 SAE terpisah dapat dilatih - satu untuk setiap keluaran lapisan. Jika kita juga ingin menganalisis berbagai aktivasi perantara dalam setiap lapisan, diperlukan ratusan SAE. Untuk mendapatkan data pelatihan untuk SAE ini, sejumlah besar teks berbeda perlu dimasukkan ke dalam model GPT ini, dan kemudian aktivasi perantara untuk setiap posisi yang dipilih dikumpulkan.

Implementasi referensi PyTorch untuk SAE disediakan di bawah ini. Variabel dianotasi dengan bentuk. Ide ini berasal dari Noam Shazeer, lihat: https://medium.com/@NoamShazeer/shape-suffixes-good-coding-style-f836e72e24fd. Harap dicatat bahwa untuk memaksimalkan kinerja, implementasi SAE yang berbeda sering kali memiliki istilah bias, skema normalisasi, atau skema inisialisasi yang berbeda. Salah satu penambahan yang paling umum adalah semacam batasan pada norma vektor dekoder. Silakan kunjungi implementasi berikut untuk detail lebih lanjut:

  • OpenAI:https://github.com/openai/sparse_autoencoder/blob/main/sparse_autoencoder/model.py#L16
  • SAELens:https://github.com/jbloomAus/SAELens/blob/main/sae_lens/sae.py#L97
  • dictionary_learning:https://github.com/saprmarks/dictionary_learning/blob/main/dictionary.py#L30

impor obor

impor torch.nn sebagai nn

# D = d_model, F = ukuran_kamus

# misalnya jika d_model = 12288 dan dictionary_size = 49152

# lalu model_activations_D.shape = (12288,) dan encoder_DF.weight.shape = (12288, 49152)

kelas SparseAutoEncoder (nn.Module):

Autoencoder satu lapis.

def __init__(self, activation_dim: int, ukuran_dikt: int):

super ().__init__()

self.activation_dim = aktivasi_dim

self.dict_size = ukuran_dikt

self.encoder_DF = nn.Linear (dim_aktivasi, ukuran_dikt, bias=Benar)

self.decoder_FD = nn.Linear (ukuran_dict, dim_aktivasi, bias=Benar)

def encode (diri sendiri, aktivasi_model_D: torch.Tensor) -> torch.Tensor:

kembalikan nn.ReLU ()(self.encoder_DF (model_activations_D))

def decode (diri sendiri, representasi_yang_dikodekan_F: torch.Tensor) -> torch.Tensor:

kembalikan self.decoder_FD (encoded_representation_F)

def forward_pass (diri, aktivasi_model_D: torch.Tensor) -> tupel [torch.Tensor, torch.Tensor]:

representasi_yang_dikodekan_F = self.encode (aktivasi_model_D)

aktivasi_model_yang_direkonstruksi_D = self.decode (representasi_yang_dikodekan_F)

kembalikan aktivasi model yang direkonstruksi_D, representasi_yang_dikodekan_F

Fungsi kerugian autoencoder standar didasarkan pada keakuratan hasil rekonstruksi masukan. Untuk memperkenalkan ketersebaran, cara paling mudah adalah dengan menambahkan istilah penalti ketersebaran ke fungsi kerugian SAE. Cara paling umum untuk menghitung suku penalti ini adalah dengan mengambil kerugian L1 dari representasi SAE yang dikodekan (bukan bobot SAE) dan mengalikannya dengan koefisien L1. Koefisien L1 ini merupakan hyperparameter utama dalam pelatihan SAE karena menentukan trade-off antara mencapai ketersebaran dan mempertahankan akurasi rekonstruksi.

Perhatikan bahwa ini tidak dioptimalkan untuk kemampuan interpretasi. Sebaliknya, fitur SAE yang dapat diinterpretasikan merupakan efek samping dari optimalisasi ketersebaran dan rekonstruksi. Di bawah ini adalah fungsi kehilangan referensi.

# B = ukuran batch, D = d_model, F = ukuran_kamus

def hitung_kerugian (autoencoder: SparseAutoEncoder, model_activations_BD: torch.Tensor, l1_coeffient: float) -> torch.Tensor:

aktivasi_model_yang_direkonstruksi_BD, representasi_yang_dikodekan_BF = autoencoder.forward_pass (aktivasi_model_BD)

rekonstruksi_kesalahan_BD = (aktivasi_model_yang_direkonstruksi_BD - aktivasi_model_BD).pow (2)

rekonstruksi_kesalahan_B = einops.reduce (rekonstruksi_kesalahan_BD, 'BD -> B', 'jumlah')

l2_loss = kesalahan_rekonstruksi_B.mean ()

l1_loss = l1_koefisien * encoded_representation_BF.sum ()

kerugian = l2_kerugian + l1_kerugian

mengembalikan kerugian



Diagram skematik dari penerusan autoencoder renggang.

Ini adalah satu forward pass dari autoencoder sparse. Pertama adalah model vektor ukuran 1x4. Ini kemudian dikalikan dengan matriks encoder 4x8 untuk mendapatkan vektor berkode 1x8, dan ReLU diterapkan untuk mengubah nilai negatif menjadi nol. Vektor yang dikodekan ini jarang. Kemudian, kalikan dengan matriks dekoder 8x4 untuk mendapatkan aktivasi model 1x4 yang direkonstruksi secara tidak sempurna.

Demonstrasi fitur SAE hipotetis

Idealnya, setiap nilai numerik signifikan dalam representasi SAE berhubungan dengan beberapa komponen yang dapat dimengerti.

Di sini kita mengasumsikan sebuah kasus sebagai ilustrasi. Asumsikan bahwa vektor berdimensi 12.288 [1,5, 0,2, -1.2, ...] mewakili "Golden Retriever" dalam tampilan GPT-3. SAE adalah matriks berbentuk (49.512, 12.288), tetapi kita juga dapat menganggapnya sebagai himpunan 49.512 vektor, yang masing-masing mempunyai bentuk (1, 12.288). Jika vektor 317 decoder SAE mempelajari konsep "Golden Retriever" yang sama seperti GPT-3, maka vektor decoder kira-kira sama dengan [1.5, 0.2, -1.2, ...].

Setiap kali elemen 317 dari aktivasi SAE bukan nol, maka vektor yang sesuai dengan "Golden Retriever" (dan berdasarkan besarnya elemen 317) ditambahkan ke aktivasi yang direkonstruksi. Dalam istilah interpretasi mekanis, hal ini dapat secara ringkas digambarkan sebagai “vektor dekoder berhubungan dengan representasi linier dari fitur-fitur dalam ruang aliran sisa”.

Dapat juga dikatakan bahwa SAE dengan 49.512 dimensi representasi yang dikodekan memiliki 49.512 fitur. Fitur terdiri dari vektor encoder dan decoder yang sesuai. Peran vektor encoder adalah untuk mendeteksi konsep internal model sekaligus meminimalkan interferensi konsep lain, sedangkan peran vektor decoder adalah untuk merepresentasikan arah fitur "sebenarnya". Eksperimen peneliti menemukan bahwa fitur encoder dan decoder dari masing-masing fitur berbeda, dan median kesamaan cosinus adalah 0,5. Pada gambar di bawah, tiga kotak merah sesuai dengan fitur individual.



Diagram skema autoencoder jarang, di mana tiga kotak merah berhubungan dengan fitur SAE 1 dan kotak hijau berhubungan dengan fitur 4. Setiap fitur memiliki vektor encoder 1x4, aktivasi fitur 1x1, dan vektor decoder 1x4. Aktivasi yang direkonstruksi dibuat hanya menggunakan vektor dekoder dari fitur SAE 1 dan 4. Jika kotak merah melambangkan "warna merah" dan kotak hijau melambangkan "bola", maka model tersebut mungkin melambangkan "bola merah".

Jadi bagaimana kita tahu apa yang diwakili oleh fitur yang dihipotesiskan 317? Saat ini, praktiknya adalah mencari masukan yang memaksimalkan aktivasi fitur dan memberikan respons intuitif terhadap kemampuan interpretasinya. Masukan yang mengaktifkan setiap fitur biasanya dapat diinterpretasikan.

Misalnya, Anthropic melatih SAE pada Claude Sonnet dan menemukan bahwa teks dan gambar yang terkait dengan Jembatan Golden Gate, ilmu saraf, dan tempat wisata populer mengaktifkan fitur SAE yang berbeda. Fitur lain akan diaktifkan dengan konsep yang tidak jelas. Misalnya, fitur SAE yang dilatih pada Pythia akan diaktifkan dengan konsep "tanda akhir dari klausa relatif atau frasa preposisi yang digunakan untuk mengubah subjek kalimat. "

Karena vektor decoder SAE memiliki bentuk yang sama dengan aktivasi perantara LLM, intervensi kausal dapat dilakukan hanya dengan menambahkan vektor decoder ke aktivasi model. Kekuatan intervensi ini dapat disesuaikan dengan mengalikan vektor decoder dengan faktor penyebaran. Ketika peneliti Antropik menambahkan vektor decoder SAE "Jembatan Golden Gate" ke aktivasi Claude, Claude terpaksa menyebutkan "Jembatan Golden Gate" di setiap tanggapan.

Di bawah ini adalah referensi implementasi intervensi kausal menggunakan fitur yang dihipotesiskan 317. Mirip dengan "Jembatan Golden Gate" Claude, intervensi yang sangat sederhana ini memaksa model GPT-3 menyebutkan "golden retriever" di setiap respons.

def perform_intervention (aktivasi_model_D: torch.Tensor, dekoder_FD: torch.Tensor, skala: mengapung) -> torch.Tensor:

vektor_intervensi_D = dekoder_FD [317, :]

vektor_intervensi_berskala_D = vektor_intervensi_D * skala

aktivasi_model_modified_D = aktivasi_model_D + vektor_intervensi_berskala_D

kembalikan modified_model_activations_D

Dilema evaluasi autoencoder yang jarang

Salah satu tantangan utama dalam menggunakan SAE adalah evaluasi. Kami dapat melatih autoencoder yang jarang untuk menafsirkan model bahasa, tetapi kami tidak memiliki kebenaran dasar yang dapat diukur dari representasi bahasa alami. Saat ini, evaluasi sangat subjektif, pada dasarnya "kami mempelajari masukan aktivasi serangkaian fitur, dan kemudian secara intuitif menjelaskan kemampuan interpretasi fitur-fitur ini." Ini adalah batasan utama bidang interpretasi.

Para peneliti telah menemukan beberapa proxy umum yang tampaknya berhubungan dengan kemampuan interpretasi fitur. Yang paling umum digunakan adalah L0 dan Loss Recovered. L0 adalah jumlah rata-rata elemen bukan nol dalam representasi perantara SAE yang dikodekan. Loss Recovered menggantikan aktivasi asli GPT dengan aktivasi yang direkonstruksi dan mengukur kerugian tambahan dari hasil rekonstruksi yang tidak sempurna. Biasanya terdapat trade-off antara kedua metrik ini, karena SAE mungkin memilih solusi yang mengakibatkan penurunan akurasi rekonstruksi guna meningkatkan ketersebaran.

Saat membandingkan SAE, pendekatan yang umum dilakukan adalah dengan memplot kedua variabel dan kemudian memeriksa trade-off di antara keduanya. Untuk mencapai trade-off yang lebih baik, banyak metode SAE baru (seperti Gated SAE dari DeepMind dan TopK SAE dari OpenAI) telah memodifikasi penalti ketersebaran. Gambar di bawah ini berasal dari makalah Gated SAE DeepMind. SAE yang terjaga keamanannya diwakili oleh garis merah, yang terletak di kiri atas grafik, yang menunjukkan bahwa SAE berkinerja lebih baik dalam trade-off ini.



Gated SAE L0 dan Kerugian Dipulihkan

Ada beberapa tingkat kesulitan dalam mengukur SAE. L0 dan Loss Recovered adalah dua indikator proksi. Namun, kami tidak menggunakannya selama pelatihan karena L0 tidak dapat dibedakan dan menghitung Loss Recovered selama pelatihan SAE sangat mahal secara komputasi. Sebaliknya, kerugian pelatihan kami ditentukan oleh ketentuan penalti L1 dan keakuratan rekonstruksi aktivasi internal, bukan dampaknya terhadap kerugian hilir.

Fungsi kerugian pelatihan tidak berhubungan langsung dengan metrik pengganti, dan metrik pengganti hanya merupakan proksi untuk penilaian subjektif terhadap interpretasi fitur. Karena tujuan kami yang sebenarnya adalah untuk "memahami cara kerja model" dan penilaian interpretabilitas subjektif hanyalah proksi, maka akan ada lapisan ketidaksesuaian lainnya. Beberapa konsep penting dalam LLM mungkin tidak mudah untuk ditafsirkan, dan kita mungkin mengabaikan konsep-konsep ini sambil mengoptimalkan kemampuan interpretasi secara membabi buta.

Meringkaskan

Jalan yang harus ditempuh dalam bidang kemampuan menjelaskan masih panjang, namun SAE merupakan kemajuan nyata. SAE memungkinkan penerapan baru yang menarik, seperti metode tanpa pengawasan untuk menemukan vektor kemudi seperti vektor kemudi Jembatan Golden Gate. SAE juga dapat membantu kita menemukan loop dalam model bahasa dengan lebih mudah, yang dapat digunakan untuk menghilangkan bias yang tidak perlu dalam model.

Fakta bahwa SAE dapat menemukan fitur yang dapat diinterpretasikan (meskipun tujuannya hanya untuk mengidentifikasi pola dalam aktivasi) menunjukkan bahwa SAE dapat mengungkapkan sesuatu yang bermakna. Ada juga bukti bahwa LLM memang bisa mempelajari sesuatu yang bermakna, bukan sekedar menghafal pola statistik yang dangkal.

SAE juga dapat mewakili tonggak awal yang dituju oleh perusahaan seperti Anthropic, yaitu "MRI (magnetic resonance imaging) untuk model pembelajaran mesin". SAE memang belum memberikan pemahaman yang sempurna, namun dapat digunakan untuk mendeteksi perilaku buruk. Tantangan utama penilaian SAE dan SAE bukannya tidak dapat diatasi, dan banyak peneliti telah membahas topik ini.

Untuk pengenalan lebih lanjut tentang autoencoder renggang, lihat buku catatan Colab Callum McDougal: https://www.lesswrong.com/posts/LnHowHgmrMbWtpkxx/intro-to-superposition-and-sparse-autoencoders-colab

https://www.reddit.com/r/MachineLearning/comments/1eeihdl/d_an_intuitive_explanation_of_sparse_autoencoders/

https://adamkarvonen.github.io/machine_learning/2024/06/11/sae-intuitions.html