Eu posso ver dois motivos para usar Gradientes Sintéticos na RNN:
- Para acelerar o treinamento, corrigindo imediatamente cada camada com o gradiente previsto
- 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