Batch_size no Keras tem algum efeito na qualidade dos resultados?

38

Estou prestes a treinar uma grande rede LSTM com 2 a 3 milhões de artigos e estou enfrentando erros de memória (uso o AWS EC2 g2x2large).

Eu descobri que uma solução é reduzir o batch_size. No entanto, não tenho certeza se esse parâmetro está relacionado apenas a problemas de eficiência de memória ou se afetará meus resultados. De fato, também notei que o batch_sizeuso de exemplos costuma ser uma potência de dois, o que também não entendo.

Não me importo se minha rede demorar mais para treinar, mas gostaria de saber se reduzir a batch_sizediminuirá a qualidade de minhas previsões.

Obrigado.

hipoglucido
fonte
Esta questão não é específica para keras. Eu acho que o consesus geral é que os tamanhos de amostras menores convergem mais lento, mas são menos propensas a ficar preso no mínimo local
Alex
Vi casos em que um tamanho de lote muito grande pode impedir a convergência, mesmo com o mesmo número de épocas de treinamento.
Curtis White

Respostas:

43

Depois de um ano e meio, volto à minha resposta porque minha resposta anterior estava errada.

O tamanho do lote afeta significativamente o aprendizado. O que acontece quando você coloca um lote na rede é que calcula a média dos gradientes. O conceito é que, se o tamanho do lote for grande o suficiente, isso fornecerá uma estimativa suficientemente estável do que seria o gradiente do conjunto de dados completo. Ao coletar amostras do seu conjunto de dados, você estima o gradiente enquanto reduz significativamente o custo computacional. Quanto mais baixo você for, menos precisa será sua estimativa; no entanto, em alguns casos, esses gradientes ruidosos podem realmente ajudar a escapar dos mínimos locais. Quando está muito baixo, os pesos da sua rede podem simplesmente saltar se os dados estiverem barulhentos e eles não conseguirem aprender ou convergirem muito lentamente, afetando negativamente o tempo total de computação.

Outra vantagem do lote é o cálculo da GPU, pois as GPUs são muito boas para paralelizar os cálculos que ocorrem nas redes neurais se parte da computação for a mesma (por exemplo, multiplicação de matriz repetida na mesma matriz de peso da sua rede). Isso significa que um tamanho de lote de 16 terá menos que o dobro da quantidade de um tamanho de lote de 8.

No caso de você precisar de tamanhos de lote maiores, mas não caber em sua GPU, você pode alimentar um lote pequeno, salvar as estimativas de gradiente e alimentar um ou mais lotes e, em seguida, fazer uma atualização de peso. Dessa forma, você obtém um gradiente mais estável porque aumentou o tamanho do lote virtual.

RESPOSTA ERRADA E ANTIGA: [[[Não, o tamanho do lote, em média, influencia apenas a velocidade do seu aprendizado, não a qualidade do aprendizado. O batch_sizes também não precisa ter potências de 2, embora eu entenda que certos pacotes permitem apenas potências de 2. Você deve tentar obter seu batch_size o mais alto possível, que ainda se encaixa na memória da sua GPU para obter a velocidade máxima possível .]]]]

Jan van der Vegt
fonte
Não posso pagar 32, mas posso pagar 16. No entanto, notei que é muito lento. Você acha que eu deveria tentar alguns valores entre 16 e 32 ou ficar com 16?
Hipoglucido
Eu tentaria cronometrar alguns valores. Cada época deve ocorrer ao mesmo tempo, para que não demore muito. Tente 17 primeiro para ver se é mais rápido ou mais lento, porque estou interessado nisso, já que esse poder de 2 depende da GPU e / ou back-end da Keras. Mas eu acho que só preenchê-lo até a borda é provável melhor
Jan van der Vegt
9
Você tem certeza de que o tamanho do lote não influencia a qualidade do aprendizado? Lembro-me de ler alguns blogs / artigos (?) Onde eles disseram que lotes menores produzem gradientes mais ruidosos do que lotes maiores, mas o ruído pode ser útil para sair dos mínimos locais. Não tenho certeza se / como isso se aplica aos LSTMs.
stmax
Não totalmente convencido, não tive experiência suficiente, mas é isso que eu li. Eu posso ver os gradientes menos estáveis, então talvez eu esteja fora.
Jan van der Vegt 04/07/19
2
Um ano e meio depois e muito mais qualificado agora e eu concordo. Eu vou mudar a minha resposta
Jan van der Vegt
11

Sinto que a resposta aceita está possivelmente errada. Existem variantes nos algoritmos de descida de gradiente .

  1. Descida do gradiente de baunilha : Aqui, o gradiente está sendo calculado em todos os pontos de dados de uma só vez e a média é calculada. Portanto, temos uma versão mais suave do gradiente que leva mais tempo para aprender.

  2. Descida de gradiente estocástico : Aqui um ponto de dados de cada vez, portanto, o gradiente é agressivo (gradientes barulhentos), portanto haverá muitas oscilações (usamos parâmetros de momento - por exemplo, Nesterov para controlar isso). Portanto, há uma chance de que suas oscilações possam fazer com que o algoritmo não atinja um mínimo local (divergir).

  3. Descida de gradiente de mini-lote : o que leva as vantagens das duas anteriores à média de gradientes de um pequeno lote. Portanto, não é muito agressivo como o SGD e permite o aprendizado on-line que o Vanilla GD nunca permitiu.

Quanto menor o Mini-Lote, melhor o desempenho do seu modelo (nem sempre) e, é claro, isso tem a ver com as épocas de um aprendizado muito mais rápido. Se você está treinando em um grande conjunto de dados, deseja uma convergência mais rápida com bom desempenho, portanto, escolhemos Batch-GD's.

O SGD tinha um parâmetro de aprendizado fixo, portanto, iniciamos outros Otimizadores Adaptativos, como Adam, AdaDelta, RMS Prop etc., que alteram o parâmetro de aprendizado com base no histórico dos Gradientes.

Jil Jung Juk
fonte
3) é chamado minibatch normalmente
Alex
@ Alex: adicionada a alteração.
precisa saber é o seguinte
1
Concordo que não há regra em relação ao parâmetro de tamanho do lote. Mas essa afirmação - "Quanto menor o Mini-Lote, melhor o desempenho do seu modelo" - é contrário à regra geral. Você geralmente deseja maximizar o batch-size
MonsieurBeilto
4

Curiosamente, descobri que tamanhos maiores de lotes com keras exigem mais épocas para convergir.

Por exemplo, a saída desse script com base no teste de integração de keras é

epochs 15   , batch size 16   , layer type Dense: final loss 0.56, seconds 1.46
epochs 15   , batch size 160  , layer type Dense: final loss 1.27, seconds 0.30
epochs 150  , batch size 160  , layer type Dense: final loss 0.55, seconds 1.74

Relacionado

Usar um tamanho de lote muito grande pode afetar negativamente a precisão da sua rede durante o treinamento, pois reduz a estocástica da descida do gradiente.

Editar: na maioria das vezes, batch_sizeé desejável aumentar para acelerar a computação, mas existem outras maneiras mais simples de fazer isso, como usar tipos de dados de menor tamanho através do dtypeargumento, seja em keras ou fluxo tensorial , por exemplo, em float32vez defloat64

shadi
fonte
Com lotes maiores (e, portanto, menos por época), você terá menos atualizações de gradiente por época. "época" é apenas o jargão da ML para "uma passagem pelos seus dados durante o treinamento". Se você está tentando acelerar o treinamento, meça o tempo na parede e ignore as épocas.
Andrew Wagner