Dane ciągu analizującego sieć neuronową?


28

Właśnie zaczynam się uczyć, jak sieć neuronowa może działać, aby rozpoznawać wzorce i kategoryzować dane wejściowe, i widziałem, jak sztuczna sieć neuronowa może analizować dane obrazu i kategoryzować obrazy ( demo z convnetjs ) i klucz tam polega na próbkowaniu w dół obrazu, a każdy piksel stymuluje jeden neuron wejściowy do sieci.

Jednak próbuję owinąć głowę, jeśli można to zrobić za pomocą ciągów znaków? Przypadek użycia, który mam, to „silnik rekomendacji” do filmów oglądanych przez użytkownika. Filmy zawierają wiele ciągów znaków (tytuł, fabuła, tagi) i mogę sobie wyobrazić „próbkowanie” tekstu w dół do kilku kluczowych słów opisujących ten film, ale nawet jeśli przeanalizuję pięć pierwszych słów opisujących ten film, myślisz, że potrzebuję neuronów wejściowych dla każdego angielskiego słowa, aby porównać zestaw filmów? Mógłbym ograniczyć neurony wejściowe tylko do słów użytych w zestawie, ale czy mógłbym się urosnąć / uczyć przez dodanie nowych filmów (użytkownik ogląda nowy film, z nowymi słowami)? Większość bibliotek, które widziałem, nie pozwalają na dodawanie nowych neuronów po przeszkoleniu systemu?

Czy istnieje standardowy sposób mapowania danych ciąg / słowo / znak na dane wejściowe w sieci neuronowej? Czy też sieć neuronowa naprawdę nie jest odpowiednim narzędziem do analizowania takich ciągów danych (jakie jest lepsze narzędzie do dopasowywania wzorców w ciągach danych)?

Odpowiedzi:


19

Używanie sieci neuronowej do przewidywania danych w języku naturalnym może być trudnym zadaniem, ale istnieją wypróbowane i prawdziwe metody umożliwiające to.

W polu Przetwarzanie języka naturalnego (NLP) tekst jest często reprezentowany przy użyciu modelu worka słów. Innymi słowy, masz wektor długości n , gdzie n jest liczbą słów w twoim słowniku, a każde słowo odpowiada elementowi w wektorze. Aby przekonwertować tekst na dane liczbowe, wystarczy policzyć liczbę wystąpień każdego słowa i umieścić tę wartość na indeksie wektora, który odpowiada temu słowu. Wikipedia znakomicie opisuje ten proces konwersji. Ponieważ długość wektora jest stała, trudno jest poradzić sobie z nowymi słowami, które nie są mapowane na indeks, ale istnieją sposoby na złagodzenie tego problemu ( funkcja mieszania funkcji wyszukiwania ).

Ta metoda reprezentacji ma wiele wad - nie zachowuje związku między sąsiednimi słowami i powoduje powstanie bardzo rzadkich wektorów. Patrzenie na n-gram pomaga rozwiązać problem zachowywania relacji między słowami, ale na razie skupmy się na drugim problemie, rzadkości.

Trudno jest bezpośrednio radzić sobie z tymi rzadkimi wektorami (wiele bibliotek algebry liniowej źle radzi sobie z rzadkimi danymi wejściowymi), więc często następnym krokiem jest zmniejszenie wymiarów. W tym celu możemy odnieść się do dziedziny modelowania tematów : techniki takie jak Latent Dirichlet Allocation (LDA) i Latent Semantic Analysis (LSA) pozwalają na kompresję tych rzadkich wektorów w gęste wektory, reprezentując dokument jako kombinację tematów. Możesz naprawić liczbę używanych tematów, a tym samym ustalić rozmiar wektora wyjściowego produkowanego przez LDA lub LSA. Ten proces redukcji wymiarowości drastycznie zmniejsza rozmiar wektora wejściowego, jednocześnie próbując stracić minimalną ilość informacji.

Na koniec, po wszystkich tych konwersjach, możesz wprowadzić wyniki procesu modelowania tematów do danych wejściowych Twojej sieci neuronowej.


1
Daj mi znać, jeśli masz dodatkowe pytania, a dołożę wszelkich starań, aby podać więcej szczegółów.
Madison

Dzięki, to daje mi świetne warunki do dalszego odkrywania!
MidnightLightning

Nawiasem mówiąc, mogę odnosić się do „haszowania funkcji”, ponieważ wydaje się to bardzo podobne do filtra Blooma , który znam z pracy z kodem kryptowaluty. Zastanawiam się, czy bardziej efektywne jest, aby funkcja haszująca powiązała funkcję wprowadzania z wieloma pozycjami indeksu (w stylu filtru Blooma), niż potrzebuje drugiej funkcji haszującej, aby ustawić znak indeksu ...
MidnightLightning

6

Zarówno odpowiedzi od @Emre, jak i @Madison mogą mieć dobre zdanie na temat omawianego problemu. Problem polega na reprezentowaniu łańcucha jako wektora cech dla danych wejściowych do NN.

Po pierwsze, problem zależy od rozmiaru ciągu, który chcesz przetworzyć. Długie ciągi zawierające tokeny may (zazwyczaj słowa) są często nazywane dokumentami w tym ustawieniu. Istnieją osobne metody radzenia sobie z poszczególnymi tokenami / słowami.

Istnieje wiele sposobów reprezentowania dokumentów. Wielu z nich przyjmuje założenie „ worka słów” . Najprostsze typy reprezentują dokument jako wektor liczby słów lub częstotliwości terminu (tf). Aby wyeliminować wpływ długości dokumentu, zwykle ludzie wolą normalizować się na podstawie liczby dokumentów, w których pojawia się termin, częstotliwość dokumentów ( tf-idf ).

