RStudio AI Blog: luz 0.3.0

Estamos felices de anunciar que luz la versión 0.3.0 ahora está en CRAN. Esta versión trae algunas mejoras al buscador de tasa de aprendizaje aportado por primera vez por chris mcmaster. Como no teníamos una publicación de lanzamiento de 0.2.0, también destacaremos algunas mejoras que se remontan a esa versión.

Qué luz?

Dado que es un paquete relativamente nuevo, comenzamos esta publicación de blog con un resumen rápido de cómo luz obras. Si ya sabes lo que luz es decir, siéntase libre de pasar a la siguiente sección.

luz es una API de alto nivel para torch que tiene como objetivo encapsular el ciclo de entrenamiento en un conjunto de piezas de código reutilizables. Reduce el repetitivo requerido para entrenar un modelo con torchevita la tendencia a errores zero_grad()backward()step() secuencia de llamadas, y también simplifica el proceso de mover datos y modelos entre CPU y GPU.

Con luz puedes tomar tu torch nn_module()por ejemplo, el perceptrón de dos capas definido a continuación:

modnn <- nn_module(
  initialize = function(input_size) ,
  forward = function(x) 
)

y ajústelo a un conjunto de datos específico así:

fitted <- modnn %>% 
  setup(
    loss = nn_mse_loss(),
    optimizer = optim_rmsprop,
    metrics = list(luz_metric_mae())
  ) %>% 
  set_hparams(input_size = 50) %>% 
  fit(
    data = list(x_train, y_train),
    valid_data = list(x_valid, y_valid),
    epochs = 20
  )

luz entrenará automáticamente su modelo en la GPU si está disponible, mostrará una bonita barra de progreso durante el entrenamiento y manejará el registro de métricas, todo mientras se asegura de que la evaluación de los datos de validación se realice de la manera correcta (por ejemplo, deshabilitando la deserción).

luz se puede ampliar en muchas capas diferentes de abstracción, por lo que puede mejorar su conocimiento gradualmente, a medida que necesita funciones más avanzadas en su proyecto. Por ejemplo, puede implementar métricas personalizadas, devoluciones de llamadao incluso personalizar el bucle de entrenamiento interno.

Aprender sobre luzleer el empezando en la sección del sitio web y navegue por la galería de ejemplos.

¿Qué hay de nuevo en luz?

Buscador de tasa de aprendizaje

En el aprendizaje profundo, encontrar una buena tasa de aprendizaje es fundamental para poder ajustar su modelo. Si es demasiado bajo, necesitará demasiadas iteraciones para que su pérdida converja, y eso podría no ser práctico si su modelo tarda demasiado en ejecutarse. Si es demasiado alto, la pérdida puede explotar y es posible que nunca pueda llegar a un mínimo.

los lr_finder() La función implementa el algoritmo detallado en Tasas de aprendizaje cíclico para entrenar redes neuronales (Smith 2015) popularizado en el marco FastAI (Howard y Gugger 2020). se necesita un nn_module() y algunos datos para producir un marco de datos con las pérdidas y la tasa de aprendizaje en cada paso.

model <- net %>% setup(
  loss = torch::nn_cross_entropy_loss(),
  optimizer = torch::optim_adam
)

records <- lr_finder(
  object = model, 
  data = train_ds, 
  verbose = FALSE,
  dataloader_options = list(batch_size = 32),
  start_lr = 1e-6, # the smallest value that will be tried
  end_lr = 1 # the largest value to be experimented with
)

str(records)
#> Classes 'lr_records' and 'data.frame':   100 obs. of  2 variables:
#>  $ lr  : num  1.15e-06 1.32e-06 1.51e-06 1.74e-06 2.00e-06 ...
#>  $ loss: num  2.31 2.3 2.29 2.3 2.31 ...

Puede utilizar el método de trazado integrado para mostrar los resultados exactos, junto con un valor exponencialmente suavizado de la pérdida.

plot(records) +
  ggplot2::coord_cartesian(ylim = c(NA, 5))
Gráfico que muestra los resultados de lr_finder()

Si quieres aprender a interpretar los resultados de este gráfico y saber más sobre la metodología lee el artículo del buscador de tasa de aprendizaje sobre el luz sitio web.

Manejo de datos

En el primer lanzamiento de luzel único tipo de objeto que se permitió utilizar como datos de entrada para fit era un torch dataloader(). A partir de la versión 0.2.0, luz también admite matrices/arreglos R de R (o listas anidadas de ellos) como datos de entrada, así como torch dataset()s.

Admite abstracciones de bajo nivel como dataloader() ya que los datos de entrada son importantes, ya que con ellos el usuario tiene control total sobre cómo se cargan los datos de entrada. Por ejemplo, puede crear cargadores de datos paralelos, cambiar la forma en que se realiza la mezcla y más. Sin embargo, tener que definir manualmente el cargador de datos parece innecesariamente tedioso cuando no es necesario personalizar nada de esto.

Otra pequeña mejora con respecto a la versión 0.2.0, inspirada en Keras, es que puedes pasar un valor entre 0 y 1 a fit‘s valid_data parámetro, y luz tomará una muestra aleatoria de esa proporción del conjunto de entrenamiento, para usarla como datos de validación.

Lea más sobre esto en la documentación de la fit() función.

Nuevas devoluciones de llamada

En versiones recientes, se agregaron nuevas devoluciones de llamadas integradas a luz:

  • luz_callback_gradient_clip(): ayuda a evitar la divergencia de pérdida al recortar grandes gradientes.
  • luz_callback_keep_best_model(): Cada época, si hay una mejora en la métrica monitoreada, serializamos los pesos del modelo en un archivo temporal. Cuando finaliza el entrenamiento, recargamos pesos del mejor modelo.
  • luz_callback_mixup(): Implementación de ‘confusión: más allá de la minimización empírica del riesgo’ (Zhang et al. 2017). Mixup es una buena técnica de aumento de datos que ayuda a mejorar la consistencia del modelo y el rendimiento general.

Puede ver el registro de cambios completo disponible aquí.

En este post también queremos agradecer a:

  • @jonthegeek por valiosas mejoras en el luz guías de inicio.

  • @mattwarkentin para muchas buenas ideas, mejoras y correcciones de errores.

  • @cmcmaster1 para la implementación inicial del buscador de tasa de aprendizaje y otras correcciones de errores.

  • @skeydan para la implementación de la devolución de llamada de Mixup y mejoras en el buscador de tasa de aprendizaje.

¡Gracias!

Foto por dil en Unsplash

Howard, Jeremy y Sylvain Gugger. 2020. «Fastai: una API en capas para el aprendizaje profundo». Información 11 (2): 108. https://doi.org/10.3390/info11020108.

Smith, Leslie N. 2015. «Tasas de aprendizaje cíclico para entrenar redes neuronales». https://doi.org/10.48550/ARXIV.1506.01186.

Zhang, Hongyi, Moustapha Cisse, Yann N. Dauphin y David López-Paz. 2017. «Mezcla: más allá de la minimización empírica del riesgo». https://doi.org/10.48550/ARXIV.1710.09412.

¿Que te ha parecido?

Deja un comentario