- Se muestra que reemplazar Layer Norm/RMSNorm, que se usaba casi como algo indispensable en los Transformer, por Dynamic Tanh (DyT) puede ofrecer un rendimiento similar o mejor que los modelos tradicionales con normalización
- DyT es una operación elemento por elemento con la forma
DyT(x) = tanh(αx), y parte de la observación de que Layer Normalization dentro de un Transformer a menudo crea un mapeo de entrada-salida en forma de S parecido a tanh
- La implementación requiere apenas unas pocas líneas en PyTorch y aplica escala y sesgo a la salida de
tanh(alpha * x) con alpha, weight y bias aprendibles
- La evaluación abarca ViT, ConvNeXt, MAE, DINO, DiT, LLaMA, wav2vec 2.0, HyenaDNA y Caduceus, cubriendo visión, lenguaje, voz y modelado de secuencias de ADN
- Incluso sin ajuste adicional de hiperparámetros, en varias configuraciones logra resultados similares o mejores que sus contrapartes basadas en normalización, lo que lleva a replantear la idea de que una capa de normalización es obligatoria
Qué cambia con Dynamic Tanh
- DyT es una capa simple que reemplaza Layer Norm o RMSNorm en bloques Transformer
- La operación central es
DyT(x) = tanh(αx), aplicada elemento por elemento
- Se muestra que un Transformer sin capas de normalización también puede rendir de forma similar o incluso mejor que un Transformer tradicional con normalización
- La idea parte de la observación de que la relación entrada-salida que Layer Normalization genera con frecuencia dentro de los Transformer se parece a una función tanh escalada
Cómo se implementa
- El módulo DyT puede implementarse brevemente en 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 es un parámetro aprendible y su valor inicial se establece en 0.5
weight y bias también son parámetros aprendibles, y se aplican a la salida de tanh(alpha * x)
Observación surgida de Layer Normalization
- La Layer Normalization (LN) de los Transformer genera un mapeo de entrada-salida cercano a una función
tanh escalada
- En las capas iniciales, este mapeo suele ser mayormente lineal
- A medida que se avanza hacia capas más profundas, se vuelve más evidente la curva en forma de S característica de
tanh
- Entre los objetos observados se incluyen capas LN seleccionadas de Vision Transformer (ViT), el modelo Transformer de voz wav2vec 2.0 y Diffusion Transformer (DiT)
Alcance y resultados de la evaluación
- DyT se evaluó en varias arquitecturas y tareas
- Visión con aprendizaje supervisado: ViT, ConvNeXt
- Visión con aprendizaje autosupervisado: MAE, DINO
- Modelos de difusión: DiT
- Modelos de lenguaje de gran tamaño: LLaMA
- Voz con aprendizaje autosupervisado: wav2vec 2.0
- Modelado de secuencias de ADN: HyenaDNA, Caduceus
- En todos los casos, los Transformer con DyT muestran un rendimiento similar o mejor que sus contrapartes basadas en normalización
- El alcance de la evaluación es amplio: va desde reconocimiento hasta generación, de aprendizaje supervisado a autosupervisado, y de visión por computadora a modelos de lenguaje
Material de referencia
- Download Paper: artículo con todos los detalles de la investigación
- View on GitHub: repositorio para revisar detalles de implementación
- View Summary: resumen breve de los resultados
Transformers without Normalization fue aceptado como artículo de CVPR 2025
1 comentarios
Opiniones en Hacker News
Ajustar alpha no tuvo mucho efecto, así que quizá haga falta bastante tuning de hiperparámetros o una inicialización más sofisticada. Probé tanto la inicialización por defecto de PyTorch como la inicialización ortogonal, pero no hubo diferencia.
O quizá el optimizador escalar que uso no encaje bien. Uso un optimizador escalar personalizado que converge más rápido que Adam, pero en las capas DyT solo pareció estar a un nivel similar al de Adam.
O tal vez sea un enfoque que solo alcanza a los demás después de decenas de miles de millones de tokens, pero no tengo presupuesto para probar durante tanto tiempo.
Si se pudieran reemplazar estas capas, ayudaría a reducir bastante el costo computacional.
tanh seguramente también tendrá otros efectos, porque la normalización a veces está resolviendo problemas de condicionamiento. Aun así, se agradece tener más alternativas.
Recomiendo el artículo original de ResNet de Kaiming He y otros, así como trabajos posteriores.
Como enfoque moderno para RNN, vale la pena leer el de DeepMind: https://arxiv.org/abs/2303.06349.
La clave es que el mayor valor propio, es decir, el radio espectral, debe estar cerca de 1. Eso significa que, aunque se aplique repetidamente una transformación lineal, las activaciones no crecerán ni se reducirán.
y = x + f(x).LNinputyLNoutput, parece que también pusieron peso y sesgo después detanh(a*x).Para ver la similitud, ¿no habría que comparar con la salida de LayerNorm después de quitarle el peso y el sesgo?
Si el resultado final sale bien, no importa, pero si se observa por separado solo la parte que realmente se cambia, creo que se entendería mejor qué está pasando.