O que é Dropout? Reduza o sobrefitting em suas redes neurais

Última atualização em 17 de dezembro de 2019

Quando estiver treinando redes neurais, seu objetivo é produzir um modelo que tenha um desempenho realmente bom.

Isso faz todo o sentido, pois não adianta usar um modelo que não tenha desempenho.

No entanto, há um equilíbrio relativamente estreito que você terá de manter quando tentar encontrar um modelo com desempenho perfeito.

É o equilíbrio entre underfitting e overfitting.

A fim de evitar underfitting (ter um desempenho pior do que o possível previsto), você pode continuar o treinamento, até experimentar o outro problema – overfitting, ou seja, ser muito sensível aos seus dados de treinamento. Ambos prejudicam o desempenho do modelo.

Algumas vezes, o intervalo em que o seu modelo não está subequipado ou sobreequipado é realmente pequeno. Felizmente, ela pode ser estendida aplicando o que é conhecido como um regularizador – uma técnica que regulariza o comportamento do seu modelo durante o treinamento, para atrasar o overfit por algum tempo.

Dropout é uma técnica de regularização. Neste post do blog, nós a cobrimos, dando uma olhada em algumas coisas. Primeiro, mergulhamos na diferença entre underfitting e overfitting com mais detalhes, para que possamos ter uma compreensão mais profunda dos dois. Em segundo lugar, apresentamos o Dropout baseado em trabalhos acadêmicos e contamos como funciona. Em terceiro lugar, vamos ver se realmente funciona, descrevendo as várias experiências feitas com esta técnica. Finalmente, vamos comparar o Dropout tradicional com o Gaussian Dropout – e como ele muda o treinamento do seu modelo.

Ready? Vamos lá! 😎

Qual é o desempenho do seu modelo? Underfitting and overfitting

Vejamos primeiro o que são underfitting e overfitting.

Ao iniciar o processo de treino, os pesos dos seus neurónios são provavelmente inicializados ao acaso ou com alguma outra estratégia de inicialização. Isto significa que a taxa de erro, ou valor de perda, será muito alta durante as primeiras épocas. Dê uma olhada neste diagrama, onde a perda diminui muito rapidamente durante as primeiras épocas:

Quando tanto a perda do treinamento quanto a validação diminuem, diz-se que o modelo é subequipado: ele ainda pode ser treinado para fazer melhores previsões, ou seja, para ganhar em seu poder preditivo.

A ação a ser tomada então é continuar o treinamento.

No entanto, isto não pode continuar para sempre. A otimização de um modelo envolve gerar previsões de validação com seus dados de validação, resultando em valores de perda e gradientes para a otimização, que é então realizada. Infelizmente, isto significa que algumas das ideosincrasias dos dados são vazadas para os pesos do modelo. Ou seja, como os dados são uma amostra e não uma população completa, eles são sempre ligeiramente diferentes da população completa que representam. Quando você otimizar o modelo para centenas de épocas com esses dados, você sempre terá uma compensação em relação a essa verdadeira população.

Se você continuasse a treinar, seu modelo se adaptaria mais e mais a essas ideosincrasias, tornando-o menos adequado para dados que nunca viu antes – ou seja, outras amostras da população. Diz-se então que o modelo está demasiado bem adaptado aos dados de treino e validação.

Pausa por um segundo! 👩💻

Blogs no MachineCurve ensinam Machine Learning for Developers. Inscreva-se hoje mesmo na atualização gratuita de MachineCurve’s Machine Learning! Você vai aprender coisas novas e entender melhor conceitos que você já conhece.
Enviamos e-mails pelo menos todas as sextas-feiras. Bem-vindo!

Ao se inscrever, você consente que qualquer informação que você receber pode incluir serviços e ofertas especiais por e-mail.

Overfitting pode ser detectado em parcelas como a acima, inspecionando a perda de validação: quando ela sobe novamente, enquanto a perda de treinamento permanece constante ou diminui, você sabe que o seu modelo está superfitting. Como você pode ver, a rede alimentada por ELU no gráfico acima começou a sobreajustar muito ligeiramente.

Both underfitting e overfitting devem ser evitados, pois o seu modelo terá um desempenho pior do que o que poderia teoricamente ter. Felizmente, certas técnicas – chamadas regularizadores – podem ser usadas para reduzir o impacto do overfitting. Dropout é uma delas – e nós vamos cobrir isso neste blog. Vamos começar analisando o que é Dropout, o que ele faz e como funciona.

O que é Dropout e como ele funciona?

