Tamanho do lote de troca versus número de iterações para treinar uma rede neural

222

Ao treinar uma rede neural, que diferença faz para definir:

  • tamanho do lote para e o número de iterações paraumab
  • vs. tamanho do lote em número de iterações emcd

onde ?umab=cd

Em outras palavras, assumindo que treinamos a rede neural com a mesma quantidade de exemplos de treinamento, como definir o tamanho ideal do lote e o número de iterações? (onde tamanho do lote * número de iterações = número de exemplos de treinamento mostrados na rede neural, com o mesmo exemplo de treinamento sendo potencialmente mostrado várias vezes)

Estou ciente de que quanto maior o tamanho do lote, mais espaço de memória é necessário e, com frequência, isso torna os cálculos mais rápidos. Mas em termos de desempenho da rede treinada, que diferença isso faz?

Franck Dernoncourt
fonte
11
Confira este blog que descreve como escolher o tamanho de lote correto, enquanto compara os efeitos de diferentes tamanhos de lote na precisão do conjunto de dados Cifar-10.
Teja Sreenivas 27/03

Respostas:

208

De Nitish Shirish Keskar, Dheevatsa Mudigere, Jorge Nocedal, Mikhail Smelyanskiy e Ping Tak Peter Tang. Sobre o treinamento em lotes grandes para aprendizado profundo: diferença de generalização e Sharp Minima. https://arxiv.org/abs/1609.04836 :

O método de descida de gradiente estocástico e suas variantes são algoritmos de escolha para muitas tarefas de Aprendizado Profundo. Esses métodos operam em um regime de pequenos lotes em que uma fração dos dados de treinamento, geralmente de 32 a 512 pontos de dados, é amostrada para calcular uma aproximação ao gradiente. Observou-se na prática que, ao usar um lote maior, há uma degradação significativa na qualidade do modelo, conforme medido por sua capacidade de generalização.Houve algumas tentativas de investigar a causa dessa queda de generalização no regime de grandes lotes, mas a resposta precisa para esse fenômeno é, até agora desconhecida. Neste artigo, apresentamos ampla evidência numérica que apóia a visão de que métodos de grandes lotes tendem a convergir para minimizadores nítidos das funções de treinamento e teste - e que mínimos nítidos levam a uma generalização mais fraca. Por outro lado, os métodos de pequenos lotes convergem consistentemente para minimizadores planos, e nossos experimentos sustentam uma visão comum de que isso se deve ao ruído inerente na estimativa do gradiente. Também discutimos várias estratégias empíricas que ajudam os métodos de grandes lotes a eliminar a lacuna de generalização e concluir com um conjunto de idéias de pesquisas futuras e perguntas em aberto.

[...]

A falta de capacidade de generalização se deve ao fato de os métodos de lotes grandes tenderem a convergir para minimizadores acentuados da função de treinamento . Esses minimizadores são caracterizados por grandes autovalores positivos em e tendem a generalizar menos bem. Por outro lado, os métodos de pequenos lotes convergem para minimizadores planos, caracterizados por pequenos autovalores positivos de . Observamos que o cenário da função de perda de redes neurais profundas é tal que os métodos de lotes grandes são quase invariavelmente atraídos para regiões com mínimos acentuados e que, diferentemente dos métodos de lotes pequenos, são incapazes de escapar das bacias desses minimizadores.2f(x)2f(x)

[...]

insira a descrição da imagem aqui

Além disso, algumas boas idéias de Ian Goodfellow, respondendo a por que não usar todo o conjunto de treinamento para calcular o gradiente? no Quora:

O tamanho da taxa de aprendizado é limitado principalmente por fatores como a curvatura da função de custo. Você pode pensar na descida do gradiente como fazendo uma aproximação linear à função de custo e depois descendo ao longo desse custo aproximado. Se a função de custo for altamente não linear (altamente curvada), a aproximação não será muito boa por muito tempo, portanto, apenas tamanhos pequenos de etapas são seguros. Você pode ler mais sobre isso no Capítulo 4 do livro de aprendizado profundo, sobre computação numérica: http://www.deeplearningbook.org/contents/numerical.html

