Gradientes sintéticos - qual é o benefício prático?

8

Eu posso ver dois motivos para usar Gradientes Sintéticos na RNN:

  1. Para acelerar o treinamento, corrigindo imediatamente cada camada com o gradiente previsto
  2. Ser capaz de aprender sequências mais longas

Eu vejo problemas com os dois. Observe que eu realmente gosto de gradientes sintéticos e gostaria de implementá-los. Mas preciso entender onde minha trilha de pensamento está incorreta.

Agora, mostrarei por que os pontos 1 e 2 não parecem ser benéficos e preciso que você me corrija, se eles forem realmente benéficos:


Ponto 1:

Os gradientes sintéticos nos dizem que podemos confiar em outra "rede de mini-auxiliares" (chamada DNI) para aconselhar nossa camada atual sobre quais gradientes chegarão de cima, mesmo durante o uso de acessórios.

No entanto, esses gradientes virão apenas várias operações posteriormente. A mesma quantidade de Backprop terá que ser feita sem o DNI, exceto que agora também precisamos treinar nosso DNI.

A adição dessa assincronicidade não deve fazer com que as camadas sejam treinadas mais rapidamente do que durante a sequência tradicional "bloqueada" completa fwdprop -> full back prop, porque o mesmo número de cálculos deve ser feito pelo dispositivo. Só que os cálculos serão deslizados no tempo

Isso me faz pensar que o ponto 1) não funcionará. Simplesmente adicionar SG entre cada camada não deve melhorar a velocidade do treinamento.

Ponto 2:

Ok, que tal adicionar SG apenas na última camada para prever "gradiente do futuro" e apenas se for o timestep final durante o avanço ?

Dessa forma, mesmo que nosso LSTM precise parar de prever e deva ser retropropagado, ele ainda pode prever o gradiente futuro que receberia (com a ajuda do DNI sentado no último timestep).


Considere várias sessões de treinamento (sessão A, sessão B):

fwdprop timestep_1A ---> fwdprop timestep_2A ---> fwdprop timestep_3A ----> stop e bkprop!

fwdprop timestep_1B ---> fwdprop timestep_2B ---> fwdprop timestep_3B ----> stop e bkprop!

Acabamos de forçar nossa rede a "analisar" 6 timesteps em duas metades: 3 timesteps e 3 restantes timesteps novamente.

Observe que temos o nosso DNI no final da "Sessão A" e prevendo "qual gradiente eu obteria fluindo desde o início da Sessão B (do futuro)". Por isso, timestep_3A será equipado com gradiente "que viria de timestep_1B"; portanto, as correções feitas durante A serão mais confiáveis.

Mas ei! Estes previu "gradientes sintéticos" será muito pequeno (desprezível) de qualquer maneira - afinal, é por isso que iniciar uma nova Retropropagação sessão B . Se eles não fossem muito pequenos, analisaríamos todos os 6 timesteps em uma única "sessão A" bkprop longa.

Portanto, acho que o ponto 2) também não deve trazer benefícios. A adição de SG no último passo do fwdprop permite treinar efetivamente sequências mais longas, mas os gradientes de fuga não foram a lugar algum.


Está bem. Talvez possamos obter o benefício de treinar "sessão A" , "sessão B" etc. em máquinas separadas? Mas como isso é diferente de simplesmente treinar com os minibatches usuais em paralelo? Lembre-se, foi mencionado no ponto 2: as coisas pioram com os gradientes de previsão da sessãoA que desaparecem de qualquer maneira.

Pergunta: Por favor, ajude-me a entender os benefícios do Gradiente Sintético, porque os 2 pontos acima não parecem ser benéficos