No seu artigo “Dropout: A Simple Way to Prevent Neural Networks from Overfitting”, Srivastava et al. (2014) descrevem a técnica Dropout, que é uma técnica de regularização estocástica e deve reduzir o overfitting combinando (teoricamente) muitas arquiteturas diferentes de redes neurais.

Com Dropout, o processo de treinamento essencialmente deixa os neurônios de fora em uma rede neural. Eles são temporariamente removidos da rede, que pode ser visualizada da seguinte forma:

Note que as conexões ou sinapses são removidas também, e que portanto nenhum dado flui mais através desses neurônios.

…mas apenas muito brevemente! Este processo repete-se a cada época (ou mesmo a cada mini-batch! – Srivastava et al. 2014) e, portanto, a amostragem de redes finas acontece com muita frequência. Isto deve levar a taxas de erro de generalização significativamente mais baixas (ou seja, sobreajustamento), pois “a presença de neurônios não é confiável” (Srivastava et al., 2014).

Esta remoção de neurônios e sinapses durante o treinamento é feita aleatoriamente, com um parâmetro \(p\) que é sintonizável (ou, dados os testes empíricos, melhor ajustado para 0,5 para camadas ocultas e próximo a 1,0 para a camada de entrada). Isto significa efetivamente que, segundo os autores, a rede “afinada” é amostrada a partir da arquitetura global e usada para treinamento.

No momento do teste, “não é viável fazer uma média explícita das previsões de exponencialmente muitos modelos afinados” (Srivastava et al., 2014). Isso é verdade: tornar-se-ia uma carga computacional quando centenas de milhares de épocas/minibatches têm de ser calculadas como média, especialmente quando as redes se tornam realmente grandes.

Felizmente, existe uma solução – que é simples, mas produz o mesmo resultado. Usando uma rede neural, onde as saídas de peso são escalonadas para baixo de acordo com o \(p) com o qual uma unidade foi retida durante o treinamento. Isto significa que o output esperado no momento do treino é o mesmo que o output verdadeiro no momento do teste, resolvendo a questão computacional e tornando o Dropout utilizável na prática.

Variáveis Bernoulli

Vamos agora ver como o Dropout funciona matematicamente. Não se preocupe, nós não o enterramos com matemática, mas em vez disso vamos tentar ter um ponto de vista muito intuitivo.

Muito simplista, é assim que um neurónio recebe o seu input: por exemplo, três neurónios a montante numa camada densa de três neurónios enviam os seus outputs para a camada seguinte, onde é recebido como input. Note que, por uma questão de simplicidade, omitimos aqui os valores de enviesamento.

Normal neuron (assumido como sem viés)

É muito simples ir daqui para um neurônio Dropout, que se parece com o seguinte:

Neurônio Dropout (assumido como sem viés)

Matematicamente, isto envolve as chamadas variáveis aleatórias Bernoulli:

Em teoria da probabilidade e estatística, a distribuição Bernoulli, com o nome do matemático suíço Jacob Bernoulli, é a distribuição discreta de probabilidade de uma variável aleatória que toma o valor 1 com probabilidade \(p\).

Wikipédia sobre a distribuição Bernoulli

Para criar Dropout, Srivastava et al. (2014) anexaram variáveis Bernoulli aos neurônios da rede (multiplicando-as com saídas neurais), “cada uma das quais probabilidade \(p\) de ser 1″. O valor \(p\) aqui é selecionado pelo engenheiro de aprendizado de máquina, geralmente baseado em algum conjunto de validação, ou naïvely definido como 0.5.

Nunca perca novos artigos de Machine Learning ✅

Blogs no MachineCurve teach Machine Learning for Developers. Inscreva-se hoje mesmo na atualização gratuita de MachineCurve’s Machine Learning! Você vai aprender coisas novas e entender melhor conceitos que você já conhece.
Enviamos e-mails pelo menos todas as sextas-feiras. Bem-vindo!

Ao se inscrever, você consente que qualquer informação que você receber pode incluir serviços e ofertas especiais por e-mail.

Dentro da rede, a variável Bernoulli e o seu valor de 1 ou 0 determina se um neurônio é ‘abandonado’ durante esta época ou operação de alimentação de mini-lotes. Isto, de fato, leva à ‘rede fina’ que Srivastava et al. (2014) falam.

Por que poderia a queda reduzir o sobre-equipamento?

Você pode agora se perguntar: por que as variáveis Bernoulli ligadas às redes neurais regulares, tornando a rede mais fina, reduzem o sobre-equipamento?