Quando você coloca m exemplos em um minibatch, precisa calcular O (m) e usar a memória O (m), mas reduz a quantidade de incerteza no gradiente por um fator de apenas O (sqrt (m)). Em outras palavras, há retornos marginais decrescentes para colocar mais exemplos no minibatch. Você pode ler mais sobre isso no Capítulo 8 do livro de aprendizado profundo, sobre algoritmos de otimização para aprendizado profundo: http://www.deeplearningbook.org/contents/optimization.html

Além disso, se você pensar bem, mesmo usando todo o conjunto de treinamento não oferece o verdadeiro gradiente. O gradiente verdadeiro seria o gradiente esperado com a expectativa tomada em todos os exemplos possíveis, ponderada pela distribuição de geração de dados. O uso de todo o conjunto de treinamento é apenas usar um tamanho de minibatch muito grande, em que o tamanho do minibatch é limitado pela quantia gasta na coleta de dados, e não pela quantia gasta em computação.

Relacionado: descida do gradiente em lote versus descida do gradiente estocástico

Franck Dernoncourt
fonte
Como batch_size apenas divide o conjunto de dados de treinamento em lotes, faria sentido reorganizar o conjunto de dados (não temporal) para ter uma variação uniforme em todos os lotes? Isso pode reduzir a necessidade de otimização do tamanho do lote, o que é bom apenas para encontrar uma convergência mais rápida. Se sim, como isso seria feito? Eu estava pensando que pode não fornecer um mínimo mais plano. Gostaria de receber orientações detalhadas.
user12348
@ user12348 Como irá reorganizar o conjunto de dados? Como você pode estimar que determinada dimensão de dados produzirá um vetor de recurso específico após o treinamento?
Cloud Cho
46

Suponho que você esteja falando sobre reduzir o tamanho do lote em um algoritmo de descida gradiente estocástico de mini lote e compará-lo a tamanhos de lote maiores que exigem menos iterações.

Andrew Ng. fornece uma boa discussão sobre isso e alguns recursos visuais em sua classe de cursos on-line sobre ML e redes neurais. Portanto, o restante deste post é principalmente uma regurgitação de seus ensinamentos daquela classe.

Vamos dar os dois extremos: de um lado, cada etapa de descida do gradiente está usando o conjunto de dados inteiro. Você está computando os gradientes para cada amostra. Nesse caso, você sabe exatamente o melhor diretamente para um mínimo local. Você não perde tempo indo na direção errada. Portanto, em termos de etapas de descida de gradiente de números, você chegará lá em menos.

É claro que computar o gradiente em todo o conjunto de dados é caro. Então agora vamos para o outro extremo. Um tamanho de lote de apenas 1 amostra. Nesse caso, o gradiente dessa amostra pode levá-lo completamente na direção errada. Mas ei, o custo de calcular o único gradiente foi bastante trivial. Ao tomar medidas em relação a apenas uma amostra, você "perambula" um pouco, mas, em média, caminha em direção a um mínimo local igualmente razoável, como na descida em gradiente de lote total.

Este pode ser um momento para apontar que vi alguma literatura sugerindo que talvez esse salto em torno da descida estocástica de uma amostra de 1 amostra possa ajudá-lo a sair de um mínimo local que o modo de lote inteiro não evitaria, mas isso é discutível. Algumas outras boas respostas aqui abordam essa questão mais diretamente do que eu.

Em termos de poder computacional, enquanto o processo GD estocástico de amostra única leva muito mais iterações, você acaba chegando lá por um custo menor do que o modo de lote completo "normalmente". É assim que Andrew Ng coloca.