Kari
fonte
Por que você acha que isso não vai acelerar o treinamento? A única justificativa que vejo é a afirmação simples de que isso "não deve melhorar a velocidade do treinamento", mas você não fornece seu raciocínio. Também não está claro o que você quer dizer com "etapa 1)", pois você não descreveu nenhuma etapa da pergunta. De qualquer forma, o artigo demonstra que ele fornece acelerações. Os dados superam a teoria a qualquer dia. Você leu o jornal?
DW
Os dados superam a teoria a qualquer dia, eu concordo, mas o melhor exemplo de contador que posso fazer é GPUs vs CPUs. Em todos os lugares, as pessoas continuam dizendo à GPU que executa ordens de grandeza mais rapidamente que a CPU e fornecem comparações. No entanto, uma CPU multithread corretamente codificada é apenas 2-3 vezes mais lenta que a mesma categoria GPU e é mais barata que a GPU. larsjuhljensen.wordpress.com/2011/01/28/… Mais uma vez, não vou contra os Gradientes sintéticos - eles parecem incríveis, é só até que eu possa obter resposta para o meu post, não poderei descansar: D
Kari
Não tenho certeza de que um post de 7 anos sobre o BLAST seja muito relevante aqui.
DW
O que estou tentando dizer é que "há maneiras de fazer paralelismo parece melhor do que ele pode realmente ser", em qualquer cenário
Kari

Respostas:

2

Mas ei! Esses "gradientes sintéticos" previstos serão muito pequenos (desprezíveis) - afinal, é por isso que começamos uma nova sessão de backprop B. Se eles não fossem muito pequenos, analisaríamos todas as 6 timestaps em uma única sessão longa de bkprop " "

-Isso não é necessariamente correto. Normalmente, truncamos e iniciamos um novo backprop devido a restrições de hardware, como memória ou velocidade computacional. O gradiente de fuga pode ser aprimorado por outros meios, como Normalização do gradiente - aumentar o vetor de gradiente se ele for muito pequeno além de determinadas camadas, ou diminuir o tamanho se estiver prestes a explodir. Ou mesmo usando a Normalização de lote


É importante entender como atualizar qualquer módulo DNI. Para esclarecer as coisas, considere um exemplo de rede com várias camadas e 3 módulos DNI:

 input
   |
   V
Layer_0 & DNI_0
Layer_1
Layer_2
Layer_3 & DNI_3
Layer_4
Layer_5 & DNI_5
Layer_6
Layer_7
   | 
   V
output

O DNI_0 é sempre treinado com um gradiente sintético que chega do DNI_3 (fluindo através da camada_2 e da camada_1, é claro), situando várias camadas ainda mais.

Da mesma forma, o DNI_3 é sempre treinado com um gradiente sintético chegando de DNI_5

DNI_0 ou DNI_3 nunca verá o gradiente verdadeiro, porque o gradiente verdadeiro é entregue apenas ao DNI_5 e não antes.

Para quem ainda está lutando para entendê-los, leia este incrível post do blog , parte 3

As camadas anteriores precisarão se contentar com gradientes sintéticos, porque eles ou seu DNI nunca testemunharão o "verdadeiro gradiente".


Em relação ao treinamento em paralelo com minibatches em vez de Parallelizing via Synthetic Grads:

Seqüências mais longas são mais precisas que minibatches, no entanto, minibatches adicionam um efeito de regulação . Mas, dada alguma técnica para impedir que o gradiente exploda ou desapareça, o treinamento de seqüências mais longas pode fornecer uma visão muito melhor do contexto do problema. Isso ocorre porque a rede deduz a produção depois de considerar uma sequência mais longa de entrada, então o resultado é mais racional.

Para a comparação dos benefícios concedidos pela SG, consulte os diagramas na página 6 do documento , sendo capaz de resolver sequências mais longas, o que considero mais benéfico (já podemos paralelizar via minibatches de qualquer maneira e, portanto, a SG não deve acelerar o processo). processo quando executado na mesma máquina - mesmo se nós realmente propagarmos até o próximo DNI).


No entanto, quanto mais módulos DNI tivermos, mais ruidoso deverá ser o sinal. Portanto, pode valer a pena treinar as camadas e o DNI pelo backprop legado, e somente depois de algumas épocas decorridas, começamos a usar o DNI-bootstrapping discutido acima.

