Migliore utilizzo di LSTM per la previsione di eventi all'interno della sequenza


9

Assumi la seguente sequenza 1 dimensionale:

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

Le lettere A, B, C, ..qui rappresentano eventi "ordinari".

I simboli #, $, %, ...qui rappresentano eventi "speciali"

La spaziatura temporale tra tutti gli eventi è non uniforme (qualsiasi cosa, dai secondi ai giorni) anche se più in passato un evento ha meno probabilità di influenzare gli eventi futuri. Idealmente, posso tenere conto esplicitamente di questi ritardi.

Esistono nell'ordine di 10000 tipi di eventi ordinari e nell'ordine di 100 tipi di eventi speciali. La quantità di eventi ordinari che precede un evento speciale varia ma è improbabile che sia superiore a 100-300.

Fondamentalmente sono interessato a cercare modelli nella sequenza di eventi ordinari che finiscono per essere predittivi per gli eventi speciali.

Ora puoi affrontarlo in diversi modi: creazione di vettori di funzioni + classificazione standard, apprendimento delle regole di associazione, HMM, ecc.

In questo caso sono curioso di sapere come una rete basata su LSTM si adatterebbe meglio. Semplice sarebbe fare qualcosa come Char-rnn di Karparthy e prevedere il prossimo evento con una storia. Quindi per una nuova sequenza

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

Potresti eseguirlo attraverso il modello e vedere quale evento speciale è più probabile che verrà dopo. Ma non sembra del tutto adatto.

Poiché questo è un problema di classificazione temporale, sembra che la cosa giusta da fare sia usare la Classificazione temporale connessa come descritta da Alex Graves .

Tuttavia, prima di investire troppo al momento, sto cercando qualcosa di più facile e veloce da sperimentare per avere un'idea di come gli LSTM si adatterebbero qui. Tensorflow vedrà un esempio CTC ad un certo punto, ma non ancora.

Quindi le mie (sotto) domande sono:

  1. Dato il problema sopra e mi piacerebbe sperimentare LSTM, vale la pena provare l'approccio di tipo char-rnn, se dovessi mordere il proiettile e mettermi alla prova con CTC, o c'è un posto migliore per iniziare.
  2. Come incorporeresti esplicitamente le informazioni sui tempi tra eventi. L'uso di un orologio fisso con eventi no-op ovviamente funziona ma sembra brutto.
  3. Supponendo che sono riuscito a formare un LSTM, c'è un modo per ispezionare il modello per vedere che tipo di "motivi" di eventi ha raccolto? (vale a dire analogo ai filtri nelle convnet)

Qualsiasi codice di esempio (preferito da Python) è sempre utile.

Modifica: solo per aggiungere che c'è un po 'di rumore nella sequenza. Alcuni eventi possono essere tranquillamente ignorati, ma esattamente quali non è sempre possibile dire in anticipo. Quindi idealmente il modello (e i motivi da esso derivati) è robusto contro questo.


Che tipo di set di dati è questo?
Pir

@felbo: ​​purtroppo non posso dirlo esplicitamente, ma i suoi dati dall'hardware, non finanziari / vendite / annunci / ..
dgorissen,

Ok. In realtà, la codifica one-hot (nella mia risposta) potrebbe essere problematica se si hanno ~ 10k tipi di eventi. Potresti forse fare qualcosa sulla falsariga di word2vec in modo da avere solo ~ 300 dimensioni di input. Allo stesso modo, è probabilmente problematico prevedere il prossimo tipo di evento su 10k opzioni. Invece, avrebbe senso riformulare il problema solo per prevedere i 100 tipi speciali e quindi una classe di "evento normale" per tutti i 10k eventi normali.
pir

Giusto per essere chiari: suppongo che tu abbia tonnellate di dati per questo tipo di problema.
pir

@felbo: ​​davvero. Avevo pensato di usare solo un indice, imparare un vettore che incorporava word2vec o raggruppare gli eventi in classi per ridurre la dimensionalità. Simile dal lato della previsione, concordato.
Dgorissen,

