1 คะแนน โดย GN⁺ 2023-07-25 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • 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 ความคิดเห็น

 
GN⁺ 2023-07-25
ความเห็นจาก 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 ถึงอย่างนั้นก็ชอบโทนที่ไม่เป็นวิชาการเกินไปและท่าทีที่อยากลองแตะไอเดียพื้นฐานของบทความ แม้ยังไม่ถึงกับถูกโน้มน้าวทั้งหมด แต่ก็อยากอ่านงานแบบนี้อีก

    • เท่าที่ฉันเข้าใจ ผู้เขียนดูเหมือนจะบอกว่าการเปลี่ยนนี้จะทำให้ ค่าขนาดใหญ่หายไป และเข้ารหัสเอาต์พุตของ Transformer ด้วยจำนวนบิตที่น้อยลงได้ จึงลดความต้องการหน่วยความจำของเครือข่าย
      ในการรันโมเดลขนาดใหญ่ หน่วยความจำคือคอขวด ดังนั้นถ้าจริงก็มีนัยสำคัญมาก
    • ฉันชอบโมเดลเชิงแนวคิดที่ผู้เขียนเสนอมากกว่า
      อย่างที่บอกว่าจริง ๆ เดิมอยากเรียกฟังก์ชันนี้ว่า ghostmax นั้น ถ้ามองว่า x มีรายการค่า 0 เพิ่มมาอีกหนึ่งตัว และ exp(0)=1 ก็เท่ากับว่าในเมทริกซ์ V ก็มีเวกเตอร์ศูนย์ที่ทำให้ผลลัพธ์อ่อนลงอยู่ด้วย
      แทนที่จะคิดว่า “ผลรวมน้ำหนักน้อยกว่า 1 เลยบางครั้งไม่เลือกอะไรเลย” จะมองว่า ทุกครั้งที่พิจารณาชุดตัวเลือก ระบบถูกบังคับให้พิจารณาทางเลือก ไม่ทำอะไรเลย ไปพร้อมกันด้วยจะเหมาะกว่า
      มันต่างกันระหว่าง “ถ้ามีแค่ค้อน ทุกอย่างก็ดูเหมือนตะปู” กับ “แม้จะมีแค่ค้อน ก็ยังตอกเฉพาะตะปูและเมินสิ่งที่ไม่ใช่ตะปู”
      ตัวอย่างเช่น ระบบเสียงเป็นข้อความที่ให้คนเลือกภาษาก่อน แล้วค่อยป้อนเสียงของภาษานั้น มักถอดความได้ค่อนข้างดี แต่ถ้าขั้นเลือกภาษารอบแรกผิดก็จะได้ผลลัพธ์เลอะเทอะ ซึ่งน่าหงุดหงิด ถ้าเป็นตัวถอดเสียงภาษาอังกฤษ ก็ควรบอกก่อนว่า “นี่ไม่ใช่ภาษาอังกฤษ” เมื่อรับเสียงภาษาฝรั่งเศสเข้ามา แบบนั้นจะใกล้เคียงวิธีคิดของคนมากกว่า
    • ถ้าจะตรวจว่าดีไหม ก็ฝึก โมเดลเดียวกันสองตัว บนชุดข้อมูลขนาดใหญ่ได้เลย
      ตัวหนึ่งใส่ +1 ในตัวส่วน softmax ของโมดูล attention อีกตัวไม่ใส่ ต้องแสดงให้เห็นว่าประสิทธิภาพใกล้เคียงกัน และโมเดลแบบ +1 มีอาการค่าพุ่งรุนแรงน้อยกว่า จึงทำ quantization ได้มีประสิทธิภาพกว่า
    • ฉันไม่ค่อยเห็นด้วยกับแนวคิดที่ว่า “ถ้าความมั่นใจต่ำ ก็ทำให้คะแนนก่อน softmax ใกล้ ๆ กันก็พอ”
      เหมือนที่โครงข่ายประสาทเทียมจำเป็นต้องมี residual connection เพราะมันโมเดลฟังก์ชันเอกลักษณ์ได้ไม่ดี ฉันก็คิดว่ามันอ่อนพอสมควรเหมือนกันในการเรียนรู้ การแปลงแบบเอนโทรปีต่ำ โดยปริยาย
      ถึงจะไม่ได้เพิ่มพลังการแทนค่า แต่ก็อาจมีผลคล้ายการฝังทรานส์ฟอร์มแบบหาเข็มในกองฟางที่ gradient descent เข้าถึงได้ยากไว้ในตัวโมเดลเลย ไม่แน่ใจว่าในทางปฏิบัติจะมีประโยชน์แค่ไหน
    • เทคนิคนี้เป็นที่รู้จักมาหลายปีแล้วและมีอยู่ใน PyTorch ด้วย
      ที่ไม่ค่อยถูกใช้แพร่หลายก็เพราะคนเคยลองกันมาแล้ว และในทางปฏิบัติมันทำงานไม่ได้ดีนัก การที่ต้นฉบับเรียกมันว่า “บั๊กที่ถูกมองข้ามมากว่า 8 ปี” จึงออกจะเป็น clickbait มากกว่า
  • ฉันอาจพลาดอะไรไป แต่ไม่ค่อยเข้าใจว่าทำไมคอมเมนต์ต่าง ๆ ถึงมองว่าเป็นเรื่องใหญ่นัก ฉันเห็นทริกนี้มาหลายครั้งแล้ว
    ตัวอย่างเช่น ใน repository เก่าของ Google ก็มีโค้ดแบบนี้อยู่: https://github.com/google/flaxformer/blob/ee62754ebe5a5eeb11...

    • ใช่เลย เมื่อไม่กี่ปีก่อนในโมเดลเก่าของพวกเราก็ใช้สิ่งนี้อยู่ จำรายละเอียดไม่ได้แม่นแล้ว แต่ดูเหมือนจะไม่ได้ผลอะไรนัก
      ฉันไม่คิดว่ามันจะช่วยเรื่องเสถียรภาพได้เลย เวลา scale โมเดลขึ้น ทริกอย่าง Q/K layernorm น่าจะช่วยเรื่องเสถียรภาพของ softmax ได้ดีกว่า: https://arxiv.org/pdf/2302.05442.pdf
    • ถ้าโมเดลยอดนิยมยังคงทำพลาดเรื่องนี้อยู่ ก็ยังถือว่าน่าสนใจ
      การเขียนบล็อกโพสต์หรืองานวิจัยเพื่อเพิ่มการรับรู้ก็มีคุณค่าเพียงพอ ไอเดียดี ๆ ถูกค้นพบซ้ำอย่างอิสระหลายครั้งก็เป็นเรื่องปกติ
    • ประเด็นสำคัญคือมีใครลองสิ่งนี้กับ quantization หรือยัง เช่นแนวทาง int8 / GGML / GPTQ
      การที่ตัวส่วนใหญ่ขึ้นทำให้การกระจายแบนลงนั้น จะนำไปสู่พฤติกรรมการ 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...

    • เอกสารค่อนข้างแย่ มันเขียนแค่ว่า “ถ้าระบุ จะเพิ่ม batch ใหม่ของศูนย์เข้าไปในลำดับ key และ value ที่ dim=1”
      ไม่ได้อธิบายความหมายเลยแม้สั้น ๆ ถ้าเพิ่มแค่ประโยคที่สองที่ฉันเพิ่งเขียนไปก็จะมีประโยชน์ขึ้นมาก
    • มันเป็นออปชันที่ค่าเริ่มต้นเป็น false ถ้าอย่างนั้นแปลว่าคนเคยลองแล้วและโดยทั่วไปไม่ค่อยช่วยงั้นหรือ?
    • จับประเด็นนี้ได้ดี อยากให้ผู้เขียนต้นฉบับมาเห็น
    • https://en.wikipedia.org/wiki/Multiple_discovery
  • แม้จะไม่ใช่เรื่อง AI หรืออัลกอริทึมนี้โดยตรง แต่บางครั้งต่อให้พูดแค่ไหนก็โน้มน้าวคนอื่นไม่ได้ว่านี่คือข้อผิดพลาดเล็ก ๆ
    ในปี 2011 ตอนที่พยายามคัดลอก อัลกอริทึมจัดอันดับของ reddit มาใช้ในโปรเจ็กต์ของตัวเอง ผมไปดูซอร์สโค้ดแล้วพบว่ามันทำงานแบบไม่สมเหตุสมผลเลยกับโพสต์ที่มีผลรวมคะแนนโหวตติดลบ
    ผมคิดว่าในสมการง่าย ๆ มีการสลับพจน์กัน และใส่เครื่องหมายบวก/ลบผิด ดังนั้นจึงเขียนบล็อกและ โพสต์ลง reddit แต่หลายคนรวมถึงพนักงาน reddit บอกว่าผิดทั้งหมด และอัลกอริทึมทำงานตามที่ตั้งใจไว้
    เขายังบอกด้วยว่า ก่อนหน้านี้ก็มีคนสังเกตและชี้ประเด็นเดียวกันนี้เหมือนกัน แต่ทุกคนก็ถูกบอกว่าคิดผิด
    สุดท้ายผมเลยแก้โพสต์บล็อกเป็นประมาณว่า “คนที่ฉลาดกว่าผมบอกว่าอัลกอริทึมของ reddit ไม่มีข้อผิดพลาด เพียงแต่เวอร์ชันดัดแปลงของผมดูสมเหตุสมผลกว่าสำหรับผม”
    แต่แล้ว 3 ปีต่อมาในปี 2014 ก็มีการคอมมิตแก้ในซอร์สโค้ดของ reddit ด้วยการแก้แบบเดียวกับที่ผม และคนก่อนหน้าผม เสนอมาโดยตลอด: https://github.com/reddit-archive/reddit/commit/50d35de04b92...
    โอเพนซอร์สช่วยให้มีสายตาจำนวนมากช่วยกันหา bug ได้ แต่บางครั้งถึงคุณจะหา bug เจอ ก็โน้มน้าวใครไม่ได้อยู่ดี แน่นอนว่า reddit ปิดโค้ดไปแล้วในปี 2017
    สุดท้ายแล้วในแอปของผมก็ไม่ได้ใส่ทั้งฟีเจอร์จัดอันดับที่เดิมตั้งใจจะคัดลอกมา และไม่ได้ใส่ระบบโหวตด้วย

    • ตอนเป็นเด็กฝึกงานที่ Yahoo ราวปี 2008 ผมก็เคยเจออะไรคล้ายกันตอนทำเครื่องมือภายในสำหรับสร้าง OAuth 1.0 URL
      ต้องเข้ารหัสค่าหลายอย่างใน query parameter และมีพารามิเตอร์บางตัวที่ในทางปฏิบัติต้องถูกเข้ารหัสซ้ำสองรอบ ดังนั้นเครื่องมือของผมก็ทำแบบนั้น แต่วิศวกรผู้ทำ implementation ยืนกรานว่าเครื่องมือของผมผิด ยกเรื่องที่ผมเป็นเด็กฝึกงานขึ้นมา และถึงขั้นหยิบสเปก OAuth มาอ้างพร้อมตีความแบบฝืน ๆ ว่า implementation ของเขาถูก ส่วนผมอ่านผิด
      สุดท้ายต้องตาม Eran Hammer-Lahav มายืนยันก่อนจึงได้ข้อสรุปว่าผมถูกต้อง และตอนนั้นเองวิศวกรคนนั้นถึงยอมรับว่าใช่ แน่นอนว่าต้องเป็นแบบนั้นอยู่แล้ว แต่ก็ไม่มีการยอมรับหรือขอโทษใด ๆ ต่อการโจมตีตัวบุคคลที่เกิดขึ้นหลายวันก่อนหน้า
      มันทำให้ผมได้บทเรียนสำคัญว่า คนที่อาวุโสกว่าก็ไม่ได้ถูกเสมอไป และตอนนี้โดยมากผมมักเป็นฝ่ายที่อาวุโสกว่าแล้ว แต่ก็พยายามเตือนตัวเองเรื่องนี้ทุกวัน
    • ผมทำงานอยู่ที่บริษัทระดับ FAANG และตกใจมากที่รู้ว่าเรื่องแบบนี้เกิดขึ้นบ่อยแค่ไหน
      แค่เป็น “คนที่ใส่ log ไปทั่ว codebase แล้วค่อย ๆ ไล่เหตุผลทีละขั้น” ก็สร้างอาชีพที่ยาวนานและมีอิทธิพลได้แล้ว หลายครั้งแม้ทำในระดับพื้นฐานมาก ๆ ก็ยังเจอการแก้ปัญหาน่าทึ่งสำหรับปัญหาเก่า ๆ
      แต่ก็มักมีเกมการเมืองตามมามากเช่นกัน ปฏิกิริยาแรกของคนส่วนใหญ่คือปฏิเสธ แล้วหลังจากนั้นก็มักแย่ลงอีก จะมีแค่ 1-2 คนที่มองว่า “อ๋อ งั้นก็แก้สิ” ส่วนบางคนจะเขียนอีเมล cc ไปถึงหัวหน้าของหัวหน้าของหัวหน้า โดยใช้ถ้อยคำสวยหรูประมาณว่า “คุณยังคำนึงถึง concurrency / memory management / เรื่องอื่น ๆ ไม่เพียงพอ”
      เวลานั้นควรรอเงียบ ๆ อย่าไปปะทะหรือบ่น ถ้าไม่มีอะไรเกิดขึ้นและฝ่ายผู้นำก็ไม่ถามอะไร แต่เพื่อนร่วมงานเริ่มถามกันเอง ก็ควรวางแผนย้ายทีมจะดีกว่า
    • เมื่อกี้ผมเพิ่งไปดูโค้ดมา แล้วมันผิดแบบชัดเจนมากจริง ๆ คงน่าหงุดหงิดมากแน่ ๆ
    • พอมองจากช่วงไม่กี่เดือนที่ผ่านมา ก็ไม่ได้แปลกใจเลยที่ปฏิสัมพันธ์กับพนักงาน reddit จะออกมาในลักษณะนั้น
  • มีการพูดคุยที่น่าสนใจเกี่ยวกับ 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 อย่างไร

    • ปรากฏว่ามีคนคิดเรื่องนี้ไว้แล้วจริง ๆ โดยเฉพาะคือ Google และไอเดียนี้อยู่ใน flaxformer อย่างน้อยตั้งแต่เดือนพฤศจิกายน 2021
      https://github.com/google/flaxformer/blame/ee62754ebe5a5eeb1...
      ในคอมเมนต์เขียนไว้ว่า “ฟังก์ชัน softmax ที่มี virtual logit เพิ่มเข้ามาเท่ากับ 0 เพื่อความเข้ากันได้กับโมเดลบางตัวที่เทรนไว้ก่อนหน้า ซึ่งเทียบเท่ากับการเพิ่ม 1 เข้าไปในตัวส่วน ในบริบทของ attention มันทำให้สามารถไม่มองอะไรเลยได้”
      มันคือ softmax แบบดัดแปลงแบบเดียวกับในโพสต์นี้เป๊ะ ๆ ส่วนทำไมถึงถูกมองข้ามในที่สาธารณะก็คงต้องรอดูกันต่อไป อาจเป็นเพราะผลไม่ค่อยดี แค่มันถูกกลบไป หรือ Google ไม่ได้ผลักดันมันก็ได้
    • ขาดการตรวจสอบที่สำคัญที่สุดไป นั่นคือ ผลลัพธ์
      ไม่ได้ลองทำจริง แค่คิดว่าน่าจะเวิร์กเท่านั้น การแก้ softmax ที่ง่ายขนาดนี้ไม่น่าจะใช้เวลาตรวจสอบนานนัก การที่ไม่ได้ลองก่อนเผยแพร่จึงค่อนข้างน่าอาย
    • คำอธิบายว่า “ทำไมไม่มีใครคิดได้? เพราะผู้เขียนคุ้นกับ softmax อย่างลึกซึ้งจากนอกวงการแมชชีนเลิร์นนิง” ฟังดูน่าสงสัย
      softmax เป็นสิ่งที่ชุมชนแมชชีนเลิร์นนิงเข้าใจกันดีมากอยู่แล้ว เป็นเทคนิคที่ใช้กันทั่วไปมาก และคุณสมบัติแบบนี้ก็เป็นที่รู้จักกันดี โอกาสที่ไม่มีใครคิดถึงเลยจึงดูต่ำ
      ถึงอย่างนั้นก็เป็นไปได้ว่าธรรมเนียมการใช้ softmax ในปัจจุบันถูกเลือกมาแบบบังเอิญ และผู้เขียนก็ชี้ข้อเสียของมันได้ถูกจริง
    • อาจเป็นเพราะผลกระทบของปัญหานี้ค่อนข้างละเอียดอ่อน
      ต่อให้การวินิจฉัยถูกต้อง LLM แบบ full precision ก็อาจหลบปัญหาได้ด้วยการให้น้ำหนัก attention สูงกับโทเคนที่ไม่มีความหมาย เพื่อสร้าง attention output ที่ไม่เป็นพิษเป็นภัย
      ปัญหานี้อาจสำคัญเฉพาะตอน quantize น้ำหนักเท่านั้น และเป้าหมายของการพัฒนา LLM ระดับล้ำสมัยช่วงหลัง ๆ ก็ไม่จำเป็นต้องเป็นประสิทธิภาพด้าน quantization เสมอไป
    • ฉันอ่าน “มั่นใจ 99.44%” ว่าเป็นมุกล้อเรื่อง ความน่าจะเป็นที่ปรับเทียบผิดของ softmax
      ประมาณว่า 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 ปีก่อนไม่ได้เลย
    • การเยาะว่า “ขึ้นหน้าแรก HN” ฟังดูดูแคลน แต่ถ้าเปลี่ยนคำพูดเป็น “กำลังคุยถึงบางสิ่งที่สังเกตเห็นอย่างไม่เป็นทางการ” น้ำหนักของคำดูแคลนนั้นก็หายไป
      เป้าหมายอาจเป็นทั้งการให้ข้อมูลและความเพลิดเพลิน หลายคนสนุกกับการถกแบบหลวม ๆ รอบ ๆ ประเด็นหลัก และผู้เขียนเองก็อาจชอบแบบนั้นมากกว่าน้ำเสียงเชิงคลินิกและเป็นทางการของบทความวิชาการ
    • เผื่อใครสนใจ มีคนชี้ว่ามีวิธีหลบปัญหานี้แบบเลือกใช้ได้อยู่ใน PyTorch Multihead Attention API
      แต่ก็น่าหงุดหงิดนิดหน่อยที่กว่าจะเห็นข้อมูลนั้น ต้องไถข้ามคอมเมนต์บ่นนอกประเด็น 200 ข้อก่อน
  • ฉันเคยลองการทดลองคล้าย ๆ กันมาแล้ว และในเซ็ตอัปของฉันมันไม่ช่วย
    ฉันไม่ได้ยืนยันว่าไม่มีบั๊กอะไรเลย แต่ดูเหมือนว่า การทำ attention ไปยังตำแหน่งปัจจุบัน จะช่วยแก้ปัญหานี้ได้ระดับหนึ่ง เวลาที่ไม่ควรพูดอะไร มันก็แค่ส่งออกค่าของตำแหน่งปัจจุบันออกมา
    พูดให้แม่นคือ ฉันไม่ได้เพิ่ม 1 เข้าไปในตัวส่วนของ softmax ตรง ๆ แต่ต่อ attention sink ซึ่งเป็นพารามิเตอร์ที่เรียนรู้ได้เข้าไปก่อน QK แล้วค่อยเอาออกหลัง softmax เพื่อให้ตอนคูณกับ V แล้วผลรวมไม่จำเป็นต้องเป็น 1
    ฉันยังลองทั้งแบบที่มองตำแหน่งปัจจุบันและไม่มอง รวมถึงแบบที่สร้าง sink ด้วย feedforward network ตามแต่ละตำแหน่งแทนการใช้พารามิเตอร์ที่เรียนรู้ได้ ในเซ็ตอัปของฉันทั้งสองทางไม่ได้สร้างความต่างมากนัก แต่ก็มีองค์ประกอบแปลก ๆ อื่นปนอยู่เยอะ เลยอาจยังคุ้มที่จะลองใหม่

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