Trabalhando com redes neurais: lista de verificação para depuração

Trabalhando com redes neurais: lista de verificação para depuração

O código dos produtos de software de aprendizado de máquina costuma ser complexo e bastante confuso. Detectar e eliminar bugs é uma tarefa que consome muitos recursos. Mesmo o mais simples redes neurais feedforward requerem uma abordagem séria à arquitetura de rede, inicialização de pesos e otimização de rede. Um pequeno erro pode levar a problemas desagradáveis.

Este artigo é sobre um algoritmo para depurar suas redes neurais.

A Skillbox recomenda: curso prático Desenvolvedor Python do zero.

Lembramos: para todos os leitores de "Habr" - um desconto de 10 rublos ao se inscrever em qualquer curso Skillbox usando o código promocional "Habr".

O algoritmo consiste em cinco etapas:

  • começo fácil;
  • confirmação de perdas;
  • verificação de resultados intermediários e conexões;
  • diagnóstico de parâmetros;
  • controle do trabalho.

Se algo lhe parecer mais interessante do que o resto, você pode pular imediatamente para estas seções.

Início fácil

Uma rede neural com arquitetura complexa, regularização e um escalonador de taxa de aprendizado é mais difícil de depurar do que uma rede normal. Estamos sendo um pouco complicados aqui, já que o ponto em si está indiretamente relacionado à depuração, mas esta ainda é uma recomendação importante.

Um começo simples é criar um modelo simplificado e treiná-lo em um conjunto (ponto) de dados.

Primeiro criamos um modelo simplificado

Para começar rapidamente, criamos uma pequena rede com uma única camada oculta e verificamos se tudo funciona corretamente. Em seguida, complicamos gradativamente o modelo, verificando cada novo aspecto de sua estrutura (camada adicional, parâmetro, etc.), e seguimos em frente.

Treinamos o modelo em um único conjunto (ponto) de dados

Como uma verificação rápida de integridade do seu projeto, você pode usar um ou dois pontos de dados para treinamento para confirmar se o sistema está funcionando corretamente. A rede neural deve apresentar 100% de precisão em treinamento e teste. Se não for esse o caso, o modelo é muito pequeno ou você já tem um bug.

Mesmo que tudo esteja bem, prepare o modelo para uma ou mais épocas antes de prosseguir.

Avaliação de perdas

A estimativa de perdas é a principal forma de refinar o desempenho do modelo. Você precisa garantir que a perda seja apropriada ao problema e que as funções de perda sejam classificadas na escala correta. Se você usar mais de um tipo de perda, certifique-se de que todos sejam da mesma ordem e dimensionados corretamente.

É importante estar atento às perdas iniciais. Verifique o quão próximo o resultado real está do resultado esperado se o modelo começou com uma estimativa aleatória. EM O trabalho de Andrey Karpathy sugere o seguinte:: “Certifique-se de obter o resultado esperado ao começar com um pequeno número de parâmetros. É melhor verificar imediatamente a perda de dados (com o grau de regularização definido como zero). Por exemplo, para CIFAR-10 com um classificador Softmax, esperamos que a perda inicial seja 2.302 porque a probabilidade difusa esperada é 0,1 para cada classe (já que existem 10 classes) e a perda Softmax é o log de probabilidade negativo da classe correta como - ln (0.1) = 2.302.”

Para o exemplo binário, um cálculo semelhante é feito simplesmente para cada uma das classes. Aqui, por exemplo, estão os dados: 20% 0 e 80% 1. A perda inicial esperada será de até –0,2ln (0,5) –0,8ln (0,5) = 0,693147. Se o resultado for maior que 1, pode indicar que os pesos da rede neural não estão devidamente balanceados ou os dados não estão normalizados.

Verificando resultados intermediários e conexões

Para depurar uma rede neural, é necessário compreender a dinâmica dos processos dentro da rede e o papel das camadas intermediárias individuais à medida que estão conectadas. Aqui estão os erros comuns que você pode encontrar:

  • expressões incorretas para atualizações do Gradle;
  • atualizações de peso não são aplicadas;
  • gradientes explosivos.

Se os valores do gradiente forem zero, isso significa que a taxa de aprendizado no otimizador é muito lenta ou que você está encontrando uma expressão incorreta para atualizar o gradiente.

Além disso, é necessário monitorar os valores das funções de ativação, pesos e atualizações de cada uma das camadas. Por exemplo, a magnitude das atualizações dos parâmetros (pesos e tendências) deveria ser 1-e3.

Existe um fenômeno chamado “Dying ReLU” ou "problema de gradiente de desaparecimento", quando os neurônios ReLU produzirão zero após aprender um grande valor de polarização negativo para seus pesos. Esses neurônios nunca mais são disparados em nenhum ponto dos dados.

Você pode usar a verificação de gradiente para identificar esses erros aproximando o gradiente usando uma abordagem numérica. Se estiver próximo dos gradientes calculados, a retropropagação foi implementada corretamente. Para criar uma verificação de gradiente, confira estes excelentes recursos do CS231 aqui и aquiBem como lição Andrew Nga sobre este assunto.

