10 KiB
Truques para Treino em Deep Learning
À medida que as redes neurais se tornam mais profundas, o processo de treino torna-se cada vez mais desafiador. Um dos principais problemas é o chamado vanishing gradients ou exploding gradients. Este artigo oferece uma boa introdução a esses problemas.
Para tornar o treino de redes profundas mais eficiente, existem algumas técnicas que podem ser utilizadas.
Manter valores num intervalo razoável
Para tornar os cálculos numéricos mais estáveis, é importante garantir que todos os valores dentro da rede neural estejam numa escala razoável, tipicamente [-1..1] ou [0..1]. Não é um requisito muito rígido, mas a natureza dos cálculos em ponto flutuante é tal que valores de magnitudes diferentes não podem ser manipulados com precisão juntos. Por exemplo, se somarmos 10-10 e 1010, é provável que obtenhamos 1010, porque o valor menor seria "convertido" para a mesma ordem do maior, e assim a mantissa seria perdida.
A maioria das funções de ativação tem não-linearidades em torno de [-1..1], e por isso faz sentido escalar todos os dados de entrada para o intervalo [-1..1] ou [0..1].
Inicialização de Pesos
Idealmente, queremos que os valores permaneçam na mesma faixa após passarem pelas camadas da rede. Assim, é importante inicializar os pesos de forma a preservar a distribuição dos valores.
A distribuição normal N(0,1) não é uma boa ideia, porque se tivermos n entradas, o desvio padrão da saída seria n, e os valores provavelmente sairão do intervalo [0..1].
As seguintes inicializações são frequentemente utilizadas:
- Distribuição uniforme --
uniform - N(0,1/n) --
gaussian - N(0,1/√n_in) garante que para entradas com média zero e desvio padrão de 1, a mesma média/desvio padrão será mantida
- N(0,√2/(n_in+n_out)) -- chamada Xavier initialization (
glorot), ajuda a manter os sinais na faixa durante a propagação direta e reversa
Normalização por Lote
Mesmo com uma inicialização adequada dos pesos, estes podem ficar arbitrariamente grandes ou pequenos durante o treino, levando os sinais para fora da faixa apropriada. Podemos trazer os sinais de volta utilizando uma das técnicas de normalização. Embora existam várias delas (Normalização de Pesos, Normalização de Camadas), a mais utilizada é a Normalização por Lote.
A ideia da normalização por lote é considerar todos os valores do minibatch e realizar a normalização (ou seja, subtrair a média e dividir pelo desvio padrão) com base nesses valores. É implementada como uma camada na rede que realiza essa normalização após aplicar os pesos, mas antes da função de ativação. Como resultado, é provável que se obtenha maior precisão final e treino mais rápido.
Aqui está o artigo original sobre normalização por lote, a explicação na Wikipedia, e um bom artigo introdutório (e outro em russo).
Dropout
Dropout é uma técnica interessante que remove uma certa percentagem de neurónios aleatórios durante o treino. É implementada como uma camada com um parâmetro (percentagem de neurónios a remover, tipicamente 10%-50%), e durante o treino zera elementos aleatórios do vetor de entrada antes de passá-lo para a próxima camada.
Embora possa parecer uma ideia estranha, pode-se observar o efeito do dropout no treino de um classificador de dígitos MNIST no notebook Dropout.ipynb. Ele acelera o treino e permite alcançar maior precisão em menos épocas de treino.
Este efeito pode ser explicado de várias formas:
- Pode ser considerado como um fator de choque aleatório para o modelo, que o tira de mínimos locais
- Pode ser considerado como média implícita de modelos, porque durante o dropout estamos a treinar modelos ligeiramente diferentes
Algumas pessoas dizem que quando uma pessoa bêbada tenta aprender algo, ela lembra-se melhor no dia seguinte, comparando com uma pessoa sóbria, porque um cérebro com alguns neurónios a funcionar mal tenta adaptar-se melhor para captar o significado. Nunca testámos se isto é verdade ou não.
Prevenir overfitting
Um dos aspetos muito importantes do deep learning é ser capaz de prevenir o overfitting. Embora possa ser tentador usar um modelo de rede neural muito poderoso, devemos sempre equilibrar o número de parâmetros do modelo com o número de amostras de treino.
Certifique-se de que compreende o conceito de overfitting que introduzimos anteriormente!
Existem várias formas de prevenir o overfitting:
- Paragem antecipada -- monitorizar continuamente o erro no conjunto de validação e parar o treino quando o erro de validação começar a aumentar.
- Decaimento explícito de pesos / Regularização -- adicionar uma penalização extra à função de perda para valores absolutos altos de pesos, o que previne resultados muito instáveis no modelo
- Média de Modelos -- treinar vários modelos e depois fazer a média dos resultados. Isto ajuda a minimizar a variância.
- Dropout (Média Implícita de Modelos)
Otimizadores / Algoritmos de Treino
Outro aspeto importante do treino é escolher um bom algoritmo de treino. Embora o gradient descent clássico seja uma escolha razoável, pode por vezes ser demasiado lento ou resultar em outros problemas.
Em deep learning, utilizamos Stochastic Gradient Descent (SGD), que é um gradient descent aplicado a minibatches, selecionados aleatoriamente do conjunto de treino. Os pesos são ajustados utilizando esta fórmula:
wt+1 = wt - η∇ℒ
Momentum
No momentum SGD, mantemos uma parte do gradiente dos passos anteriores. É semelhante a quando nos movemos com inércia e recebemos um empurrão numa direção diferente; a nossa trajetória não muda imediatamente, mas mantém parte do movimento original. Aqui introduzimos outro vetor v para representar a velocidade:
- vt+1 = γ vt - η∇ℒ
- wt+1 = wt+vt+1
Aqui o parâmetro γ indica até que ponto consideramos a inércia: γ=0 corresponde ao SGD clássico; γ=1 é uma equação de movimento puro.
Adam, Adagrad, etc.
Como em cada camada multiplicamos os sinais por uma matriz Wi, dependendo de ||Wi||, o gradiente pode diminuir e ser próximo de 0, ou crescer indefinidamente. Este é o cerne do problema de Exploding/Vanishing Gradients.
Uma das soluções para este problema é usar apenas a direção do gradiente na equação e ignorar o valor absoluto, ou seja:
wt+1 = wt - η(∇ℒ/||∇ℒ||), onde ||∇ℒ|| = √∑(∇ℒ)2
Este algoritmo é chamado Adagrad. Outros algoritmos que utilizam a mesma ideia: RMSProp, Adam
Adam é considerado um algoritmo muito eficiente para muitas aplicações, por isso, se não tiver certeza de qual usar - use Adam.
Gradient clipping
Gradient clipping é uma extensão da ideia acima. Quando ||∇ℒ|| ≤ θ, consideramos o gradiente original na otimização dos pesos, e quando ||∇ℒ|| > θ - dividimos o gradiente pela sua norma. Aqui θ é um parâmetro; na maioria dos casos podemos usar θ=1 ou θ=10.
Decaimento da taxa de aprendizagem
O sucesso do treino muitas vezes depende do parâmetro de taxa de aprendizagem η. É lógico assumir que valores maiores de η resultam em treino mais rápido, algo que normalmente queremos no início do treino, e depois valores menores de η permitem ajustar melhor a rede. Assim, na maioria dos casos queremos diminuir η durante o processo de treino.
Isto pode ser feito multiplicando η por um número (ex. 0.98) após cada época de treino, ou utilizando um cronograma de taxa de aprendizagem mais complicado.
Diferentes Arquiteturas de Redes
Selecionar a arquitetura certa para o seu problema pode ser complicado. Normalmente, escolhemos uma arquitetura que já tenha demonstrado funcionar para a nossa tarefa específica (ou uma semelhante). Aqui está uma boa visão geral de arquiteturas de redes neurais para visão computacional.
É importante selecionar uma arquitetura que seja suficientemente poderosa para o número de amostras de treino que temos. Escolher um modelo demasiado poderoso pode resultar em overfitting.
Outra boa abordagem seria usar uma arquitetura que se ajuste automaticamente à complexidade necessária. Até certo ponto, as arquiteturas ResNet e Inception são autoajustáveis. Mais sobre arquiteturas de visão computacional
Aviso Legal:
Este documento foi traduzido utilizando o serviço de tradução por IA Co-op Translator. Embora nos esforcemos para garantir a precisão, esteja ciente de que traduções automáticas podem conter erros ou imprecisões. O documento original no seu idioma nativo deve ser considerado a fonte autoritativa. Para informações críticas, recomenda-se a tradução profissional humana. Não nos responsabilizamos por quaisquer mal-entendidos ou interpretações incorretas resultantes do uso desta tradução.