1 điểm bởi GN⁺ 2025-03-16 | 1 bình luận | Chia sẻ qua WhatsApp
  • Cho thấy rằng việc thay Dynamic Tanh (DyT) vào vị trí Layer Norm/RMSNorm vốn được dùng như thành phần gần như thiết yếu trong Transformer có thể đạt hiệu năng tương đương hoặc tốt hơn các mô hình chuẩn hóa hiện có
  • DyT là một phép toán theo từng phần tử có dạng DyT(x) = tanh(αx), xuất phát từ quan sát rằng Layer Normalization trong Transformer thường tạo ra ánh xạ đầu vào–đầu ra dạng chữ S tương tự tanh
  • Việc triển khai chỉ ở mức vài dòng PyTorch, áp dụng scale và bias lên đầu ra tanh(alpha * x) bằng các tham số học được alpha, weight, bias
  • Đánh giá bao quát toàn bộ các mảng mô hình hóa thị giác, ngôn ngữ, âm thanh và chuỗi DNA, từ ViT, ConvNeXt, MAE, DINO, DiT, LLaMA, wav2vec 2.0, HyenaDNA, Caduceus
  • Ngay cả khi không tinh chỉnh hyperparameter riêng, nhiều thiết lập vẫn cho kết quả tương đương hoặc tốt hơn các mô hình đối ứng dựa trên chuẩn hóa, khiến giả định rằng lớp chuẩn hóa là bắt buộc cần được xem xét lại

Điểm mà Dynamic Tanh thay đổi

  • DyT là một lớp đơn giản thay thế Layer Norm hoặc RMSNorm trong block Transformer
  • Phép toán cốt lõi là DyT(x) = tanh(αx), được áp dụng theo từng phần tử
  • Cho thấy Transformer đã loại bỏ lớp chuẩn hóa vẫn có thể đạt hiệu năng tương đương hoặc cao hơn Transformer chuẩn hóa hiện có
  • Ý tưởng bắt nguồn từ quan sát rằng quan hệ đầu vào–đầu ra mà Layer Normalization trong Transformer thường tạo ra giống với hàm scaled tanh

Cách triển khai

  • Module DyT có thể được triển khai ngắn gọn trong 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 là tham số có thể học được và được đặt giá trị khởi tạo là 0.5
  • weightbias cũng là các tham số có thể học được, được áp dụng lên đầu ra tanh(alpha * x)

Quan sát từ Layer Normalization

  • Layer Normalization(LN) của Transformer tạo ra ánh xạ đầu vào–đầu ra gần với hàm scaled tanh
  • Ở các lớp đầu, ánh xạ này nhìn chung gần tuyến tính
  • Càng đi vào các lớp sâu, đường cong chữ S đặc trưng của hàm tanh càng xuất hiện rõ hơn
  • Đối tượng quan sát bao gồm Vision Transformer(ViT), mô hình Transformer âm thanh wav2vec 2.0, và các lớp LN được chọn trong Diffusion Transformer(DiT)

Phạm vi đánh giá và kết quả

  • DyT được đánh giá trên nhiều kiến trúc và tác vụ
    • Thị giác học có giám sát: ViT, ConvNeXt
    • Thị giác tự giám sát: MAE, DINO
    • Mô hình khuếch tán: DiT
    • Mô hình ngôn ngữ lớn: LLaMA
    • Âm thanh tự giám sát: wav2vec 2.0
    • Mô hình hóa chuỗi DNA: HyenaDNA, Caduceus
  • Trong mọi trường hợp, Transformer áp dụng DyT cho thấy hiệu năng tương đương hoặc tốt hơn các mô hình đối ứng dựa trên chuẩn hóa
  • Phạm vi đánh giá trải rộng từ nhận thức đến sinh tạo, từ học có giám sát đến tự giám sát, từ thị giác máy tính đến mô hình ngôn ngữ

Tài liệu tham khảo

  • Download Paper: bài báo chứa toàn bộ chi tiết của nghiên cứu
  • View on GitHub: repository để xem chi tiết triển khai
  • View Summary: tóm tắt ngắn gọn kết quả nghiên cứu
  • Transformers without Normalization được đăng ký là bài báo tại CVPR 2025

