1 คะแนน โดย GN⁺ 2024-11-22 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • เป็นโปรเจกต์ที่พยายามแยก 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 activation
    • openwebtext_sentences_dataset.py: ชุดข้อมูลแบบ custom สำหรับการประมวลผลระดับประโยค
  • SAE Training

    • sae.py: implementation ของโมเดล SAE หลัก
    • sae_preprocessing.py: preprocess ข้อมูลฝึก SAE
    • sae_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 completion
    • llama_3_inference_chat_completion_test.py: ทดสอบ chat completion
    • llama_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_activ
    • sae_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
  • 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 = 3072
    • n_latents = 2**16 หรือ 65,536
    • k = 64
    • k_aux = 2048
    • aux_loss_coeff = 1 / 32
    • dead_steps_threshold = 80_000
    • batch_size = 1024
    • num_epochs = 10
    • learning_rate = 5e-5
    • train_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 k latent สามารถจับข้อมูลที่พลาดไปได้
  • หาก 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.85
    • beta_2 = 0.9999
    • eps = 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 และประมวลผลการตีความความหมาย
  • ผลลัพธ์ระหว่างทางถูกเก็บไว้เพื่อให้ทำซ้ำและวิเคราะห์เพิ่มเติมได้
  • ตัวอย่างเช่น 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.py
    • llama_3_inference_text_completion_test.py
    • llama_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 the
    • Foreign officials released a statement
    • Humanitarian staff coordinated their efforts
    • Senior 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 ได้
  • 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 เปิดใช้งานหรือหยุดทำงานเมื่อใด
  • มีการเสนอการสนับสนุนเพื่อวิเคราะห์ 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 ความคิดเห็น

 
GN⁺ 2024-11-22
ความเห็นจาก Hacker News
  • การตีความเชิงกลไก จัดการกับปัญหาที่พบบ่อยเวลาไปถาม LLM ว่า “ทำไมถึงตอบแบบนั้น” คำอธิบายจากตัวโมเดลเองมักไม่ใช่เหตุผลที่แท้จริง แต่ใกล้เคียงกับเกมวาทศิลป์ที่สร้างเหตุผลฟังดูน่าเชื่อจากแพตเทิร์นในข้อมูลฝึกมากกว่า
    ยิ่งโมเดลเก่งขึ้น ก็ยิ่งอาจหาเหตุผลมาแก้ตัวให้ความเท็จย้อนหลังได้อย่างน่าเชื่อมากขึ้น จนบางครั้งกลับทำได้แย่ลงในการทดสอบที่ให้ตรวจจับ “ความไม่ซื่อตรง” ด้วยตัวเอง เป้าหมายไม่ใช่ความจริง แต่คือความสอดคล้อง
    วาทศิลป์ ไม่ใช่การให้เหตุผล และความสามารถในการอธิบายที่แท้จริงซึ่ง sparse autoencoder ที่ overfit อ้างว่ามอบให้ได้นั้น ใกล้เคียงกับลำดับการไหลเชิงเหตุและผลของ “ความคิด” ที่โมเดลผ่านระหว่างสร้างคำตอบมากกว่า

    • มนุษย์ก็ทำคล้ายกัน เรามักไม่รู้ว่าทำไมถึงคิดหรือกระทำแบบนั้น แล้วค่อยย้อนมาสร้างคำอธิบายด้วย confabulation ที่ฟังดูสมเหตุสมผล
    • เหมือนศิลปะ/AI กำลังเลียนแบบชีวิต การให้เหตุผลของมนุษย์เองก็อาจเป็นการตัดสินเร็วไปก่อน แล้วใช้เหตุผลภายหลังเพื่อทำให้คนอื่นยอมรับความเชื่อนั้น
      เคยมีการถกกันว่าการให้เหตุผลเป็นเครื่องมือของ อิทธิพลทางสังคม และนี่ก็อธิบายได้ว่าทำไมคนพูดเก่งถึงยอมรับยากว่าตัวเองผิด เพราะปกติพวกเขาชนะการโต้แย้งมาตลอด X ถูกนึกถึงเป็นตัวอย่างเด่น
    • งานวิจัยด้านการตีความเชิงกลไกจำนวนมากดูเหมือน ไสยศาสตร์ คนละแบบ เช่น quantum Hall effect แบบจำนวนเต็ม หรือการยัดคำว่า “superposition” ลงไปเป็นอุปมาแปลก ๆ โดยไม่มีทฤษฎีการแทนกลุ่มที่เคร่งครัดหรือสมมาตรที่ชัดเจน มันดูฝืนไปหน่อย อ่านเปเปอร์พวกนั้นหมดแล้ว และให้ความรู้สึกเหมือนกำลังมองหา postdoc ที่มีงบจ้าง
      แต่ก็ยอมรับว่ามีอยู่ชิ้นหนึ่งที่เป็น 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 แบบไหนสร้างฟีเจอร์ที่มีเอกลักษณ์ที่สุดได้ดี โดยยังคงความ sparse ให้มากที่สุด และนี่ก็เกือบเป็นหัวใจของงานวิจัยการตีความ LLM ผ่าน SAE
      ต่อให้สมมุติว่าเราแก้ปัญหาการหาโครงสร้าง 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 แบบนี้อยู่ เพื่อหลอกผู้สังเกตการณ์ด้านการตีความเชิงกลไก และทำให้มันคิดแบบอ้อมค้อมในทางปฏิบัติได้หรือไม่?

    • นั่นเป็นสถานการณ์ด้าน ความปลอดภัย AI ที่ยากกว่า ไม่จำเป็นต้องมี “AI ที่เก่งกว่ามากมาคุมการฝึกของตัวเอง” เพื่อสร้างปัญหาแฝงแบบนี้ แค่นักวิจัย AI ที่มีเจตนาร้ายก็พอ
      ตัวอย่างเช่น อาจหาโมเดลที่เหยียดเชื้อชาติ แต่ไม่มีแพตเทิร์น 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 ก็เป็นไอเดียที่ดีมาก