Attention ผิดไปหนึ่งช่อง
(evanmiller.org)- attention softmax ภายใน Transformer ทำให้ head ไม่สามารถเลือก “ไม่ทำอะไรเลย” ได้ ซึ่งอาจทำให้การ quantization และการนำไปใช้งานในสภาพแวดล้อมหน่วยความจำต่ำทำได้ยาก
- เบาะแสของปัญหาคือ weight/activation ที่เป็นค่าผิดปกติ ที่พบใน LLM โดยงานวิจัยของ Qualcomm AI Research วิเคราะห์ว่า activation ที่ผิดปกติมากกว่า 97% มาจากตำแหน่งช่องว่างและเครื่องหมายวรรคตอน
- softmax แบบเดิมให้ค่าน้ำหนัก 1/k แก่แต่ละพจน์แม้อินพุตทั้งหมดจะเป็นค่าลบมาก ๆ แต่
softmax_1เพิ่ม 1 ในตัวส่วน ทำให้ output ของ attention เข้าใกล้ 0 ได้ softmax_1รักษาอัตราส่วนสัมพัทธ์ไว้ พร้อมจำกัดผลรวมให้อยู่ระหว่าง 0 ถึง 1 และด้วยอนุพันธ์ที่เป็นบวกจึงยังเหลือ gradient ที่ไม่เป็นศูนย์- การเปลี่ยนแปลงนี้ไม่ใช่แพตช์ที่นำไปติดกับโมเดลเดิมได้ทันที แต่ต้อง ฝึกใหม่ และในโมเดลอย่าง LLaMA อาจทดลองได้อย่างรวดเร็วด้วยวิธี zero prefix token
ค่าผิดปกติที่ทำให้ quantization ยากขึ้น
- ในโมเดล Transformer มี weight และ activation ที่ใหญ่กว่าค่าอื่นหลายหลัก ปรากฏขึ้น และค่าเหล่านี้ดูเหมือนมีความสำคัญต่อการทำงานของโมเดล
- ค่าผิดปกติเหล่านี้ทำให้ประสิทธิภาพลดลงในการ quantization แบบจำนวนเต็ม scale-and-bias ทั่วไป ส่งผลให้การนำโมเดลขนาดใหญ่ไปรันในสภาพแวดล้อมที่ RAM จำกัดอย่าง Mac Mini หรือ Raspberry Pi ทำได้ยาก
- การลดการใช้ RAM จะเปิดโอกาสให้รองรับโมเดลที่ใหญ่ขึ้นหรือฟีเจอร์มากขึ้นได้ทั้งในสภาพแวดล้อมคลาวด์และ edge
- Quantizable Transformers: Removing Outliers by Helping Attention Heads Do Nothing ของ Qualcomm AI Research เชื่อมโยงค่าผิดปกติเข้ากับ softmax ของ attention mechanism
- วิเคราะห์ว่าใน activation ที่ผิดปกติของ LLM นั้น มากกว่า 97% เกิดที่ตำแหน่ง whitespace และ punctuation
- clipped softmax มีปัญหา zero gradient ส่วน gated attention เพิ่มพารามิเตอร์ใหม่หลายล้านตัว
บทบาทของ softmax ใน Transformer
- embedding ของอินพุตใน Transformer คือเวกเตอร์ทศนิยมลอยตัวที่แทนคำ
- LLaMA 2 ของ Meta ใช้ embedding vector ความยาว 3,204 และเมื่อคิดแบบ half-precision ต้องใช้มากกว่า 6KB เพื่อแทนคำหนึ่งคำ
- vocabulary โดยทั่วไปมีรายการประมาณ 30,000~50,000 รายการ
- Transformer แปลงเวกเตอร์อินพุตเป็นเวกเตอร์เอาต์พุตขนาดเท่ากัน และเวกเตอร์เอาต์พุตสุดท้ายใช้ทำนายโทเคนที่จะมาต่อจากโทเคนปัจจุบัน
- residual connection ทำงานในลักษณะที่ attention เพิ่มข้อมูลบริบทเข้าไปในข้อมูลคำเดิม
- เช่น เพิ่มข้อมูลบริบทเพื่อแยกว่า
pupilหมายถึงนักเรียนหรือรูม่านตา
- เช่น เพิ่มข้อมูลบริบทเพื่อแยกว่า
- ในขั้นตอนสุดท้าย จะเปลี่ยนเวกเตอร์เอาต์พุตเป็นเวกเตอร์ที่มีความยาวเท่ากับ vocabulary แล้วใช้ softmax เพื่อปฏิบัติเหมือนเป็นความน่าจะเป็นของโทเคนถัดไป
- การใช้งานจริงมักใช้ sampling mechanism มากกว่าจะเชื่อความน่าจะเป็นจาก output ของ softmax โดยตรง
- softmax ในขั้น output ถือเป็นตัวเลือกที่สมเหตุสมผล เพราะทำหน้าที่ส่ง gradient ให้ทั้ง vocabulary
ข้อจำกัดของ softmax ใน attention ภายใน
- สมการหลักของ attention ภายในเป็นดังนี้
[ \textrm{Attention}(Q, K, V) = \textrm{softmax}\left(\frac{QK^T}{\sqrt{d}}\right)V ]
- ใน decoder-only model นั้น (Q), (K), (V) เริ่มจากลำดับอินพุตเดียวกัน แต่ถูก projection ด้วยวิธีที่ต่างกัน
- (QK^T) หาความสัมพันธ์ระหว่าง token embedding vector แล้วใช้ softmax กับแต่ละแถวเพื่อเป็นค่าน้ำหนักสำหรับผสม value vector ใน matrix (V)
- multi-head attention ทำกระบวนการนี้แบบขนานในหลาย head ของแต่ละ layer
- โดยแบ่ง embedding vector ออกเป็นหลาย segment และแต่ละ head เพิ่มข้อมูลให้หนึ่ง segment ของ output vector
- ปัญหาคือ softmax บังคับให้แต่ละ attention head ต้องสร้าง annotation เสมอ
- แม้ head จะไม่มีข้อมูลที่จะเพิ่ม softmax ก็ยังสร้างการเลือกขึ้นมา
- ยิ่งเป็น head ที่ specialized มากเท่าไร ก็ยิ่งมีโอกาสต้องการ “pass” มากขึ้น แต่ softmax แบบเดิมไม่มีการงดเลือก
ข้อเสนอ: softmax_1 และ QuietAttention
- การเปลี่ยนแปลงที่เสนอคือ เพิ่ม 1 ในตัวส่วน ของ softmax
[ (\textrm{softmax}_1(x))_i = \frac{\exp(x_i)}{1+\sum_j \exp(x_j)} ]
- softmax แบบเดิม เมื่อค่า (x) ทั้งหมดเข้าใกล้ค่าลบมาก ๆ แต่ละพจน์จะลู่เข้าสู่ (1/k)
[ \lim_{x_1 \to -\infty} \ldots \lim_{x_k \to -\infty} (\textrm{softmax}(x))_i = \frac{1}{k} \gt 0 ]
softmax_1ภายใต้เงื่อนไขเดียวกัน แต่ละพจน์จะลู่เข้าสู่ 0
[ \lim_{x_1 \to -\infty} \ldots \lim_{x_k \to -\infty} (\textrm{softmax}_1(x))_i = 0 ]
- ความแตกต่างนี้ทำให้ attention head เลือกที่จะไม่เพิ่มข้อมูลได้
- สมการ attention ที่เสนอเป็นดังนี้
[ \textrm{QuietAttention}(Q, K, V) := \textrm{softmax}_1 \left(\frac{QK^T}{\sqrt{d}}\right)V ]
คุณสมบัติของ softmax_1 และเงื่อนไขการทดลอง
softmax_1ลดค่ารวมลงเล็กน้อย แต่เนื่องจากมี normalization หลัง attention การลดลงนี้จึงอาจถูกชดเชยได้- อัตราส่วนสัมพัทธ์ของเวกเตอร์เอาต์พุตเหมือนกับ softmax แบบเดิม
[ \frac{(\textrm{softmax}_1(x))_i}{(\textrm{softmax}_1(x))_j} = \frac{(\textrm{softmax}(x))_i}{(\textrm{softmax}(x))_j} = \frac{\exp(x_i)}{\exp(x_j)} \quad \forall \ i, j ]
- อนุพันธ์เป็นบวกจึงรักษา non-zero gradient ไว้ และผลรวมอยู่ระหว่าง 0 ถึง 1 ทำให้เอาต์พุตไม่หลุดออกจากช่วงที่ควบคุมได้
- ปัญหานี้ถูกมองว่าเป็น ปัญหาทางคณิตศาสตร์ ไม่ใช่เรื่อง numerical precision และไม่สามารถแก้ได้ด้วย extra precision เพียงอย่างเดียว
- แนวคิดการทดลองคือเพิ่ม zero vector ไว้หน้าทุก input context และรับประกันว่าไม่มี bias ถูกเพิ่มเข้ามา รวมถึง positional encoding ด้วย
- หาก zero ผ่านไปโดยคงค่าเดิม จะให้ผลเหมือนเพิ่ม 1 เข้าไปใน softmax denominator ทุกครั้ง
- อาจทำได้ในโมเดล LLaMA ที่ใช้ fixed embedding และ special prefix token
- นี่ไม่ใช่การทดลองที่นำไปใช้กับโมเดลเดิมได้ทันที แต่ต้อง ฝึกโมเดลใหม่
- ค่าที่ต้องการตรวจสอบคือการเปลี่ยนแปลงของ weight kurtosis และ activation infinity norm
1 ความคิดเห็น
ความเห็นจาก Hacker News
สิ่งที่ผู้เขียนเสนอไม่ใช่การเพิ่มอะไรใน softmax ของเอาต์พุตสุดท้าย แต่เป็นการเพิ่ม 1 เข้าไปในตัวส่วนของ softmax ภายใน attention
softmax ของ attention ทำให้การจับคู่ key/query ถูกมองคล้ายความน่าจะเป็น จึงเปลี่ยนจากการ lookup แบบ 0/1 ไปเป็นการ lookup key-value ด้วยค่าน้ำหนักต่อเนื่อง
เมื่อเพิ่ม 1 ในตัวส่วน ผลรวมของน้ำหนักจะน้อยกว่า 1 จึงไม่ใช่เวกเตอร์ความน่าจะเป็นจริง ๆ อีกต่อไป แต่ถ้าโมเดลเรียนรู้น้ำหนักที่สูง มันก็ยังทำงานเกือบเหมือนเวกเตอร์ความน่าจะเป็นได้ และยังอาจเลือกให้น้ำหนักทั้งหมดต่ำเพื่อสื่อว่า “ไม่มั่นใจในอะไรเลย” ได้ด้วย
จะดีจริงหรือไม่ก็ต้องลองฝึก LLM ด้วยวิธีนี้ดูตรง ๆ แต่คงไม่ได้ต่างมากนัก เพราะโหนด attention ที่มีความมั่นใจต่ำสามารถทำให้คะแนนก่อน softmax ใกล้เคียงกันอยู่แล้วจนได้การกระจายเกือบสม่ำเสมอ ซึ่งสุดท้ายก็เป็นค่าเฉลี่ยของหลายเวกเตอร์และมีโอกาสเข้าใกล้ 0 ทางสถิติ
อีกทั้งใน Transformer ก็มีน้ำหนักที่เรียนรู้ได้สำหรับทำ opt-out อยู่แล้วหลายจุด เช่น เมทริกซ์ V และชั้น feedforward หลัง attention ถึงอย่างนั้นก็ชอบโทนที่ไม่เป็นวิชาการเกินไปและท่าทีที่อยากลองแตะไอเดียพื้นฐานของบทความ แม้ยังไม่ถึงกับถูกโน้มน้าวทั้งหมด แต่ก็อยากอ่านงานแบบนี้อีก
ในการรันโมเดลขนาดใหญ่ หน่วยความจำคือคอขวด ดังนั้นถ้าจริงก็มีนัยสำคัญมาก
อย่างที่บอกว่าจริง ๆ เดิมอยากเรียกฟังก์ชันนี้ว่า ghostmax นั้น ถ้ามองว่า x มีรายการค่า 0 เพิ่มมาอีกหนึ่งตัว และ
exp(0)=1ก็เท่ากับว่าในเมทริกซ์ V ก็มีเวกเตอร์ศูนย์ที่ทำให้ผลลัพธ์อ่อนลงอยู่ด้วยแทนที่จะคิดว่า “ผลรวมน้ำหนักน้อยกว่า 1 เลยบางครั้งไม่เลือกอะไรเลย” จะมองว่า ทุกครั้งที่พิจารณาชุดตัวเลือก ระบบถูกบังคับให้พิจารณาทางเลือก ไม่ทำอะไรเลย ไปพร้อมกันด้วยจะเหมาะกว่า
มันต่างกันระหว่าง “ถ้ามีแค่ค้อน ทุกอย่างก็ดูเหมือนตะปู” กับ “แม้จะมีแค่ค้อน ก็ยังตอกเฉพาะตะปูและเมินสิ่งที่ไม่ใช่ตะปู”
ตัวอย่างเช่น ระบบเสียงเป็นข้อความที่ให้คนเลือกภาษาก่อน แล้วค่อยป้อนเสียงของภาษานั้น มักถอดความได้ค่อนข้างดี แต่ถ้าขั้นเลือกภาษารอบแรกผิดก็จะได้ผลลัพธ์เลอะเทอะ ซึ่งน่าหงุดหงิด ถ้าเป็นตัวถอดเสียงภาษาอังกฤษ ก็ควรบอกก่อนว่า “นี่ไม่ใช่ภาษาอังกฤษ” เมื่อรับเสียงภาษาฝรั่งเศสเข้ามา แบบนั้นจะใกล้เคียงวิธีคิดของคนมากกว่า
ตัวหนึ่งใส่ +1 ในตัวส่วน softmax ของโมดูล attention อีกตัวไม่ใส่ ต้องแสดงให้เห็นว่าประสิทธิภาพใกล้เคียงกัน และโมเดลแบบ +1 มีอาการค่าพุ่งรุนแรงน้อยกว่า จึงทำ quantization ได้มีประสิทธิภาพกว่า
เหมือนที่โครงข่ายประสาทเทียมจำเป็นต้องมี residual connection เพราะมันโมเดลฟังก์ชันเอกลักษณ์ได้ไม่ดี ฉันก็คิดว่ามันอ่อนพอสมควรเหมือนกันในการเรียนรู้ การแปลงแบบเอนโทรปีต่ำ โดยปริยาย
ถึงจะไม่ได้เพิ่มพลังการแทนค่า แต่ก็อาจมีผลคล้ายการฝังทรานส์ฟอร์มแบบหาเข็มในกองฟางที่ gradient descent เข้าถึงได้ยากไว้ในตัวโมเดลเลย ไม่แน่ใจว่าในทางปฏิบัติจะมีประโยชน์แค่ไหน
ที่ไม่ค่อยถูกใช้แพร่หลายก็เพราะคนเคยลองกันมาแล้ว และในทางปฏิบัติมันทำงานไม่ได้ดีนัก การที่ต้นฉบับเรียกมันว่า “บั๊กที่ถูกมองข้ามมากว่า 8 ปี” จึงออกจะเป็น clickbait มากกว่า
ฉันอาจพลาดอะไรไป แต่ไม่ค่อยเข้าใจว่าทำไมคอมเมนต์ต่าง ๆ ถึงมองว่าเป็นเรื่องใหญ่นัก ฉันเห็นทริกนี้มาหลายครั้งแล้ว
ตัวอย่างเช่น ใน repository เก่าของ Google ก็มีโค้ดแบบนี้อยู่: https://github.com/google/flaxformer/blob/ee62754ebe5a5eeb11...
ฉันไม่คิดว่ามันจะช่วยเรื่องเสถียรภาพได้เลย เวลา scale โมเดลขึ้น ทริกอย่าง Q/K layernorm น่าจะช่วยเรื่องเสถียรภาพของ softmax ได้ดีกว่า: https://arxiv.org/pdf/2302.05442.pdf
การเขียนบล็อกโพสต์หรืองานวิจัยเพื่อเพิ่มการรับรู้ก็มีคุณค่าเพียงพอ ไอเดียดี ๆ ถูกค้นพบซ้ำอย่างอิสระหลายครั้งก็เป็นเรื่องปกติ
การที่ตัวส่วนใหญ่ขึ้นทำให้การกระจายแบนลงนั้น จะนำไปสู่พฤติกรรมการ quantize ที่ดีขึ้นหรือไม่ ต้องเทียบกรณีใส่ +1 กับไม่ใส่โดยตรงถึงจะรู้ ต้นฉบับมองว่าข้อดีด้านนี้อาจใหญ่พอสมควร
ในทางเทคนิค softmax ไม่ได้ถูก implement ตามสมการที่ยกมาตรง ๆ แต่เป็น
exp(x_i-max(x))แล้วค่อยนำค่าเหล่านั้นไปบวกกันในตัวส่วน ฉันอาจพลาดอะไรบางอย่างก็ได้อีกอย่าง residual connection ถูกใช้เพราะเครือข่ายเรียนรู้ฟังก์ชันเอกลักษณ์ได้ไม่ดี แต่ค่า 0 นั้นเรียนรู้ได้ ดังนั้นใน
f(x): x+g(x)ก็แค่ให้g:x ~> 0คือเกือบเป็นศูนย์ก็พอและ
f(x): x+g(x)ยังช่วยให้ gradient ไหลได้ง่ายขึ้นด้วยทริกที่ “ค้นพบ” นี้เป็นส่วนหนึ่งของ implementation มาตรฐานของ PyTorch multi-head attention อยู่แล้ว และชื่อคือ
add_zero_attentionมันเพิ่ม 0 เข้าไปใน logit ดังนั้น
e^0=1จึงมี 1 เพิ่มในตัวส่วน: https://pytorch.org/docs/stable/generated/torch.nn.Multihead...ไม่ได้อธิบายความหมายเลยแม้สั้น ๆ ถ้าเพิ่มแค่ประโยคที่สองที่ฉันเพิ่งเขียนไปก็จะมีประโยชน์ขึ้นมาก
แม้จะไม่ใช่เรื่อง AI หรืออัลกอริทึมนี้โดยตรง แต่บางครั้งต่อให้พูดแค่ไหนก็โน้มน้าวคนอื่นไม่ได้ว่านี่คือข้อผิดพลาดเล็ก ๆ
ในปี 2011 ตอนที่พยายามคัดลอก อัลกอริทึมจัดอันดับของ reddit มาใช้ในโปรเจ็กต์ของตัวเอง ผมไปดูซอร์สโค้ดแล้วพบว่ามันทำงานแบบไม่สมเหตุสมผลเลยกับโพสต์ที่มีผลรวมคะแนนโหวตติดลบ
ผมคิดว่าในสมการง่าย ๆ มีการสลับพจน์กัน และใส่เครื่องหมายบวก/ลบผิด ดังนั้นจึงเขียนบล็อกและ โพสต์ลง reddit แต่หลายคนรวมถึงพนักงาน reddit บอกว่าผิดทั้งหมด และอัลกอริทึมทำงานตามที่ตั้งใจไว้
เขายังบอกด้วยว่า ก่อนหน้านี้ก็มีคนสังเกตและชี้ประเด็นเดียวกันนี้เหมือนกัน แต่ทุกคนก็ถูกบอกว่าคิดผิด
สุดท้ายผมเลยแก้โพสต์บล็อกเป็นประมาณว่า “คนที่ฉลาดกว่าผมบอกว่าอัลกอริทึมของ reddit ไม่มีข้อผิดพลาด เพียงแต่เวอร์ชันดัดแปลงของผมดูสมเหตุสมผลกว่าสำหรับผม”
แต่แล้ว 3 ปีต่อมาในปี 2014 ก็มีการคอมมิตแก้ในซอร์สโค้ดของ reddit ด้วยการแก้แบบเดียวกับที่ผม และคนก่อนหน้าผม เสนอมาโดยตลอด: https://github.com/reddit-archive/reddit/commit/50d35de04b92...
โอเพนซอร์สช่วยให้มีสายตาจำนวนมากช่วยกันหา bug ได้ แต่บางครั้งถึงคุณจะหา bug เจอ ก็โน้มน้าวใครไม่ได้อยู่ดี แน่นอนว่า reddit ปิดโค้ดไปแล้วในปี 2017
สุดท้ายแล้วในแอปของผมก็ไม่ได้ใส่ทั้งฟีเจอร์จัดอันดับที่เดิมตั้งใจจะคัดลอกมา และไม่ได้ใส่ระบบโหวตด้วย
ต้องเข้ารหัสค่าหลายอย่างใน query parameter และมีพารามิเตอร์บางตัวที่ในทางปฏิบัติต้องถูกเข้ารหัสซ้ำสองรอบ ดังนั้นเครื่องมือของผมก็ทำแบบนั้น แต่วิศวกรผู้ทำ implementation ยืนกรานว่าเครื่องมือของผมผิด ยกเรื่องที่ผมเป็นเด็กฝึกงานขึ้นมา และถึงขั้นหยิบสเปก OAuth มาอ้างพร้อมตีความแบบฝืน ๆ ว่า implementation ของเขาถูก ส่วนผมอ่านผิด
สุดท้ายต้องตาม Eran Hammer-Lahav มายืนยันก่อนจึงได้ข้อสรุปว่าผมถูกต้อง และตอนนั้นเองวิศวกรคนนั้นถึงยอมรับว่าใช่ แน่นอนว่าต้องเป็นแบบนั้นอยู่แล้ว แต่ก็ไม่มีการยอมรับหรือขอโทษใด ๆ ต่อการโจมตีตัวบุคคลที่เกิดขึ้นหลายวันก่อนหน้า
มันทำให้ผมได้บทเรียนสำคัญว่า คนที่อาวุโสกว่าก็ไม่ได้ถูกเสมอไป และตอนนี้โดยมากผมมักเป็นฝ่ายที่อาวุโสกว่าแล้ว แต่ก็พยายามเตือนตัวเองเรื่องนี้ทุกวัน
แค่เป็น “คนที่ใส่ log ไปทั่ว codebase แล้วค่อย ๆ ไล่เหตุผลทีละขั้น” ก็สร้างอาชีพที่ยาวนานและมีอิทธิพลได้แล้ว หลายครั้งแม้ทำในระดับพื้นฐานมาก ๆ ก็ยังเจอการแก้ปัญหาน่าทึ่งสำหรับปัญหาเก่า ๆ
แต่ก็มักมีเกมการเมืองตามมามากเช่นกัน ปฏิกิริยาแรกของคนส่วนใหญ่คือปฏิเสธ แล้วหลังจากนั้นก็มักแย่ลงอีก จะมีแค่ 1-2 คนที่มองว่า “อ๋อ งั้นก็แก้สิ” ส่วนบางคนจะเขียนอีเมล cc ไปถึงหัวหน้าของหัวหน้าของหัวหน้า โดยใช้ถ้อยคำสวยหรูประมาณว่า “คุณยังคำนึงถึง concurrency / memory management / เรื่องอื่น ๆ ไม่เพียงพอ”
เวลานั้นควรรอเงียบ ๆ อย่าไปปะทะหรือบ่น ถ้าไม่มีอะไรเกิดขึ้นและฝ่ายผู้นำก็ไม่ถามอะไร แต่เพื่อนร่วมงานเริ่มถามกันเอง ก็ควรวางแผนย้ายทีมจะดีกว่า
มีการพูดคุยที่น่าสนใจเกี่ยวกับ outlier feature และการ quantization: https://timdettmers.com/2022/08/17/llm-int8-and-emergent-fea...
ค่า outlier ถูกใช้ในการ pruning ค่าออกไป และดูเหมือนว่า Transformer จะเกิด “การเปลี่ยนสถานะ” ในวิธีจัดการกับ outlier feature แถว ๆ จุดที่มีพารามิเตอร์ประมาณ 6.7 พันล้านตัว เรื่องนี้อาจทำให้การทำ ablation study ซับซ้อนขึ้นได้
น่าจะมีเรื่องให้คุยกับ Tim Dettmers ได้อีกเยอะ
ผู้เขียนชี้ปัญหาจริงได้ตรงจุดและเสนอวิธีแก้ที่เรียบง่าย ผ่านเกณฑ์วัดความเพี้ยนแบบเนิร์ดของฉันครบทุกข้อ
สำหรับคำถามว่า “ทำไมไม่มีใครคิดเรื่องนี้ได้?” คำอธิบายที่ว่าผู้เขียนคุ้นเคยกับ ฟังก์ชัน softmax มากจากงานนอกวงการแมชชีนเลิร์นนิง และคนที่ตรวจสอบปัญหานี้แม้จะตีกรอบได้ถึงระดับว่าเป็น “อะไรบางอย่างที่เกี่ยวกับ softmax” แต่ก็อาจยังไม่ได้เข้าใจตัว softmax เองลึกพอ ก็ฟังดูสมเหตุสมผล
แต่ถ้าผู้เขียนต้นฉบับมาเห็นคอมเมนต์นี้ ก็อยากให้ขยายความคำกล่าวที่ว่า “จะแก้ลูปฟีดแบ็กของ outlier ได้ด้วยความน่าจะเป็น 99.44%” เพิ่มอีกหน่อย ตอนนี้มีแค่ประโยคนั้นประโยคเดียวที่อธิบายว่า outlier อาจเกี่ยวข้องกับ softmax อย่างไร
https://github.com/google/flaxformer/blame/ee62754ebe5a5eeb1...
ในคอมเมนต์เขียนไว้ว่า “ฟังก์ชัน softmax ที่มี virtual logit เพิ่มเข้ามาเท่ากับ 0 เพื่อความเข้ากันได้กับโมเดลบางตัวที่เทรนไว้ก่อนหน้า ซึ่งเทียบเท่ากับการเพิ่ม 1 เข้าไปในตัวส่วน ในบริบทของ attention มันทำให้สามารถไม่มองอะไรเลยได้”
มันคือ softmax แบบดัดแปลงแบบเดียวกับในโพสต์นี้เป๊ะ ๆ ส่วนทำไมถึงถูกมองข้ามในที่สาธารณะก็คงต้องรอดูกันต่อไป อาจเป็นเพราะผลไม่ค่อยดี แค่มันถูกกลบไป หรือ Google ไม่ได้ผลักดันมันก็ได้
ไม่ได้ลองทำจริง แค่คิดว่าน่าจะเวิร์กเท่านั้น การแก้ softmax ที่ง่ายขนาดนี้ไม่น่าจะใช้เวลาตรวจสอบนานนัก การที่ไม่ได้ลองก่อนเผยแพร่จึงค่อนข้างน่าอาย
softmax เป็นสิ่งที่ชุมชนแมชชีนเลิร์นนิงเข้าใจกันดีมากอยู่แล้ว เป็นเทคนิคที่ใช้กันทั่วไปมาก และคุณสมบัติแบบนี้ก็เป็นที่รู้จักกันดี โอกาสที่ไม่มีใครคิดถึงเลยจึงดูต่ำ
ถึงอย่างนั้นก็เป็นไปได้ว่าธรรมเนียมการใช้ softmax ในปัจจุบันถูกเลือกมาแบบบังเอิญ และผู้เขียนก็ชี้ข้อเสียของมันได้ถูกจริง
ต่อให้การวินิจฉัยถูกต้อง LLM แบบ full precision ก็อาจหลบปัญหาได้ด้วยการให้น้ำหนัก attention สูงกับโทเคนที่ไม่มีความหมาย เพื่อสร้าง attention output ที่ไม่เป็นพิษเป็นภัย
ปัญหานี้อาจสำคัญเฉพาะตอน quantize น้ำหนักเท่านั้น และเป้าหมายของการพัฒนา LLM ระดับล้ำสมัยช่วงหลัง ๆ ก็ไม่จำเป็นต้องเป็นประสิทธิภาพด้าน quantization เสมอไป
ประมาณว่า softmax ชอบให้ความมั่นใจ 99.9% หรือ 0.1% ได้ดี แต่ค่าตรงกลางไม่ค่อยมี
ฉันรู้ว่าใน HN การบ่นวงการวิชาการเป็นเรื่องฮิต แต่โพสต์บล็อกนี้ให้เหตุผลได้ไม่ดีนัก
เนื้อหาหลักน่าจะสื่อได้ในความยาวสัก 1/4 ของทั้งหมด หรืออาจสั้นกว่านั้นถึง 1/8 ด้วยซ้ำ แต่กลับห่อมันไว้ด้วยสำนวนไม่เป็นทางการและการบ่นเรื่องงานตีพิมพ์เชิงวิชาการแบบอ้อม ๆ
ผลคือการถกเถียงที่นี่กลายเป็นคอมเมนต์ 200 ข้อเรื่อง งานตีพิมพ์วิชาการ vs บล็อก และการเขียนแบบเป็นทางการ vs ไม่เป็นทางการ แทนที่จะเป็นผลลัพธ์หรือไอเดียของบทความ
ถ้าจุดมุ่งหมายคือเอาโพสต์บล็อกขึ้นหน้าแรกของ HN มันอาจเป็นสไตล์ที่ดี แต่ถ้าอยากให้คนตรวจสอบและถกข้อดีข้อเสียของไอเดียจริง ๆ มันไม่ค่อยเวิร์ก
คนเรามีความสนใจจำกัดสำหรับใช้กับทุกสิ่ง แต่ความสามารถและความต้องการที่จะดึงความสนใจนั้นไร้ขีดจำกัด นั่นคือสิ่งที่ Michael Goldhaber พูดไว้
นี่เป็นเมล็ดพันธุ์ของการระเบิดข้อมูล เช่น วิดีโอสอนต้มไข่ 6 พันล้านคลิป หรือคอมเมนต์แบบโรงเก็บจักรยาน 200 ข้อ
เพื่อพยายามสกัดสิ่งนี้ เราเลยมีการจัดอันดับคอมเมนต์ ลิงก์ และ newsfeed บน Google, Facebook, HN และที่อื่น ๆ แต่เมื่อพูลของสิ่งที่ต้องจัดอันดับส่วนใหญ่เป็นเรื่องเหลวไหล มันก็แค่กลายเป็นชั้นของเรื่องเหลวไหลอีกชั้นหนึ่ง
เรายังออกแบบระบบสารสนเทศที่สะท้อนสิ่งที่ Goldhaber พูดเรื่องความสนใจเมื่อ 30-40 ปีก่อนไม่ได้เลย
เป้าหมายอาจเป็นทั้งการให้ข้อมูลและความเพลิดเพลิน หลายคนสนุกกับการถกแบบหลวม ๆ รอบ ๆ ประเด็นหลัก และผู้เขียนเองก็อาจชอบแบบนั้นมากกว่าน้ำเสียงเชิงคลินิกและเป็นทางการของบทความวิชาการ
แต่ก็น่าหงุดหงิดนิดหน่อยที่กว่าจะเห็นข้อมูลนั้น ต้องไถข้ามคอมเมนต์บ่นนอกประเด็น 200 ข้อก่อน
ฉันเคยลองการทดลองคล้าย ๆ กันมาแล้ว และในเซ็ตอัปของฉันมันไม่ช่วย
ฉันไม่ได้ยืนยันว่าไม่มีบั๊กอะไรเลย แต่ดูเหมือนว่า การทำ attention ไปยังตำแหน่งปัจจุบัน จะช่วยแก้ปัญหานี้ได้ระดับหนึ่ง เวลาที่ไม่ควรพูดอะไร มันก็แค่ส่งออกค่าของตำแหน่งปัจจุบันออกมา
พูดให้แม่นคือ ฉันไม่ได้เพิ่ม 1 เข้าไปในตัวส่วนของ softmax ตรง ๆ แต่ต่อ attention sink ซึ่งเป็นพารามิเตอร์ที่เรียนรู้ได้เข้าไปก่อน QK แล้วค่อยเอาออกหลัง softmax เพื่อให้ตอนคูณกับ V แล้วผลรวมไม่จำเป็นต้องเป็น 1
ฉันยังลองทั้งแบบที่มองตำแหน่งปัจจุบันและไม่มอง รวมถึงแบบที่สร้าง sink ด้วย feedforward network ตามแต่ละตำแหน่งแทนการใช้พารามิเตอร์ที่เรียนรู้ได้ ในเซ็ตอัปของฉันทั้งสองทางไม่ได้สร้างความต่างมากนัก แต่ก็มีองค์ประกอบแปลก ๆ อื่นปนอยู่เยอะ เลยอาจยังคุ้มที่จะลองใหม่
ในบริบทของโพสต์นี้ ดูเหมือนว่าทั้งประสิทธิภาพของงานและ จำนวนกับขนาดของน้ำหนัก outlier จะสำคัญ
ยังไม่เห็นผลลัพธ์ ถ้ามีตัวเลขมารองรับทฤษฎี มันจะหนักแน่นและน่าเชื่อถือกว่านี้มาก
การเอาภาษารุ่นเดิมมาทำ fine-tune กับข้อมูลเล็ก ๆ เพื่อเช็กว่ามันเวิร์กไหม ไม่ใช่เรื่องยากอะไร
แต่ฉันก็คิดคล้ายกันว่าอาจมีสมการ attention ที่ดีกว่าได้ งานปี 2020 https://arxiv.org/abs/2005.09561 ช่วยได้มากกับ Transformer โมเดลหนึ่งที่ฉันเทรนไว้ มันไม่ใช่ language model ทั่วไป แต่เป็น ปัญหากราฟหลายโมดัลแบบเฉพาะทาง
งานนี้เสนอ normalized attention ซึ่งถ้าฉันเข้าใจไม่ผิด มันอาจช่วยเรื่องปัญหา quantization ได้ด้วย
วิธีนี้ถูกใช้กันบ่อยก่อนที่ dummy token จะกลายเป็นเรื่องปกติ ฉันเห็นไอเดียนี้ครั้งแรกผ่านบทความของ XLNet
เท่าที่รู้ ใน PyTorch มีสิ่งนี้มาตั้งแต่ราวปี 2019/2020 และก็น่าจะมีงานอ้างอิงที่เก่ากว่านั้นซึ่งใครสักคนอาจหาเจอได้
ฉันแปลกใจกับท่าทีที่โอ้อวดของโพสต์ต้นฉบับ โดยเฉพาะเมื่อเป็นเรื่องที่นักวิจัย Transformer ส่วนใหญ่เข้าใจกันอยู่แล้ว และก็แปลกใจเหมือนกันที่ในคอมเมนต์ตอบกลับมีจุดยืนแบบ “งานวิจัยต้องทำกันแบบนี้” อยู่มาก นี่ใกล้เคียงกับการเป็นตัวอย่างว่าทำไมงานวิจัยถึงไม่ได้ดำเนินไปแบบนี้มากกว่า และการรีวิวโดยเพื่อนร่วมวงการก็มีข้อดีหลายด้าน ซึ่งหนึ่งในนั้นคือช่วยลดโอกาสที่จะทำให้ตัวเองขายหน้า
ดูเหมือนว่ากำลังอ่านการถ่อมตัวแบบกำกวมว่าเป็นข้ออ้างจริงจัง
ถ้าจะสรุปว่าทำไมเรื่องนี้ถึงสำคัญพอให้แชร์ มันเป็นปัญหาเฉพาะทางพอสมควรที่สำคัญตอนคุณพยายามรันของเลียนแบบ ChatGPT แบบจาง ๆ บนฮาร์ดแวร์ที่มีข้อจำกัด ดังนั้นก็เป็นไปได้มากที่ทีมวิจัยขนาดใหญ่จะไม่ได้มองว่ามันสำคัญ เพราะพวกเขาไม่ได้พยายามรัน LLM บน 3090
ตัวบทใช้โทนภาษาพูด ถ่อมตัว และมีอารมณ์ขัน ฉันไม่แน่ใจว่ามีข้อดีข้อเสียอะไรบ้าง แต่ฉันตามเหตุผลทั้งหมดได้อย่างสมบูรณ์ มันห่างไกลจากความหยิ่งยโส
คำว่า “ช่วยลดโอกาสที่จะทำให้ตัวเองขายหน้า” แฝงนัยว่า ถ้าผิดหรือไม่ใช่การค้นพบครั้งแรกก็เป็นเรื่องน่าอาย แบบนั้นต่างหากที่ไม่หยิ่งยโสหรือ?