O treinamento em redes neurais é realizado um a um? [duplicado]

9

Estou tentando aprender redes neurais assistindo a essa série de vídeos e implementando uma rede neural simples em Python.

Aqui está uma das coisas que estou pensando: estou treinando a rede neural em dados de amostra e tenho 1.000 amostras. O treinamento consiste em alterar gradualmente os pesos e desvios para que a função de custo resulte em um custo menor.

Minha pergunta: devo alterar os pesos / desvios em cada amostra antes de passar para a próxima amostra ou devo primeiro calcular as alterações desejadas para todo o lote de 1.000 amostras e só então começar a aplicá-las à rede?

Ram Rachum
fonte

Respostas:

9

Devo alterar os pesos / desvios em cada amostra antes de passar para a próxima amostra,

Você pode fazer isso, é chamado de descida de gradiente estocástico (SGD) e normalmente embaralha o conjunto de dados antes de trabalhar com ele todas as vezes.

ou devo primeiro calcular as alterações desejadas para todo o lote de 1.000 amostras e só então começar a aplicá-las à rede?

Você pode fazer isso, é chamado descida em gradiente em lote ou, em alguns casos (especialmente em recursos mais antigos), apenas assumido como a abordagem normal e chamado descida em gradiente.

Cada abordagem oferece vantagens e desvantagens. Em geral:

  • O SGD torna cada atualização mais cedo em termos de quantidade de dados que foram processados. Portanto, você pode precisar de menos épocas antes de convergir em valores razoáveis.

  • O SGD faz mais processamento por amostra (porque é atualizado com mais frequência), também é mais lento, pois leva mais tempo para processar cada amostra.

  • O SGD pode aproveitar menos a paralelização, pois as etapas de atualização significam que você precisa executar cada item de dados em série (pois os pesos foram alterados e os resultados de erro / gradiente são calculados para um conjunto específico de pesos).

  • As etapas individuais da SGD fazem tipicamente apenas palpites muito grosseiros nos gradientes corretos para alterar pesos. Isso é uma desvantagem (o desempenho do NN em relação ao objetivo no conjunto de treinamento pode diminuir e aumentar) e uma vantagem (há menos probabilidade de ficar preso em um ponto estacionário local devido ao "tremor" causado por essas diferenças aleatórias).

O que acontece na prática é que a maioria dos softwares permite comprometer o processamento em lote e o processamento de amostra única, para tentar obter as melhores características de desempenho e atualização. Isso é chamado de processamento em mini-lote, que envolve:

  • Baralhar o conjunto de dados no início de cada época.

  • Trabalhando com os dados embaralhados, N itens por hora em que N pode variar de talvez 10 a 1000, dependendo do problema e de quaisquer restrições no hardware. Uma decisão comum é processar o maior tamanho de lote que a aceleração da GPU permite executar em paralelo.

  • Calcule a atualização necessária para cada lote pequeno e aplique-a.

Atualmente, esse é o método de atualização mais comum que a maioria das bibliotecas de redes neurais assume, e elas quase universalmente aceitam um parâmetro de tamanho de lote na API de treinamento. A maioria das bibliotecas ainda chamará otimizadores simples que fazem isso SGD; tecnicamente, é verdade que os gradientes calculados ainda são um pouco aleatórios devido à não utilização do lote completo, mas você pode encontrar isso chamado descida do gradiente de mini lotes em alguns artigos mais antigos.

Neil Slater
fonte
'Uma decisão comum é processar o maior tamanho de lote que a aceleração da GPU permite executar em paralelo.' Como você determina isso? Eu não vi qualquer recurso onde ele pode ser comentado, quando o tamanho do lote é apenas o suficiente para o pico paralelização
DuttaA
Uma pergunta semelhante foi feita antes neste site. Eu até acho que é uma duplicata (embora de outra perspectiva um pouco). Consulte: ai.stackexchange.com/q/11667/2444 .
nbro
"Uma decisão comum é processar o maior tamanho de lote que a aceleração da GPU permite executar em paralelo". - Você tem ao contrário! A primeira heurística é processar o menor tamanho de minilote que resulta em desempenho aceitável. Com muitos modelos, no entanto, você atinge os limites de memória antes de saturar a eficiência do hardware, e acaba executando o maior modelo que caberá na RAM. Geralmente, porém, lotes menores encontram melhores mínimos, pois exibem mais estocástico. Uma ressalva é que a norma de lote quebra com tamanhos de lote muito pequenos.
Aleksandr Dubinsky
@AleksandrDubinsky RAM é hardware.
DuttaA
0

Idealmente, você precisa atualizar os pesos examinando todas as amostras no conjunto de dados. Isso é chamado de descida de gradiente em lote . Mas, como o não. de exemplos de treinamento aumenta, o cálculo se torna enorme e o treinamento será muito lento. Com o advento da aprendizagem profunda, o tamanho do treinamento está em milhões e a computação usando todos os exemplos de treinamento é muito impraticável e muito lenta.

É aqui que duas técnicas de otimização se destacam.

  1. Descida de gradiente de mini-lote
  2. Descida Estocástica de Gradiente (SGD)

Na descida do gradiente de mini-lote, você usa um tamanho de lote consideravelmente menor que o total não. de exemplos de treinamento e atualize seus pesos após passar por esses exemplos.

Na descida do gradiente estocástico, você atualiza os pesos após passar por cada exemplo de treinamento.

Chegando às vantagens e desvantagens dos três métodos que discutimos.

  • A descida do gradiente de lote converge gradualmente para o mínimo global, mas é lenta e requer enorme poder de computação.

  • A descida do gradiente estocástico converge rapidamente, mas não para o mínimo global, converge em algum lugar próximo ao mínimo global e fica em torno desse ponto, mas nunca converge para o mínimo global. Mas, o ponto convergente na descida do gradiente estocástico é bom o suficiente para todos os propósitos práticos.

  • O gradiente de mini-lote é um trade-off dos dois métodos acima. Porém, se você possui uma implementação vetorizada da atualização de pesos e
    está treinando com uma configuração de vários núcleos ou enviando o treinamento para
    várias máquinas, esse é o melhor método, tanto em termos de tempo de treinamento quanto de convergência para o mínimo global.

Você pode plotar a função de custo, escrever o não. de iterações para entender a diferença entre convergência em todos os três tipos de descida de gradiente.

  • A plotagem de descida do gradiente de lote cai suavemente e lentamente, estabiliza-se e atinge o mínimo global.

  • O gráfico de descida do gradiente estocástico terá oscilações, cairá rapidamente, mas pairará em torno do mínimo global.

Estes são alguns blogs nos quais há uma explicação detalhada das vantagens, desvantagens de cada método e também gráficos de como a função de custo é alterada para todos os três métodos com iterações.

https://adventuresinmachinelearning.com/stochastic-gradient-descent/

https://machinelearningmastery.com/gentle-introduction-mini-batch-gradient-descent-configure-batch-size/

Kartik Podugu
fonte