Agora vamos encontrar o meio termo que você perguntou. Podemos perceber que as bibliotecas BLAS modernas tornam a computação em matemática de vetores bastante eficiente; portanto, calcular 10 ou 100 amostras de uma só vez, presumindo que você tenha vetorizado seu código corretamente, dificilmente será mais trabalhoso do que computar 1 amostra (você obtém eficiência de chamadas de memória e também truques computacionais incorporados às bibliotecas matemáticas mais eficientes). E a média de um lote de 10, 100, 1000 amostras produzirá um gradiente que é uma aproximação mais razoável do verdadeiro gradiente completo do modo de lote. Portanto, nossos passos agora são mais precisos, o que significa que precisamos de menos deles para convergir e a um custo apenas marginalmente mais alto que o GD de amostra única.

A otimização do tamanho exato do mini lote que você deve usar geralmente é deixada para tentativa e erro. Execute alguns testes em uma amostra do conjunto de dados com números que variam de, digamos, dezenas a alguns milhares e veja qual converge mais rapidamente, depois siga com isso. Os tamanhos de lote nessas faixas parecem bastante comuns na literatura. E se seus dados realmente são IID, o teorema do limite central da variação de processos aleatórios também sugere que esses intervalos são uma aproximação razoável do gradiente completo.

A decisão exata de quando parar a iteração geralmente é feita monitorando o erro de generalização em relação a um conjunto de validação não treinado e escolhendo o ponto no qual o erro de validação está no ponto mais baixo. O treinamento para muitas iterações acabará resultando em sobreajuste, quando o erro no seu conjunto de validação começará a subir. Quando você vê isso acontecendo, volte e pare no ponto ideal.

David Parks
fonte
22

TL; DR: Um tamanho muito pequeno de mini-lote geralmente leva a uma precisão menor !

Para os interessados, aqui está uma explicação.

Existem duas noções de velocidade:

  • Velocidade computacional
  • Velocidade de convergência de um algoritmo

A velocidade computacional é simplesmente a velocidade de realizar cálculos numéricos no hardware. Como você disse, geralmente é mais alto com um tamanho maior de mini-lote. Isso ocorre porque as bibliotecas de álgebra linear usam vetorização para operações de vetor e matriz para acelerá-las, às custas do uso de mais memória. Os ganhos podem ser significativos até certo ponto. Da minha experiência, há um ponto após o qual existem apenas ganhos marginais de velocidade, se houver. O ponto depende do conjunto de dados, hardware e uma biblioteca usada para cálculos numéricos (sob o capô).

Mas não vamos esquecer que existe também a outra noção de velocidade, que nos diz com que rapidez nosso algoritmo converge.

Em primeiro lugar, o que significa para o nosso algoritmo convergir? Bem, cabe a nós definir e decidir quando estamos satisfeitos com uma precisão ou erro que obtemos, calculado no conjunto de validação. Podemos defini-lo com antecedência e aguardar o algoritmo chegar a esse ponto, ou podemos monitorar o processo de treinamento e decidir pará-lo quando o erro de validação começar a aumentar significativamente (o modelo começa a superajustar o conjunto de dados). Realmente não devemos parar imediatamente, no primeiro momento em que o erro começar a aumentar, se trabalharmos com mini lotes, porque usamos a Descentralização Estocástica por Gradiente, SGD. No caso de descida de gradiente (em lote inteiro), após cada época, o algoritmo será estabelecido no mínimo, seja local ou global. A SGD nunca se instala realmente no mínimo. Ele continua oscilando em torno dele. Poderia continuar indefinidamente,

Agora, depois de toda essa teoria, há um "problema" em que precisamos prestar atenção. Ao usar um tamanho de lote menor, o cálculo do erro tem mais ruído do que quando usamos um tamanho de lote maior. Alguém poderia dizer, bem, isso é ruim, não é? O problema é que esse ruído pode ajudar o algoritmo a saltar de um mínimo local ruim e ter mais chances de encontrar um mínimo local melhor ou, esperançosamente, o mínimo global.

Portanto, se pudermos encontrar uma solução melhor mais rapidamente usando um tamanho de lote menor em vez de um tamanho maior, apenas com a ajuda do ruído "indesejado", podemos ajustar o tempo total necessário para que nosso algoritmo encontre um resultado satisfatório. solução e uma maior precisão.

