1 คะแนน โดย GN⁺ 2025-03-16 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • แสดงให้เห็นว่าแม้จะแทนที่ Layer Norm/RMSNorm ซึ่งเดิมแทบเป็นองค์ประกอบจำเป็นใน Transformer ด้วย Dynamic Tanh (DyT) ก็ยังให้ประสิทธิภาพใกล้เคียงหรือดีกว่าโมเดลแบบใช้ normalization เดิมได้
  • DyT เป็น การคำนวณแบบรายองค์ประกอบ ในรูป DyT(x) = tanh(αx) โดยเริ่มจากข้อสังเกตว่า Layer Normalization ภายใน Transformer มักสร้างการแมปอินพุต-เอาต์พุตแบบโค้งตัว S คล้าย tanh
  • การติดตั้งใช้งานทำได้ด้วยโค้ด PyTorch เพียงไม่กี่บรรทัด และใช้ alpha, weight, bias ที่เรียนรู้ได้เพื่อปรับสเกลและไบอัสให้กับเอาต์พุตของ tanh(alpha * x)
  • การประเมินครอบคลุมทั้ง ViT, ConvNeXt, MAE, DINO, DiT, LLaMA, wav2vec 2.0, HyenaDNA, Caduceus ครอบคลุมงานด้านวิชัน ภาษา เสียง และการทำโมเดลลำดับ DNA
  • แม้จะ ไม่มีการจูนไฮเปอร์พารามิเตอร์เพิ่มเติม ในหลายการตั้งค่า DyT ก็ให้ผลลัพธ์ใกล้เคียงหรือดีกว่าโมเดลเทียบเคียงที่ใช้ normalization ทำให้ต้องกลับมาทบทวนสมมติฐานที่ว่าชั้น normalization เป็นสิ่งจำเป็นเสมอ

จุดที่ Dynamic Tanh เปลี่ยนเกม

  • DyT เป็นชั้นอย่างง่ายที่ใช้แทน Layer Norm หรือ RMSNorm ในบล็อกของ Transformer
  • การคำนวณหลักคือ DyT(x) = tanh(αx) ซึ่งถูกใช้แบบรายองค์ประกอบ
  • แสดงให้เห็นว่า Transformer ที่ตัดชั้น normalization ออกไปก็ยังอาจให้ประสิทธิภาพใกล้เคียงหรือสูงกว่า Transformer แบบเดิมที่ใช้ normalization
  • จุดเริ่มต้นของแนวคิดนี้มาจากข้อสังเกตว่าความสัมพันธ์อินพุต-เอาต์พุตที่ Layer Normalization สร้างขึ้นภายใน Transformer มักคล้ายฟังก์ชัน scaled tanh

วิธีการติดตั้งใช้งาน

  • โมดูล DyT สามารถเขียนใน PyTorch ได้แบบสั้น ๆ
class DyT(nn.Module):
    def __init__(self, num_features, alpha_init_value=0.5):
        super().__init__()
        self.alpha = nn.Parameter(torch.ones(1) * alpha_init_value)
        self.weight = nn.Parameter(torch.ones(num_features))
        self.bias = nn.Parameter(torch.zeros(num_features))

    def forward(self, x):
        x = torch.tanh(self.alpha * x)
        return x * self.weight + self.bias
  • alpha เป็นพารามิเตอร์ที่เรียนรู้ได้ โดยกำหนดค่าเริ่มต้นเป็น 0.5
  • weight และ bias ก็เป็นพารามิเตอร์ที่เรียนรู้ได้เช่นกัน และถูกนำไปใช้กับเอาต์พุตของ tanh(alpha * x)

ข้อสังเกตจาก Layer Normalization

  • Layer Normalization(LN) ใน Transformer สร้างการแมปอินพุต-เอาต์พุตที่ใกล้เคียงกับฟังก์ชัน scaled tanh
  • ในชั้นต้น ๆ การแมปนี้มักใกล้เคียงเชิงเส้นเป็นส่วนใหญ่
  • เมื่อชั้นลึกขึ้น ลักษณะ โค้งรูปตัว S ซึ่งเป็นเอกลักษณ์ของฟังก์ชัน tanh จะยิ่งเด่นชัดขึ้น
  • สิ่งที่นำมาสังเกตรวมถึงชั้น LN ที่คัดเลือกจาก Vision Transformer(ViT), โมเดล Transformer ด้านเสียงอย่าง wav2vec 2.0 และ Diffusion Transformer(DiT)

