Melhor uso do LSTM para previsão de eventos dentro da sequência

9

Assuma a seguinte sequência dimensional 1:

A, B, C, Z, B, B, #, C, C, C, V, $, W, A, % ...

As cartas A, B, C, ..aqui representam eventos "comuns".

Os símbolos #, $, %, ...aqui representam eventos 'especiais'

O espaçamento temporal entre todos os eventos não é uniforme (de segundos a dias), embora quanto mais no passado um evento seja menos provável é que ele influencie eventos futuros. Idealmente, posso levar em consideração esses atrasos explicitamente.

Existem na ordem de 10000 tipos de eventos comuns e na ordem de 100 tipos de eventos especiais. A quantidade de eventos comuns que precede um evento especial varia, mas é improvável que seja superior a 100-300.

Fundamentalmente, estou interessado em procurar padrões na sequência de eventos comum que acabam sendo preditivos para os eventos especiais.

Agora você pode abordar isso de diferentes maneiras: criando vetores de recursos + classificação padrão, aprendizado de regras de associação, HMMs etc.

Nesse caso, estou curioso para saber como uma rede baseada em LSTM se encaixaria melhor. Simples seria fazer algo como o caráter de Karparthy e prever o próximo evento dado uma história. Então, para uma nova sequência

C, Z, Q, V, V, ... , V, W

Você pode executá-lo através do modelo e ver qual evento especial é mais provável que venha a seguir. Mas não parece o ajuste certo.

Como esse é um problema de classificação temporal, parece que a coisa certa a se fazer é usar a Classificação Temporal Conexional, conforme descrito por Alex Graves .

No entanto, antes de investir muito no momento, estou procurando algo mais fácil e rápido de experimentar para ter uma ideia de como os LSTMs se encaixariam aqui. O Tensorflow verá um exemplo da CTC em algum momento, mas ainda não.

Então, minhas (sub) perguntas são:

  1. Dado o problema acima e gostaria de experimentar os LSTMs, vale a pena tentar a abordagem do tipo char-rnn, devo morder a bala e me familiarizar com o CTC, ou existe um lugar melhor para começar.
  2. Como você incorporaria explicitamente informações de tempo entre eventos. Usar um relógio fixo com eventos sem operação obviamente funciona, mas parece feio.
  3. Supondo que eu consegui treinar um LSTM, há uma maneira de inspecionar o modelo para ver que tipo de evento 'motivos' ele pegou? (ou seja, análogo aos filtros nos convnets)

Qualquer código de amostra (preferencialmente python) sempre útil.

Edit: Apenas para adicionar que há algum ruído na sequência. Alguns eventos podem ser ignorados com segurança, mas exatamente quais nem sempre é possível dizer com antecedência. Então, idealmente, o modelo (e os motivos derivados dele) é robusto contra isso.

dgorissen
fonte
Que tipo de conjunto de dados é esse?
Pir
@felbo: ​​infelizmente não posso dizer explicitamente, mas seus dados de hardware, não financeiros / de vendas / anúncios / ..
dgorissen
Está bem. Na verdade, a codificação one-hot (na minha resposta) pode ser problemática se você tiver ~ 10k tipos de eventos. Talvez você possa fazer algo como o word2vec para ter apenas 300 dimensões de entrada. Da mesma forma, é provavelmente problemático prever o próximo tipo de evento dentre 10 mil opções. Em vez disso, faria sentido reformular o problema para prever apenas os 100 tipos especiais e, em seguida, uma classe de 'evento normal' para todos os 10k eventos normais.
Pir
Só para esclarecer: suponho que você tenha muitos dados para esse tipo de problema.
Pir
@ Felbo: ​​de fato. Estava pensando em usar apenas um índice, aprender a incorporação de vetores como word2vec ou agrupar os eventos em classes para reduzir a dimensionalidade. Semelhante no lado da previsão, concordou.
dgorissen

Respostas:

4

Seus dados parecem ser apenas sequências de tokens. Tente criar um autoencoder LSTM e deixe o codificador aprender algumas representações fixas da primeira parte da sua sequência e do decodificador para prever o restante.

Essas representações seriam seus motivos.

Ref:

Bahdanau, D., Cho, K. & Bengio, Y. (2014). Tradução automática neural, aprendendo em conjunto a alinhar e traduzir. pré-impressão do arXiv arXiv: 1409.0473.

Srivastava, N., Mansimov, E., & Salakhutdinov, R. (2015). Aprendizado não supervisionado de representações de vídeo usando LSTMs. pré-impressão do arXiv arXiv: 1502.04681.

horaceT
fonte
1

A parte mais importante é como você "expressa" o problema de classificação, significando como você representa a entrada e o que deseja produzir. Como você tem tantos tipos diferentes de eventos, precisa aprender a incorporá-los. Isso pode ser feito diretamente em, por exemplo, Keras. Você pode ver este exemplosobre como aprender uma incorporação diretamente a partir dos dados. Outra abordagem seria aprender a incorporação de antemão usando uma abordagem não supervisionada, como o word2vec. No entanto, isso requer mais trabalho de sua parte, pois você precisa criar uma tarefa relevante e treiná-la para gerar a incorporação. Como você tem dados suficientes, é mais fácil (embora um pouco menos eficaz) aprender a incorporação diretamente. Para a saída, eu não previa todos os diferentes tipos de eventos, mas apenas os eventos especiais e uma "classe de segundo plano" para manter o problema viável. Se você realmente deseja prever todas as classes, precisará usar alguns truques (veja como o word2vec faz isso).

Em relação ao tempo entre os eventos. Você pode simplesmente adicionar isso ao seu LSTM como uma dimensão adicional (veja, por exemplo, este exemplo de como fazer isso no Keras). Isso seria fácil e permitiria ao LSTM levar em consideração a diferença temporal.

Não conheço nenhuma maneira de visualizar os motivos "desenrolando" a natureza temporal da rede. Você pode gerar alguns motivos usando uma rede generativa, mas provavelmente seria difícil de interpretar. Uma maneira de explorar motivos poderia ser simplesmente encontrar as 100000 sequências mais comuns de eventos não especiais, por exemplo, comprimento 20-100, inseri-las no modelo treinado e extrair a probabilidade de saída da camada final de softmax. Dessa maneira, você pode encontrar seqüências conectadas a determinados eventos especiais. No entanto, é difícil dizer se essa abordagem de motivos é viável / útil sem observar seus dados.

pir
fonte
Só para ficar claro. No lado do motivo, você quer dizer examinar os dados brutos e extrair as subsequências mais comuns de um comprimento mínimo específico (ou usar a mineração frequente de conjuntos de itens para gerá-los) e depois ver onde as previsões de eventos especiais são máximas? Nesse caso, parece mais fácil abordá-lo como um problema de classificação padrão, não?
dgorissen
Eu esperava que a natureza dependente do tempo de um modelo recorrente permitisse algum tipo de inspeção útil. Alternativamente, talvez a coisa a fazer seria executar o modelo em 'reverso'. Maximize a confiança de previsão de cada tipo de evento especial e veja em que tipo de sequência isso resulta. No entanto, não tenho certeza de como isso funcionaria e talvez precise de um modelo generativo.
dgorissen
11
Por favor, veja minha resposta atualizada. Sim, quero dizer ver onde "as previsões de eventos especiais são máximas" com base nos dados brutos. Eu não entendo o que você quer dizer sobre aproximando-lo como um problema de classificação padrão :)
pir