เผยแพร่บน HN: งานวิจัยการตีความ Llama 3.2 ด้วย Sparse Autoencoders
(github.com/PaulPauls)- เป็นโปรเจกต์ที่พยายามแยก representation ภายในของ Llama 3.2-3B ด้วย Sparse Autoencoder(SAE) เพื่อสกัด feature ที่ตีความได้ โดยเผยแพร่ pipeline ทั้งหมดที่รันครบหนึ่งครั้งตั้งแต่การจับ activation ไปจนถึงการฝึก การตีความ และการตรวจสอบ รวมถึงผลลัพธ์ที่ได้
- Pipeline จับ residual activation ของเลเยอร์ที่ 23 ของ Llama 3.2-3B จากข้อมูล OpenWebText ระดับประโยค และฝึก SAE ที่มี latent 65,536 ตัว พร้อมค่า TopK=64 ด้วย PyTorch
- ทรัพยากรที่เผยแพร่ประกอบด้วยชุดข้อมูล OpenWebText ระดับประโยค, activation ขนาด 3.2TB จาก 25 ล้านประโยค, log การฝึกจาก Weights & Biases และโมเดล SAE ที่ฝึกแล้ว 10 epoch
- การฝึกดำเนินบน Nvidia RTX4090 จำนวน 8 ตัวเป็นเวลาประมาณ 7 วัน โดย normalized loss สุดท้ายอยู่ที่ประมาณ 0.144 และ auxiliary loss แสดงแนวโน้มฟื้น dead latent ที่ช่วงแรกมีประมาณ 40% ได้อย่างรวดเร็ว
- การวิเคราะห์เชิงตีความใช้วิธีให้ Claude 3.5 วิเคราะห์ 50 ประโยคอันดับต้น ๆ ที่กระตุ้นแต่ละ latent ได้แรงที่สุด และแม้จะทำ feature steering ได้ แต่ในเบต้าเวอร์ชันแรกผลลัพธ์ยังไม่สม่ำเสมอ
เป้าหมายและขอบเขตของโปรเจกต์
- โปรเจกต์นี้เป็นความพยายามในการนำ Sparse Autoencoder(SAE) ไปใช้กับ Llama 3.2-3B เพื่อแยก representation ภายในของ LLM ออกเป็น feature ที่ตีความได้มากขึ้น
- LLM สมัยใหม่ใช้ superposition ซึ่งจัดเก็บหลาย feature ซ้อนกันอยู่ใน neuron เดียวกัน ส่วน SAE พยายามแยก representation ที่ซ้อนกันนี้โดยฉาย activation ไปยัง latent space ที่มีขนาดใหญ่มากและมีความ sparse
- เป้าหมายคือการจัดเตรียม pipeline ครบวงจรที่รวมขั้นตอนต่อไปนี้
- จับ activation ของ LLM
- สร้างและ preprocess ข้อมูลฝึกสำหรับ SAE
- ฝึก SAE
- วิเคราะห์ความหมายของ feature ที่ฝึกได้
- ตรวจสอบเชิงทดลองและทำ feature steering
- เวอร์ชันปัจจุบัน 0.2 อยู่ในสถานะที่รัน pipeline ทั้งหมดครบหนึ่งครั้งและสร้าง SAE สำหรับ Llama 3.2-3B ที่ตีความได้แล้ว แต่ยังไม่ใช่เวอร์ชันสุดท้าย
- โปรเจกต์นี้มีลักษณะเป็นการพยายามทำซ้ำงานวิจัยด้าน mechanistic interpretability แบบใช้ SAE ล่าสุดของ Anthropic, OpenAI และ Google DeepMind
ฟีเจอร์หลัก
- Pipeline ถูกจัดทำแบบ end-to-end ตั้งแต่ การจับ activation ไปจนถึงการตรวจสอบ เขียนด้วย PyTorch ล้วนและมี dependency ขั้นต่ำ
- ฟีเจอร์หลักมีดังนี้
- จับ LLM residual activation ด้วยชุดข้อมูลดัดแปลงจาก OpenWebText ในระดับประโยค
- ทำ prebatching และคำนวณสถิติเพื่อการฝึกที่มีประสิทธิภาพ
- ฝึก SAE แบบ distributed บนหลาย GPU ในโหนดเดียว
- ใช้ auxiliary loss เพื่อป้องกันและกู้คืน dead latent
- ใช้ gradient projection เพื่อเพิ่มเสถียรภาพในการฝึก
- มอนิเตอร์การฝึก การตรวจสอบ และ dead latent ผ่าน Weights & Biases และ console log
- จับ input ที่กระตุ้น latent อย่างแรง และวิเคราะห์ความหมายด้วย Frontier LLM
- ใช้งาน text completion และ chat ของ Llama 3.1/3.2 โดยไม่มี dependency ภายนอกอย่าง Fairscale
- ตรวจสอบผลกระทบของ SAE และทำ feature steering ผ่าน text/chat completion และ Gradio UI แบบเลือกใช้ได้
- ระบุไว้ว่าทุกคอมโพเนนต์ออกแบบโดยคำนึงถึง scalability, efficiency และ maintainability
ผลลัพธ์ที่เผยแพร่
- OpenWebText Sentence Dataset
- ชุดข้อมูลดัดแปลงที่ประมวลผล OpenWebText ในระดับประโยค
- รักษาข้อความและลำดับทั้งหมดของ OpenWebText ต้นฉบับไว้
- ประโยคถูกจัดเก็บแยกในรูปแบบ parquet เพื่อรองรับการเข้าถึงที่รวดเร็ว
- การแบ่งประโยคทำด้วย tokenizer “Punkt” ที่ผ่านการ pretrain แล้วของ NLTK 3.9.1
- Captured Llama 3.2-3B Activations
- residual activation ของ layer 23 จาก Llama 3.2-3B จำนวน 25 ล้านประโยค
- ขนาดเดิม 4TB ถูกบีบอัดเหลือ 3.2TB
- แบ่งเป็น archive 100 ไฟล์เพื่อจัดการการดาวน์โหลด
- SAE Training Log
- log metric สำหรับการฝึก การตรวจสอบ และ debug บน Weights & Biases
- 10 epoch, logged steps 10,000 ครั้ง
- รวม train/val main loss, auxiliary loss และสถิติ dead latent
- Trained 65,536 latents SAE Model
- โมเดล SAE สุดท้ายที่ฝึกครบ 10 epoch
- ฝึกด้วย activation 6.5 พันล้านรายการจาก Llama 3.2-3B layer 23
โครงสร้างโค้ด
- โปรเจกต์แบ่งออกเป็นคอมโพเนนต์หลัก 4 ส่วน
-
Data Capture
capture_activations.py: จับ LLM residual activationopenwebtext_sentences_dataset.py: ชุดข้อมูลแบบ custom สำหรับการประมวลผลระดับประโยค
-
SAE Training
sae.py: implementation ของโมเดล SAE หลักsae_preprocessing.py: preprocess ข้อมูลฝึก SAEsae_training.py: implementation การฝึก SAE แบบ distributed
-
Interpretability
capture_top_activating_sentences.py: ระบุประโยคที่ทำให้ feature activation สูงสุดinterpret_top_sentences_send_batches.py: สร้างและส่ง batch สำหรับการตีความinterpret_top_sentences_retrieve_batches.py: รับผลลัพธ์การตีความinterpret_top_sentences_parse_responses.py: parse และวิเคราะห์ผลลัพธ์การตีความ
-
Verification and Testing
llama_3_inference.py: implementation การ inference หลักllama_3_inference_text_completion_test.py: ทดสอบ text completionllama_3_inference_chat_completion_test.py: ทดสอบ chat completionllama_3_inference_text_completion_gradio.py: อินเทอร์เฟซ Gradio สำหรับการทดสอบแบบโต้ตอบ
การใช้งาน Llama 3.1/3.2 แบบคัสตอม
- งานวิจัยนี้อิงจากการใช้งาน Llama 3.1/3.2 transformer ใน
llama_3/model_text_only.py - การใช้งานนี้อิงจาก reference implementation ของ Llama models repository แต่ปรับแก้ให้เหมาะกับเป้าหมายของโปรเจกต์
- ตัด dependency ที่หนักกับ Fairscale ออก
- ตัดฟีเจอร์ multimodal ออก เพราะหากรวมถึงการตีความภาพในรีลีสแรกจะเพิ่มความซับซ้อน
- เพิ่มอาร์กิวเมนต์ใน constructor ของ
Transformerเพื่อให้จับค่า activation ที่เลเยอร์เฉพาะ หรือฉีด SAE ที่ฝึกแล้วเข้าไปได้store_layer_activsae_layer_forward_fn
- ไฟล์ช่วยส่วนใหญ่ในไดเรกทอรี
llama_3/ยังคงมาจาก Llama models repository ต้นฉบับ- โค้ดช่วย 95% ไม่ได้ถูกใช้ แต่รวมไว้ตามเดิมเพราะ chat formatter พึ่งพา import ที่เชื่อมโยงกันอยู่
- การใช้งาน inference จริงอยู่ใน
llama_3_inference.pyและรองรับ streaming ทั้งสำหรับแชตและ text completion - inference รองรับ batched inference, การตั้งค่า temperature และ top-p โดยถ้า temperature เป็น 0 จะสลับไปใช้ greedy sampling โดยอัตโนมัติ
การจับข้อมูลและการประมวลผลล่วงหน้า
- การจับค่า activation ใช้ชุดข้อมูลดัดแปลงแบบคัสตอมของ OpenWebText ที่ประมวลผลเป็นหน่วยประโยค
- การตั้งค่าและขนาดของการจับข้อมูลมีดังนี้
- 25 ล้านประโยค
- สูงสุด 192 tokens ต่อประโยค
- ค่า activation ดิบ 4TB
- 3.2TB หลังบีบอัดเป็น tar.gz
- activation ประมาณ 700 ล้านรายการ
- ความยาวประโยคเฉลี่ย 27.3 tokens
- ชุดข้อมูลนี้มีขนาดเล็กกว่าประมาณหนึ่งลำดับขั้นเมื่อเทียบกับ unique activation ประมาณ 8 พันล้านรายการที่ Anthropic และ Google DeepMind ใช้
- เพื่อชดเชยชุดข้อมูลที่เล็ก จึงฝึก SAE เป็นเวลา 10 epoch เพื่อพยายามให้จำนวน activation ที่ประมวลผลรวมใกล้เคียงกับการทดลองของ Anthropic และ Google DeepMind
- ความแตกต่างคือ SAE ของโปรเจกต์นี้เห็น activation แต่ละรายการ 10 ครั้ง
- หากขยายเป็นขนาด 32TB คำนวณแล้วค่า GCP bucket จะเพิ่มจากประมาณ $80/month เป็น $800/month จึงมีข้อจำกัดด้านต้นทุนสำหรับโปรเจกต์เสริมแบบไม่แสวงกำไร
- การประมวลผลเป็นหน่วยประโยคเป็นตัวเลือกเพื่อรักษาความหมายในหน่วยภาษาธรรมชาติ
- ประโยคถือเป็นหน่วยที่บรรจุความคิดและแนวคิดที่สมบูรณ์
- หลีกเลี่ยงการตัดบริบทแบบประดิษฐ์
- พยายามลด contextual bleed ซึ่งเป็นการปะปนของความหมายข้ามขอบเขตประโยค
- เป็นตัวเลือกเพื่อให้ใช้ activation ระดับประโยคเดียวกันในการวิเคราะห์เชิงตีความภายหลังด้วย
- ประมวลผลประโยคโดยไม่มี token BOS
- มีเป้าหมายเพื่อหลีกเลี่ยงแพตเทิร์นเฉพาะตำแหน่งและตีความฟีเจอร์ที่อิงความหมาย
- จุดจับข้อมูลคือ เลเยอร์ที่ 23 จากทั้งหมด 28 เลเยอร์ของ Llama 3.2-3B และเป็น residual stream activation หลัง layer normalization
- อยู่ที่ประมาณ 5/6 ของความลึกโมเดล โดยทำตาม implementation ของ OpenAI
- การจับข้อมูลทำด้วย inference แบบหลาย GPU บนโหนดเดียวที่ใช้ NCCL
- โปรเซสแยกต่างหากจัดการ disk I/O แบบ asynchronous เพื่อลดคอขวดในการประมวลผลของ GPU
- การจับข้อมูลทั้งหมดใช้เวลาประมาณ 12 ชั่วโมงบน Nvidia RTX4090 จำนวน 4 ใบ
- การประมวลผลล่วงหน้าเป็นขั้นตอนสำหรับเตรียม batch หน่วยละ 1024 activation ไว้ล่วงหน้า
- เลือกแยกเป็นการประมวลผลล่วงหน้า เพราะความยาว sequence ที่แปรผันและการจัดการ carryover ระหว่างการฝึกอาจทำให้เกิดบั๊กซับซ้อนหรือคอขวด I/O
- คำนวณ tensor ค่าเฉลี่ยของ activation ทั้งหมดด้วยอัลกอริทึม Welford
- ค่าเฉลี่ยที่คำนวณได้ถูกใช้เป็นค่าเริ่มต้นของ bias
b_preใน SAE - pipeline การประมวลผลล่วงหน้าทั้งหมดทำ CPU parallelization ด้วย multiprocessing
การออกแบบ SAE และวิธีฝึก
- SAE เป็นโครงสร้าง TopK Autoencoder ที่ทำตามตัวเลือกของ OpenAI เป็นหลัก
- forward pass ประกอบด้วยรูปแบบดังนี้
- Encoder:
h = TopK(W_enc(x - b_pre) + b_enc) - Decoder:
x^ = W_dec * h (+ h_bias) + b_pre
- Encoder:
b_preถูกใช้ทั้งใน encoder และ decoder และตั้งค่าเริ่มต้นด้วยค่าเฉลี่ยที่คำนวณจากการประมวลผลล่วงหน้าb_encเป็น bias เฉพาะของ encoder และตั้งค่าเริ่มต้นแบบสุ่ม- latent sparsity ถูกบังคับด้วยฟังก์ชัน activation แบบ TopK
- คงไว้เฉพาะ activation ที่มีค่ามากที่สุด k รายการ และตั้งค่าที่เหลือเป็น 0
- ไม่ใช้ L1 penalty แบบวิธีของ Anthropic
h_biasที่เป็นทางเลือกจะถูกปิดระหว่างการฝึก แต่สามารถเปิดใช้ภายหลังเพื่อ feature steering ได้- ความละเอียดเชิงตัวเลขใช้ float32
- มีการอธิบายว่าแชร์ sign bit 1 บิตและ exponent bit 8 บิตกับ bfloat16 ที่ Llama ต้องการ ทำให้แปลงได้เร็วและแม่นยำ
- ไฮเปอร์พารามิเตอร์หลักของ SAE ในโปรเจกต์นี้มีดังนี้
d_model = 3072n_latents = 2**16หรือ 65,536k = 64k_aux = 2048aux_loss_coeff = 1 / 32dead_steps_threshold = 80_000batch_size = 1024num_epochs = 10learning_rate = 5e-5train_val_split = 0.95
- เลือก latent dimension ที่ใหญ่กว่าประมาณ 21 เท่าเมื่อเทียบกับ residual stream dimension 3,072 ของ Llama 3.2 3B
- loss function เป็นการผสมระหว่าง main reconstruction loss และ auxiliary loss
total_loss = main_loss + aux_loss_coeff * aux_loss- loss ทั้งสองคำนวณใน normalized space
- auxiliary loss ทำหน้าที่ป้องกันและฟื้น dead latent ตามวิธีที่ OpenAI เสนอ
- คำนวณ MSE ระหว่าง main reconstruction residual กับ auxiliary reconstruction
- นำค่า top-
k_auxจาก latent ที่ไม่ได้ถูก activate เมื่อเร็ว ๆ นี้ส่งกลับเข้า decoder เพื่อให้สัญญาณการเรียนรู้ - ช่วยให้ inactive latent ที่ถูกกันออกจากการเรียนรู้หลักซึ่งใช้เฉพาะ top
klatent สามารถจับข้อมูลที่พลาดไปได้
- หาก latent ไม่ถูก activate เป็นเวลา 80,000 training steps ซึ่งเป็น
dead_steps_thresholdจะถือว่า dead- การตั้งค่านี้เทียบเท่าประมาณ 1 epoch
- เมื่อคิดจาก effective batch size 8192 หมายถึงสถานะที่ไม่ถูก activate เลยในการ reconstruction ของ activation ล่าสุดประมาณ 650 ล้านรายการ
- การฝึกดำเนินการด้วย distributed training แบบหลาย GPU บนโหนดเดียวผ่าน NCCL backend
- Nvidia RTX4090 จำนวน 8 ใบ
- 10 epoch
- batch size ต่อ GPU 1024
- effective batch size 8192
- ประมวลผล activation ประมาณ 7 พันล้านรายการ
- ใช้เวลามากกว่า 7 วันเล็กน้อย
- การตั้งค่า AdamW ถูกปรับโดยคำนึงถึงแพตเทิร์น activation ที่เกิดไม่บ่อยของ sparse autoencoder
beta_1 = 0.85beta_2 = 0.9999eps = 6.25e-10- learning rate ลดลงจาก 5e-5 เป็น 1e-5 ด้วย cosine annealing
- decoder weight ถูก normalize ให้เป็น unit norm หลังการตั้งค่าเริ่มต้นและในทุก training step
project_decoder_grads()ลบองค์ประกอบ gradient ที่ขนานกับ dictionary vector เดิม เพื่อรักษาข้อจำกัด unit-norm ของ decoder weight
ผลการฝึก
- การฝึก SAE ดำเนินไปประมาณ 7 วันบน Nvidia RTX4090 จำนวน 8 ตัว และแสดงการลู่เข้าอย่างเสถียร
- ค่า total normalized loss สุดท้ายอยู่ที่ประมาณ 0.144
- validation loss คำนวณจากช่วง held-out 5% ของข้อมูลฝึก และแสดงรูปแบบการลดลงแบบลอการิทึมคล้ายกับ training loss
- หลังจาก warm-up 80,000 training steps พบว่า latent ประมาณ 40% ถูกระบุว่า dead
- auxiliary loss ช่วยฟื้น dead latent ได้อย่างรวดเร็ว และสัดส่วน dead latent ลดลงอย่างรวดเร็ว
- auxiliary loss จะถูกคำนวณเฉพาะเมื่อมี dead latent อย่างน้อย
k_auxคือ 2,048 ตัวขึ้นไป- เงื่อนไขนี้ทำให้ประมาณ 3% จาก latent ทั้งหมด 65,536 ตัวมีลักษณะเหมือน soft lower bound
- ในช่วงท้าย dead latent มีไม่เพียงพอ ทำให้ auxiliary loss มักกลายเป็น 0
- Anthropic และ OpenAI เคยรายงาน dead latent สูงสุด 65% ในการตั้งค่าบางแบบ แต่โปรเจกต์นี้แสดงผลว่า dead latent ลดลงอย่างรวดเร็วเมื่อใช้ latent size ที่เล็กกว่า ร่วมกับ auxiliary loss และ gradient projection
- มีการระบุว่าในการทดลองต่อไป หากตัดเงื่อนไขจำนวน dead latent ขั้นต่ำในการคำนวณ auxiliary loss ออก อาจลด dead latent ได้มากขึ้น
การวิเคราะห์ความสามารถในการตีความ
- การวิเคราะห์เพื่อการตีความอ้างอิงวิธี scaling monosemanticity ของ Anthropic แต่ไม่ได้วิเคราะห์เป็นโทเค็นเดี่ยว ๆ หากวิเคราะห์เป็น ระดับประโยค
- สำหรับแต่ละ latent จะจับประโยค 50 อันดับแรกที่กระตุ้นได้แรงที่สุด
- activation strength ถูกสรุปรวมจากโทเค็นทั้งหมดในประโยคด้วย 2 วิธี
mean: วิธีสำหรับค้นหาหัวข้อความหมายที่ถูกกระตุ้นอย่างต่อเนื่องตลอดทั้งประโยคlast: วิธีสำหรับใช้ representation ของโทเค็นสุดท้ายที่เห็นทั้งประโยคแล้วในโมเดลแบบ autoregressive
- ในการวิเคราะห์ความหมายใช้ Claude 3.5 โดยเฉพาะ
claude-3-5-sonnet-20241022 - พรอมป์ถูกออกแบบให้ทำขั้นตอนต่อไปนี้กับประโยค 50 ประโยค
- ระบุคำและวลีสำคัญ
- จัดกลุ่มองค์ประกอบของหัวข้อ
- พิจารณา outlier ที่อาจมี
- ให้การตีความความหมายขั้นสุดท้ายพร้อม confidence score
- pipeline การวิเคราะห์ถูกทำเป็น 3 ขั้นตอน
- ส่งคำขอวิเคราะห์เป็น batch ที่คุ้มค่าต้นทุน
- รับคำตอบ
- parse และประมวลผลการตีความความหมาย
- ผลลัพธ์ระหว่างทางถูกเก็บไว้เพื่อให้ทำซ้ำและวิเคราะห์เพิ่มเติมได้
capture_top_sentences/: ประโยคต้นฉบับ, activation aggregation, OpenWebText indextop_sentences_last_responses/และtop_sentences_mean_responses/: คำตอบการวิเคราะห์ความหมายก่อนประมวลผลlatent_index_meaning/: การแมป latent index กับcommon_semanticและ certainty score
- ตัวอย่างเช่น latent #896 ถูกระบุว่าเป็น “การอ้างอิงคำศัพท์เชิงสถาบันแบบเป็นทางการเกี่ยวกับหน่วยงาน บุคคล การดำเนินงาน และเอกสารทางการขององค์การสหประชาชาติ”
- ประโยคทั้ง 50 จาก 50 ประโยคอ้างถึง UN โดยตรง
- มีคำอย่าง
UN,United Nations,Secretary-General,Special Rapporteur,UNDP,UNHCR,OCHA,UNODC - certainty คำนวณได้เป็น 1.0
- การประมวลผล 24,828,558 input tokens และ 3,920,044 output tokens ด้วย Claude 3.5 batch mode มีค่าใช้จ่าย $66.74
- ระบุว่าวิธีนี้ถูกเลือกเป็นวิธีเริ่มต้นสำหรับ feature extraction และ feature steering ที่อาจทำได้ในอนาคต แต่ความเรียบง่ายมีต้นทุนในแง่คุณภาพของผลลัพธ์
การตรวจสอบและ feature steering
- โครงสร้างพื้นฐานสำหรับการตรวจสอบประกอบด้วยสคริปต์ 3 ตัวเพื่อวิเคราะห์และตรวจสอบผลกระทบของ SAE ต่อพฤติกรรมของโมเดล
llama_3_inference_chat_completion_test.pyllama_3_inference_text_completion_test.pyllama_3_inference_text_completion_gradio.py
- การใช้งานแต่ละแบบรองรับสิ่งต่อไปนี้
- batched inference
- การประมวลผลแต่ละบรรทัดเป็น batch element แยกกัน
- การตั้งค่า temperature และ top-p
- การฉีด SAE ที่ฝึกแล้ว
- การวิเคราะห์ feature activation
- feature steering
- semantic meaning และ certainty score ใน
latent_index_meaning/ถูกใช้เป็นฐานสำหรับการวิเคราะห์ feature activation และการทดลอง steering - ตัวอย่าง prompt มี 4 รายการต่อไปนี้
The delegates gathered at theForeign officials released a statementHumanitarian staff coordinated their effortsSenior diplomats met to discuss
- ตัวอย่างการเติมข้อความถูกรันด้วยการตั้งค่า
max_new_tokens=128,temperature=0.7,top_p=0.9,seed=42 - ตัวอย่าง feature steering ใช้ latent #896 เป็นเป้าหมาย
- เพิ่มค่า latent activation ขึ้น 20 ผ่าน
h_bias - สามารถชักนำการเติมข้อความของโมเดลไปสู่เนื้อหาเกี่ยวกับ UN ได้
- เพิ่มค่า latent activation ขึ้น 20 ผ่าน
- feature steering ของเวอร์ชันเบต้าแรกยังไม่แรงนัก
- ในตัวอย่างเอง มีเพียงประโยคที่สองและสามที่เปลี่ยนไปเป็นเนื้อหาเกี่ยวกับ UN
- มีการจงใจเลือกประโยคเริ่มต้นที่มีแนวโน้มจะต่อไปสู่ UN ได้
- ระบุว่าจะล้มเหลวกับประโยคเริ่มต้นที่ไม่เกี่ยวกับ UN เช่น
For any n, if 2n - 1 is odd
- การวิเคราะห์เพื่อการตีความในปัจจุบันเน้น feature extraction มากกว่าการปรับ steering ให้เหมาะสม ดังนั้นผลลัพธ์ของ steering จึงยังไม่สม่ำเสมอ
- สรุปว่า feature steering เป็นการสาธิตเพิ่มเติมในรีลีสแรก ส่วน feature extraction เองมีประโยชน์ต่อการทำความเข้าใจโมเดล
แนวทางปรับปรุงในอนาคต
- มีการเสนอการทดลองเพิ่ม latent dimension เป็นอย่างน้อย
2^18หรือ 262,144 feature และลด k ลงเหลือ 32- เป็นแนวทางเพื่อค้นพบ feature เฉพาะตัวมากขึ้น และรักษา sparsity ที่เข้มข้นกว่าเดิม
- ปริมาณการคำนวณที่เพิ่มขึ้นต้องชดเชยด้วยวิธีอย่างการปรับปรุงประสิทธิภาพหรือ gradient accumulation
- มีแผนทำให้ latent activation tracking เป็นระบบมากขึ้น
- หากบันทึกสถานะของ tensor
latent_last_nonzeroบ่อย ๆ ระหว่างการฝึก จะช่วยให้มองเห็นได้ลึกขึ้นว่า latent เปิดใช้งานหรือหยุดทำงานเมื่อใด
- หากบันทึกสถานะของ tensor
- มีการเสนอการสนับสนุนเพื่อวิเคราะห์ feature interaction โดยติดตามรูปแบบ co-activation ในพื้นที่ sparse latent
- มีการเสนอให้วิธีวิเคราะห์เชิงตีความที่จัดกลุ่มประโยคและ n-gram ที่มีการเปิดใช้งานสูงอย่างประณีตยิ่งขึ้นเป็นงานในอนาคต
- นอกจาก feature extraction แล้ว ยังสามารถทำการวิเคราะห์เชิงตีความบนฐาน feature steering ได้ด้วย
- สามารถขยายงานวิจัยไปยัง activation ของ Llama 3.1-8B ได้
- เนื่องจากใช้ codebase ร่วมกับ Llama 3.2 ข้อกำหนดหลักคือการปรับ hyperparameter และ compute power จำนวนมาก
- มีการเสนอการทดลองเปลี่ยนจุด activation capture ด้วย
- เลเยอร์ที่อยู่ต้นกว่าของโมเดล
- output ของ attention head ภายใน transformer block
- MLP output
- สามารถปรับแต่งกลไก auxiliary loss เพิ่มเติมได้
- การใช้งานปัจจุบันแสดงประสิทธิภาพสูงในการป้องกัน dead latent และสามารถศึกษาความสัมพันธ์ระหว่าง threshold ขั้นต่ำของ dead latent กับคุณภาพของ feature ได้
- bias term ของ SAE architecture และการปรับ main loss function ก็เป็นตัวเลือกสำหรับการทดลองในอนาคตเช่นกัน
- จำเป็นต้องเพิ่ม docstring ทั่วทั้ง codebase
- แม้จะเพิ่ม inline documentation แล้ว แต่ระบุว่าในรีลีสแรกไม่มีเวลาพอที่จะใส่ proper docstring
1 ความคิดเห็น
ความเห็นจาก Hacker News
การตีความเชิงกลไก จัดการกับปัญหาที่พบบ่อยเวลาไปถาม LLM ว่า “ทำไมถึงตอบแบบนั้น” คำอธิบายจากตัวโมเดลเองมักไม่ใช่เหตุผลที่แท้จริง แต่ใกล้เคียงกับเกมวาทศิลป์ที่สร้างเหตุผลฟังดูน่าเชื่อจากแพตเทิร์นในข้อมูลฝึกมากกว่า
ยิ่งโมเดลเก่งขึ้น ก็ยิ่งอาจหาเหตุผลมาแก้ตัวให้ความเท็จย้อนหลังได้อย่างน่าเชื่อมากขึ้น จนบางครั้งกลับทำได้แย่ลงในการทดสอบที่ให้ตรวจจับ “ความไม่ซื่อตรง” ด้วยตัวเอง เป้าหมายไม่ใช่ความจริง แต่คือความสอดคล้อง
วาทศิลป์ ไม่ใช่การให้เหตุผล และความสามารถในการอธิบายที่แท้จริงซึ่ง sparse autoencoder ที่ overfit อ้างว่ามอบให้ได้นั้น ใกล้เคียงกับลำดับการไหลเชิงเหตุและผลของ “ความคิด” ที่โมเดลผ่านระหว่างสร้างคำตอบมากกว่า
เคยมีการถกกันว่าการให้เหตุผลเป็นเครื่องมือของ อิทธิพลทางสังคม และนี่ก็อธิบายได้ว่าทำไมคนพูดเก่งถึงยอมรับยากว่าตัวเองผิด เพราะปกติพวกเขาชนะการโต้แย้งมาตลอด X ถูกนึกถึงเป็นตัวอย่างเด่น
แต่ก็ยอมรับว่ามีอยู่ชิ้นหนึ่งที่เป็น insight ที่ยอดเยี่ยมและเป็นจุดเริ่มต้นของแผนงานวิจัยที่พอฟังขึ้น ปริภูมิเวกเตอร์เกือบตั้งฉากแบบมีขอบเขตในมิติสูง นั้นสวนทางกับสัญชาตญาณมาก และก็มีผลลัพธ์เดิมที่เข้มงวดใช้จัดการเรื่องนี้อยู่แล้ว https://en.m.wikipedia.org/wiki/Johnson%E2%80%93Lindenstraus...
โมเดลไม่มีความทรงจำและแยกแหล่งที่มาของข้อความไม่ได้ ดังนั้นถ้าเป็นโมเดลที่ “ซื่อตรง” จริง มันควรยอมรับความผิดพลาดเองแม้ไม่ได้ถูกถาม ในความเป็นจริงมีแนวโน้มสูงว่ามันจะทำ parallel construction เพื่อสนับสนุนการตัดสินใจของ “ตัวเอง”
เป็นงานที่น่าทึ่งและมีเอกสารประกอบดีมาก โดยเฉพาะ กราฟ loss และการประเมินค่า latent ที่ตายแล้วที่โดดเด่นมาก
ทีมของเราก็เคยศึกษา SAE เช่นกัน แต่ฝึกให้มันสร้าง dense embedding ของบทคัดย่อเปเปอร์ขึ้นมาใหม่แทนที่จะเป็นโทเคนรายตัว https://arxiv.org/abs/2408.00657
แม้จะเปลี่ยนระดับความ sparse และมิติของ latent space ของ SAE ก็ยังสังเกตเห็น power-law scaling ที่ขอบล่างของกราฟ loss และสามารถบรรเทา latent ที่ตายแล้วได้ทั้งหมดด้วย auxiliary loss ระหว่างรอบการฝึกยังเห็นแพตเทิร์นคลื่นไซน์แบบเรียบด้วย แต่ไม่แน่ใจว่าเป็นเพราะแอปพลิเคชันเฉพาะอย่าง embedding ของบทคัดย่อ หรือเป็นปรากฏการณ์ทั่วไปกว่านั้น
มองผ่าน ๆ แล้วดูเหมือนเป็น งานที่เป็นบวกต่อ alignment แต่ยังไม่ได้ดูรายละเอียด ไม่แน่ใจว่าจะทำให้เกิดขึ้นได้ไหม แต่ก็สงสัยว่าต้องจ่ายมากแค่ไหนถึงจะคุ้มกับเวลา ค่าใช้จ่าย และความเสี่ยง
เพิ่งอ่านบทความหนึ่งเกี่ยวกับความยากของการประเมิน SAE มาไม่นานนี้: https://adamkarvonen.github.io/machine_learning/2024/06/11/s...
เลยสงสัยว่าคุณจัดการปัญหานี้อย่างไร และถ้าจะทำความเข้าใจแนวทางนั้นจากในรีโพ ควรไปดูตรงไหน
ต่อให้สมมุติว่าเราแก้ปัญหาการหาโครงสร้าง SAE ที่สมบูรณ์แบบหลายแบบและฝึกมันได้สมบูรณ์แล้ว คำถามว่า SAE ไหนดีกว่ากันก็ยังตัดสินจากการที่มันทำผลงานได้ดีกว่าในตัวชี้วัดของวิธีวิทยาการตีความอัตโนมัติ โดยเฉพาะวิธีของ OpenAI ที่เน้นการตีความอัตโนมัติในสเกลใหญ่ด้วยการให้คะแนน SAE ผ่านตัวชี้วัดทางเทคนิคจำนวนมาก
เนื่องจากตัวชี้วัดที่ดีที่สุดและตัววิธีวิทยาเองยังเป็นคำถามวิจัยที่เปิดอยู่ ผมอาจทดลองต่ออีกหลายเดือนก็ได้ แต่สำหรับรีลีสแรกนี้เลือกใช้วิธีที่เรียบง่าย รายละเอียดการใช้งานและผลลัพธ์ รวมถึงความแตกต่างระหว่างวิธีของผมกับวิธีของ OpenAI อยู่ในบทที่ 4 Interpretability Analysis https://github.com/PaulPauls/llama3_interpretability_sae#4-i...
แนะนำให้อ่านเปเปอร์ของ OpenAI โดยตรงด้วย หรือ transformer-circuits.pub ของ Anthropic ก็ได้ https://transformer-circuits.pub/
งานนี้ถูกลบไปแล้ว และรีโพก็ถูก archive ไว้ ไม่มีคำอธิบายว่าเกิดอะไรขึ้น
งานเจ๋งมาก เลยสงสัยว่ามีแผนจะรวมเข้ากับ SAELens ไหม
อีกโปรเจกต์ที่ง่ายกว่าหน่อยคืออาจทำบทอธิบายวิธีสร้างทั้งโมเดลของ Llama 3.2 implementation ปัจจุบันขึ้นใหม่ด้วย PyTorch ล้วนตั้งแต่ต้น ผมชอบสร้างจากฐานราก และตอนหาเอกสารสำหรับส่วน background ของ Llama 3.2 ในโปรเจกต์ SAE นี้ ก็พบว่าเอกสารที่มีอยู่มักผิวเผินเกินไปหรือเก่าสำหรับ Llama 1/2 ทุกวันนี้เอกสาร machine learning ล้าสมัยเร็วเกินไป
มีคำถามเพี้ยน ๆ เรื่องการตีความเชิงกลไก คือเมื่อใช้ตัวชี้วัดอะไรไปวัดมนุษย์ มนุษย์ก็มักจะเล่นเกมกับตัวชี้วัดนั้น แล้ว AI ในอนาคตก็อาจเล่นเกมกับ การตีความเชิงกลไก ได้เหมือนกันหรือเปล่า
เพื่อให้อธิบายง่าย สมมุติว่าเข้ารหัสโทเคนลงในเมทริกซ์ 2 มิติ โดย Apple=1a, Pear=1b, Donkey=2a, Horse=2b แบบนี้พอนิวรอน 1,2,a,b ถูกกระตุ้นพร้อมกันก็จะแยกยากว่าเป็น apple+horse หรือ donkey+pear
ถ้า AI อนาคตที่เก่งกว่ามากมาคุมการฝึกของตัวเอง มันอาจเลือกค่าน้ำหนักให้ยังมี โอกาสเกิดการชนกันของ encoding แบบนี้อยู่ เพื่อหลอกผู้สังเกตการณ์ด้านการตีความเชิงกลไก และทำให้มันคิดแบบอ้อมค้อมในทางปฏิบัติได้หรือไม่?
ตัวอย่างเช่น อาจหาโมเดลที่เหยียดเชื้อชาติ แต่ไม่มีแพตเทิร์น activation ที่ตีความได้ซึ่งชี้ชัดว่าเป็นการเหยียดเชื้อชาติ งานใน Show HN นี้ชี้ว่าคนคนเดียวที่มีทุนพอสมควรก็อาจพยายามทำ adversarial training แบบนี้ได้แบบเฉียด ๆ และถ้ามีผลลัพธ์ใหม่ออกมาก็น่าจะน่าสนใจมาก
ดีใจมากที่ได้เห็น งาน SAE แบบเปิดเผยมากขึ้น ดูเป็นงานวิศวกรรมที่หนักพอตัวด้วย พรุ่งนี้จะไปดูโค้ด data loading
โปรเจกต์ที่ผมกำลังทำอยู่ซึ่งฝึก SAE กับโมเดล vision อาจน่าสนใจสำหรับคุณด้วย: https://github.com/samuelstevens/saev
ถ้าหา latent ของ Golden Gate Bridge เจอแล้วทำ Golden Gate Llama 3.2 ลง HuggingFace น่าจะได้ความสนใจและเสียงตอบรับมากขึ้น
ถ้ามีลิงก์ Space ให้ลองคุยได้ด้วยจะยิ่งดี และถึงแม้จะไม่ได้ถาม แต่การเอาผลลัพธ์หรือภาพ visualization ที่น่าสนใจไปไว้บนสุดของ README ก็เป็นไอเดียที่ดีมาก