ขอบเขตการประเมินและผลลัพธ์

  • DyT ถูกประเมินกับสถาปัตยกรรมและงานหลายประเภท
    • วิชันแบบมีผู้สอน: ViT, ConvNeXt
    • วิชันแบบเรียนรู้ด้วยตนเอง: MAE, DINO
    • โมเดล diffusion: DiT
    • โมเดลภาษาขนาดใหญ่: LLaMA
    • เสียงแบบเรียนรู้ด้วยตนเอง: wav2vec 2.0
    • การทำโมเดลลำดับ DNA: HyenaDNA, Caduceus
  • ในทุกกรณี Transformer ที่ใช้ DyT แสดงประสิทธิภาพใกล้เคียงหรือดีกว่าโมเดลเทียบเคียงที่อิง normalization
  • ขอบเขตการประเมินครอบคลุมกว้าง ตั้งแต่งานรู้จำไปจนถึงงานสร้างข้อมูล ตั้งแต่การเรียนรู้แบบมีผู้สอนไปจนถึงแบบเรียนรู้ด้วยตนเอง และตั้งแต่วิชันคอมพิวเตอร์ไปจนถึงโมเดลภาษา

เอกสารอ้างอิง

  • Download Paper: งานวิจัยฉบับเต็มที่มีรายละเอียดทั้งหมด
  • View on GitHub: ที่เก็บโค้ดสำหรับดูรายละเอียดการติดตั้งใช้งาน
  • View Summary: สรุปผลการวิจัยแบบสั้น
  • Transformers without Normalization ได้รับการตีพิมพ์เป็นบทความใน CVPR 2025