1 bình luận

 
GN⁺ 2025-03-16
Ý kiến trên Hacker News
  • Nếu đúng thì đây là một cải tiến gia tăng khá tốt. Có vẻ nó không làm tăng hiệu năng mô hình một cách đáng kể, nhưng chi phí tính toán thấp hơn RMSNorm mà hầu hết LLM tiên tiến hiện nay đang dùng, nên việc huấn luyện có thể nhanh hơn và rẻ hơn
    • Tuy nhiên, trong tổng lượng tính toán của Transformer, tỷ trọng của RMSNorm khá nhỏ. Thông thường các phép rút gọn có thể được hợp nhất với các phép toán trước và sau nó
    • Tôi vừa thử áp dụng vào benchmark huấn luyện Transformer cá nhân của mình, và kết quả rất đáng thất vọng. Nó hội tụ chậm hơn nhiều so với khi dùng RMSNorm
      Việc điều chỉnh alpha không có mấy tác dụng, nên có thể cần tinh chỉnh siêu tham số đáng kể hoặc khởi tạo tinh vi hơn. Tôi đã thử cả khởi tạo mặc định của PyTorch lẫn khởi tạo trực giao, nhưng không có khác biệt
      Hoặc cũng có thể bộ tối ưu hóa scalar tôi dùng không phù hợp. Tôi dùng một bộ tối ưu hóa scalar tùy chỉnh giúp hội tụ nhanh hơn Adam, nhưng với lớp DyT thì nó chỉ có vẻ ngang mức Adam
      Cũng có thể đây là kiểu phải sau hàng chục tỷ token mới bắt kịp, nhưng tôi không có ngân sách để thử lâu đến vậy
  • Khi dùng các định dạng độ chính xác thấp như float8, thường phải nâng activation lên BF16 trước khi chuẩn hóa. Vì vậy càng đi xuống độ chính xác thấp hơn, tỷ trọng tính toán của lớp chuẩn hóa càng tăng
    Nếu có thể thay thế các lớp như vậy, việc này sẽ giúp giảm chi phí tính toán khá đáng kể
  • Tôi cần đọc kỹ hơn, nhưng loại bỏ chuẩn hóa có thể có ý nghĩa lớn. Khi thử kiến trúc mới, việc chỉnh để mạng được chuẩn hóa đúng cách luôn khá phiền
    tanh chắc chắn cũng sẽ có các ảnh hưởng khác. Vì đôi khi chuẩn hóa đang giải quyết vấn đề điều kiện hóa. Dù vậy, có thêm nhiều lựa chọn thay thế là điều đáng hoan nghênh
  • Vậy gradient biến mất giờ không còn là vấn đề nữa sao?
    • Nếu khởi tạo các lớp phù hợp, ngay cả trong mạng sâu cũng có thể giữ cho độ lớn gradient không bị biến mất hoặc bùng nổ. Ví dụ, nếu đặt trung bình đầu ra của mỗi lớp là 0 và độ lệch chuẩn là 1, gradient cũng sẽ nằm trong phạm vi hợp lý
      Tôi khuyên nên đọc bài báo ResNet gốc của Kaiming He và cộng sự cùng các bài tiếp theo
      Với cách tiếp cận hiện đại cho RNN, bài của DeepMind tại https://arxiv.org/abs/2303.06349 đáng để đọc
      Điểm cốt lõi là trị riêng lớn nhất, tức bán kính phổ, nên ở gần 1. Điều đó có nghĩa là khi áp dụng lặp lại biến đổi tuyến tính, activation sẽ không tăng lên hoặc nhỏ đi
    • Có thể xem ResNet đã gần như giải quyết vấn đề gradient biến mất. Gradient bùng nổ thường được xử lý bằng khởi tạo tham số tốt và chuẩn hóa. Bài này về cơ bản đề xuất một phương án thay thế cho chuẩn hóa
    • Câu hỏi hay. Đó là vấn đề của thời kỳ dùng tanh làm hàm kích hoạt, và trước khi có kết nối dư cùng các lớp chuẩn hóa. Việc dùng tanh như chuẩn hóa trong bối cảnh có các hàm kích hoạt khác và kết nối dư trông có vẻ ổn
    • Như trong hình, Transformer học phần . Có dạng y = x + f(x)
  • Không biết có phải chỉ mình tôi thấy vậy không, nhưng đồ thị trong bài có vẻ so sánh LNinput với LNoutput trong khi sau tanh(a*x) vẫn gắn thêm trọng số và bias
    Nếu muốn xem độ tương đồng, chẳng phải nên so với kết quả sau khi bỏ trọng số và bias khỏi đầu ra LayerNorm sao?
    Nếu kết quả cuối cùng tốt thì không sao, nhưng nếu tách riêng phần thực sự được thay thế, có lẽ sẽ hiểu rõ hơn chuyện gì đang diễn ra
    • Nhìn vào phần triển khai, có vẻ họ áp dụng trọng số và bias sau khi tính tanh
  • Về mặt thực tiễn thì điều này có ý nghĩa gì?
    • Theo phần tóm tắt, nếu đưa DyT vào, Transformer không chuẩn hóa có thể đạt hiệu năng ngang bằng hoặc tốt hơn các mô hình đối ứng có chuẩn hóa, hầu như không cần tinh chỉnh siêu tham số