En los modelos de deep learning puede haber varias fuentes de aleatoriedad. Los parámetros del modelo, algunos vectores iniciales y algunas variables auxiliares pueden requerir un valor inicial aleatorio. Por ello, es necesario realizar ciertas acciones para que los modelos tengan la máxima reproducibilidad y el modelo se comporte igual en diferentes ejecuciones.
Lo primero es controlar las fuentes de aleatoriedad que causan que el modelo se comporte diferente en cada ejecución.
En Python, el método seed() se usa para inicializar el generador de números pseudo-aleatorios random. Cualquier generador de números pseudo-aleatorios necesita un valor inicial (seed) y por defecto el generador coge la hora actual del sistema.
A través del método seed() se puede fijar el valor inicial del generador.
import random random.seed(10) print(random.random()) random.seed(10) print(random.random())
0.5714025946899135 0.5714025946899135
Como se puede ver, fijando la semilla, el valor generado es el mismo en diferentes ejecuciones. En PyTorch con el método torch.manual_seed() se puede fijar el valor inicial o semilla de los generadores pseudo-aleatorios tanto de la CPU como la GPU.
import torch torch.manual_seed(2) print(torch.rand(2, 3)) torch.manual_seed(2) print(torch.rand(2, 3))
tensor([[0.6147, 0.3810, 0.6371], [0.4745, 0.7136, 0.6190]]) tensor([[0.6147, 0.3810, 0.6371], [0.4745, 0.7136, 0.6190]])
Después, es necesario configurar PyTorch para evitar usar algoritmos no deterministas en determinadas operaciones, de forma que múltiples llamadas a estas operaciones con la misma entrada produzcan el mismo resultado.
torch.use_deterministic_algorithms() permite configurar PyTorch para que use algoritmos deterministas en lugar de no deterministas cuando se pueda, lanzando un error si no hay un algoritmo determinista alternativo. Por ejemplo, las siguientes operaciones no deterministas, entre otras, pueden comportarse de manera determinista:
- torch.nn.Conv1d en CUDA.
- torch.nn.Conv2d en CUDA.
- torch.nn.ConvTranspose1d en CUDA.
- torch.nn.ConvTranspose2d en CUDA.
Por lo tanto, para garantizar la reproducibilidad es necesario ser consciente de las fuentes de aleatoriedad en nuestros modelos, identificarlas e intentar controlarlas.
Deja una respuesta