Ao treinar uma rede neural, que diferença faz para definir:
- tamanho do lote para e o número de iterações para
- vs. tamanho do lote em número de iterações em
onde ?
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?
neural-networks
train
Franck Dernoncourt
fonte
fonte
Respostas:
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 :
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:
Relacionado: descida do gradiente em lote versus descida do gradiente estocástico
fonte
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.
fonte
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:
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.
fonte
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:
fonte
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.
fonte