Faizan Sheik indica três métodos principais para visualizar uma rede neural:

  • Preliminares são métodos simples que nos mostram a estrutura geral do modelo treinado. Isso inclui a saída de formas ou filtros das camadas individuais da rede neural e os parâmetros dentro de cada camada.
  • Baseado em ativação. Neles, deciframos as ativações de neurônios individuais ou grupos de neurônios para compreender suas funções.
  • Baseado em gradientes. Esses métodos tendem a manipular gradientes formados a partir das passagens para frente e para trás do treinamento do modelo (incluindo mapas de saliência e mapas de ativação de classe).

Existem várias ferramentas úteis para visualizar as ativações e conexões de camadas individuais, por ex. ConX и Quadro tensor.

Trabalhando com redes neurais: lista de verificação para depuração

Diagnóstico de parâmetros

As redes neurais possuem muitos parâmetros que interagem entre si, o que complica a otimização. Na verdade, esta seção é objeto de pesquisa ativa por parte de especialistas, portanto as sugestões abaixo devem ser consideradas apenas como conselhos, pontos de partida a partir dos quais construir.

Tamanho do pacote (tamanho do lote) - Se você deseja que o tamanho do lote seja grande o suficiente para obter estimativas precisas de gradiente de erro, mas pequeno o suficiente para que a descida de gradiente estocástica (SGD) regularize sua rede. Lotes pequenos levarão a uma convergência rápida devido ao ruído durante o processo de treinamento e, posteriormente, a dificuldades de otimização. Isso é descrito com mais detalhes aqui.

Taxa de Aprendizagem - muito baixo levará a uma convergência lenta ou ao risco de ficar preso em mínimos locais. Ao mesmo tempo, uma alta taxa de aprendizado causará divergência de otimização porque você corre o risco de saltar pela parte profunda, mas estreita, da função de perda. Tente usar o agendamento de velocidade para reduzi-la durante o treinamento da rede neural. Atualizado com CS231n há uma grande seção dedicada a este problema.

Recorte de gradiente  — aparar gradientes de parâmetros durante a retropropagação no valor máximo ou norma marginal. Útil para solucionar problemas de gradientes explosivos que você possa encontrar no ponto três.

Normalização em lote - utilizado para normalizar os dados de entrada de cada camada, o que nos permite resolver o problema de deslocamento interno de covariáveis. Se você estiver usando Dropout e Batch Norma juntos, confira este artigo.

Descida gradiente estocástica (SGD) — existem diversas variedades de SGD que utilizam impulso, taxas de aprendizagem adaptativas e o método Nesterov. No entanto, nenhum deles tem uma vantagem clara em termos de eficiência de aprendizagem e generalização (detalhes aqui).

Regularização - é crucial para a construção de um modelo generalizável, pois acrescenta uma penalidade para a complexidade do modelo ou valores extremos de parâmetros. Esta é uma forma de reduzir a variância do modelo sem aumentar significativamente o seu viés. Mais informações detalhadas - aqui.

Para avaliar tudo sozinho, você precisa desabilitar a regularização e verificar você mesmo o gradiente de perda de dados.

Desistindo é outro método de simplificar sua rede para evitar congestionamentos. Durante o treinamento, o abandono é realizado apenas mantendo a atividade do neurônio com uma certa probabilidade p (hiperparâmetro) ou zerando no caso oposto. Como resultado, a rede deve utilizar um subconjunto diferente de parâmetros para cada lote de treinamento, o que reduz as alterações em determinados parâmetros que se tornam dominantes.

Importante: Se você usar dropout e normalização em lote, tome cuidado com a ordem dessas operações ou mesmo ao usá-las juntas. Tudo isso ainda está sendo ativamente discutido e complementado. Aqui estão duas discussões importantes sobre este tópico no Stackoverflow и Arxiv.

Controle de trabalho

Trata-se de documentar fluxos de trabalho e experimentos. Se você não documentar nada, poderá esquecer, por exemplo, qual taxa de aprendizagem ou pesos de classe são usados. Graças ao controle, você pode visualizar e reproduzir facilmente experimentos anteriores. Isso permite reduzir o número de experimentos duplicados.

Porém, a documentação manual pode se tornar uma tarefa difícil no caso de um grande volume de trabalho. É aqui que entram ferramentas como Comet.ml para ajudá-lo a registrar automaticamente conjuntos de dados, alterações de código, histórico experimental e modelos de produção, incluindo informações importantes sobre seu modelo (hiperparâmetros, métricas de desempenho do modelo e informações ambientais).

Uma rede neural pode ser muito sensível a pequenas mudanças e isso levará a uma queda no desempenho do modelo. Rastrear e documentar seu trabalho é o primeiro passo que você pode dar para padronizar seu ambiente e modelagem.

Trabalhando com redes neurais: lista de verificação para depuração

Espero que este post possa ser um ponto de partida para você começar a depurar sua rede neural.

A Skillbox recomenda:

Fonte: habr.com

Adicionar um comentário