fbpx
Menu Zamknij

Jak maszyny piszą teksty: Rekurencyjna sieć neuronowa

rekurencyjna sieć neuronowa

Witam Was w kolejnym wpisie z cyklu “Jak maszyny piszą teksty”. Dzisiaj porozmawiamy sobie o sieciach neuronowych. To właśnie głównie one są odpowiedzialne za to, co nazywamy sztuczną inteligencją.

Czym jest sieć neuronowa

Aż głupio się przyznać, ale kiedy pierwszy raz czytałam o sieciach neuronowych, to wyobrażałam sobie dosłowną sieć powiązanych ze sobą punkcików. W mojej głowie powstał obraz zamkniętego pomieszczenia oświetlonego przyciemnionym, niebieskawym światłem. Zamiast stołu mieścił się tam blat z cienkimi, srebrnymi antenkami. Każda antentka zakończona była kuleczką połączoną z innymi kuleczkami podobnie cienkimi, srebrnymi drucikami. Wyobrażałam sobie, że kuleczki – czyli neurony – porozumiewają się ze sobą za pomocą elektryczności, a dane wejściowe i wyjściowe mają postać zerojedynkową, może wręcz podawaną na taśmie, tak jak w bardzo starych komputerach.

Na swoje usprawiedliwienie powiem, że książka, którą czytałam, była trochę stara i autor mówił głównie o przesyłaniu bodźców między neuronami, dlatego właśnie tak to widziałam w mojej głowie.

Oczywiście, tak samo jak w przypadku wektora, moja wyobraźnia kompletnie się myliła. Gdyż sieć neuronowa to nic innego, jak rodzaj algorytmu. Więc po prostu jest to program komputerowy.

Dlaczego “sieć neuronowa”?

Sposób, w jaki prowadzone są obliczenia w obrębie sieci neuronowej, ma w założeniu przypominać funkcjonowanie ludzkiego mózgu. Dlatego właśnie mówimy o neuronach. W dodatku te neurony mogą zostać “aktywowane” albo nie i w zależności od tego przekazują odpowiednie informacje kolejnym neuronom. Podobnie działają synapsy w naszej głowie. Twórcy sieci neuronowych uznali, że skoro ludzki mózg jest tak skuteczny w przetwarzaniu różnorakich informacji, to komputery też będą to potrafiły, jeśli tylko pozwolimy im imitować nasz sposób działania.

Jak wygląda sieć neuronowa

Neurony rzeczywiście są powiązane ze sobą w sieć, ale jest ona bardziej zorganizowana niż połączenia synaps w mózgu ludzkim i mniej drucikowa niż w moim pierwotnym wyobrażeniu. Neurony w sieci zgrupowane są w warstwy, a ich połączenia polegają na przekazywaniu sobie danych liczbowych. Tworząc program ustalamy liczbę warstw oraz neuronów w każdej warstwie. Naszą pierwszą warstwą zawsze są dane wejściowe, a ostatnią dane wyjściowe. Droga od początku do końca obliczeń wygląda następująco:

  1. Program bierze nasze dane wejściowe i przeprowadza na nich obliczenia w określony z góry sposób.
  2. Wyniki tych obliczeń przekazuje do warstwy drugiej.
  3. W warstwie drugiej znowu odbywają się obliczenia.
  4. Wynik przekazywany jest do warstwy trzeciej.
  5. Warstwa trzecia znowu liczy… i tak dalej, i tak dalej…
  6. …aż dojdziemy do warstwy ostatniej, czyli danych wyjściowych, które program prezentuje nam jako ostateczny wynik.

Obliczenia składają się z trzech rzeczy: mnożenia, dodawania i tak zwanej funkcji aktywacyjnej. W każdej warstwie odbywa się to jak niżej:

  1. Najpierw mnożymy dane przez jakiś czynnik liczbowy W (inny w każdej warstwie i dla każdego neuronu).
  2. Potem do wyniku dodajemy składnik liczbowy b (również inny w każdej warstwie i dla każdego neuronu).
  3. Na koniec bierzemy wynik tych obliczeń i przepuszczamy go przez funkcję aktywacyjną f. Ta funkcja daje wynik w stylu “tak czy nie”, czyli informację o tym, czy dany neuron został aktywowany.

