Por que o tamanho do mini lote é melhor que um único "lote" com todos os dados de treinamento?


40

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?


11
Faça o checkout desta resposta.
Icyblade



Respostas:


46

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.)

Treinar com minibatches grandes faz mal à sua saúde. Mais importante, isso é ruim para o seu erro de teste. Os amigos não permitem que amigos usem minibatches maiores que 32. Vamos ser sinceros: as únicas pessoas que mudaram para tamanhos de minibatch maiores que um desde 2012 é porque as GPUs são ineficientes para tamanhos de lote menores que 32. Esse é um motivo terrível. Significa apenas que nosso hardware é péssimo.

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,

Enquanto o uso de mini-lotes grandes aumenta o paralelismo computacional disponível, foi demonstrado que o treinamento em pequenos lotes fornece melhor desempenho de generalização ...

O melhor desempenho foi obtido consistentemente para tamanhos de mini lotes entre m = 2 e m = 32, o que contrasta com o trabalho recente que defende o uso de tamanhos de mini lotes em milhares.


2
Por que a descida do gradiente de mini-lote deve ter mais probabilidade de evitar mínimos locais ruins do que a descida do gradiente de lote? Você tem algo para apoiar essa reivindicação?
Martin Thoma

@MartinThoma Veja o Teorema 6 em [2], um artigo recente sobre JMLR.
horaceT

2
Este artigo também está no arXiv . Além disso, não vejo como isso suporta sua reivindicação. Eles nunca mencionaram a descida do gradiente de mini-lote. Eu não entendo esse teorema (por exemplo, o que é "g (X)"? Onde eles introduziram essa notação? Nas aulas de estatística, g (X) = E (X) ... mas isso não faz muito sentido aqui) . O que é ? - A afirmação deste teorema parece sugerir que não existem mínimos locais ruins. Mas isso seria verdade para a descida do gradiente de lote e SGD, bem como para a descida de gradiente de mini-lote, certo? ϕ(w,X)
Martin Thoma

2
@MartinThoma Dado que há um mínimo global para o conjunto de dados que recebemos, o caminho exato para esse mínimo global depende de coisas diferentes para cada método GD. Para o lote, o único aspecto estocástico são os pesos na inicialização. O caminho do gradiente será o mesmo se você treinar o NN novamente com os mesmos pesos e conjuntos de dados iniciais. Para mini-lote e SGD, o caminho terá alguns aspectos estocásticos entre cada etapa, desde a amostragem estocástica de pontos de dados para treinamento em cada etapa. Isso permite que o mini-lote e o SGD escapem às ótimas locais, se estiverem a caminho.
Wesley #

8

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.


3

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

Correto (embora eu chamasse de "etapa de atualização de peso")

e época é uma volta completa quando cada uma das instâncias de treinamento foi vista pelo modelo

Corrigir

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?

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.


Realmente não é uma questão de memória limitada. Sempre é possível calcular o gradiente em seu conjunto de dados em vários lotes com parâmetros de modelo fixos (funcionalmente equivalente a calcular o gradiente em um único lote gigante). Na prática, trata-se mais das propriedades de generalização causadas pela estocasticidade / ruído do SGD / MBGD e pelo fato de serem necessárias menos épocas no conjunto de dados para alcançar a convergência. A atualização de parâmetros de modelo em uma única época leva a melhores parâmetros intermediários, o que torna os cálculos de gradiente adicionais dentro da época mais informativos.
Madison May

1

Além das outras respostas, acho que vale ressaltar que existem duas quantidades distintas, mas frequentemente acopladas:

  1. O número de entradas usadas para calcular o gradiente dos parâmetros em cada etapa.

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.

  1. O número de entradas coletadas em uma matriz e computadas "ao mesmo tempo"

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.