Rete neurale analizzare i dati della stringa?


28

Quindi, sto appena iniziando a imparare come una rete neurale può operare per riconoscere schemi e classificare input, e ho visto come una rete neurale artificiale può analizzare i dati delle immagini e classificare le immagini ( demo con convnetjs ), e la chiave lì consiste nel sottocampionare l'immagine e ogni pixel stimola un neurone di input nella rete.

Tuttavia, sto cercando di avvolgere la testa se è possibile farlo con input di stringa? Il caso d'uso che ho è un "motore di raccomandazione" per i film che un utente ha visto. I film contengono molti dati sulle stringhe (titolo, trama, tag) e potrei immaginare di "sottocampionare" il testo in poche parole chiave che descrivono quel film, ma anche se analizzo le prime cinque parole che descrivono questo film, io pensi che avrei bisogno di neuroni di input per ogni parola inglese per confrontare un set di film? Potrei limitare i neuroni di input solo alle parole usate nel set, ma poi potrebbe crescere / imparare aggiungendo nuovi film (l'utente guarda un nuovo film, con nuove parole)? La maggior parte delle librerie che ho visto non consente l'aggiunta di nuovi neuroni dopo che il sistema è stato addestrato?

Esiste un modo standard per mappare i dati stringa / parola / carattere agli input in una rete neurale? Oppure una rete neurale non è davvero lo strumento giusto per il lavoro di analisi dei dati di stringa come questo (qual è lo strumento migliore per la corrispondenza dei modelli nei dati di stringa)?

Risposte:


19

L'uso di una rete neurale per la previsione dei dati del linguaggio naturale può essere un compito complicato, ma ci sono metodi provati e veri per renderlo possibile.

Nel campo Natural Language Processing (NLP), il testo è spesso rappresentato usando il modello bag of words. In altre parole, hai un vettore di lunghezza n , dove n è il numero di parole nel tuo vocabolario e ogni parola corrisponde a un elemento nel vettore. Per convertire il testo in dati numerici, devi semplicemente contare il numero di occorrenze di ogni parola e posizionare quel valore nell'indice del vettore che corrisponde alla parola. Wikipedia fa un ottimo lavoro nel descrivere questo processo di conversione. Poiché la lunghezza del vettore è fissa, è difficile gestire nuove parole che non corrispondono a un indice, ma ci sono modi per aiutare a mitigare questo problema ( hashing della funzione di ricerca ).

Questo metodo di rappresentazione presenta molti svantaggi: non preserva la relazione tra parole adiacenti e si traduce in vettori molto sparsi. Guardando n-grammi aiuta a risolvere il problema di preservare le relazioni di parole, ma per ora concentriamoci sul secondo problema, la scarsità.

È difficile trattare direttamente con questi vettori sparsi (molte librerie di algebra lineare fanno un pessimo lavoro nella gestione degli input sparsi), quindi spesso il passo successivo è la riduzione della dimensionalità. Per questo possiamo fare riferimento al campo della modellazione di argomenti : tecniche come Latent Dirichlet Allocation (LDA) e Latent Semantic Analysis (LSA) consentono la compressione di questi vettori sparsi in vettori densi rappresentando un documento come una combinazione di argomenti. È possibile correggere il numero di argomenti utilizzati e, in tal modo, correggere le dimensioni del vettore di output prodotto da LDA o LSA. Questo processo di riduzione della dimensionalità riduce drasticamente le dimensioni del vettore di input mentre tenta di perdere una quantità minima di informazioni.

Infine, dopo tutte queste conversioni, è possibile alimentare gli output del processo di modellazione degli argomenti negli input della propria rete neurale.


1
Fammi sapere se hai ulteriori domande e farò del mio meglio per fornire ulteriori dettagli.
Madison,

Grazie, questo mi dà alcuni termini fantastici con cui continuare a esplorare!
MidnightLightning

Per inciso, posso fare riferimento al "hashing delle funzionalità" poiché sembra molto simile a un filtro bloom , che ho familiarità con il lavoro con il codice di criptovaluta. Mi chiedo se sia più efficace avere una funzione di hashing che collega una funzione di input a più posizioni di indice (stile filtro-fioritura) piuttosto che una seconda funzione di hash per impostare il segno di un indice ...
MidnightLightning

6

Entrambe le risposte di @Emre e @Madison possono dare buoni punti sul problema in questione. Il problema è rappresentato dalla rappresentazione della stringa come vettore di funzionalità per l'input nell'NN.

Innanzitutto, il problema dipende dalla dimensione della stringa che si desidera elaborare. Le stringhe lunghe che contengono token possono (solitamente parole) sono spesso chiamate documenti in questa impostazione. Esistono metodi separati per gestire singoli token / parole.

Esistono diversi modi per rappresentare i documenti. Molti di loro fanno l' ipotesi del bag-of-word . I tipi più semplici rappresentano il documento come vettore dei conteggi di parole o frequenza di termine (tf). Al fine di eliminare gli effetti della lunghezza del documento, di solito le persone preferiscono normalizzarsi in base al numero di documenti in cui appare un termine, frequenza del documento ( tf-idf ).