Para a resposta a esta pergunta, teremos que dar uma olhada em como as redes neurais são treinadas.

Usualmente, a retropropagação e a descida de gradiente ou um otimizador similar é usado para este fim. Dado um valor de perda, os chamados ‘gradientes’ são computados, que o otimizador então processa nos pesos da rede. Ao usar estes gradientes (com respeito à taxa de erro) para alterar os pesos, a rede provavelmente tem um desempenho ligeiramente melhor durante a próxima iteração do processo de treinamento.

A computação do gradiente é feita com respeito ao erro, mas também com respeito ao que todas as outras unidades estão fazendo (Srivastava et al., 2014). Isto significa que certos neurônios, através de mudanças em seus pesos, podem corrigir os erros de outros neurônios. Estes, argumentam Srivastava et al. (2014), levam a co-adaptações complexas que podem não generalizar a dados invisíveis, resultando em sobreajustamentos.

Dropout, então, impede que estas co-adaptações – como escrevemos antes – tornem a presença de outros escondidos não confiável. Os neurônios simplesmente não podem confiar em outras unidades para corrigir seus erros, o que reduz o número de co-adaptações que não são generalizadas para dados invisíveis, e assim, presumivelmente, reduz também o overfitting.

Treinar redes neurais com Dropout

Treinar redes neurais às quais Dropout foi anexado é praticamente igual ao treinamento de redes neurais sem Dropout. Podem ser usados otimizadores de gradientes estocásticos ou similares. A única diferença, como relatado por Srivastava et al. (2014), pode ser encontrada quando se usa uma abordagem de mini-batch: ao invés de por época, as redes diluídas são amostradas por mini-batch.

Adicionalmente, métodos que melhoram o SGD clássico – como o momentum – também podem ser usados, e mostram melhorias semelhantes às das redes neurais regulares (Srivastava et al, 2014).

O que os autores também acharam útil durante o treinamento é aplicar a regularização de max-normes, o que significa restringir a norma do peso de entrada a ser limitado por algum valor máximo \(c\). Este valor deve ser definido pelo engenheiro à partida, e determinado através de um conjunto de validação (Srivastava et al.., 2014).

Combinando Dropout com regularização max-norm melhora o desempenho comparado ao uso de Dropout sozinho, mas os autores relataram resultados ainda melhores quando Dropout e max-norm regularização são combinados com duas outras coisas:

  • Larga, taxas de aprendizagem decadentes.
  • Alto momento.

De acordo com Srivastava et al. (2014), isto pode possivelmente ser justificado pelos seguintes argumentos:

  1. A limitação dos vetores de peso torna possível usar grandes taxas de aprendizagem sem explodir os pesos.
  2. Ruído de abandono mais grandes taxas de aprendizagem então ajudam os optimizadores a “explorar diferentes regiões do espaço de peso que de outra forma seriam difíceis de alcançar”.
  3. Diminuir a taxa de aprendizagem então retarda o salto do processo de exploração, eventualmente “estabelecendo-se num mínimo”.
  4. Um momento elevado permite à rede ultrapassar os mínimos locais, aumentando a probabilidade de que o mínimo global seja encontrado.

O abandono realmente funciona? Resultados experimentais

Com qualquer melhoria na aprendizagem da máquina, é bom ter uma melhoria teórica – mas também é importante testar se ela realmente funciona. Srivastava et al. (2014) realizaram vários testes para descobrir se o Dropout funciona. Primeiro, eles usaram vários conjuntos de dados padrão (como o conjunto de dados MNIST) para testar se Dropout melhora o desempenho do modelo através de uma ampla gama de problemas de classificação.

