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
fonte
Respostas:
-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:
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.
fonte
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.
fonte