who

Czy AI umie się skupić? Czyli o tym, czym jest Deep Learning (część 1)

7 minut czytania
Komentarze

Wraz z coraz śmielszym rozpychaniem się AI w naszej codzienności, warto usystematyzować naszą wiedzę na ten temat. Operowanie w rzeczywistości, w której sztuczna inteligencja będzie nie tylko ciekawostką, ale integralną częścią naszej będzie pełne wyzwań… ale I szans na realizację pomysłów, które do tej pory wydawały się nieosiągalne. Aby być w tym efektywnym, trzeba jednak wiedzieć, z czym tak naprawdę mamy do czynienia.

Autor: dr Jan Kwapisz (Dijkstra Enterprise)

Naiwna sieć neuronowa

Deep learning to jedna z podkategorii uczenia maszynowego, będącego częścią większego zbioru, który określamy dziś mianem sztucznej inteligencji. Pozwala komputerom nauczyć się i rozpoznawać wzorce w danych w sposób podobny do ludzkiego mózgu. To technologia, która umożliwia maszynom „myślenie” i podejmowanie decyzji na podstawie wcześniej zaprogramowanych algorytmów oraz zbiorów danych. Deep learning jest stosowany w wielu dziedzinach, takich jak rozpoznawanie mowy i obrazów, tłumaczenie języków, rozpoznawanie fraz w komunikacji czy chociażby rekomendacje produktów, z którymi spotkał się w sieci każdy z was.

Deep learning opiera się na sieciach neuronowych. Sieć neuronowa w deep learningu to model uczenia maszynowego, który składa się z jednej lub kilku warstw neuronów sztucznych, które przetwarzają dane wejściowe i generują odpowiedź. Sieć neuronowa1 to w istocie połączenie ze sobą wielu prostych operacji prowadzących od danych wejściowych do danych wyjściowych. Zadaniem sieci neuronowej jest przewidzenie na podstawie danych wejściowych, danych wyjściowych.

Przykładowo, chcielibyśmy przyporządkowywać oceny hotelu na booking.com komentarzom pisanym przez użytkowników2:

  1. “Ten hotel jest super. Miał nie tylko świetne pokoje, ale także miłą obsługę oraz świetny serwis.” Takiemu zdaniu przyporządkowali byśmy 8 gwiazdek na 10.
  2. “W tym hotelu śmierdzi i są tam szczury”. Takiemu zdaniu przyporządkowali byśmy 1 gwiazdkę na 10.
fot. Depositphotos/Gorodenkoff

Używając sieci neuronowych, moglibyśmy to zrobić następująco. Po pierwsze, z uwagi na fakt, że komputery przetwarzają liczby, nie zaś język, to każdemu słowu w języku (polskim) przyporządkowalibyśmy jakąś liczbę. Wszystkie takie przyporządkowania słowo-liczba, to tak zwany słownik3. Przykładowo słowu “a” moglibyśmy przyporządkować liczbę 1, natomiast słowu “banan” powiedzmy liczbę 500. Oprócz tego, znakom interpunkcyjnym przyporządkowalibyśmy jeszcze inne liczby, a także przydzielamy liczby początkowi wypowiedzi, końcowi oraz pustemu słowu “_”. Ta operacja nazywa się tokenizacją i jest powszechnie używana w przetwarzaniu języka naturalnego. Zaś pojedynczy element (słowo) nazywamy tokenem.

Zdanie:

Ten hotel jest super. Miał nie tylko świetne pokoje, ale także miłą obsługę oraz świetny serwis

