Estamos felizes em anunciar que luz
a versão 0.3.0 está agora no CRAN. Esta versão traz algumas melhorias para o localizador de taxa de aprendizagem, contribuído pela primeira vez por Chris McMaster. Como não tínhamos uma postagem de lançamento 0.2.0, também destacaremos algumas melhorias que datam dessa versão.
O que é luz
?
Já que é pacote relativamente novoestamos iniciando esta postagem do weblog com uma rápida recapitulação de como luz
funciona. Se você já sabe o que luz
é, sinta-se à vontade para passar para a próxima seção.
luz
é uma API de alto nível para torch
que visa encapsular o loop de treinamento em um conjunto de pedaços de código reutilizáveis. Reduz o padrão necessário para treinar um modelo com torch
evita o sujeito a erros
zero_grad()
– backward()
– step()
sequência de chamadas e também simplifica o processo de movimentação de dados e modelos entre CPUs e GPUs.
Com luz
você pode levar o seu torch
nn_module()
por exemplo, o perceptron de duas camadas definido abaixo:
modnn <- nn_module(
initialize = perform(input_size) {
self$hidden <- nn_linear(input_size, 50)
self$activation <- nn_relu()
self$dropout <- nn_dropout(0.4)
self$output <- nn_linear(50, 1)
},
ahead = perform(x) {
x %>%
self$hidden() %>%
self$activation() %>%
self$dropout() %>%
self$output()
}
)
e ajuste-o a um conjunto de dados especificado assim:
luz
treinará automaticamente seu modelo na GPU, se estiver disponível, exibirá uma boa barra de progresso durante o treinamento e lidará com o registro de métricas, ao mesmo tempo em que garante que a avaliação dos dados de validação seja realizada da maneira correta (por exemplo, desativando o abandono).
luz
pode ser estendido em diversas camadas de abstração, para que você possa aprimorar seu conhecimento gradativamente, conforme precisar de recursos mais avançados em seu projeto. Por exemplo, você pode implementar métricas personalizadas,
retornos de chamadaou até mesmo personalizar o ciclo de treinamento interno.
Para aprender sobre luz
leia o começando
seção no website e navegue na galeria de exemplos.
O que há de novo em luz
?
Localizador de taxa de aprendizagem
No aprendizado profundo, encontrar uma boa taxa de aprendizado é essencial para poder ajustar seu modelo. Se for muito baixo, você precisará de muitas iterações para que sua perda convirja, e isso pode ser impraticável se o seu modelo demorar muito para ser executado. Se for muito alto, a perda pode explodir e você nunca conseguirá chegar ao mínimo.
O lr_finder()
função implementa o algoritmo detalhado em Taxas de aprendizagem cíclica para treinamento de redes neurais
(Smith 2015) popularizado na estrutura FastAI (Howard e Gugger 2020). É preciso um nn_module()
e alguns dados para produzir um quadro de dados com as perdas e a taxa de aprendizagem em cada etapa.
mannequin <- web %>% setup(
loss = torch::nn_cross_entropy_loss(),
optimizer = torch::optim_adam
)
data <- lr_finder(
object = mannequin,
information = train_ds,
verbose = FALSE,
dataloader_options = listing(batch_size = 32),
start_lr = 1e-6, # the smallest worth that will likely be tried
end_lr = 1 # the most important worth to be experimented with
)
str(data)
#> Courses 'lr_records' and 'information.body': 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 ...
Você pode usar o método de gráfico integrado para exibir os resultados exatos, junto com um valor de perda suavizado exponencialmente.

Se você quiser aprender como interpretar os resultados deste gráfico e saber mais sobre a metodologia leia o artigo sobre localizador de taxa de aprendizagem no
luz
website.
Tratamento de dados
No primeiro lançamento de luz
o único tipo de objeto que tinha permissão para ser usado como dados de entrada para match
period um torch
dataloader()
. A partir da versão 0.2.0, luz
também suporta matrizes/matrizes R (ou listas aninhadas delas) como dados de entrada, bem como torch
dataset()
S.
Suportando abstrações de baixo nível como dataloader()
já que os dados de entrada são importantes, pois com eles o usuário tem controle whole sobre como os dados de entrada são carregados. Por exemplo, você pode criar dataloaders paralelos, alterar a forma como o embaralhamento é feito e muito mais. No entanto, ter que definir manualmente o dataloader parece desnecessariamente tedioso quando você não precisa personalizar nada disso.
Outra pequena melhoria da versão 0.2.0, inspirada em Keras, é que você pode passar um valor entre 0 e 1 para match
de valid_data
parâmetro, e luz
pegará uma amostra aleatória dessa proporção do conjunto de treinamento, para ser usada para dados de validação.
Leia mais sobre isso na documentação do
match()
função.
Novos retornos de chamada
Em versões recentes, novos retornos de chamada integrados foram adicionados ao luz
:
luz_callback_gradient_clip()
: ajuda a evitar a divergência de perdas cortando grandes gradientes.luz_callback_keep_best_model()
: A cada época, se houver melhoria na métrica monitorada, serializamos os pesos do modelo em um arquivo temporário. Terminado o treinamento, recarregamos os pesos do melhor modelo.luz_callback_mixup()
: Implementação de ‘Confusão: além da minimização do risco empírico’
(Zhang et al. 2017). Mixup é uma ótima técnica de aumento de dados que ajuda a melhorar a consistência do modelo e o desempenho geral.
Você pode ver o changelog completo disponível
aqui.
Neste publish também gostaríamos de agradecer:
@jonthegeek para melhorias valiosas no
luz
guias de primeiros passos.@matwarkentin para muitas boas ideias, melhorias e correções de bugs.
@cmcmaster1 para a implementação inicial do localizador de taxa de aprendizagem e outras correções de bugs.
@skeydan pela implementação do callback Mixup e melhorias no localizador de taxa de aprendizagem.
Obrigado!
Foto de Dil sobre Remover respingo
Howard, Jeremy e Sylvain Gugger. 2020. “Fastai: uma API em camadas para aprendizado profundo.” Informação 11(2): 108. https://doi.org/10.3390/info11020108.
Smith, Leslie N. 2015. “Taxas de aprendizagem cíclica para treinamento de redes neurais.” https://doi.org/10.48550/ARXIV.1506.01186.
Zhang, Hongyi, Moustapha Cisse, Yann N. Dauphin e David Lopez-Paz. 2017. “Confusão: além da minimização de riscos empíricos.” https://doi.org/10.48550/ARXIV.1710.09412.