Podsumowując, obliczenia w każdej warstwie można zapisać bardzo prostym wzorem:

wynik = f(W*dane+b)

Zwyczajowo dane wejściowe oznacza się symbolem x, wynik z każdej warstwy symbolem z, a wynik funkcji aktywacyjnej symbolem a. Poniżej znajdziecie ilustrację ciągu obliczeniowego sieci o wielu warstwach.

sieć neuronowa

Dane wejściowe i dane wyjściowe

Generalnie nie lubię suchego gadania o “danych wejściowych” i “danych wyjściowych”, bo wydaje mi się to bardzo ogólne i mało zrozumiałe. Dlatego zobrazujmy sobie działanie sieci neuronowej na przykładach.

poprzednim wpisie rozmawialiśmy o tym, że słowa można przedstawić za pomocą wektorów. W taki sam sposób można przedstawić też całe teksty. Na przykład wyobraźmy sobie, że mamy tekst składający się z 453 słów. Możemy dla każdego z tych słów wziąć jego wektor, powiedzmy o długości 300, a potem obliczyć średnią z tych wektorów jako reprezentację całego tekstu. W efekcie mamy jeden wektor o trzystu elementach, który zawiera informacje o wszystkich słowach składowych tekstu.

I co teraz możemy zrobić? Ano na przykład zaklasyfikować tekst jako pisany językiem naukowym lub potocznym. W tym przypadku mamy dwie kategorie, więc nasza warstwa wyjściowa będzie miała dwa neurony. Neuron odpowiedniej kategorii zostanie aktywowany i da nam wynik 1. Przykładowa sieć będzie wyglądała jak niżej:

klasyfikacja potoczny naukowy
Możemy też na przykład odkryć, jakie emocje przeważają w tekście. Wtedy sieć będzie wyglądała tak:

klasyfikacja emocje

Albo też możemy zaklasyfikować tekst jako należący do określonej tematyki:

klasyfikacja tematyka

Zauważcie, że za każdym razem warstwa wyjściowa będzie miała tyle neuronów, ile mamy kategorii.

Sztuczna inteligencja sieci neuronowej

Co to znaczy, że sieć sama się uczy? Myślę, że to jest dobry moment, żeby odpowiedzieć sobie na to pytanie.

Jak zauważyliście, w powyższych przykładach oczekujemy od sieci konkretnej odpowiedzi w postaci wskazania klasy, do której należy dany tekst. Proces uczenia sieci wymaga od nas, żebyśmy zawczasu znali prawidłową odpowiedź. Bo jak inaczej nauczyć czegoś sieć, jeśli my jako nauczyciele nie znamy odpowiedzi na nasze pytanie?

Proces uczenia sieci jest następujący:

  1. Sieć dostaje od nas dane wejściowe. Generuje sobie losowe wartości parametrów W oraz b i przelicza wszystko kolejnymi warstwami aż do uzyskania wyniku.
  2. Sieć pokazuje nam wynik, a my w zamian pokazujemy sieci, co powinno jej wyjść.
  3. Sieć oblicza sobie, o ile się pomyliła. Zwykle podajemy sieci wiele tekstów do liczenia naraz (ekonomicznie!), więc wielkość błędu obliczana jest na wszystkich tych tekstach.
  4. Sieć przechodzi jeszcze raz przez wszystkie obliczenia, ale od końca, i po drodze troszkę zmienia wartości Wb w zależności od poziomu błędu.
  5. Jak już Wb zostaną zmodyfikowane, sieć przelicza wszystko jeszcze raz. Pokazuje nam nowy wynik. My znowu pokazujemy, co powinno wyjść.
  6. Sieć powtarza kroki 3-5 tyle razy, ile jej każemy (na przykład 2 tysiące razy) albo do momentu, gdy poziom błędu będzie wystarczająco niski (na przykład 0.5%).

backpropagation

P.S. Czy zauważyliście w powyższym opisie podobieństwa do tego, jak działa algorytm word2vec? Tak, to nie jest przypadek 😉