Un altro approccio è la modellazione di argomenti, che apprende una rappresentazione latente di dimensione inferiore dei dati. LDA e LSI / LSA sono scelte tipiche, ma è importante ricordare che questo è senza supervisione. La rappresentazione appresa non sarà necessariamente l'ideale per qualsiasi apprendimento supervisionato che stai facendo con la tua NN. Se si desidera eseguire la modellazione di argomenti, è possibile provare anche modelli di argomenti supervisionati .

Per le singole parole, è possibile utilizzare word2vec , che sfrutta NNs alle parole incorporare in uno spazio arbitrario dimensioni. La somiglianza tra vettori di due parole in questo spazio appreso tende a corrispondere alla somiglianza semantica.

Un approccio pionieristico più recente è quello dei vettori di paragrafo , che prima impara un modello di parole simile a word2vec, quindi si basa su quella rappresentazione per apprendere una rappresentazione distribuita di insiemi di parole (documenti di qualsiasi dimensione). Ciò ha mostrato risultati all'avanguardia in molte applicazioni.

Quando si usano le NN nella PNL, le persone usano spesso architetture diverse, come le reti neurali ricorrenti (come le reti di memoria a breve termine ). In alcuni casi le persone hanno persino usato reti neurali convoluzionali sul testo.


Penso che word2Vec sia davvero la risposta più accurata alla domanda. Esiste un tutorial Kaggle davvero carino su come addestrarlo e usarne uno: kaggle.com/c/word2vec-nlp-tutorial/details/part-2-word-vectors
jagartner

Grazie, ho dimenticato il link word2vec, ne aggiungerò uno (oltre a quello che elenchi qui!)
jamesmf

3

Questo non è un problema relativo alle reti neurali di per sé, ma alla rappresentazione di dati testuali nell'apprendimento automatico. È possibile rappresentare i film, il cast e il tema come variabili categoriali. La trama è più complicata; probabilmente vorrai un modello di argomento per quello, ma lo lascerei fuori fino a quando non avrai capito le cose. Fa esattamente quel "downsampling" testuale che hai citato.

Dai un'occhiata a questo tutorial per imparare a codificare le variabili categoriali per le reti neurali. E buona fortuna!


Vale la pena notare che questo non è esplicitamente un problema in tutto l'apprendimento automatico, ma solo un problema quando si tratta di generare vettori di funzioni, che non sono onnipresenti nell'apprendimento automatico.
Slater Victoroff,

Che tipo di apprendimento automatico non utilizza le funzionalità?
Emre,

La foresta casuale è un buon esempio di qualcosa per cui non è un problema ottenere un vettore caratteristica del tipo che vedi nelle reti neurali. Molti metodi non supervisionati funzionano anche su parole grezze piuttosto che su vettori di funzioni. Nota: non ho detto che ci sono metodi che non usano funzionalità, solo che ci sono metodi che non si basano su vettori strutturati rigorosamente.
Slater Victoroff,

Non so cosa intendi per "rigorosamente strutturato".
Emre,

rigorosamente strutturato è un vettore 1d di unint8 rispetto a un elenco che contiene un dizionario, una matrice di pesi e una serie di stringhe
Slater Victoroff,

0

Ho provato i seguenti 2 modi per l'implementazione trial-n-test di reti neurali con testo. Quest'ultimo funziona abbastanza bene, ma con limitazioni.

  1. Crea il vocabolario usando word2vect o NLTK / token di parole personalizzati e assegna un indice a ciascuna parola. È questo indice che rappresenta la parola come numero.

    sfide:

    • Gli indici devono essere "normalizzati" utilizzando il ridimensionamento delle funzionalità.
    • Se l'output della rete neurale presenta anche una leggera variazione, allora l'output potrebbe essere un indice di una parola imprevista (ad esempio se l'output previsto è 250; ma NN genera 249 o 251, quindi potrebbe essere un output vicino dal contesto numerico; ma sono indici di parole diverse). Qui è possibile utilizzare NN ricorrente per generare indice di output.
    • Se vengono aggiunte nuove parole al vocabolario, gli indici dei token devono essere ridimensionati. Il modello addestrato con valori precedentemente ridimensionati potrebbe non essere valido e deve essere rieducato.
  2. Usa la matrice di identità, ad es. Per le parole "n" usa la matrice "nx n" o (n-1 x n-1) dove ogni riga e colonna rappresenta una parola. Inserire "1" nella cella di intersezione e "0" nei punti di riposo. ( riferimento )

    sfide:

    • Ogni valore di input e output è un vettore "nx 1". Per un vocabolario di grandi dimensioni è un calcolo voluminoso e più lento.
    • Se al vocabolario vengono aggiunte nuove parole, è necessario ricalcolare la matrice di identità (ad es. Vettore di parole). Il modello addestrato con vettori calcolati in precedenza potrebbe non essere valido e deve essere rieducato.
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.