Dessa forma, o DNI mais antigo adquirirá pelo menos algum senso do que esperar no início do treinamento. Isso ocorre porque os DNIs a seguir não têm certeza da aparência real do gradiente, quando o treinamento começa, então, inicialmente, eles aconselharão o gradiente de "lixo" para quem estiver sentado antes deles.

Não se esqueça que os autores também experimentaram prever as entradas reais para cada camada.


Se suas camadas tiverem backprop caro (talvez você tenha Normalização em lote ou algumas funções sofisticadas de ativação), a correção com DNI pode ser muito mais barata, uma vez que seja suficientemente bem treinada. Lembre-se de que o DNI não é gratuito - requer multiplicação de matrizes e provavelmente não fornecerá muita velocidade em uma camada densa simples.


Minibatches nos dão aceleração (via paralelização) e também nos regularizam. Gradientes sintéticos nos permitem inferir melhor trabalhando com sequências mais longas e (potencialmente) gradiente menos caro. Tudo junto, este é um sistema muito poderoso.

Kari
fonte
0

Os gradientes sintéticos tornam o treinamento mais rápido, não reduzindo o número de épocas necessárias ou acelerando a convergência da descida do gradiente, mas tornando cada uma das épocas mais rápidas de calcular. O gradiente sintético é mais rápido de calcular que o gradiente real (computando o gradiente sintético é mais rápido que a retropropagação), portanto, cada iteração de descida do gradiente pode ser calculada mais rapidamente.

DW
fonte
Pelo meu entendimento, em termos de tempo, os gradientes não devem alcançar o DNI mais rapidamente, mas agora eles são deslizados no tempo e computados de forma assíncrona enquanto o suporte avançado está ocorrendo. O DNI ainda terá de obter a verdadeira inclinação para treinar -se . Portanto, os gradientes sintéticos devem exigir o mesmo número de cálculos em paralelo como quando ocorre com o BPTT padrão. Isso está correto?
Kari
Portanto, não haveria aceleração em simplesmente introduzir o SG entre as camadas. Sim, nós começamos o gradiente previu imediata do DNI, mas para cada tal previsão que acabará por ter de pagar o preço por assíncrona propagação completa para trás para que DNI, um pouco mais tarde
Kari
@Kari, não, isso não parece certo para mim. Se você precisar do mesmo número de iterações, mas agora cada iteração demorar 50% menos tempo na GPU, o cálculo resultante será feito anteriormente. Mesmo se você precisar de 10% mais iterações / épocas (porque os gradientes estão atrasados ​​ou os gradientes sintéticos não combinam perfeitamente com os gradientes reais), isso ainda é uma vitória: a aceleração de poder calcular o gradiente sintético mais rapidamente que o gradiente real supera outros efeitos. Você parece confiante de que isso não pode ajudar, mas os dados do artigo mostram que isso ajuda.
DW
Bem, por exemplo, temos quatro camadas após o nosso DNI; No backprop normal, teríamos 4 trocas "para frente" entre as camadas e depois 4 "trocas para trás", e enquanto isso ocorre, o sistema está bloqueado. Com o DNI, podemos corrigir imediatamente nossos pesos, mas precisaremos obter gradientes verdadeiros mais tarde. Mas ainda devemos o gradiente verdadeiro de antes, ao nosso DNI ... Para obter e entregar esse gradiente de volta ao DNI, levará 100% do tempo (os mesmos 4 passos à frente, os mesmos 4 passos para trás).
Kari
Só que o nosso DNI diz "tudo bem, dê a eles quando possível, mais tarde", mas ainda temos que pagar o preço total, para que eu não veja o desempenho aumentar. Eu concordo, os trabalhos mostram ótimos resultados, mas como? De qualquer maneira, já podemos treinar minibatches em paralelo: /
Kari