1 puntos por GN⁺ 2025-03-16 | 1 comentarios | Compartir por WhatsApp
  • 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

 
GN⁺ 2025-03-16
Opiniones en Hacker News
  • Si es cierto, es una mejora incremental bastante buena. No parece aumentar de forma significativa el rendimiento del modelo, pero tiene un costo computacional menor que RMSNorm, que usan la mayoría de los LLM de vanguardia actuales, así que el entrenamiento podría volverse más rápido y barato.
    • Sin embargo, dentro del cómputo total de un Transformer, la proporción de RMSNorm es bastante pequeña. Por lo general, las operaciones de reducción pueden fusionarse con las operaciones anteriores y posteriores.
    • Acabo de aplicarlo a mi benchmark personal de entrenamiento de Transformers y el resultado fue muy decepcionante. Converge mucho más lento que cuando uso RMSNorm.
      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.
  • Cuando se usan formatos de baja precisión como float8, normalmente hay que subir las activaciones a BF16 antes de la normalización. Por eso, mientras más baja es la precisión, mayor se vuelve la proporción de cómputo que ocupan las capas de normalización.
    Si se pudieran reemplazar estas capas, ayudaría a reducir bastante el costo computacional.
  • Tendría que leer los detalles, pero eliminar la normalización puede ser muy significativo. Al probar arquitecturas nuevas, siempre es engorroso ajustar todo para que la red quede bien normalizada.
    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.
  • Entonces, ¿el desvanecimiento del gradiente ya no es un problema?
    • Si las capas se inicializan adecuadamente, se puede evitar que la magnitud de los gradientes se desvanezca o explote incluso en redes profundas. Por ejemplo, si se ajusta la salida de cada capa para que tenga media 0 y desviación estándar 1, los gradientes también quedan en un rango razonable.
      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.
    • Creo que ResNet prácticamente resolvió el desvanecimiento del gradiente. La explosión del gradiente normalmente se maneja con una buena inicialización de parámetros y normalización. Este artículo, en cierto modo, propone una alternativa a la normalización.
    • Buena pregunta. Ese era un problema de la época en que se usaba tanh como función de activación, y antes de que existieran las conexiones residuales y las capas de normalización. Usar tanh como una especie de normalización, teniendo otras funciones de activación y conexiones residuales, parece estar bien.
    • Como se ve en la figura, un Transformer aprende residuos. Tiene la forma y = x + f(x).
  • No sé si solo me parece a mí, pero en las gráficas del paper, al comparar LNinput y LNoutput, parece que también pusieron peso y sesgo después de tanh(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.
    • Viendo la implementación, parece que después de calcular tanh aplican peso y sesgo.
  • En términos prácticos, ¿qué implica?
    • Según el resumen, al incorporar DyT, los Transformers sin normalización pueden igualar o superar el rendimiento de sus modelos equivalentes normalizados, en la mayoría de los casos sin tuning de hiperparámetros.