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