Transformers without Normalization paper笔记

paper主要提出了在transformer中替代layer norm的方案,dynamic tanh函数,它是逐元素计算的,避免了layer norm在计算中需要计算channel整体的均值,方差,进行reduce和broad cast计算,天然并行,且硬件友好。
这篇论文专注于 Transformer 中的 LayerNorm 替代,不涉及 CNN 中使用的 BatchNorm 或其他归一化方法。DyT 的设计完全围绕“token 向量级别的标准化”,所以在 CNN 上并不适用。

先复习一下什么是layer norm.

Transformer 中输入通常是:[B, T, C]
B: batch size (样本数)
T: token个数(LLM中是词数,图像中是patch数)
C: channel, 在token中指的是向量维度,也就是embedding dim.

layer norm是对每个 token 的向量 [C] 做归一化,即对最后一个维度做均值/方差计算。

输入形状: [B, T, C]
LayerNorm 就是对每个 [x_t1, x_t2, ..., x_tC] 做归一化
                            ↑
                          每个 token 的 channel 向量

layer norm原理:
在这里插入图片描述
下面进入DyT的介绍,也就是paper部分,然后讨论为什么DyT比layer norm更快。

Abstract

归一化层在现代神经网络中无处不在,长期以来被认为是不可或缺的。
本研究表明,即使不使用归一化层,Transformer 也能通过一种非常简单的技术达到相同甚至更好的性能。
我们提出了一种逐元素操作,称为 Dynamic Tanh(DyT),其形式为:
DyT(x)=tanh(αx)
它可直接替代 Transformer 中的归一化层。

DyT 的灵感来自这样一个观察:在 Transformer 中,LayerNorm 的输入输出关系常常呈现类似 tanh 的 S 形曲线。通过使用 DyT,不含归一化层的 Transformer 模型在各种任务和设置下都能达到甚至超越原有性能,且几乎无需调参。

Introduction

在过去十年中,归一化层已经成为现代神经网络中最基础的组成部分之一。这一切始于 2015 年提出的 Batch Normalization(BN),它显著加快并稳定了视觉识别模型的收敛,并迅速被各类模型采纳。此后,针对不同架构和领域,研究者又提出了许多归一化层的变体,比如:

LayerNorm(LN)
InstanceNorm

### 不使用归一化层的Transformer模型工作原理 Transformer架构的核心在于其自注意力机制和前馈网络的设计。然而,在标准的Transformer结构中,Layer Normalization (LN) 是不可或缺的一部分,它有助于稳定训练过程并加速收敛[^1]。如果移除归一化层,则需要重新设计某些组件来维持模型稳定性。 #### 替代方案及其影响 当不使用任何类型的归一化(如 Layer Norm 或 RMSNorm)时,可以考虑以下几种替代策略: 1. **权重初始化调整**: 更加精细地设置初始权重分布能够帮助缓解梯度消失或爆炸问题。例如采用 Xavier 初始化或者 Kaiming He 初始化方法可能会有所帮助。 2. **残差连接增强**: 增强版的跳跃连接可能被引入以进一步促进信息流动。一种方式是在每个子层之后增加额外的比例因子α(0<α≤1),从而控制输入信号强度相对于转换后的输出比例关系。 3. **激活函数优化**: 使用更平滑且具有良好导数特性的非线性激活单元比如GeLU(Gaussian Error Linear Unit), Swish等代替ReLU作为默认选项也可能改善效果。 4. **正则项加强**: 添加更强力道的dropout或者其他形式随机失活技术可抑制过拟合风险同时保持泛化能力不变甚至有所提升。 以下是基于PyTorch的一个简单例子展示如何构建无规整化的基础版本transformer编码器: ```python import torch.nn as nn class NoNormEncoderLayer(nn.Module): def __init__(self, d_model=512, nhead=8, dim_feedforward=2048, dropout=0.1): super().__init__() self.self_attn = nn.MultiheadAttention(d_model, nhead, dropout=dropout) # Implementation of Feedforward model without any normalization layer. self.linear1 = nn.Linear(d_model, dim_feedforward) self.dropout = nn.Dropout(dropout) self.linear2 = nn.Linear(dim_feedforward, d_model) self.activation = nn.GELU() # Using GELU instead of ReLU def forward(self, src): attn_output, _ = self.self_attn(src, src, src) output = src + attn_output # Simple residual connection ff_output = self.linear2(self.dropout(self.activation(self.linear1(output)))) final_output = output + ff_output # Another simple residual connection return final_output ``` 尽管上述代码片段提供了一个理论上的解决方案,但在实际应用过程中仍然存在诸多挑战。由于缺乏有效的特征尺度约束手段,可能导致数值不稳定现象加剧;另外,缺少显式的均值方差调节步骤也会影响最终表现质量。因此,在大多数情况下还是推荐保留某种形态的规范化操作以便获得更好的实验成果。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

蓝羽飞鸟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值