Las redes neuronales convolucionales han revolucionado el campo del reconocimiento de imágenes, y entre ellas, ResNet18 sigue siendo una arquitectura fundamental debido a su equilibrio entre eficiencia y precisión. Sin embargo, la forma en que se implementa esta arquitectura puede variar considerablemente según la librería utilizada. Dos de las opciones más populares en la comunidad de deep learning son Timm y Torchvision, y aunque ambas ofrecen versiones funcionales de ResNet18, existen diferencias notables en su comportamiento cuando se entrenan modelos desde cero, es decir, sin utilizar pesos preentrenados. Recientemente, un análisis realizado por Kevin Bird en su blog exploró estas diferencias a partir de experimentos con la base de datos Imagenette, un conjunto de datos derivado de ImageNet que sirve para pruebas rápidas y efectivas en clasificación de imágenes. La observación inicial fue que, tras cinco épocas de entrenamiento, el ResNet18 de Torchvision alcanzaba una precisión cercana al 78%, mientras que la versión de Timm rondaba un 72%, una brecha significativa que llamó la atención de la comunidad.
Para entender mejor esta discrepancia, primero es importante destacar que ambas librerías permiten la creación de modelos ResNet18 mediante interfaces muy similares. A pesar de esto, el rendimiento parece diferir sistemáticamente en entrenamientos sin preentrenamiento. La primera hipótesis se centró en la variabilidad propia del entrenamiento debido a la inicialización aleatoria y diferencias en el manejo de semillas. No obstante, múltiples ejecuciones repetidas evidenciaron que la brecha no se debía únicamente a la azarosidad, apuntando a una causa más técnica y profunda. El dato clave que explicaría esta diferencia está relacionado con un parámetro de inicialización llamado “zero_init_last_bn” en Timm y “zero_init_residual” en Torchvision.
Por defecto, Timm aplica esta inicialización con esta configuración activada (valor True), lo que implica que el peso del segundo BatchNorm de cada bloque residual se inicializa en cero. Contrariamente, Torchvision tiene esta opción desactivada (valor False), manteniendo estos pesos inicializados en uno. ¿Por qué es importante esta diferencia? Dentro de un bloque residual en ResNet, las capas BatchNorm regulan la activación para estabilizar y acelerar el entrenamiento. Inicializar el peso del último BatchNorm en cero hace que la rama residual produzca inicialmente una salida cercana a cero, facilitando que el flujo de la red comience como una identidad. Esto puede ser beneficioso en redes muy profundas para evitar la degradación del gradiente.
Sin embargo, en redes menos profundas o entrenamientos cortos, esta configuración puede limitar el aprendizaje rápido. Al modificar la configuración de Timm para desactivar la inicialización en cero (zero_init_last_bn=False), la precisión después de cinco épocas se acercó mucho más a la de Torchvision, alcanzando aproximadamente un 78% de exactitud. Del mismo modo, al activar la opción zero_init_residual=True en Torchvision, la precisión disminuyó a valores similares a los iniciales observados en Timm. Este experimento deja en claro que el parámetro de inicialización del segundo BatchNorm es responsable de la diferencia en el desempeño observado en entrenamientos sin pesos preentrenados. Pero esta conclusión no implica que una configuración sea objetivamente mejor que la otra en todos los casos.
El creador de Timm, Ross Wightman, explicó que aunque desactivar la inicialización en cero (manteniendo pesos en uno) puede acelerar la convergencia y aumentar la precisión en entrenamientos con pocas épocas, al entrenar durante más tiempo la versión con inicialización en cero suele superar en rendimiento final a la versión sin esta opción. Esto se debe a que la inicialización en cero actúa como una forma de regularización que estabiliza el entrenamiento prolongado, especialmente en modelos muy profundos. Además, este comportamiento afecta únicamente a entrenamientos desde cero, ya que cuando se utilizan pesos preentrenados, los valores de los BatchNorm ya han sido aprendidos y cargados, ignorando la configuración por defecto de inicialización. Por lo tanto, la discrepancia solo es relevante para investigaciones y aplicaciones en las que el modelo se entrena desde el inicio en un nuevo conjunto de datos o tareas. Otra diferencia que se observó entre ambas implementaciones fue la estructura de la red en cuanto a la activación ReLU.
Mientras que Timm incluye explícitamente dos activaciones ReLU consecutivas en los bloques básicos, Torchvision implementa una única ReLU que se reutiliza en el flujo hacia adelante. Sin embargo, esta diferencia no afecta significativamente el desempeño y se trata más de una cuestión de estilo en la implementación del código. La comparación también mostró que, en general, Torchvision inicia su segundo BatchNorm con valores altos (uno), lo que implica que el camino residual contribuye plenamente a la señal desde el comienzo, mientras que Timm comienza con una contribución nula, que luego se aprende gradualmente durante el entrenamiento. Para desarrolladores e investigadores que trabajan con deep learning, estos detalles son especialmente importantes cuando se trata de reproducir resultados, comparar experimentos o implementar modelos personalizados. Entender que diferencias aparentemente sutiles en la inicialización pueden provocar saltos de rendimiento de hasta un cinco por ciento ayuda a contextualizar resultados y evita malinterpretaciones.
En cuanto a recomendaciones prácticas, si el objetivo es entrenar rápidamente un modelo desde cero para pruebas rápidas o prototipos con pocas épocas, desactivar la inicialización en cero puede ser conveniente para acelerar el aprendizaje inicial. Sin embargo, para entrenamientos extendidos, especialmente en modelos muy profundos o para tareas que requieren mayor precisión a largo plazo, mantener la configuración de inicialización en cero es preferible ya que favorece una mejor convergencia y resultados superiores a largo plazo. Finalmente, es relevante destacar que estos ajustes son transparentes para el usuario promedio que emplea modelos preentrenados, ya que el efecto de la inicialización BatchNorm queda subsumido por los pesos preaprendidos. Pero, para quienes enseñan desde cero o realizan experimentos con arquitecturas modificadas, esta es una consideración crucial. En conclusión, la diferencia de desempeño observada entre las implementaciones de ResNet18 en las librerías Timm y Torchvision se debe principalmente a cómo inicializan los pesos de la segunda capa BatchNorm en sus bloques residuales.
La inicialización en cero en Timm crea una dinámica que inicialmente limita la contribución de la rama residual, facilitando la estabilidad durante entrenamientos largos, mientras que Torchvision mantiene esta contribución desde el principio, favoreciendo un aprendizaje más rápido en pocas épocas. Elegir entre una u otra configuración depende del contexto de entrenamiento y las necesidades específicas del proyecto. Explorar estos matices ayuda a mejorar la reproducibilidad, la interpretación y el diseño de experimentos en deep learning, resaltando la importancia de comprender las implementaciones técnicas detrás de las librerías que usamos cotidianamente. Con la profundización en detalles como este, la comunidad puede avanzar hacia modelos más robustos, eficientes y adaptados a las necesidades reales de cada aplicación.