Segundamente, eles verificaram como ele funcionava com uma variedade de outros regularizadores (produzindo a percepção de que a regularização max-norm em conjunto com Dropout funciona melhor – mas vamos dar uma olhada nesses resultados com mais detalhes mais tarde), e em terceiro lugar, Srivastava et al. (2014) investigaram quais taxas de desistência (ou seja qual o parâmetro que funciona melhor e como o tamanho dos dados impacta o desempenho do Dropout. Vamos dar uma olhada!

Amostras do conjunto de dados MNIST

Desistência vs Sem Desistência nos conjuntos de dados padrão

Os autores testaram Desistência vs Sem Desistência nesses conjuntos de dados padrão (Srivastava et al.., 2014):

  • O conjunto de dados MNIST, que contém milhares de dígitos escritos à mão;
  • O conjunto de dados de referência de fala TIMIT para reconhecimento de fala limpa.
  • Os conjuntos de dados CIFAR-10 e CIFAR-100, contendo imagens naturais minúsculas em 10 e 100 classes.
  • O conjunto de dados Street View House Numbers (SVHN), com imagens de números de casas coletadas do Google Street View.
  • O conjunto de dados ImageNet, que contém muitas imagens naturais.
  • O conjunto de dados de artigos de notícias Reuters RCV1. Este é um conjunto de dados de texto e não de imagens.

Amostras do conjunto de dados CIFAR10

>

Para todos os conjuntos de dados, Dropout melhorou o poder de generalização do modelo. No MNIST, erros de teste drasticamente diferentes puderam ser relatados, com melhorias substanciais para todas as diferentes arquiteturas que foram testadas.

Junte centenas de outros alunos! 😎

Blogs no MachineCurve ensinam Machine Learning for Developers. Inscreva-se hoje mesmo na atualização gratuita de MachineCurve’s Machine Learning! Você vai aprender coisas novas e entender melhor conceitos que você já conhece.
Enviamos e-mails pelo menos todas as sextas-feiras. Bem-vindo!

Ao se inscrever, você consente que qualquer informação que você receber pode incluir serviços e ofertas especiais por e-mail.

O dropout também supera o desempenho das redes neurais regulares no ConvNets treinadas no CIFAR-100, CIFAR-100, e nos conjuntos de dados ImageNet.

Para o conjunto de dados SVHN, outra observação interessante poderia ser relatada: quando o Dropout é aplicado na camada convolucional, o desempenho também aumenta. De acordo com os autores, isto é interessante, porque antes, assumia-se que estas camadas não eram sensíveis ao sobreajustamento porque não têm muitos parâmetros (Srivastava et al., 2014). Argumenta-se que a adição de Dropout às camadas Conv fornece entradas ruidosas para as camadas Dense que as seguem, o que as impede de se sobreajustarem.

Finalmente, Dropout trabalha nos conjuntos de dados de referência de fala TIMIT e no conjunto de dados RCV1 da Reuters, mas aqui a melhoria foi muito menor em comparação com os conjuntos de dados de visão e fala.

Dropout vs sem dropout com outros regularizadores

Agora os autores sabiam que o Dropout se adapta bem a uma variedade de problemas de aprendizagem da máquina, investigaram-no melhor: como é que funciona em relação a outros regularizadores?

Métodos de regularizadoreveral foram testados para prevenir o excesso de ajuste:

  • Diminuição de peso de L2;
  • Lasso;
  • KL sparsity;
  • Regularização da Norma Máxima.

Srivastava et al. (2014) descobriram que quando combinado com a regularização da Norma Máxima, Dropout dá ainda menos erros de generalização. Na verdade, ele forneceu o menor erro relatado, seguido – a alguma distância – pela regularização Dropout + L2, e finalmente os outros.

Hence, ao aplicar Dropout, também pode ser uma boa idéia executar a regularização de max-normenta ao mesmo tempo.

Quando o Dropout funciona melhor? Sobre a taxa de dropout e tamanho do conjunto de dados

Outra pergunta que tentaram responder: a taxa de dropout (ou seja, o parâmetro \(p\)) e/ou tamanho do conjunto de dados tem impacto no desempenho do Dropout e nas redes neurais a que está ligado?

A pergunta deve ser respondida com sim.

Qual é o melhor valor para \(p\)?

Primeiro, o parâmetro \(p\). A esta altura, podemos recordar que é sintonizável, e deve de facto ser configurado previamente pelo engenheiro de aprendizagem da máquina. O facto de ser sintonizável leva aos mesmos erros que a razão pela qual as taxas de aprendizagem fixas não são uma boa ideia: simplesmente não se sabe qual o que melhor se ajusta aos dados.

Hence, os autores argumentam, a selecção de um valor para \i(p) deve ser feita por alguns testes iniciais com um conjunto de validação.

Fizeram-no também – para ver se padrões interessantes podiam ser encontrados.

E encontraram tal padrão: através de múltiplos cenários, um valor de \\(p \ aprox. 0,5\) para as camadas ocultas parece resultar no melhor desempenho ao aplicar Dropout (Srivastava et al, 2014). Isto é verdade para todas as camadas, exceto a de entrada, onde a(p) deve ser de aproximadamente 1,0. Este último é presumivelmente o caso porque a camada de entrada leva os dados de entrada, e é difícil encontrar padrões quando os dados são descartados aleatoriamente.

Como o Dropout funciona em relação ao tamanho do conjunto de dados?

De acordo com os autores, um “bom regularizador torna possível obter um bom erro de generalização de modelos com um grande número de parâmetros treinados em conjuntos de dados pequenos”. Isto é, ele executa muito bem em dados que nunca viu antes – mesmo quando treinado com dados pequenos.

A fim de descobrir se o Dropout regulariza bem em vários tamanhos de conjuntos de dados, Srivastava et al. (2014) realizaram testes com vários tamanhos no conjunto de dados MNIST. Os tamanhos foram os seguintes: “100, 500, 1K, 5K, 10K e 50K escolhidos aleatoriamente do conjunto de treinamento MNIST” (Srivastava et al., 2014).

Ajudamos você com o aprendizado da máquina! 🧠

Blogs no MachineCurve ensinam Machine Learning for Developers. Inscreva-se hoje mesmo na atualização gratuita de MachineCurve’s Machine Learning! Você vai aprender coisas novas e entender melhor conceitos que você já conhece.
Enviamos e-mails pelo menos todas as sextas-feiras. Bem-vindo!

Ao se inscrever, você consente que qualquer informação que você receber pode incluir serviços e ofertas especiais por e-mail.

Os autores descobriram que existe um trade-off entre quando o Dropout é necessário, e quando ele não é mais útil. Primeiro, para cobrir o caso em que o conjunto de dados é extremamente pequeno: mesmo o Dropout não melhora o desempenho nesse caso, simplesmente porque o tamanho do conjunto de dados é muito pequeno. O mesmo se aplica aos conjuntos de dados que são suficientemente grandes: Dropout então não melhora mais o modelo, mas sim, o desempenho do modelo fica pior.

Hence, existe um sweet spot, quando Dropout é necessário e quando é inteligente não usá-lo (ou aumentar o tamanho do conjunto de dados). De acordo com Srivastava et al. (2014), não existem heurísticas para determinar esse tamanho; ao contrário, ele deve ser determinado com um conjunto de validação.

Gaussian Dropout: Variáveis Gaussianas ao invés de Bernoulli

Lembramos de cima que Dropout trabalha com variáveis Bernoulli que levam 1 com probabilidade \(p\) e 0 com o resto, sendo \(1 – p\).

Esta idéia pode ser generalizada para multiplicar as ativações com variáveis aleatórias de outras distribuições (Srivastava et al., 2014). Em seu trabalho, Srivastava et al. descobriram que a distribuição Gaussiana e, portanto, as variáveis Gaussianas funcionam tão bem – e talvez até melhor.

Aplicar as variáveis Gaussianas pode ser feito de forma semelhante: redes de desbaste em tempo de treinamento, e usando ativações ponderadas em tempo de teste e produção (como com Dropout regular). Entretanto, os autores optam por usar o Dropout Gaussiano de forma diferente – ou seja, de forma multiplicativa. Ao invés de desbaste e ponderação, o Gaussian Dropout é ponderado no tempo de treinamento, quando os valores ativados que não são descartados são multiplicados por 1/p em vez de 1 (com o Bernoulli Dropout regular). Eles não são modificados no momento do teste. Isto é igual ao cenário anterior.

Gaussian Dropout deve ser configurado por algum {\sigma}, que nos experimentos de Srivastava et al. foi definido como {(1-p)/p}, onde {\sqrt{(1-p)/p}, onde {\p} é a configuração da variante Bernoulli (ou seja em casos ingénuos (p

) para camadas ocultas e (p) para a camada de entrada).

Sumário

Neste post do blog, olhámos para o excesso – e como evitá-lo, com Dropout. Olhando o que é, como funciona, e que funciona, descobrimos que é uma técnica interessante para aplicação em seus modelos de aprendizado profundo.

Espero que você tenha aprendido algo hoje – algo útil aos seus modelos ML 😀 Se você fez, ou quando tiver dúvidas, por favor não hesite em deixar um comentário abaixo ⬇! Quando possível, eu responderei suas perguntas 😊

Obrigado por ler MachineCurve hoje e feliz engenharia! 😎

Srivastava, N., Hinton, G., Krizhevsky, A., Sutskever, I., & Salakhutdinov, R. (2014, 15 de junho). Dropout: Uma forma simples de evitar que as redes neurais se sobreponham. Recuperado de http://jmlr.org/papers/v15/srivastava14a.html

Wikipedia. (2003, 20 de março). Distribuição Bernoulli. Obtido de https://en.wikipedia.org/wiki/Bernoulli_distribution

💡 Domine o seu ML – veja também estes posts:

Deixe uma resposta

O seu endereço de email não será publicado.