Na język komputerowy przetłumaczylibyśmy jako tabelkę [3000, 800, …,]. Długość tej tabelki to 16, zatem w tak zwanej warstwie wejściowej sieci neuronowej, tworzymy 18 neuronów (16 słów plus początek i koniec zdania (na potrzeby tekstu komentarze będę nazywał zdaniami, nawet jeśli mają one parę zdań), które następnie w kolejnych warstwach się ze sobą mieszają przy użyciu operacji matematycznych. Dzięki zastosowaniu dodatkowych warstw między wejściem a wyjściem tzw. warstw ukrytych to mieszanie może w dużym stopniu dopasować się do konkretnego zadania. Na końcu, po przejściu przez warstwy ukryte, zadaniem sieci neuronowej jest przyporządkowanie tej tabelce liczby 8. Będziemy ją szkolić tak długo, aż będzie to robić dobrze, ponieważ na początku jej wyniki będą wysoce losowe.

Z tym podejściem wiążą się jednak dwa problemy.

Po pierwsze – zdania mogą być różnej długości. Przykładowo drugi przytoczony przeze mnie komentarz ma 10 tokenów (8 słów plus początek i koniec zdania). Chcielibyśmy używać jednak sieci o tej samej liczbie neuronów w warstwach do każdego z tych zdań, aby sieć zawsze była taka sama. Inaczej nie będzie się ona tak skutecznie uczyć.

Ten problem możemy rozwiązać w następujący sposób. Spośród komentarzy wybrać ten najdłuższy i w pozostałych wstawić token odpowiadający pustym słowom na przykład w ten sposób: “W tym hotelu śmierdzi i są tam szczury _ _ _ _ _ _.” Jednak to podejście powoduje, że sieć musi procesować masę niepotrzebnych danych, czyli pustych tokenów. Ponadto, jeśli potem jakiś użytkownik zostawi komentarz dłuższy niż wszystkie poprzednie, to sieć “zwariuje” i nie będzie wiedziała jak taki komentarz przeprocesować, ponieważ nie ma wystarczającej ilości neuronów.

Po drugie w tym podejściu dla sieci neuronowej zdanie:

W tym hotelu śmierdzi i są tam szczury

Będzie kompletnie innym niż zdanie “W tym hotelu są szczury i tam śmierdzi”. Te zdania mają jednak to samo znaczenie.

Rekurencyjne sieci neuronowe

Oba te problemy można rozwiązać używając rekurencyjnej sieci neuronowej. Rekurencyjna sieć neuronowa (RNN) to rodzaj sieci neuronowej, w której informacja przepływa nie tylko z jednej warstwy do drugiej, ale także z jednej iteracji do następnej w celu zachowania kontekstu sekwencji danych. RNN jest często stosowana w zadaniach, takich jak przetwarzanie języka naturalnego i generowanie tekstu. W skrócie, RNN różni się od standardowej sieci neuronowej tym, że ma dodatkową pętlę sprzężenia zwrotnego, która umożliwia przetwarzanie sekwencji danych.

Wracając do głównego problemu, robi się to w następujący sposób. Zamiast wprowadzać wszystkie tokeny naraz, po prostu wprowadza się je po kolei. Następnie po wykonaniu operacji w ramach sieci zapisuje się ten wynik (oznaczony na rysunku jako h) i “miesza” się go z kolejnym tokenem. Przypatrzmy się pierwszemu zdaniu

Ten hotel jest super. Miał nie tylko świetne pokoje, ale także miłą obsługę oraz świetny serwis

W rekurencyjnej sieci napierw pprzetworzymy token „Ten”.  Następnie wynik przetworzenia  tokenu „Ten” miesza się w drugim kroku z tokenem „hotel”. Następnie tą mieszankę „Ten” oraz „hotel” mieszamy  ponownie z tokenem „jest” i tak aż do ostatniego tokenu „.” Na końcu wykorzystuje się ostatni wynik zmieszania tokenu „.”  z  wszystkimi dotychczasowymi informacjami, do przewidzenia ile gwiazdek należy przyporządkować. Warto podkreślić, że mimo tego co może sugerować obrazek, to w każdym kroku wykorzystuje się tą samą sieć, zatem operacja mieszania zawsze “zachodzi tak samo”.

Dzięki temu podejściu możemy przetwarzać zdania różnej długości, wystarczy, że dostatecznie długo będziemy je przetwarzali. Natomiast dzięki operacji mieszania możemy nauczyć sieć wykrywać podobieństwa między słowami i nauczyć ją, które informacje są ważne, a które są tylko “przypadkowym szumem”4. Można stosować także dwukierunkowe sieci neuronowe.

Fot. Depositphotos/everythingposs

Dodatkowo, aby lepiej procesować zdania typu “Tywin, Pan Zachodu, Lord Casterly Rock, zwierzchnik rodu Lannisterów i były namiestnik Siedmiu Królestw, był smutny” możemy zastosować tak zwane bramki zapominania / pamiętania5, które nauczą się, że cała tytulatura Lorda Tywina jest nieważna dla jego stanu emocjonalnego i po prostu nie przekażą jej dalej. Będą natomiast pamiętać jego imię aż do ostatniego tokena.

Takie podejście było stosowane aż do 2017 roku. Jest ono bardzo skuteczne w przyporządkowaniu gwiazdek, jednak słabo radziły sobie z tłumaczeniem zdań z jednego języka na inny, gdzie zdania miały powyżej 20 słów. Na przykład taka para zdań “Jan je jabłko” oraz “John is eating an apple” byłaby tłumaczona w architekturze zakoduj – odkoduj (encoder – decoder), gdzie łączymy ze sobą dwie sieci6. Encoder musi spakować (zakodować) całą informację o polskim do jednej liczby (wektora), natomiast decoder musi z tej jednej liczby odtworzyć całe zdanie po angielsku. Jak się pewnie domyślasz czytelniku jedna liczba to trochę mało aby zakodować całe zdanie, zwłaszcza w języku polskim, gdzie występuje tyle odmian. Dlatego, też przez wiele lat tłumaczenie maszynowe, zwłaszcza długich tekstów robiono innymi metodami.

Po prostu musisz się skupić (Attention is all you need)

W 2017 roku nadeszła rewolucja7. W przełomowym artykule „Attention is all you need” autorzy zasugerowali, że problem można rozwiązać zupełnie inaczej. Jest to chyba najbardziej przełomowy artykuł naukowy o tematyce komputerowej ostatnich lat i dzięki niemu stało się możliwe nie tylko “zachowanie sensu” w tłumaczeniu tekstów dłuższych niż ten, ale także powstanie ChatGPT.

Ciąg dalszy nastąpi w części drugiej artykułu, w której dowiesz się na czym polega mechanizm atencji i dlaczego modele językowe “rozumieją” oraz gdzie jeszcze stosuje się ten mechanizm. Gdy zostanie on opublikowany – w tym miejscu znajdziesz do niego odnośnik.

Przypisy oraz objaśnienia

  1. Na potrzeby tego tekstu będę omawiał tzw. uczenie nadzorowane, chociaż sieci neuronowe stosuje się także w uczeniu nienadzorowanym oraz uczeniu ze wzmocnieniem. ↩︎
  2. Inną kwestią jest to, że użytkownicy częściej wystawiają gwiazdki niż komentarze. ↩︎
  3. Tak naprawdę w sieciach neuronowych stosuje się tzw. reprezentacje one-hot i tworzy się wektory długości słownika z samymi zerami oraz jedynką na miejscu, gdzie dane słowo występuje w słowniku. Także dane wyjściowe przedstawiane są jako wektor prawdopodobieństw, gdzie kolejne elementy wektora to prawdopodobieństwa danej ilości gwiazdek. Jako przewidywanie sieci wybieramy element z największym prawdopodobieństwem. Zatem jeśli nasz wektor prawdopodobieństw wygląda następująco [0.05, 0.7, …] , to wynikiem przewidywania byłyby 2 gwiazdki. ↩︎
  4. Swoją drogą mogę szczerze polecić czytelnikowi książkę noblisty Daniela Kahnemana “Szum”. ↩︎
  5. W literaturze takie modele nazywają się Long-Short Memory (LSTM) lub Gated Recurrent Units (GRU). ↩︎
  6. Nie da się tego zrobić jedna siecią, ponieważ w tłumaczeniu często pojedyncze polskie słowo nie ma odpowiednika jako jedno słowo angielskie. Na przykład: “je” -> “is eating”, zatem po polsku mamy jeden token zaś po angielsku 2. Pomyśl o takich konstrukcjach jak “would be having” i polskie “miałbym”. ↩︎
  7. Tak naprawdę na początku łączono rekurencyjne sieci z mechanizmem atencji. Bahdanau et. Al. Neural Machine Translation by Jointly Learning to Align and Translate, 2014. ↩︎

opracowanie: Dijkstra Enterprise

Motyw