Como a descida do gradiente de minibatch atualiza os pesos para cada exemplo em um lote?

12

Se processarmos, digamos, 10 exemplos em um lote, entendo que podemos somar a perda para cada exemplo, mas como a retropropagação funciona em relação à atualização dos pesos para cada exemplo?

Por exemplo:

  • Exemplo 1 -> perda = 2
  • Exemplo 2 -> perda = -2

Isso resulta em uma perda média de 0 (E = 0), então como isso atualizaria cada peso e convergiria? É simplesmente pela aleatorização dos lotes que "esperamos" convergir mais cedo ou mais tarde? Além disso, isso não calcula apenas o gradiente para o primeiro conjunto de pesos do último exemplo processado?

carbonocomputado
fonte

Respostas:

15

A descida de gradiente não funciona da maneira que você sugeriu, mas um problema semelhante pode ocorrer.

Não calculamos a perda média do lote, calculamos os gradientes médios da função de perda. Os gradientes são a derivada da perda em relação ao peso e, em uma rede neural, o gradiente para um peso depende das entradas desse exemplo específico e também de muitos outros pesos no modelo.

Se o seu modelo tiver 5 pesos e você tiver um tamanho de minilote 2, poderá obter o seguinte:

gradients=(1.5,2.0,1.1,0.4,0.9)

gradients=(1.2,2.3,1.1,0.8,0.7)

(1.35,0.15,0,0.2,0.8)

0

editar em resposta aos comentários:

kLiwj

Lwj=1ki=1kLiwj

O código do tutorial ao qual você vinculou nos comentários usa o Tensorflow para minimizar a perda média.

1ki=1kLi

Para minimizar isso, ele calcula os gradientes da perda média em relação a cada peso e usa a descida do gradiente para atualizar os pesos:

Lwj=wj1ki=1kLi

A diferenciação pode ser trazida para dentro da soma, portanto é a mesma que a expressão da abordagem no meu exemplo.

wj1ki=1kLi=1ki=1kLiwj

Hugh
fonte
Peguei vocês. Você ainda deseja calcular a média da perda no lote_size correto? Não tenho certeza se você está familiarizado com o tensorflow, mas tenho tentado conciliar meu entendimento com este tutorial: tensorflow.org/get_started/mnist/beginners Você pode ver que a perda é calculada como média no lote (código lower_mean). Suponho que o tensorflow mantém uma contagem / média interna dos pesos?
carboncomputed
1
@carboncomputed Ah, sim, você está certo, eles calculam a média da perda, de modo que quando o Tensorflow calcula os gradientes da perda média, ele efetivamente calcula a média dos gradientes para cada perda. Vou editar minha resposta para mostrar a matemática para isso.
Hugh
Interessante. Obrigado pelo esclarecimento. Então, apenas para aprofundar um pouco mais, os gradientes de peso são calculados por exemplo durante a passagem para frente e armazenados ou são computados durante o processo de otimização no fluxo tensor? Suponho que estou perdendo "onde" estão esses gradientes no fluxo tensorial? Eu vejo a passagem para frente e a perda, então o fluxo tensor está fazendo esses cálculos de gradiente / média sob o capô para mim?
carboncomputed
1
@carboncomputed Esse é o apelo de Tensorflow, ele usa a matemática simbólica e pode fazer a diferenciação sob o capô
Hugh
Obrigado por uma resposta elegante. No entanto, eu não conseguia entender como TF sabe como fazer backup propagar com uma perda média como mostra a este exemplo , code line 170?
pecador
-1

O motivo para usar mini-lotes é ter uma boa quantidade de exemplo de treinamento, de modo que o possível ruído seja reduzido pela média de seus efeitos, mas também não é um lote completo que, para muitos conjuntos de dados, possa exigir uma quantidade enorme de memória. Um fato importante é que o erro que você avalia é sempre distanteentre a saída prevista e a saída real: isso significa que não pode ser negativo; portanto, você não pode ter, como disse, um erro de 2 e -2 que se cancelam, mas que se tornaria um erro de 4 Em seguida, você avalia o gradiente do erro em relação a todos os pesos, para poder calcular qual alteração nos pesos os reduziria mais. Depois de fazer isso, você dá um "passo" nessa direção, com base na magnitude da sua taxa de aprendizado alfa. (Esses são os conceitos básicos, não entrarei em detalhes sobre a retropropagação para NNs profundos). Depois de executar este treinamento em seu conjunto de dados por um certo número de épocas, você pode esperar que sua rede convergir se sua etapa de aprendizado não for muito grande para faça divergir. Você ainda pode acabar no mínimo local, isso pode ser evitado inicializando diferentes pesos, usando otimizadores diferentes e tentando regularizar.

dante
fonte
Apenas para acrescentar: usamos mini-lotes principalmente para eficiência computacional. Temos um compromisso entre precisão de descida e frequência de atualização de pesos. Os dados precisam ser extremamente grandes para não caber na memória.
Gradukasz Grad
Compreendo cada um, mas como atualizamos nossos pesos para um lote específico? Os gradientes de peso também são somados para cada exemplo?
carboncomputed
Não, há apenas um gradiente, que é um vetor de derivadas, no erro total do lote. Isso significa que atualizamos uma vez nossos pesos com base no gradiente, ou seja, a direção da atualização que comete o erro neste mini lote diminui mais. O gradiente é feito de derivadas parciais, ou seja, a derivada do erro do mini lote em relação a cada peso: isso nos diz se cada peso deve se tornar menor ou maior e quanto. Todos os pesos obtêm uma atualização para lote, para reduzir o erro nesse mini lote, independente de outros mini lotes.
dante 12/03