Zatem jak widać, sieć neuronowa uczy się metodą prób i błędów. Kiedy uczenie się zakończy, otrzymujemy ostateczne wartości parametrów Wb. Potem, gdy sieć dostanie nowe dane (na przykład nowy tekst), powinna być w stanie przeliczyć te dane za pomocą otrzymanych w procesie uczenia Wb i dać już prawidłowy wynik. Ta zdolność uczenia się, jak i możliwość zastosowania wyuczonych mechanizmów do nowych danych, stanowi właśnie podstawę sztucznej inteligencji sieci neuronowych.

Rekurencyjna sieć neuronowa

Istnieje kilka głównych rodzajów sieci neuronowych. Najważniejsze z nich to:

  • sieć składająca się z prostych warstw, gdzie każdy neuron jednej warstwy jest obliczeniowo połączony z każdym neuronem warstwy kolejnej (fully connected network) – sieci tego właśnie rodzaju były przedstawione na powyższych obrazkach;
  • sieć konwolucyjna (convolutional neural network, CNN), której wyjątkowy sposób prowadzenia obliczeń świetnie sprawdza się w przetwarzaniu obrazów;
  • sieć rekurencyjna (recurrent neural network, RNN), którą wykorzystujemy do przetwarzania danych stanowiących jakąś sekwencję.

Ponieważ tekst jest sekwencją słów, to do rozwiązywania zadań dotyczących języka naturalnego najczęściej stosujemy właśnie sieć rekurencyjną.

Ta sieć jest zbudowana trochę inaczej niż inne sieci. Zauważcie na przykład, że na powyższych ilustracjach dane wejściowe zawsze miały tyle samo elementów, na przykład 300 elementów wektora. Jeśli wytrenujemy sieć, gdzie dane wejściowe zawsze mają 300 elementów, to tak będzie musiało być już zawsze; na przykład nie będziemy mogli użyć tej samej sieci do przetwarzania wejściowego wektora o długości 500. Nie będzie to problemem, jeśli dane wejściowe zawsze będą średnią wektorów wyrazów występujących w tekście i te wektory będą miały z góry określoną długość. Jednak przedstawienie tekstu w taki sposób nie pozwala nam na przyjrzenie się każdemu słowu indywidualnie ani na wzięcie pod uwagę kolejności tych słów. A przecież to jest niezwykle istotna część komunikacji językowej!

Rekurencyjna sieć neuronowa rozwiązuje ten problem poprzez zmianę sposobu prowadzenia obliczeń. Zwykła sieć ma ustaloną liczbę neuronów w każdej warstwie. Sieć rekurencyjna w miejsce neuronów ustanawia sobie coś w rodzaju pudełka obliczeniowego i w każdej warstwie kopiuje to pudełko tyle razy, ile tego wymaga długość danych wejściowych. Na przykład dla zdania o pięciu wyrazach pudełko jest skopiowane 5 razy, a dla zdania o trzynastu wyrazach 13 razy. Nasze słowa zaś podajemy sieci jedno po drugim w kolejnych etapach. Poniższa sieć ma 7 etapów i jedną warstwę (przy sieciach rekurencyjnych zwykle jedna wystarcza).

wyrazy - kroki

Daje nam to wspaniałe możliwości. Bowiem to, co trenujemu w tej sieci, to właśnie jej pudełko. A wytrenowane pudełko można sobie skopiować ile razy się chce! Więc wytrenowana sieć rekurencyjna przyjmie ciąg wyrazów dowolnej długości i nie trzeba się martwić żadnymi ograniczeniami 🙂

Zależności między słowami

Pudełka sieci rekurencyjnej są fajniejsze od neuronów zwykłej sieci jeszcze pod jednym względem. Otóż są one ze sobą połączone, dzięki czemu sieć rekurencyjna zwraca uwagę na kolejność przetwarzanych elementów.

Zobaczmy sobie, jak to działa w praktyce. Oto jak wygląda bardziej szczegółowa ilustracja naszych pudełek:

pudełka sieci rekurencyjnej

Każde pudełko przyjmuje dane z dwóch źródeł. Pierwszym są nasze dane wejściowe na danym etapie (czyli na przykład kolejne słowo), a drugim dane z poprzedniego pudełka (za wyjątkiem pudełka pierwszego, któremu w tym miejscu podajemy takie niby-dane). Każde pudełko produkuje również dwa różne wyniki obliczeń. Jeden wynik to nasze dane wyjściowe na danym etapie pracy sieci, a drugi to informacje, które są przekazywane do pudełka następnego.

