- หลังจากฝึก decoder-only Transformer ขนาดประมาณ 10 ล้านพารามิเตอร์ด้วย TinyShakespeare ผู้เขียนติดตามด้วยสถานะภายในและการทดลองว่าผลลัพธ์การคำนวณหลัง self-attention ถูกแปลงเป็นความน่าจะเป็นของโทเค็นถัดไปอย่างไร
- สมมติฐานหลักคือ Transformer แต่ละบล็อกเชื่อมโยงพรอมป์เข้ากับชุดสตริงเฉพาะในคลังข้อมูลฝึก และ การแจกแจงความถี่ ของโทเค็นที่เกิดขึ้นจริงหลังสตริงเหล่านั้นใกล้เคียงกับการทำนายโทเค็นถัดไปของบล็อกนั้น
- ขั้นตอนประมาณค่าที่นำไปใช้คือค้นหาสตริงฝึกที่คล้ายกับ เอาต์พุตของ feed-forward network ของแต่ละบล็อก รวมการแจกแจงอักขระที่ตามมา แล้วสร้างเอาต์พุตของโมเดลขึ้นใหม่ด้วยผลรวมถ่วงน้ำหนักแยกตามบล็อก
- จากพรอมป์ความยาว 10 จำนวน 20,000 รายการ ค่าเฉลี่ย Hellinger distance ระหว่างเอาต์พุตประมาณค่ากับเอาต์พุตจริงของ Transformer อยู่ที่ประมาณ 0.17 และระยะห่างระหว่างโมเดลต้นฉบับกับโมเดลทางเลือกที่ฝึกด้วยโครงสร้างเดียวกันแต่ใช้ seed อื่นอยู่ที่ประมาณ 0.11 ± 0.08
- การวิเคราะห์สนับสนุนการตีความว่าเอาต์พุต feed-forward มีน้ำหนักมากในการแปลงของบล็อก และ attention ทำหน้าที่แมปพรอมป์ไปยังคลาสสตริงฝึกที่ถูกต้อง แต่ยังไม่ทราบว่าสามารถทั่วไปออกไปนอกโมเดลขนาดเล็กได้หรือไม่
โมเดลที่ใช้ทดลองและคำถาม
- นำ Transformer ขนาดประมาณ 10 ล้านพารามิเตอร์มาสร้างและฝึกตาม Let’s build GPT: from scratch, in code, spelled out ของ Andrej Karpathy
- โค้ดหลักของโมเดลภาษาเป็นผลงานของ Karpathy ส่วนการวิเคราะห์ภายในและโค้ดช่วยเหลือเป็นการมีส่วนร่วมแยกต่างหาก
- โค้ดที่เกี่ยวข้องอยู่ที่ transformer-experiments
- โมเดลเป็น decoder-only Transformer ที่ประกอบด้วย 6 บล็อก
- ข้อมูลฝึกคือ TinyShakespeare ซึ่งมีบทละคร Shakespeare 40,000 บรรทัด
- หลังฝึกบน GPU RTX 4000 ประมาณ 1 ชั่วโมง โมเดลสามารถสร้างข้อความ Shakespeare ปลอมที่ดูสมเหตุสมผลเชิงโครงสร้างได้
- โทเค็นไม่ใช่คำ แต่เป็น อักขระ
- ขนาดคำศัพท์คือ 65 รายการ และโมเดลทำนายการแจกแจงความน่าจะเป็นของอักขระที่จะมาต่อจากพรอมป์อินพุต
- เช่น หลัง
'my most gr'โมเดลทำนายอักขระถัดไปเป็นaที่ 0.819,eที่ 0.081,iที่ 0.059
- คำถามหลักไม่ใช่ self-attention เอง แต่คือผลลัพธ์หลัง attention ถูกแปลงเป็น ความน่าจะเป็นของโทเค็นถัดไป ขั้นสุดท้ายอย่างไร
โครงสร้างบล็อกและน้ำหนักของ feed-forward network
- แต่ละ Transformer block มี multi-head self-attention และ feed-forward network
- ตามโครงสร้าง PyTorch เอาต์พุตของบล็อกอยู่ในรูปที่เพิ่ม
x + self.ffwd(self.ln2(x))หลังจากx + self.sa(self.ln1(x)) - หากเขียนเป็นตัวแปรกลาง เอาต์พุตของบล็อกมองได้เป็น
x + sa_out + ffwd_out
- ตามโครงสร้าง PyTorch เอาต์พุตของบล็อกอยู่ในรูปที่เพิ่ม
- ในโมเดลที่วิเคราะห์ feed-forward network คิดเป็น 65.71% ของพารามิเตอร์ที่ฝึกได้ทั้งหมด
- พารามิเตอร์ feed-forward: 7,089,408 ตัว
- พารามิเตอร์ที่ฝึกได้ทั้งหมด: 10,788,929 ตัว
- เอาต์พุตของ feed-forward network ดูเหมือนเป็น ปัจจัยหลัก ที่เปลี่ยนอินพุตของบล็อกให้เป็นเอาต์พุต
- ในการทดลองต่อ ๆ มา เอาต์พุต feed-forward ส่งผลต่อการแจกแจงความน่าจะเป็นสุดท้ายมากกว่าเอาต์พุต self-attention เพียงอย่างเดียว
ค้นหาสตริงจากเอาต์พุต feed-forward ที่คล้ายกัน
- ขั้นตอนประมาณค่าใช้ ความคล้ายของเอาต์พุต feed-forward ระหว่างพรอมป์กับสตริงในคลังข้อมูลฝึก
- ใส่พรอมป์เข้าโมเดลและบันทึกเอาต์พุตของ feed-forward network ในแต่ละบล็อก
- สำหรับแต่ละบล็อก ค้นหาสตริงในคลังข้อมูลฝึกที่มีเอาต์พุต feed-forward คล้ายกัน
- รวมการแจกแจงความถี่ของโทเค็นที่ตามหลังสตริงเหล่านั้น
- รวมการแจกแจงรายบล็อกแบบถ่วงน้ำหนักและ normalize เพื่อสร้างการแจกแจงความน่าจะเป็น
- ในพรอมป์เดโม
'And only l'พบสตริงความยาว 10 จำนวน 94 รายการที่มี cosine similarity กับเอาต์พุต feed-forward ของบล็อก 1 ตั้งแต่ 0.95 ขึ้นไป- สตริงที่พบ เช่น
hat only l,\nMy only l,I dearly l,ng Henry l,And only lโดยส่วนใหญ่ลงท้ายด้วยy lหรือly l - การแจกแจงความถี่แบบ normalize ของอักขระที่ตามหลังสตริงเหล่านี้คล้ายกับการทำนายอักขระถัดไปของโมเดลจริงมาก
- สตริงที่พบ เช่น
- ในตัวอย่าง
'And only l'ค่าประมาณกับการทำนายของโมเดลจริงสอดคล้องกันใกล้เคียง- โมเดล:
i0.437,o0.204,a0.195,e0.160 - ค่าประมาณ:
i0.389,o0.250,a0.222,e0.139 - Hellinger distance คือ 0.0711
- โมเดล:
- บางกรณีใช้บล็อกเดียวแล้วล้มเหลว
- สำหรับพรอมป์
'hing tremb'หากใช้เฉพาะบล็อก 1 โมเดลทำนายlที่ 0.999 แต่ค่าประมาณเป็นe0.543,l0.343 ทำให้ Hellinger distance เป็น 0.6305 - เมื่อสะท้อนทุกบล็อก ในตัวอย่างเดียวกันค่าประมาณทำนาย
lที่ 0.997 และ Hellinger distance ลดลงเป็น 0.0233
- สำหรับพรอมป์
ขนาดการคำนวณและการปรับแต่งด้วยมือ
- เพื่อประสิทธิภาพ การวิเคราะห์ทั้งหมดทำกับสตริงความยาว 10 เป็นหลัก
- คลังข้อมูลฝึกมี 1,115,394 อักขระ และมี substring ความยาว 10 ที่ไม่ซ้ำกัน 858,923 รายการ
- เอาต์พุต feed-forward เป็นเวกเตอร์
float32ขนาด 384 มิติ และได้มาบล็อกละหนึ่งเวกเตอร์จาก 6 บล็อก
- สุ่มเลือกสตริงความยาว 10 จำนวน 20,000 รายการมาใช้เป็นพรอมป์ทดลอง
- คำนวณ cosine similarity รายบล็อกล่วงหน้าระหว่างแต่ละพรอมป์กับ substring ไม่ซ้ำกัน 858,923 รายการ และบันทึกลงดิสก์
- เนื่องจากแมตช์ที่น่าสนใจไม่ปรากฏที่ cosine similarity ต่ำกว่า 0.7 จึงกรองล่วงหน้าเฉพาะค่าตั้งแต่ 0.7 ขึ้นไป
- similarity threshold รายบล็อกกำหนดด้วยการปรับแต่งด้วยมือ
- บล็อก 0: 0.95
- บล็อก 1: 0.94
- บล็อก 2: 0.85
- บล็อก 3: 0.76
- บล็อก 4: 0.81
- บล็อก 5: 0.89
- เมื่อรวมการแจกแจงความถี่รายบล็อก ก็ใช้น้ำหนักที่ปรับด้วยมือเช่นกัน
- น้ำหนักที่ใช้คือ
[0.01, 0.01, 0.1, 1.5, 6, 0.01] - แม้ลองค้นหาน้ำหนักด้วยวิธี deep learning แล้ว แต่ไม่ได้ผลดีกว่าการปรับแต่งด้วยมือ
- น้ำหนักที่ใช้คือ
การประเมินพรอมป์ 20,000 รายการ
- คำนวณ Hellinger distance ระหว่างการแจกแจงประมาณค่ากับการแจกแจงเอาต์พุตของโมเดล สำหรับพรอมป์ทั้งหมด 20,000 รายการ
- ค่าเฉลี่ย: 0.1677
- ส่วนเบี่ยงเบนมาตรฐาน: 0.1215
- ค่าต่ำสุด: 0.0013
- ค่าสูงสุด: 0.9994
- Hellinger distance ใช้วัดการทับซ้อนระหว่างการแจกแจงความน่าจะเป็น โดย 0 หมายถึงเหมือนกัน และ 1 หมายถึงไม่ทับซ้อนกัน
- เพื่อเปรียบเทียบคุณภาพของค่าประมาณ ฝึกสถาปัตยกรรมเดียวกันเพิ่มอีก 3 ครั้งด้วย random seed อื่น
- โมเดลต้นฉบับ seed: 1337, training loss โดยประมาณ 0.9334, validation loss 1.5063
- Alternate 1 seed: 1442, training loss 0.9293, validation loss 1.5038
- Alternate 2 seed: 88, training loss 0.9294, validation loss 1.4991
- Alternate 3 seed: 99999, training loss 0.9339, validation loss 1.4941
- ค่าเฉลี่ย Hellinger distance ระหว่างโมเดลต้นฉบับกับโมเดลทางเลือกอยู่ที่ประมาณ 0.11 ± 0.08
- Original vs Alternate 1: 0.1064 ± 0.0823
- Original vs Alternate 2: 0.1057 ± 0.0817
- Original vs Alternate 3: 0.1053 ± 0.0828
- ระยะห่างเฉลี่ย 0.17 ระหว่างค่าประมาณกับโมเดลสูงกว่าระยะห่าง 0.11 ระหว่างโมเดลทางเลือก แต่ยังอยู่ในช่วงส่วนเบี่ยงเบนมาตรฐาน จึงเป็นเหตุผลให้มองว่าค่าประมาณค่อนข้างดี
การตีความการทำงานภายใน Transformer
- โมเดลมองได้เป็น การแปลงในปริภูมิ หลายขั้นหลัง embedding
- Transformer 6 บล็อกแปลง embedding อินพุตเป็น embedding เอาต์พุตภายในปริภูมิ embedding 384 มิติ
- LayerNorm สุดท้ายและ linear layer แปลงปริภูมิ embedding เป็นปริภูมิ logit 65 มิติ แล้ว softmax สร้างความน่าจะเป็นของโทเค็นถัดไป
- การแปลงภายในบล็อกมองได้เป็นการบวกเวกเตอร์
- เอาต์พุตบล็อกคือผลรวมของอินพุต
x, เอาต์พุต self-attentionsa_outและเอาต์พุต feed-forwardffwd_out - ในการวิเคราะห์พบว่าเวกเตอร์เอาต์พุต feed-forward โดยทั่วไปมี norm ใหญ่กว่าเอาต์พุต self-attention และในแต่ละบล็อก เอาต์พุตทั้งสองโดยมากชี้ไปในทิศทางคล้ายกัน
- เอาต์พุตบล็อกคือผลรวมของอินพุต
- แม้เพิ่มเฉพาะเอาต์พุต feed-forward ทิศทางก็โดยมากคล้ายกับเวกเตอร์เอาต์พุตสุดท้าย
- เอาต์พุตที่ใช้เฉพาะ feed-forward มี norm เล็กกว่า แต่ทิศทางใกล้กับเอาต์พุตเดิม
- เนื่องจาก LayerNorm สุดท้าย ความต่างของ norm จึงไม่สำคัญมากต่ออินพุตของ linear layer สุดท้าย
- ผลลัพธ์นี้ไม่ได้หมายความว่าสามารถตัดการคำนวณ self-attention ออกได้
- feed-forward network รับเอาต์พุต self-attention รวมอยู่ในอินพุต เช่น
ffwd_out = self.ffwd(self.ln2(x + sa_out))ดังนั้นหากตัด self-attention ออก เอาต์พุต feed-forward เองก็จะเปลี่ยนไป
- feed-forward network รับเอาต์พุต self-attention รวมอยู่ในอินพุต เช่น
สมมติฐาน token subspace
- embedding บางตัวสามารถทำให้โมเดลทำนายโทเค็นบางตัวได้เกือบแน่นอน
- เช่น สามารถฝึก embedding ที่จะป้อนเข้าสู่ LayerNorm และ linear layer หลังบล็อกสุดท้าย เพื่อให้ความน่าจะเป็นของ token
aเกือบเป็น 1 - ตรึงน้ำหนัก Transformer ไว้และ optimize เฉพาะ embedding tensor
- เช่น สามารถฝึก embedding ที่จะป้อนเข้าสู่ LayerNorm และ linear layer หลังบล็อกสุดท้าย เพื่อให้ความน่าจะเป็นของ token
- แต่ละโทเค็นไม่ได้มี embedding เพียงตัวเดียว แต่มี embedding ได้หลายตัว
- ตีความสิ่งนี้เป็น embedding subspace ไม่เชิงเส้นที่ซับซ้อนซึ่งสอดคล้องกับแต่ละโทเค็น
- สามารถฝึก embedding ที่ไม่ซ้ำกันหลายพันตัวสำหรับแต่ละโทเค็นได้อย่างง่ายดาย
- แม้ยังไม่สามารถหา subspace ได้อย่างแม่นยำเชิงคณิตศาสตร์ แต่ในขั้นสุดท้าย linear approximation ทำงานได้ดี
- นำ embedding ที่ฝึกไว้สำหรับแต่ละโทเค็นมาซ้อนกันแล้วทำ SVD
- right singular vector ตัวแรกเพียงตัวเดียวทำหน้าที่เป็นการประมาณเชิงเส้น 1 มิติของ subspace ของโทเค็นนั้นได้ดี
- หากนำเวกเตอร์ประมาณของ subspace สำหรับหลายโทเค็นมารวมเชิงเส้น จะสร้าง embedding ที่กระจายความน่าจะเป็นไปยังหลายโทเค็นได้
- เมื่อบวกเวกเตอร์ประมาณของ
aและbจะได้การแจกแจงที่แบ่งความน่าจะเป็นให้สองโทเค็น - อย่างไรก็ตาม เนื่องจากความคลาดเคลื่อนของการประมาณ ความไม่ตั้งฉากกันของเวกเตอร์ subspace และความต่างของขนาด logit ระหว่างโทเค็น จึงไม่ได้เป็นการแจกแจง 50:50 อย่างสมบูรณ์
- เมื่อบวกเวกเตอร์ประมาณของ
ความสอดคล้องระหว่างเอาต์พุต feed-forward กับ token subspace
- เอาต์พุต feed-forward ถูกตีความว่าเป็นการปรับเอาต์พุตของบล็อกไปทาง token subspace เฉพาะบางตัว
- โทเค็นเหล่านั้นตรงกับโทเค็นที่ขั้นตอนประมาณค่าทำนาย กล่าวคือโทเค็นที่ตามหลังสตริงฝึกซึ่งสร้างเอาต์พุต feed-forward คล้ายกัน
- ในตัวอย่าง
med me Autหากดูเฉพาะบล็อกสุดท้าย ค่าประมาณทำนายว่าoเป็นโทเค็นถัดไปที่เป็นไปได้มากที่สุด และhเป็นลำดับถัดมา- เมื่อนำเวกเตอร์เอาต์พุต feed-forward เดียวกันไปฉายบนการประมาณ token subspace โทเค็นที่คล้ายที่สุดก็เรียงเป็น
o,h,i,u,y
- เมื่อนำเวกเตอร์เอาต์พุต feed-forward เดียวกันไปฉายบนการประมาณ token subspace โทเค็นที่คล้ายที่สุดก็เรียงเป็น
- ในตัวอย่าง
if and thyก็พบความสอดคล้องคล้ายกัน- ค่าประมาณเลือก space,
s, newline เป็นโทเค็นทำนายหลัก - subspace ที่ align กับเอาต์พุต feed-forward มากที่สุดก็ใกล้เคียงกับลำดับ space,
s, newline
- ค่าประมาณเลือก space,
- กำหนดเกณฑ์ตามอำเภอใจและรวบรวมผลจากพรอมป์ทั้งหมด 20,000 รายการ
- เกณฑ์คือ “subspace ของโทเค็นที่ครองมวลความน่าจะเป็น 90% ในการทำนายแบบประมาณค่า อยู่ในครึ่งบนของอันดับ cosine similarity กับเอาต์พุต feed-forward หรือไม่”
- สำหรับบล็อกสุดท้าย มี 16,357 รายการ หรือ 81.78% ที่ผ่านเกณฑ์
ผล aggregate รายบล็อกและการเทียบกับ chance
- เมื่อใช้การประมาณ subspace ที่ฝึกไว้ ณ ตำแหน่งแต่ละบล็อก อัตราผ่านเกณฑ์สูงขึ้นในบล็อกด้านหลัง
- บล็อก 6: 16,357 รายการ, 81.78%
- บล็อก 5: 10,142 รายการ, 50.71%
- บล็อก 4: 7,760 รายการ, 38.80%
- หากนำการประมาณ subspace ของขั้นสุดท้ายไปใช้กับทุกบล็อก จะได้ผลดีกว่า
- บล็อก 6: 81.78%
- บล็อก 5: 68.26%
- บล็อก 4: 58.15%
- บล็อก 3: 57.34%
- บล็อก 2: 52.02%
- บล็อก 1: 49.71%
- ยังจำลองโอกาสที่เกณฑ์จะผ่านโดยบังเอิญจาก cosine similarity แบบสุ่มด้วย
- บล็อก 6: 20.76% ± 0.25%
- บล็อก 5: 20.55% ± 0.26%
- บล็อก 4: 18.37% ± 0.24%
- บล็อก 3: 18.20% ± 0.24%
- บล็อก 2: 17.04% ± 0.23%
- บล็อก 1: 16.31% ± 0.23%
- ผลลัพธ์สูงกว่า chance มาก แต่ด้วย noise ในการวัดและข้อจำกัดของการประมาณ subspace จึงยังถือเป็น หลักฐานชี้ขาด ได้ยาก
บทบาทของ self-attention
- ในการตีความนี้ การทำนายที่ดีขึ้นอยู่กับการแมปพรอมป์ไปยังคลาสสตริงที่ถูกต้องในคลังข้อมูลฝึก
- แกนที่รับผิดชอบการแมปนั้นคือ self-attention
- attention layer ระบุแพตเทิร์นระหว่างโทเค็นในพรอมป์
- แพตเทิร์นอาจเป็นแพตเทิร์นสตริงง่าย ๆ เช่น
y lที่ท้ายข้อความ หรืออาจเป็นชนิดโทเค็นที่ทั่วไปกว่า เช่น สระหรือตัวพิมพ์ใหญ่ในตำแหน่งเฉพาะ
- น้ำหนักที่ฝึกแล้วของ attention head กำหนดว่าจะตอบสนองต่อแพตเทิร์นใด
- เมื่อเอาต์พุต attention head ผ่าน feed-forward network จะกลายเป็น representation ในปริภูมิ embedding ที่บรรจุข้อมูลการแจกแจงของโทเค็นซึ่งปรากฏหลังสตริงฝึกที่คล้ายกัน
- โมเดลที่วิเคราะห์มี 6 บล็อก และแต่ละบล็อกมี 6 attention head จึงสามารถประเมินพรอมป์หนึ่งรายการกับแพตเทิร์นแฝงหลายแบบได้
สรุปและข้อจำกัด
- หลักฐานว่าขั้นตอนประมาณค่าและเอาต์พุตจริงของ Transformer คล้ายกันนั้นค่อนข้างแข็งแรง
- หลักฐานว่าขั้นตอนประมาณค่าสอดคล้องกับการคำนวณภายในจริงของ Transformer ยังไม่ชัดเจนเท่า แต่บ่งชี้ว่าอาจถูกต้องอย่างน้อยบางส่วน
- ยังไม่ทราบว่าผลลัพธ์จาก Transformer ขนาดเล็กหนึ่งตัวนี้จะทั่วไปไปยังโมเดลที่ใหญ่กว่า หรือชุดข้อมูลอื่นได้หรือไม่
- โปรเจกต์นี้เป็นกระบวนการตั้งคำถามกับภายในโมเดลและออกแบบการทดลอง และทำให้เห็นความซับซ้อนของโมเดลภาษาชัดขึ้น มากกว่าจะลดทอน “เวทมนตร์” ของมันให้เหลือเพียงกลไกง่าย ๆ
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ประเด็นบางส่วนในโพสต์ต้นทางไม่น่าจะน่าประหลาดใจมากนักสำหรับคนที่เคยอ่าน https://people.math.harvard.edu/~ctm/home/text/others/shanno...
หากไม่อ่าน วรรณกรรมพื้นฐาน ในสาขาของตนเอง แม้แต่ปรากฏการณ์ที่เกิดขึ้นเป็นผลลัพธ์ตามธรรมชาติของงานที่มีการจัดวางไว้แล้ว ก็จะดูเหมือนปริศนาที่อธิบายไม่ได้
ถึงอย่างนั้น การทดลองก็ดูค่อนข้างละเอียดถี่ถ้วนตั้งแต่แรกเห็น และผมชื่นชมปริมาณงานรายละเอียดที่ใส่ลงไป
มีจุดสมดุลที่ยากระหว่างการเรียนรู้ทฤษฎีที่มีอยู่กับการลองอนุมานขึ้นมาใหม่ตั้งแต่ต้น หากไม่มีฐานแบบดั้งเดิมก็อาจค้นพบสิ่งใหม่ได้ แต่หากมีฐาน ก็จะเข้าใจปรากฏการณ์บางอย่างได้ลึกขึ้น
ในคอมเมนต์ที่นี่ ดูเหมือนมีหลายคนแปลกใจว่าโมเดลที่เพิ่ม log-likelihood ของลำดับให้สูงสุดเมื่อมีข้อมูลให้ จะไม่หลุดออกจากพฤติกรรมนั้นอย่างมหัศจรรย์ในตอน inference นี่คือโมเดลประมาณค่าความหนาแน่น แล้วจะคาดหวังให้มันท่อง Shakespeare ออกมาจากความว่างเปล่าหรืออย่างไร
การกลับไปสู่พื้นฐานทำให้เข้าใจการทดลองแบบนี้ได้ดีกว่ามาก มีรากฐานทางคณิตศาสตร์ที่ชัดเจนมากอยู่แล้ว ซึ่งอธิบายเรื่องนี้ รวมถึงสิ่งที่เรียกว่าปรากฏการณ์อุบัติใหม่ได้
หากเจาะจงกว่านั้น มีหลายระดับ และการที่ Shannon จัดการกับระบบเออร์โกดิกเป็นจุดเริ่มต้นที่ดี แม้ที่นี่จะมีส่วนที่คลาดเคลื่อนไปบ้าง แต่ก็ดูเป็นการเทียบเคียงที่ใกล้พอสำหรับทำความเข้าใจพลวัตโดยรวม
ไม่ใช่เรื่องแปลกที่คนฉลาดจะพูดว่า “โครงสร้างทางคณิตศาสตร์นี้คล้ายกับไอเดียนั้น ถ้าเพิ่มหรือลดโครงสร้างอีกไม่กี่อย่างก็จะอธิบายได้ทั้งหมด” แต่ในความเป็นจริง เรายังไม่รู้อีกมาก
ผมไม่เคยเห็นนักทฤษฎีในสาขานี้นำทฤษฎีมาแล้วสร้างสิ่งใหม่หรือให้การคาดการณ์ที่เป็นประโยชน์ได้ โดยทั่วไปคือทดลองโน่นนี่ไปเรื่อย ๆ ถ้ามันใช้ได้ ก็ค่อยใส่คำอธิบายที่ฟังดูสมเหตุสมผลภายหลังว่าทำไมถึงใช้ได้ และถ้าใช้ไม่ได้ก็กลบไว้
เมื่อเร็ว ๆ นี้ก็มีบทความที่มอง transformer เป็นการทำ kernel smoothing: https://arxiv.org/abs/1908.11775
การค้นพบซ้ำ ๆ ไม่จำเป็นต้องเป็นความสูญเปล่าเสมอไป แต่อาจเป็นกระบวนการยืนยันและตรวจสอบความจริงเชิงลึกที่มีได้หลายเส้นทางไปถึง
ตำราทฤษฎีสารสนเทศจำนวนไม่น้อยได้ชี้ให้เห็นคุณสมบัติแบบ content-addressable ของเครือข่ายลักษณะนี้ไว้แล้ว[1] และด้วยเหตุผลนี้จึงถูกใช้กับแอปพลิเคชันอย่างการบีบอัดด้วย[2][3]
ดังนั้นจึงไม่น่าแปลกใจที่เมื่อ NYT ใส่ข้อความจากบทความของตนเองไม่กี่ย่อหน้าเป็นพรอมป์ต์ให้โมเดลของ OpenAI มันก็สร้างซ้ำออกมาแทบจะเหมือนเดิม
[1] https://www.inference.org.uk/itprnn/book.pdf
[2] https://bellard.org/nncp/
[3] https://pub.towardsai.net/stable-diffusion-based-image-compr...
ตอนที่เห็น Google ชี้ให้เห็นว่าสามารถทำให้ ChatGPT คายข้อมูลฝึกออกมาตรง ๆ ได้ ถ้าสั่งให้มันพูดคำเดิมซ้ำไปเรื่อย ๆ [0][1] ผมก็นึกถึงไอเดียเดียวกันเป๊ะ ดีใจที่มีคนเอาไปทำจริง
จากตรงนี้มีคำถามเพิ่มอีกสองข้อ
[0] เมื่อก่อนทำได้ ตอนนี้ OpenAI บล็อกการสร้างข้อความถ้าเติม context window ด้วยคำเดียว
[1] https://arxiv.org/abs/2311.17035
ขั้นตอนที่ข้ามไปไม่ได้มีมากนัก แถมยังมีงานเพิ่มเข้ามาอีกเยอะ
ต่อให้แยกคลังข้อความสำหรับฝึกโมเดลกับคลังข้อความสำหรับค้นหาสตริงที่มี activation คล้ายกันออกจากกันโดยสิ้นเชิง ก็น่าจะได้ผลลัพธ์แทบเหมือนเดิมอยู่ดี ส่วนที่ยากคือการทำให้สตริงที่มีสถิติโทเค็นถัดไปคล้ายกันสร้าง activation ที่คล้ายกันตั้งแต่แรก
ในค่าน้ำหนักรายชั้น [0.01, 0.01, 0.1, 1.5, 6, 0.01] สิ่งที่สำคัญที่สุดคือชั้นก่อนสุดท้าย และตอนนั้นอินพุตก็ถูกแปลงไปมากแล้ว ดังนั้นจึงไม่ควรคาดหวังว่าจะใช้สิ่งนี้แทน transformer ด้วยการ grep ข้อมูลฝึกแบบง่าย ๆ ได้
เหตุผลที่ค่าน้ำหนักของชั้นก่อนสุดท้ายใหญ่กว่าชั้นสุดท้ายมาก น่าจะเป็นเพราะ induction head อาจเป็นโครงสร้างที่ทำหน้าที่คัดลอกสตริงซ้ำในอินพุตตามที่อธิบายใน https://transformer-circuits.pub/2021/framework/index.html โดยชั้นก่อนสุดท้ายกำหนดว่าจะต้องหาอะไร และชั้นสุดท้ายทำการคัดลอก
คุณูปการของบทความนี้ ตามที่ผู้เขียนบอก คือการแสดงประเด็นนั้นให้ผู้อ่านสายเทคนิคที่กำลังสร้าง GPT เองเห็น โดยต่างจากบทความแนว “มันทำงานอย่างไร?” ที่โฟกัสไปที่ตัว transformer เอง
พอดูละเอียด ๆ ก็เป็น README ของ GitHub ที่ไม่มีอยู่จริงและบริบทก่อนหลังไม่สอดคล้องกัน โบรชัวร์แนะนำที่แทบไม่มีสาระ บทสนทนาสุ่ม ๆ อะไรทำนองนั้น
แต่การกวาดเก็บทั้งอินเทอร์เน็ตไปเพื่อฝึกโมเดลแบบนี้ กลับไม่เคยถูกเรียกว่าเป็นการโจมตีเลย
ถ้าอย่างนั้น ทำไมเราจึงไม่ควรมองว่าเขามีสิทธิ์ใน การกระจายความน่าจะเป็นของตัวอักษร ภายในงานนั้นด้วย?
ทันทีที่ได้รู้จัก NanoGPT ของ Andrej Karpathy ผมก็ลองฝึกมันด้วย War and Peace ฉบับภาษารัสเซีย และน่าสนใจมากที่แม้จะเป็นโมเดลขนาดแค่ 3MB แต่มันก็จับ ไวยากรณ์รัสเซีย ได้เกือบหมด
ภาษารัสเซียมีโครงสร้างสังเคราะห์และการผันคำที่ซับซ้อน เช่น หลังบุพบท “na” (“upon”) ต้องตามด้วยคำนามรูปกรรมตรง ซึ่งในคำนามเพศชายที่เป็นสิ่งมีชีวิตจะแสดงด้วย -a, ในคำนามไม่มีชีวิตจะไม่เติมท้าย, ในคำนามที่ลงท้ายด้วย “soft consonant” จะเป็น -ia, ในคำนามเพศหญิงจะเป็น -u เป็นต้น
อีกอย่างคือกริยา “ใช้” หากตามด้วยคำนามที่ทำหน้าที่เป็นเครื่องมือ จะบังคับให้คำนามนั้นอยู่ในรูป instrumental case
มันไม่ได้สมบูรณ์แบบและมีข้อผิดพลาด แต่ก็น่าสนใจที่ NanoGPT อนุมานกฎเฉพาะที่ซับซ้อนได้จากการฝึกเพียง 3 นาที ผมลองค้นหาประโยคตัวอย่างที่มันสร้างขึ้นในต้นฉบับแล้ว แต่ไม่พบประโยคที่ตรงกันทุกประการ
อย่างไรก็ตาม แม้มันจะเข้าใจไวยากรณ์ได้ในระดับหนึ่ง แต่ในเชิงความหมายแล้วเป็นเรื่องไร้สาระล้วน ๆ
มี ภาพอธิบายแบบ 3D ที่ดีซึ่งแสดงระบบเดียวกัน และน่าจะอ่านประกอบกันแล้วได้ผลมาก
LLM Visualization (https://bbycroft.net/llm)
https://news.ycombinator.com/item?id=38505211
น่าจะเป็นเพราะพยายามแสดงทุกอย่างพร้อมกัน และไม่ผลักบางส่วนไปอยู่ในแนวคิดเชิงนามธรรม แต่ก็ไม่แน่ใจนัก
เป็นโปรเจกต์ที่ดี แต่โมเดลที่นำมาวิเคราะห์นั้น โดยทั้งขนาดและปริมาณข้อมูลฝึกแล้ว แทบจะเป็น โมเดลของเล่น
ดังนั้นโมเดลนี้อาจประมาณได้ด้วยโมเดลที่ง่ายกว่า อาจเป็น n-gram language model แต่ก็คงยากที่จะถือว่ามันเป็นตัวแทนวิธีการทำงานของโมเดลภาษาที่ใหญ่กว่านี้
สงสัยว่าผู้เขียนกำลังอ้างว่า LLM เป็นตัวสร้างข้อความแบบ Markov chain หรือไม่
กล่าวคือ หมายความว่าการแจกแจงความน่าจะเป็นของโทเค็นถัดไปที่ถูกสร้างขึ้น เท่ากับความน่าจะเป็นของลำดับโทเค็นนั้นในข้อมูลฝึกหรือเปล่า?
ถ้าเป็นเช่นนั้น แปลว่าถ้า “แค่” สร้าง Markov chain จากข้อมูลฝึกดั้งเดิม ก็จะได้ประสิทธิภาพคล้ายกับ LLM หรือไม่?
สถานะคือเวกเตอร์โทเค็นที่มีความยาวเท่ากับความยาวบริบท และโมเดลอธิบายเมทริกซ์การเปลี่ยนสถานะ กล่าวคือ สำหรับเวกเตอร์โทเค็นที่มีขนาดเท่าความยาวบริบทที่กำหนด โมเดลจะให้ความน่าจะเป็นของเวกเตอร์โทเค็นถัดไปที่มีขนาดเท่าความยาวบริบท
ส่วนที่ยากคือการจำแนกว่า ข้อความใดในข้อมูลฝึกที่ “คล้าย” กับข้อความในพรอมป์
หากยกตัวอย่างจากบล็อกโพสต์ จะเป็นดังนี้
Original string: 'And only l'
Similar strings: 'hat only l' 's sickly l' ' as\nthey l' 'r kingly l'
นี่หมายความว่าอาจมีวิธีข้าม transformer แล้วได้ผลลัพธ์เดียวกันได้ สงสัยว่าจะมีประสิทธิภาพกว่าหรือไม่
ตัวอย่างเช่น เมื่อมีโมเดลพื้นฐานอยู่แล้ว อาจเป็นไปได้ที่จะฝึกสิ่งอื่นขึ้นมาเพื่อให้รันบนอุปกรณ์ที่เล็กกว่ามาก
ค่อนข้างยากที่จะเข้าใจว่าผู้เขียนอ้างว่าได้แสดงให้เห็นอะไรแน่
อ่านหัวข้อ “Interpretation: Why Does the Approximation Work?” หลายครั้งแล้ว แต่รู้สึกเหมือนเป็นคำอธิบายเชิงกลไกของขั้นตอนใน transformer ยังไม่รู้ว่าประเด็นหลักคืออะไร
สงสัยว่าปรากฏการณ์ที่ attention และ FF displacement มักชี้ไปในทิศทางเดียวกันนั้นเป็นสิ่งที่รู้กันอยู่แล้วหรือไม่
แค่การที่มันอยู่ใน latent space เดียวกันข้ามชั้นต่าง ๆ ก็น่าแปลกใจอยู่แล้ว ไม่ใช่ว่าเครือข่าย FF อาจทำการหมุนแบบใดก็ได้หรือ? คงเข้าใจอะไรผิดไปแน่ ๆ
ย่อมต้องมีบางอย่างตกหล่นไป และหนึ่งในสิ่งที่ตกหล่นก็คือการอธิบายการหมุนแบบใดก็ได้ในปริภูมิมิติสูงได้อย่างถูกต้อง