1 ความคิดเห็น

 
GN⁺ 2025-03-16
ความคิดเห็นจาก Hacker News
  • ถ้าเป็นจริงก็ถือว่าเป็นการ ปรับปรุงแบบค่อยเป็นค่อยไป ที่ดีพอสมควร ดูเหมือนไม่ได้เพิ่มประสิทธิภาพของโมเดลอย่างมีนัยสำคัญ แต่มีต้นทุนการคำนวณต่ำกว่า RMSNorm ที่ LLM ล้ำสมัยส่วนใหญ่ใช้อยู่ในปัจจุบัน จึงอาจทำให้การฝึกเร็วขึ้นและถูกลง
    • อย่างไรก็ตาม สัดส่วนของ RMSNorm ในปริมาณการคำนวณทั้งหมดของ Transformer นั้นค่อนข้างเล็ก โดยปกติการทำ reduction สามารถฟิวส์เข้ากับการคำนวณก่อนหน้าและถัดไปได้
    • ฉันเพิ่งลองใช้กับเบนช์มาร์กการฝึก Transformer ส่วนตัวของฉัน ผลน่าผิดหวังมาก มันคอนเวิร์จช้ากว่าตอนใช้ RMSNorm มาก
      การปรับ alpha แทบไม่ช่วยอะไร ดังนั้นอาจต้องมีการจูนไฮเปอร์พารามิเตอร์พอสมควรหรือใช้อินิทเชียลไลเซชันที่ละเอียดกว่านี้ ฉันลองทั้งค่าเริ่มต้นของ PyTorch และการอินิทแบบออร์โธโกนัลแล้ว แต่ไม่เห็นความต่าง
      หรืออาจเป็นเพราะสเกลาร์ออปติไมเซอร์ที่ฉันใช้ไม่เหมาะก็ได้ ฉันใช้ออปติไมเซอร์สเกลาร์แบบคัสตอมที่ทำให้คอนเวิร์จเร็วกว่า Adam แต่กับเลเยอร์ DyT มันดูได้ผลพอๆ กับ Adam เท่านั้น
      หรืออีกความเป็นไปได้คือมันอาจตามทันได้ก็ต่อเมื่อฝึกไปหลายหมื่นล้านโทเค็นแล้ว แต่ฉันไม่มีงบพอจะทดสอบนานขนาดนั้น
  • ถ้าใช้ฟอร์แมตความแม่นยำต่ำอย่าง float8 โดยปกติจะต้องยก activation ขึ้นเป็น BF16 ก่อนทำ normalization ดังนั้นยิ่งลดความแม่นยำลง ต้นทุนการคำนวณที่ชั้น normalization กินอยู่ก็ยิ่งมีสัดส่วนมากขึ้น
    ถ้าแทนที่ชั้นพวกนี้ได้ ก็จะช่วยลดต้นทุนการคำนวณลงได้ค่อนข้างมาก
  • ต้องอ่านรายละเอียดเพิ่ม แต่การ ตัด normalization ออก อาจมีความหมายมาก เวลาลองสถาปัตยกรรมใหม่ การทำให้เครือข่ายถูก normalization อย่างเหมาะสมมักเป็นเรื่องจุกจิกเสมอ
    tanh เองก็น่าจะมีผลด้านอื่นด้วย เพราะบางครั้ง normalization กำลังช่วยแก้ปัญหา conditioning อยู่ ถึงอย่างนั้นการมีทางเลือกเพิ่มขึ้นก็เป็นเรื่องที่น่ายินดี
  • ถ้าอย่างนั้น vanishing gradient ก็ไม่ใช่ปัญหาอีกต่อไปแล้วหรือ?
    • ถ้าอินิทเชียลไลซ์เลเยอร์อย่างเหมาะสม ก็สามารถรักษาขนาดของ gradient ไม่ให้หายไปหรือระเบิดได้แม้ในเครือข่ายลึกๆ ตัวอย่างเช่น ถ้าทำให้เอาต์พุตของแต่ละเลเยอร์มีค่าเฉลี่ยเป็น 0 และส่วนเบี่ยงเบนมาตรฐานเป็น 1 gradient ก็จะอยู่ในช่วงที่สมเหตุสมผล
      ขอแนะนำทั้งบทความ ResNet ต้นฉบับของ Kaiming He และคณะ รวมถึงงานต่อเนื่องในภายหลัง
      สำหรับแนวทางสมัยใหม่กับ RNN งานของ DeepMind นี้ก็น่าอ่าน https://arxiv.org/abs/2303.06349
      แก่นสำคัญคือค่า eigenvalue ที่ใหญ่ที่สุด หรือ spectral radius ควรอยู่ใกล้ 1 หมายความว่าเมื่อใช้การแปลงเชิงเส้นซ้ำๆ แล้ว activation จะไม่โตขึ้นหรือเล็กลง
    • ผมมองว่า ResNet แก้ปัญหา vanishing gradient ไปได้เกือบหมดแล้ว ส่วน exploding gradient มักจัดการด้วยการอินิทพารามิเตอร์ที่ดีและ normalization งานนี้ก็เหมือนกำลังเสนอทางเลือกแทน normalization
    • เป็นคำถามที่ดี นั่นเป็นปัญหาในยุคที่ใช้ tanh เป็น activation function และก่อนจะมี residual connection กับชั้น normalization การใช้ tanh แบบ normalization ภายใต้ activation function แบบอื่นและมี residual connection ดูจะใช้ได้ดี
    • ตามที่เห็นในภาพ Transformer เรียนรู้ residual ในรูปแบบ y = x + f(x)
  • ไม่แน่ใจว่ามีแค่ฉันที่รู้สึกแบบนี้ไหม แต่กราฟในบทความดูเหมือนจะเปรียบเทียบ LNinput กับ LNoutput โดยยังใส่ weight และ bias ต่อท้าย tanh(a*x) ด้วย
    ถ้าจะดูความคล้ายกัน น่าจะต้องเทียบกับผลลัพธ์ของ LayerNorm ที่เอา weight กับ bias ออกแล้วหรือเปล่า
    ถึงผลลัพธ์สุดท้ายจะออกมาดีก็ไม่เป็นไร แต่ถ้าแยกดูเฉพาะส่วนที่ถูกเปลี่ยนจริงๆ ก็น่าจะเข้าใจได้ชัดขึ้นว่าเกิดอะไรขึ้น
    • จาก implementation ดูเหมือนว่าจะคำนวณ tanh ก่อน แล้วค่อยใส่ weight และ bias
  • ในทางปฏิบัติมันมีความหมายอย่างไร?
    • ตามบทคัดย่อ การใส่ DyT ทำให้ Transformer แบบไม่มี normalization สามารถทำผลงานได้เทียบเท่าหรือดีกว่าโมเดลคู่เทียบที่มี normalization โดยส่วนใหญ่ไม่ต้องจูนไฮเปอร์พารามิเตอร์เพิ่ม