Risposte:


4

I tuoi dati sembrano essere solo sequenze di token. Prova a costruire un codificatore automatico LSTM e lascia che il codificatore apprenda alcune rappresentazioni fisse della prima parte della sequenza e del decodificatore per prevedere il rimanente.

Queste rappresentazioni sarebbero i tuoi motivi.

Rif:

Bahdanau, D., Cho, K., e Bengio, Y. (2014). Traduzione automatica neurale imparando congiuntamente ad allineare e tradurre. arXiv prestampa arXiv: 1409.0473.

Srivastava, N., Mansimov, E., & Salakhutdinov, R. (2015). Apprendimento senza supervisione delle rappresentazioni video tramite LSTM. arXiv prestampa arXiv: 1502.04681.


1

La parte più importante è il modo in cui "pronunci" il problema di classificazione, ovvero come rappresenti l'input e cosa vuoi produrre. Visto che hai tanti tipi di eventi diversi, devi imparare a incorporarli. Questo può essere fatto direttamente ad esempio in Keras. Puoi vedere questo esempiosu come imparare un incorporamento direttamente dai dati. Un altro approccio sarebbe quello di apprendere in anticipo un incorporamento utilizzando un approccio non supervisionato come word2vec. Tuttavia, ciò richiede più lavoro da parte dell'utente in quanto è necessario elaborare un compito rilevante e formarlo per generare l'incorporamento. Dato che hai abbastanza dati, è più facile (anche se leggermente meno efficace) imparare direttamente l'incorporamento. Per l'output non predirei tutti i diversi tipi di eventi, ma solo gli eventi speciali e una "classe di fondo" per mantenere fattibile il problema. Se vuoi davvero essere in grado di prevedere ogni singola classe, allora devi usare alcuni trucchi (guarda come lo fa word2vec).

Per quanto riguarda il tempo tra gli eventi. Potresti semplicemente aggiungerlo al tuo LSTM come dimensione aggiuntiva (vedi ad esempio questo per un esempio di come farlo in Keras). Ciò sarebbe facile da fare e consentirebbe a LSTM di tenere conto della differenza temporale.

Non conosco alcun modo per visualizzare i motivi "srotolando" la natura temporale della rete. Potresti essere in grado di generare alcuni motivi usando una rete generativa, ma sarebbe probabilmente difficile da interpretare. Un modo per esplorare i motivi potrebbe essere semplicemente quello di trovare le prime 100000 sequenze più comuni di eventi non speciali di lunghezza 20-100, inserendole nel modello addestrato ed estraendo l'output di probabilità dallo strato finale di softmax. In questo modo è possibile trovare sequenze connesse a determinati eventi speciali. Tuttavia, è difficile dire se questo approccio a motivi sia fattibile / utile senza guardare i tuoi dati.


Giusto per essere chiari. Dal punto di vista del motivo, intendi guardare i dati grezzi ed estrarre le sottosequenze più comuni di una determinata lunghezza minima (o utilizzare il mining di set di articoli frequenti per generarli) e quindi vedere dove le previsioni di eventi speciali sono massime? In quel caso sembra più facile affrontarlo come un problema di classificazione standard no?
Dgorissen,

Speravo che la natura dipendente dal tempo di un modello ricorrente potesse consentire qualche tipo di ispezione utile. In alternativa, forse la cosa da fare sarebbe eseguire il modello in "reverse". Massimizza la sicurezza della previsione di ogni tipo di evento speciale e vedi in che tipo di sequenze ne risulta. Tuttavia, non sei sicuro di come funzionerebbe e forse ha bisogno di un modello generativo.
Dgorissen,

1
Si prega di vedere la mia risposta aggiornata. Sì, intendo vedere dove "le previsioni di eventi speciali sono massime" in base ai dati non elaborati. Non capisco cosa intendi per affrontarlo come un problema di classificazione standard :)
pir
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.