Innym podejściem jest modelowanie tematyczne, które uczy ukrytej reprezentacji danych w niższych wymiarach. LDA i LSI / LSA to typowe wybory, ale ważne jest, aby pamiętać, że nie jest to nadzorowane. Wyuczona reprezentacja niekoniecznie będzie idealna do nadzorowanego uczenia się z NN. Jeśli chcesz wykonać modelowanie tematów, możesz także wypróbować nadzorowane modele tematów .

Dla pojedynczych słów można użyć word2vec , który wykorzystuje NN do osadzania słów w przestrzeni o dowolnym rozmiarze. Podobieństwo między dwoma wektorami słów w tej wyuczonej przestrzeni ma tendencję do podobieństwa semantycznego.

Nowszym pionierskim podejściem jest wektory akapitowe , które najpierw uczą się modelu słownego podobnego do word2vec, a następnie wykorzystują tę reprezentację do nauki rozproszonej reprezentacji zestawów słów (dokumentów dowolnej wielkości). To pokazało najnowocześniejsze wyniki w wielu aplikacjach.

Korzystając z NN w NLP, ludzie często używają różnych architektur, takich jak rekurencyjne sieci neuronowe (takie jak sieci pamięci krótkoterminowej ). W niektórych przypadkach ludzie korzystali nawet z konwergentnych sieci neuronowych na tekście.


Myślę, że word2Vec jest naprawdę najdokładniejszą odpowiedzią na pytanie. Jest naprawdę fajny samouczek Kaggle na temat trenowania i korzystania z niego: kaggle.com/c/word2vec-nlp-tutorial/details/part-2-word-vectors
jagartner

Dzięki, zapomniałem linku word2vec, dodam jeden (oprócz tego, który tu wymieniasz!)
jamesmf

3

Nie jest to problem dotyczący sieci neuronowych jako takich, ale reprezentowania danych tekstowych w uczeniu maszynowym. Możesz reprezentować filmy, obsadę i motyw jako zmienne kategoryczne. Fabuła jest bardziej skomplikowana; prawdopodobnie chciałbyś mieć model tematyczny do tego, ale zostawiłbym to, dopóki nie zrozumiesz wszystkiego. Robi dokładnie to tekstowe „próbkowanie w dół”, o którym wspomniałeś.

Zapoznaj się z tym samouczkiem, aby dowiedzieć się, jak kodować zmienne jakościowe dla sieci neuronowych. I powodzenia!


Warto zauważyć, że nie jest to wyraźnie problem w całym uczeniu maszynowym, ale tylko problem, jeśli chodzi o generowanie wektorów cech, które nie są wszechobecne w uczeniu maszynowym.
Slater Victoroff,

Jaki rodzaj uczenia maszynowego nie korzysta z funkcji?
Emre

Losowy las jest dobrym przykładem czegoś, dla którego uzyskanie wektora cech takiego, jaki widzisz w sieciach neuronowych, nie stanowi problemu. Wiele nienadzorowanych metod działa również na surowych słowach, a nie na wektorach cech. Uwaga: Nie powiedziałem, że istnieją metody, które nie używają funkcji, tylko że istnieją metody, które nie opierają się na ściśle ułożonych wektorach.
Slater Victoroff,

Nie wiem, co rozumiesz przez „ściśle ustrukturyzowany”.
Emre

ściśle skonstruowany jest 1d wektor unint8 w przeciwieństwie do listy zawierającej słownik, macierz wagową i serię ciągów
Slater Victoroff

0

Wypróbowałem następujące 2 sposoby próbnej implementacji sieci neuronowych z tekstem. Ten ostatni działa dość dobrze, ale z ograniczeniami.

  1. Utwórz słownictwo za pomocą word2vect lub NLTK / niestandardowych tokenów i przypisz indeks do każdego słowa. To ten indeks reprezentuje słowo jako liczbę.

    Wyzwania:

    • Indeksy muszą być „znormalizowane” przy użyciu skalowania funkcji.
    • Jeśli wyjście sieci neuronowej ma nawet niewielką zmienność, wówczas wyjście może być indeksem nieoczekiwanego słowa (np. Jeśli oczekiwany wynik to 250; ale NN wyprowadza 249 lub 251, to może być bliski wynik z kontekstu numerycznego; ale są indeksami różnych słów). Tutaj można wykorzystać cykliczne NN do generowania indeksu wyjściowego.
    • Jeśli do słownika zostaną dodane nowe słowa, indeksy tokenów powinny zostać ponownie przeskalowane. Model przeszkolony z poprzednio skalowanymi wartościami może stać się nieprawidłowy i musi zostać ponownie przeszkolony.
  2. Użyj macierzy tożsamości np. Dla słów „n” użyj macierzy „nx n” lub (n-1 x n-1), gdzie każdy wiersz i kolumna reprezentuje słowo. Umieść „1” w komórce przecięcia, a „0” w miejscach spoczynku. ( odniesienie )

    Wyzwania:

    • Każda wartość wejściowa i wyjściowa jest wektorem „nx 1”. W przypadku dużego słownictwa jest to nieporęczne obliczenie i wolniejsze.
    • Jeśli do słownika zostaną dodane nowe słowa, należy ponownie obliczyć macierz tożsamości (tj. Wektor słów). Model trenowany z wcześniej obliczonymi wektorami może stać się nieważny i musi zostać ponownie przeszkolony.
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.