- แสดงให้เห็นว่าแม้จะแทนที่ 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 ความคิดเห็น
ความคิดเห็นจาก Hacker News
การปรับ alpha แทบไม่ช่วยอะไร ดังนั้นอาจต้องมีการจูนไฮเปอร์พารามิเตอร์พอสมควรหรือใช้อินิทเชียลไลเซชันที่ละเอียดกว่านี้ ฉันลองทั้งค่าเริ่มต้นของ PyTorch และการอินิทแบบออร์โธโกนัลแล้ว แต่ไม่เห็นความต่าง
หรืออาจเป็นเพราะสเกลาร์ออปติไมเซอร์ที่ฉันใช้ไม่เหมาะก็ได้ ฉันใช้ออปติไมเซอร์สเกลาร์แบบคัสตอมที่ทำให้คอนเวิร์จเร็วกว่า Adam แต่กับเลเยอร์ DyT มันดูได้ผลพอๆ กับ Adam เท่านั้น
หรืออีกความเป็นไปได้คือมันอาจตามทันได้ก็ต่อเมื่อฝึกไปหลายหมื่นล้านโทเค็นแล้ว แต่ฉันไม่มีงบพอจะทดสอบนานขนาดนั้น
ถ้าแทนที่ชั้นพวกนี้ได้ ก็จะช่วยลดต้นทุนการคำนวณลงได้ค่อนข้างมาก
tanh เองก็น่าจะมีผลด้านอื่นด้วย เพราะบางครั้ง normalization กำลังช่วยแก้ปัญหา conditioning อยู่ ถึงอย่างนั้นการมีทางเลือกเพิ่มขึ้นก็เป็นเรื่องที่น่ายินดี
ขอแนะนำทั้งบทความ ResNet ต้นฉบับของ Kaiming He และคณะ รวมถึงงานต่อเนื่องในภายหลัง
สำหรับแนวทางสมัยใหม่กับ RNN งานของ DeepMind นี้ก็น่าอ่าน https://arxiv.org/abs/2303.06349
แก่นสำคัญคือค่า eigenvalue ที่ใหญ่ที่สุด หรือ spectral radius ควรอยู่ใกล้ 1 หมายความว่าเมื่อใช้การแปลงเชิงเส้นซ้ำๆ แล้ว activation จะไม่โตขึ้นหรือเล็กลง
y = x + f(x)LNinputกับLNoutputโดยยังใส่ weight และ bias ต่อท้ายtanh(a*x)ด้วยถ้าจะดูความคล้ายกัน น่าจะต้องเทียบกับผลลัพธ์ของ LayerNorm ที่เอา weight กับ bias ออกแล้วหรือเปล่า
ถึงผลลัพธ์สุดท้ายจะออกมาดีก็ไม่เป็นไร แต่ถ้าแยกดูเฉพาะส่วนที่ถูกเปลี่ยนจริงๆ ก็น่าจะเข้าใจได้ชัดขึ้นว่าเกิดอะไรขึ้น