Capturando padrões iniciais ao usar a retropropagação truncada ao longo do tempo (RNN / LSTM)

12

Digamos que eu use um RNN / LSTM para fazer análise de sentimentos, que é uma abordagem muitos-para-um (consulte este blog ). A rede é treinada por meio de uma retropropagação truncada ao longo do tempo (BPTT), em que a rede é desenrolada por apenas 30 últimas etapas, como de costume.

No meu caso, cada uma das minhas seções de texto que quero classificar são muito mais longas do que as 30 etapas que estão sendo desenroladas (~ 100 palavras). Com base no meu conhecimento, o BPTT é executado apenas uma única vez para uma única seção de texto, que é quando passou por toda a seção de texto e calculou o destino da classificação binária, y , que então compara com a função de perda para encontrar o erro.

posEutEuvenegumatEuve

pir
fonte

Respostas:

11

É verdade que limitar a propagação do gradiente a 30 etapas impedirá que ele aprenda tudo o que é possível no seu conjunto de dados. No entanto, depende fortemente do seu conjunto de dados se isso o impedirá de aprender coisas importantes sobre os recursos do seu modelo!

Limitar o gradiente durante o treinamento é mais como limitar a janela na qual seu modelo pode assimilar recursos de entrada e estado oculto com alta confiança. Como no momento do teste, você aplica seu modelo a toda a sequência de entrada, ele ainda poderá incorporar informações sobre todos os recursos de entrada em seu estado oculto. Pode não saber exatamente como preservar essas informações até que faça sua previsão final para a sentença, mas pode haver algumas conexões (reconhecidamente mais fracas) que ainda seria capaz de fazer.

Pense primeiro em um exemplo artificial. Suponha que sua rede gere 1 se houver 1 em qualquer lugar da entrada e 0 em caso contrário. Digamos que você treine a rede em seqüências de comprimento 20 e limite então o gradiente a 10 etapas. Se o conjunto de dados de treinamento nunca contiver 1 nas 10 etapas finais de uma entrada, a rede terá um problema com as entradas de teste de qualquer configuração. No entanto, se o conjunto de treinamento tiver alguns exemplos como [1 0 0 ... 0 0 0] e outros como [0 0 0 ... 1 0 0], a rede poderá captar a "presença de um recurso de 1 "em qualquer lugar da entrada.

De volta à análise de sentimentos então. Digamos que, durante o treinamento, seu modelo encontra uma longa sentença negativa como "Eu odeio isso porque ... sem parar" com, digamos, 50 palavras nas reticências. Ao limitar a propagação do gradiente a 30 etapas, o modelo não conectará o "Eu odeio isso porque" ao rótulo de saída, para que ele não atinja "I", "Odeio" ou "Isso" deste treinamento exemplo. Mas ele entenderá as palavras que estão dentro de 30 etapas a partir do final da frase. Se o seu conjunto de treinamento contiver outros exemplos que contenham essas mesmas palavras, possivelmente junto com "ódio", ele poderá captar o vínculo entre "ódio" e o rótulo de sentimentos negativos. Além disso, se você tiver exemplos de treinamento mais curtos, diga: "Nós odiamos isso porque é terrível!" seu modelo poderá conectar os recursos "ódio" e "isso" ao rótulo de destino. Se você tem o suficiente desses exemplos de treinamento, o modelo deve ser capaz de aprender a conexão de forma eficaz.

No momento do teste, digamos que você apresente outra frase longa como "Eu odeio isso porque ... na lagartixa!" A entrada do modelo começará com "Eu odeio isso", que será passado para o estado oculto do modelo de alguma forma. Esse estado oculto é usado para influenciar futuros estados ocultos do modelo, portanto, embora possa haver 50 palavras antes do final da frase, o estado oculto dessas palavras iniciais tem uma chance teórica de influenciar a saída, mesmo que nunca tenha sido treinados em amostras que continham uma distância tão grande entre o "Eu odeio isso" e o final da frase.

lmjohns3
fonte
0

@ Imjohns3 tem razão: se você processar sequências longas (tamanho N) e limitar a retropropagação aos últimos K passos, a rede não aprenderá padrões no início.

Eu trabalhei com textos longos e uso a abordagem em que que computo a perda e faço a retropropagação após cada K etapas. Vamos supor que minha sequência tenha N = 1000 tokens, meu processo RNN primeiro K = 100 e depois tento fazer previsão (perda de computação) e retropropagação. Em seguida, mantendo o estado RNN, freie a cadeia de gradiente (em pytorch-> desconecte) e inicie mais k = 100 etapas.

Um bom exemplo dessa técnica pode ser encontrado aqui: https://github.com/ksopyla/pytorch_neural_networks/blob/master/RNN/lstm_imdb_tbptt.py

ksopyla
fonte