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_size
uso 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_size
diminuirá a qualidade de minhas previsões.
Obrigado.
deep-learning
keras
hipoglucido
fonte
fonte
Respostas:
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 .]]]]
fonte
Sinto que a resposta aceita está possivelmente errada. Existem variantes nos algoritmos de descida de gradiente .
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.
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).
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.
fonte
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 é
Relacionado
BatchNormalization
, o que afetou os resultados.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 dodtype
argumento, seja em keras ou fluxo tensorial , por exemplo, emfloat32
vez defloat64
fonte