I to właśnie te dane przekazywane z jednego pudełka do kolejnego mówią nam tak wiele o kolejności słów w naszym tekście. Zauważcie też, że nawet ostatnie pudełka dostają informacje z pudełka pierwszego czy drugiego, choć nie odbywa się to bezpośrednio. Dlatego właśnie sieci rekurencyjne tak dobrze radzą sobie z przetwarzaniem relacji między wyrazami. W zależności od rodzaju zastosowanego pudełka (a jest ich kilka, na przykład GRU lub LSTM) sieć może sobie radzić w tej kwestii wręcz śpiewająco.

Przykład działania sieci rekurencyjnej

Żeby jeszcze lepiej wyjaśnić działanie sieci rekurencyjnej, przyjrzyjmy się przykładowemu zadaniu, które już omówiliśmy w tym wpisie: klasyfikacji emocji tekstu. Oto, jak będzie wyglądała sieć rekurencyjna do tego zadania.

klasyfikacja sieć rekurencyjna

Jak widać na rysunku, tym razem do sieci wrzucamy nie średni wektor słów, ale pojedyncze wektory wyrazowe jeden po drugim. Pudełka jak zwykle produkują dane wyjściowe na każdym kroku, ale w tym zadaniu ignorujemy je i skupiamy się tylko na tych informacjach, które są przekazywane między pudełkami. Dopiero od ostatniego pudełka oczekujemy wyniku, a wynikiem tym ma być wskazanie konkretnej emocji powiązanej z tekstem. Dlaczego tak? Ponieważ dopiero to pudełko przeczytało cały tekst. Innymi słowy, zebrało informacje ze wszystkich innych pudełek w określonej kolejności i właśnie dzięki temu jest w stanie powiedzieć nam, jaki jest prawidłowy rezultat obliczeń.

Czego się dzisiaj dowiedzieliśmy

  1. Sieć neuronowa jest algorytmem.
  2. Sieć neuronowa została tak nazwana, bo ma imitować działanie neuronów w ludzkim mózgu.
  3. Sieć neuronowa składa się z warstw, które po kolei przeliczają dane aż do podania wyniku.
  4. Sieć neuronowa uczy się metodą prób i błędów, modyfikując swoje parametry tak, żeby wyszedł jej wynik jak najbliższy prawidłowemu.
  5. Do przetwarzania tekstu najczęściej stosujemy sieci rekurencyjne, ponieważ dobrze radzą sobie one z danymi w formie sekwencji.
  6. Sieć rekurencyjna składa się z połączonych ze sobą pudełek, które przyjmują słowa tekstu jedno po drugim i produkują jakiś wynik na każdym etapie pracy. Czasami istotny jest dla nas tylko wynik ostatniego pudełka.
  7. Dzięki połączeniom między pudełkami sieć rekurencyjna otrzymuje informacje o kolejności podawanych jej słów.

A jak zastosować sieć rekurencyjną do tworzenia własnego tekstu? Tego dowiecie się z następnego wpisu. Tymczasem, jeśli macie pytania dotyczące działania sieci neuronowych, to zadawajcie je w komentarzach!

Podziel się tym wpisem w mediach społecznościowych

Powiązane wpisy

3
Dodaj komentarz

avatar
3 Komentarze
0 Odpowiedzi w tym wątku
0 Śledzą
 
Komentarz z największą liczbą rekacji
Najpopularniejszy wątek
0 Autorzy komentarzy
Ostatnio komentujący
  Powiadamiaj o  
najnowszy najstarszy oceniany
Powiadom o
trackback

[…] W kolejnym wpisie opowiemy sobie o tym, co to jest sieć rekurencyjna. […]

trackback

[…] “Jak maszyny piszą teksty”. Rozmawialiśmy już o wektorach i o sieciach neuronowych. Jeśli ktoś nie jest w temacie, to zdecydowanie polecam mu przeczytać […]

trackback

[…] ostatnim już wpisie z cyklu “Jak maszyny piszą teksty”. We wpisie numer dwa poznaliśmy rekurencyjną sieć neuronową. We wpisie numer trzy […]

Powrót do góry strony