O que quero dizer é que, para uma determinada precisão (ou erro), um tamanho de lote menor pode levar a um tempo total de treinamento mais curto, não mais, como muitos acreditam.

Ou, se decidirmos manter o mesmo tempo de treinamento de antes, podemos obter uma precisão um pouco mais alta com um tamanho de lote menor, e provavelmente o conseguiremos, especialmente se tivermos escolhido nossa taxa de aprendizado adequadamente.

Se você tiver tempo, confira este documento: Avaliação sistemática dos avanços da CNN no ImageNet Especialmente, consulte "3.7. Tamanho do lote e taxa de aprendizado" e Figura 8. Você verá que tamanhos grandes de mini lotes levam a uma precisão menor , mesmo que sintonizando a taxa de aprendizado com uma heurística.

Em geral, o tamanho do lote 32 é um bom ponto de partida e você também deve tentar com 64, 128 e 256. Outros valores (inferiores ou superiores) podem ser bons para alguns conjuntos de dados, mas o intervalo fornecido geralmente é o melhor para comece a experimentar. Embora, com menos de 32 anos, possa ficar muito lento por causa da velocidade computacional significativamente menor, por não explorar a vetorização em toda a extensão. Se você receber um erro de "falta de memória", tente reduzir o tamanho do mini lote de qualquer maneira.

Portanto, não se trata apenas de usar o maior tamanho possível de mini lotes que cabe na memória.

Para concluir e responder à sua pergunta, um tamanho menor de mini-lote (não muito pequeno) geralmente leva não apenas a um número menor de iterações de um algoritmo de treinamento, a um tamanho de lote grande, mas também a uma maior precisão geral, ou seja, uma rede neural com melhor desempenho, na mesma quantidade de tempo de treinamento ou menos.

Não se esqueça que o ruído mais alto pode ajudá-lo a sair de um mínimo local ruim, em vez de deixá-lo preso nele.

ivanbgd
fonte
14

Estou adicionando outra resposta a esta pergunta para fazer referência a um novo documento da conferência ICLR (2018) do Google, que aborda quase diretamente essa questão.

Título: Não diminua a taxa de aprendizado, aumente o tamanho do lote

https://arxiv.org/abs/1711.00489

O resumo do artigo acima é copiado aqui:

É prática comum diminuir a taxa de aprendizado. Aqui mostramos que geralmente é possível obter a mesma curva de aprendizado nos conjuntos de treinamento e teste, aumentando o tamanho do lote durante o treinamento. Esse procedimento é bem-sucedido para descida do gradiente estocástico (SGD), SGD com momento, momento Nesterov e Adam. Atinge precisão de teste equivalente após o mesmo número de épocas de treinamento, mas com menos atualizações de parâmetros, resultando em maior paralelismo e menor tempo de treinamento. Podemos reduzir ainda mais o número de atualizações de parâmetros aumentando a taxa de aprendizado ϵ e escalando o tamanho do lote B∝ϵ. Finalmente, pode-se aumentar o coeficiente de momento me escalar B∝1 / (1 m), embora isso tenda a reduzir levemente a precisão do teste. Crucialmente, nossas técnicas nos permitem redefinir os agendamentos de treinamento existentes para treinamento em lotes grandes sem ajuste de hiperparâmetros. Treinamos o ResNet-50 no ImageNet com 76,1% de precisão de validação em menos de 30 minutos.

David Parks
fonte
11
Um requisito de memória maior parece uma troca ruim por simplesmente evitar diminuir um valor. Além disso, o IMHO com o aumento da área de memória durante o treinamento contribui para um algoritmo menos, não mais, escalável.
P-Gn
3

Eu mostro alguma experiência empírica aqui . Fiz um experimento com o tamanho do lote 4 e o tamanho do lote 4096. O tamanho 4096 está fazendo 1024x menos retropropagações. Portanto, minha intuição é que lotes maiores executem menos etapas de pesquisa mais grosseiras em busca da solução ideal e, portanto, por construção, haverá menos probabilidade de convergir para a solução ideal.

Lars Ericson
fonte