Costumo ler que, no caso dos modelos de Aprendizado Profundo, a prática usual é aplicar mini-lotes (geralmente pequenos, 32/64) em várias épocas de treinamento. Eu realmente não consigo entender a razão por trás disso.
A menos que eu esteja enganado, o tamanho do lote é o número de instâncias de treinamento permitidas pelo modelo durante uma iteração de treinamento; e época é uma volta completa quando cada uma das instâncias de treinamento foi vista pelo modelo. Nesse caso, não vejo a vantagem de iterar sobre um subconjunto quase insignificante das instâncias de treinamento várias vezes, em contraste com a aplicação de um "lote máximo", expondo todas as instâncias de treinamento disponíveis em cada turno ao modelo (supondo, é claro, o suficiente a memória). Qual é a vantagem dessa abordagem?
fonte
Respostas:
A principal vantagem do uso do minibatch em oposição ao conjunto de dados completo remonta à ideia fundamental da descida estocástica do gradiente 1 .
Na descida do gradiente em lote, você calcula o gradiente em todo o conjunto de dados, calculando a média de uma quantidade potencialmente vasta de informações. É preciso muita memória para fazer isso. Mas a verdadeira desvantagem é que a trajetória do gradiente do lote leva você a um ponto ruim (ponto de sela).
Por outro lado, no SGD puro, você atualiza seus parâmetros adicionando (sinal de menos) o gradiente calculado em uma única instância do conjunto de dados. Como é baseado em um ponto de dados aleatórios, é muito barulhento e pode sair em uma direção distante do gradiente do lote. No entanto, o ruído é exatamente o que você deseja na otimização não convexa, porque ajuda a escapar de pontos de sela ou mínimos locais (Teorema 6 em [2]). A desvantagem é que é terrivelmente ineficiente e você precisa fazer um loop em todo o conjunto de dados várias vezes para encontrar uma boa solução.
A metodologia de minibatch é um compromisso que injeta ruído suficiente para cada atualização de gradiente, enquanto obtém uma convergência relativamente rápida.
1 Bottou, L. (2010). Aprendizado de máquina em larga escala com descida de gradiente estocástico. In Proceedings of COMPSTAT'2010 (pp. 177-186). Physica-Verlag HD.
[2] Ge, R., Huang, F., Jin, C. e Yuan, Y. (2015, junho). Escapando do gradiente estocástico on-line dos pontos de sela para decomposição do tensor. Em COLT (pp. 797-842).
EDIT:
Acabei de ver esse comentário no facebook de Yann LeCun, que fornece uma nova perspectiva sobre essa questão (desculpe, não sei como vincular ao fb.)
Ele citou este artigo que acabou de ser publicado no arXiv há alguns dias (abril de 2018), que vale a pena ler,
Dominic Masters, Carlo Luschi, Revisitando o treinamento em pequenos lotes para redes neurais profundas , arXiv: 1804.07612v1
Do resumo,
fonte
A memória não é realmente a razão para fazer isso, porque você pode apenas acumular seus gradientes à medida que percorre o conjunto de dados e aplicá-los no final, mas ainda no SGD você os aplica em todas as etapas.
Os motivos pelos quais o SGD é amplamente utilizado são:
1) eficiência. Normalmente, especialmente no início do treinamento, os gradientes de parâmetro para diferentes subconjuntos de dados tendem a apontar na mesma direção. Portanto, os gradientes avaliados em 1/100 dos dados apontarão aproximadamente na mesma direção geral que no conjunto de dados completo, mas requerem apenas 1/100 da computação. Como a convergência em uma rede profunda altamente não-linear geralmente requer milhares ou milhões de iterações, independentemente de quão bons sejam seus gradientes, faz sentido fazer muitas atualizações com base em estimativas baratas do gradiente, em vez de poucas atualizações com base nas boas.
2) Otimização: atualizações barulhentas podem permitir que você evite ótimas opções locais ruins (embora eu não tenha uma fonte que mostre que isso é importante na prática).
3) Generalização. Parece (consulte Zhang et al: Theory of Deep Learning III: Generalization Properties of SGD ) que o SGD realmente ajuda a generalização ao encontrar mínimos "planos" no conjunto de treinamento, que provavelmente também serão mínimos no conjunto de testes. Intuitivamente, podemos pensar no SGD como uma espécie de ensacamento - calculando nossos parâmetros com base em muitos minibatches dos dados, reforçamos as regras que generalizam nos minibatches e cancelamos as regras que não o fazem, tornando-nos menos propensos a sobreajuste ao conjunto de treinamento.
fonte
Correto (embora eu chamasse de "etapa de atualização de peso")
Corrigir
Bem, praticamente isso. Você geralmente não tem memória suficiente. Digamos que estamos falando sobre classificação de imagens. ImageNet é um conjunto de dados muito popular. Por um bom tempo, o VGG-16D foi um dos mod.els mais populares. Ele precisa calcular 15 245 800 flutuadores (nos mapas de recursos) para uma imagem de 224x224. Isso significa cerca de 61 MB por imagem. Esse é apenas um limite aproximado da quantidade de memória necessária durante o treinamento para cada imagem. O ImageNet contém vários milhares (eu acho que cerca de 1,2 milhão?) De imagens. Embora você possa ter tanta memória principal, certamente não possui tanta memória da GPU. Eu vi a GPU acelerando as coisas para cerca de 21x. Então você definitivamente deseja usar a GPU.
Além disso: o tempo para um mini lote é muito menor. Portanto, a pergunta é: você prefere n atualizar etapas com mini-lote por hora em uma GPU ou m atualizar etapas com lote sem GPU, em que n >> m.
fonte
Além das outras respostas, acho que vale ressaltar que existem duas quantidades distintas, mas frequentemente acopladas:
Como outros já apontaram, o gradiente em relação a um minibatch é uma aproximação do gradiente verdadeiro. Quanto maior o minibatch, melhor a aproximação.
A troca aqui é puramente sobre desempenho (memória / ciclos).
Essas quantidades são tipicamente as mesmas, ou seja, o tamanho do minibatch, mas, em princípio, podem ser dissociadas.
fonte