Word embeddings (i kłopoty sztucznej inteligencji)

Ostatni mój referat na seminarium na studiach dotyczył techniki word embeddings. Jak zwykle, przygotowawcze studia pozwoliły mi spojrzeć na wiele tematów z nowej strony; myślę, że zamiast surowej prezentacji komentarz w formie artykułu lepiej przybliży tematy, o których ostatnio myślałem. Sama prezentacja jest dostępna tutaj.

Przetwarzanie języka dotyczy szeregu trudnych zadań, których dzisiejsza technologia nie potrafi zrobić naprawdę dobrze. Mam tu na myśli automatyczną parafrazę (albo streszczanie) informacji czy tłumaczenie między językami. Obok tego mamy ileś wyizolowanych prostszych spraw, takich jak analiza sentymentu/nastawienia (ustalanie, czy np. komentarz do produktu w ogólnej wymowie jest pozytywny, czy negatywny). Część badań jest bardziej akademicka i nastawiona na odzwierciedlenie lingwistycznej rzeczywistości w strukturze programu, część służy potrzebom korporacji i agencji rządowych.

Jak się można domyślić, badania ściśle akademickie mogą częściej służyć porządnemu załatwieniu kwestii, której znaczenie dla dużych zadań (parafraza, tłumaczenie, rozumowanie) jest bardzo pośrednie. W Polsce wykonano tu co najmniej tyle pracy, co w innych krajach: opracowano klasyfikację słów w Narodowym Korpusie Języka Polskiego, rozpoznawanie wielu podstawowych, semantycznych połączeń między wyrazami (takich jak czasownika nazywającego czynność z jej obiektem: “zabijam muchę”) w słowniku Walenty i tak dalej.

Owe rozwiązania są zazwyczaj czysto gramatyczne, przez co rozumiem ich oddalenie od ściśle pojętych znaczeń wyrazów. A właśnie one odgrywają największą rolę, kiedy chcemy przetwarzać treść artykułów, wpisów na stronach społecznościowych, książek, słowem pełnych wypowiedzi. A takie są potrzeby praktyczne. Dlatego też szuka się dróg na skróty – właściwie nawet na duże skróty – i o tym jest w większej mierze niniejszy tekst.

Zgubiona instrukcja

Gdy chcemy nauczyć nasze liczydła złożonych umiejętności, pojawiają się zwykle dwa problemy*.

Po pierwsze, nie mamy dużych zbiorów danych bezpośrednio dla nas przydatnych, albo brak ich w ogóle. Można dziś rozsądnie powiedzieć, jeżeli chodzi o semantykę, że nie istnieje sensowny, satysfakcjonujący format definicji znaczenia słów. Żeby rozumieć typowe definicje słownikowe, takie jak ze słownika języka polskiego, trzeba najpierw pojmować tekst pisany, do czego potrzeba rozumienia definicji słownikowych. Tak powstaje błędno koło. Zresztą jeśli spróbujecie pobawić się takim słownikiem, na pewno znajdziecie błędne koła w samych definicjach.

Słowniki semantyczne, owszem, istnieją. Swego rodzaju. Mamy wordnety, czy też słowosieci, takie jak polska Słowosieć http://plwordnet.pwr.wroc.pl/wordnet/ . Wyszukując tam jakieś słowo, jak “ryba”, “pralka”, “rąbać”, otrzymujemy zbiór odesłań do innych słów. Owe słowa istnieją w określonej relacji do danego hasła: są klasyfikowane np. jako hiponim czy hiperonim (tzn. mają mniejszy lub większy zakres, tak jak w ciągu ptak -> sikorka -> bogatka) czy agens (wykonawcami czynności, tak jak w malować -> malarz). Kiedy zorientować się trochę w jej zawiłościach, słowosieć może komuś służyć jako wyrafinowany słownik wyrazów bliskoznacznych.

Wbrew temu, co może się powierzchownie wydawać, sieć powiązań między słowami, niezależnie od tego, co “naprawdę” one znaczą, jest najpewniej właściwym modelem języka. To, co przyporządkujemy owym słowom jako ich odniesienia w rzeczywistym świecie, jest często dość przypadkowe albo w ogóle nie istnieje. Doskonale znamy różnicę między strzygą i jednorożcem, chociaż nigdy ich w życiu nie napotkamy. W przypadku par słów takich jak “piękne” i “brzydkie”, “głupie” i “mądre”, można się zapętlić przy próbie połączenia ich z jakimiś określonymi zbiorami bytów w świecie, albo próbie określenia powodów, dla których ludzie nazywają rzeczy tak albo inaczej. Sens tych słów tkwi jedynie w tym, że istnieją w określonym stosunku i przeciwstawieniu wzajemnym. Myślę, że w ostatecznym rachunku pytanie semantyki (i językoznawstwa) jest o kształt owego układu połączeń, który tworzy w zasadzie samowystarczalny system. Prawdopodobnie słowosieć, na tyle, na ile jest zrobiona dobrze, chwyta niewielki fragment tej znacznie złożeńszej sieci.

Można znaleźć także nieco ambitniejsze w zamyśle próby zrobienia słownika zależności semantycznych. Żeby ograniczyć się do polskojęzycznych przykładów, rzućmy okiem na Słownik Semantyczny Języka Polskiego http://www.klk.uj.edu.pl/ssjp . Po lewej, na dole strony można podejrzeć kilka przykładowych haseł, niestety jako zrzuty ekranu w bardzo niskiej rozdzielczości. Ciekawe wydaje mi się, że relacje dotyczą w SSJP wyrazów, które rzeczywiście mogą wystąpić obok siebie w jednym tekście, będąc powiązanymi semantycznie: na przykład w opowiadaniu jakiś “pies”, czyjś “towarzysz” (przeznaczenie ze względu na człowieka) może być “obronny” (przeznaczenie ze względu na pracę) i “alarmować” (akcja pozytywna) całą “zagrodę” (przynależność). Widać tutaj wyraźne odbicie tkwiącego w języku obrazu świata, tak jak w „długich” definicjach Anny Wierzbickiej.

Określenia w nawiasach zaczerpnięte są z samego słownika: tak się tam klasyfikuje relacje. Według mnie klasyfikacja SSJP przede wszystkim pokazuje, jak trudny i niepewny może być opis relacji międzysłownych. Na przykład akcje “gryźć” i “warczeć” u psa nie zostały zaklasyfikowane jako negatywne (tylko neutralne); natomiast pozytywne (nie neutralne) jest “węszyć”. Myślę, że równie łatwo przedstawić argumenty i za takimi właśnie przyporządkowaniami, i za odwrotnymi. Tylko że, jak wiemy, maszyna sama z siebie nie zrozumie lekkich dwuznaczności i półtonów. Także “formalny” opis bardzo niedoskonale odbija w wypadku SSJP prawdziwy język.

Wytworzenie porządnych, słownikowych zasobów semantycznych wymagałoby ogromnych nakładów na pracę specjalistów (których jest niewielu). Musieliby się oni jakoś dogadać co do sposobu opisu – co byłoby wyzwaniem samym w sobie – i poświęcić takiemu projektowi długie lata.

Podobnie wygląda sytuacja z zasobami instruktywnych danych do wielu zadań, które chcielibyśmy zlecać komputerom. Generalnie, jako cywilizacja, mamy intelektualne trudności ze zrozumieniem otaczającego nas świata. Być może więc sama maszyna, przetwarzając masowo surowe informacje, będzie w stanie nas poratować? Sama zbudować model, taki jak model języka, dla siebie?

Wróżenie ze ścinków

Wspomniałem o zasadniczych problemach z danymi przy uczeniu maszyn. Szczupłość danych łatwych do przetwarzania to problem pierwszy. Problem drugi dotyczy zbiorów informacji, które są łatwo dostępne w dużych ilościach. Bo są przecież i takie; sęk w tym, że zwykle trudno je pożytecznie wykorzystać.

Wówczas należy zrobić coś jeszcze innego: wytworzyć model do pozornie bezsensownego zadania, dla którego jednak mamy dużo danych, i wykorzystać ten sam model do zaatakowania kwestii, na której zależy nam naprawdę. Léon Bottou, francuski badacz sztucznej inteligencji, twierdzi, że to jest już “maszynowe rozumowanie”. (Z jego artykułu zaczerpnąłem też wspomniane ujęcie problemów uczenia maszynowego, zob. przypis). Rozumowanie można bowiem pojmować jako takie posługiwanie się zgromadzoną wcześniej wiedzą, by rozwiązywać nowe problemy. Czego by nie sądzić o tej opinii – wykorzystanie pomocniczych wyników to droga, jaką najłatwiej podążyć w trudnych sytuacjach.

Tak naprawdę (przynajmniej do pewnego stopnia) da się wydobywać znaczenia z samych, zwyczajnych tekstów, bez towarzyszącej im anotacji. Jak to w ogóle możliwe? Gdy budujemy jakąś wypowiedź, to całe słownictwo języka, kształty jego zdań, związki składniowe między wyrazami tworzą pewne regularności. Na poziomie bardziej praktycznym nakładają się na to prawidłowości przejawiane przez świat, o jakim mówimy.

Świadomość wewnętrznych prawidłowości wypowiedzi, choćby na poziomie potrzebnym do odróżniania składnego tekstu od bełkotu, może przynieść znaczące korzyści. Na przykład, zdanie “Zdzisław ma auto” jest bardziej prawdopodobne niż “Zawisła mała tą”. Słuchając jakiejś osoby, uznamy, że wypowiedziała raczej pierwsze niż drugie, nawet jeżeli mówi szybko i nie całkiem wyraźnie. Podobnej umiejętności potrzebują programy rozumiejące ludzką mowę ze słuchu.

To podpowiada bardzo proste ćwiczebne zadanie dla systemu mającego w przyszłości służyć większym celom. Chodzi tu o przewidywanie następnego wyrazu. Czy po „Ala ma ” nastąpi „kota” czy „kaszalot”? Dla zdań z korpusu tekstów, takich jak Narodowy Korpus Języka Polskiego, łatwo sprawdzić poprawność odpowiedzi na takie pytanie.

Istnieje też dość oczywista, intuicyjna metoda statystycznego konstruowania odpowiedzi po stronie programu: metoda n-gramów. Wystarczy dysponować dużym korpusem sensownych, gramatycznych zdań w danym języku. Wszystkie teksty trzeba poszatkować na fragmenty po dwa, trzy (tzw. odpowiednio bigramy i trigramy) czy więcej słów. Powiedzmy teraz, że program napotyka gdzieś ciąg “Ala ma ” i zastanawia się nad kolejnym słowem. Bardzo prawdopodobne, że w korpusie wystąpił gdzieś bigram “ma kota” i takie rozwiązanie otrzyma wysokie ocenę, w przeciwieństwie do “ma jota” czy “na szczota” (zapewne niewystępujących w korpusie).

Taka “sztuczka” buduje już pewnego model języka, ubogi, ale wyciągnięty najprostszymi środkami z nieobrobionych (nieanotowanych) danych.

Oczywiście, nie jest to najmądrzejsza rzecz, jaką można zrobić. Weźmy kombinacje słów, które są całkiem poprawne i gramatyczne, ale zawiniły nieobecnością w korpusie. Wtedy, przy n-gramach, nie ma zmiłowania ani metody. Czasami co prawda da się cofnąć od większych n-gramów do mniejszych (backing-off); ponieważ jeżeli nie znamy trigramu “ma puszystego kota”, to istnieje jakaś szansa, że znamy bigram “ma puszystego” albo “puszystego kota”. Trzeba zaznaczyć na marginesie, że w angielskim, gdzie mają początek opisywane metody, znacznie mniej jest złożoności odmiany i dowolności w szyku zdań (na co zwrócił uwagę dr Piotr Wasilewski w dyskusji nad moim referatem). Posługując się terminami teorii informacji, tekst angielski ma mniejszą entropię; jego regularność łatwiej uchwycić na podstawie mniejszej próbki.

Nie zmienia to prawdy, że nawet angielski nie poddaje się tak łatwo n-gramowemu czary-mary. Autorzy artykułu wprowadzającego word embeddings** (wektory właściwościowe, jak to luźno tłumaczę), zwracają uwagę na ogólniejszy problem, tak zwane „przekleństwo złożoności” (curse of dimensionality). Właściwie owo przekleństwo to kolejne zjawisko pojawiające na wielu obszarach uczenia maszynowego.

Po pierwsze, fragment świata, który chcemy ogarnąć, jest niezmiernie skomplikowany, czy ściślej: występuje w nim wiele zmiennych. Wyobraźmy sobie, że takimi zmiennymi są nie tyle słowa, czy nawet ich właściwości określonych kategorii, ile wszystkie dotyczące owych słów fakty, a otrzymamy astronomiczne liczby. (Bengio et al. ujmują to inaczej: mając dziesięciowyrazowe wypowiedzi i słownik o 100 tysiącach pozycji, otrzymujemy potencjalnie 10^50-1 zmiennych wolnych).

Z drugiej strony, pojawia się kwestia modelu, czyli zbioru informacji oraz pewnej struktury pozwalającej porządkować fakty i otrzymywać odpowiedzi. Wyzwaniem jest zamknięcie wielkiej złożoności świata w modelu bardzo ograniczonym – wbrew pozorom – ze względu na fizyczne możliwości pamięciowe i obliczeniowe, zwłaszcza że wiele zjawisk w całej ich różnorodności nie ujawni się w korpusie treningowym.

Słowa = ciągi liczb?

Kierunek ogólny jest w zasadzie jasny: próbować redukować złożoność przez generalizacje. Weźmy trzy zdania, które powierzchownie (i w oczach są systemu n-gramowego) są całkowicie różne i niepodobne (ponieważ “podobieństwo” wymaga już generalizacji: jest stwierdzeniem o dwóch rzeczach tego samego pod jakimś względem):

The cat is walking in the bedroom. (Kot chodzi po sypialni)

A dog was running in a room. (Pies biegał po pokoju)

A cat is creeping into the closet. (Kot wkrada się do komórki)

Podobieństwo budowy i znaczenia tych zdań jest jasne dla osoby znającej trochę angielski. Ale owych podobieństw nie widać w prostej powtarzalności tych samych słów. Natomiast można się spodziewać, że takie wyrazy jak “cat” i “dog”, czy “walking” i “running”, występują kilka razy w korpusie w identycznych kontekstach, na przykład “was walking around”, “was running around” (chodził, biegał wokoło). Stąd dałoby się wywnioskować, że również informacja uzyskana skądinąd (z innych kontekstów) na temat “walking” stosuje się w pewnym stopniu do “running”, i odwrotnie. W ten sposób znacznie zwiększa się ilość informacji, jaką program może wywnioskować z korpusu treningowego.

Żeby możliwe były takie asocjacje, koniecznym jest, by uzyskane wiadomości na temat każdego słowa zostały zebrane w jeden złożony wpis, a nie pozostawały rozproszone w statystyce n-gramów. To jest właśnie word embedding, czy też wektor właściwościowy. Formalnie trzeba by go ująć właśnie jako wektor w kilkudziesięciu czy kilkuset wymiarach, ale jako że nikt nie potrafi sobie wyobrazić sobie czegoś takiego, przyjmijmy, że to po prostu ciąg liczb rzeczywistych.

W warunkach laboratoryjnych nie ma sensu ani czasu oznaczać owych liczb-parametrów. Nie mówimy więc, że ten parametr odpowiada za rodzaj gramatyczny, ów za przynależność do czasowników, czy bycie zwierzęciem, czy częścią budynku. Cała struktura programu tkwi w sieci neuronowej, która nie poddaje się łatwej analizie. Można jednak podejrzewać, że poszczególne właściwości gramatyczne i znaczeniowe spontanicznie wiążą się z którymś z parametrów, albo ich kombinacją, i to niekoniecznie tak, że jeden parametr modelu łączy się tylko z jednym parametrem rzeczywistości. Co naprawdę istotne, wyrazy podobne otrzymują podobne reprezentacje w swoich wektorach. Fakty o słowach stają się, mówiąc najkrócej, faktami o liczbach.

Nie mam tutaj ani miejsca, ani kompetencji, żeby opisywać dogłębnie proces uczenia sieci neuronowej. Przypomnijmy sobie, że wszystkie matematyczne metody, o jakich tu mowa, polegają na uczeniu się przewidywania prawdopodobieństwa. W istocie Bengio et al. założyli funkcję prawdopodobieństwa, tworzącą przewidywania co do następnego słowa na podstawie ciągu wektorów właściwościowych wszystkich słów poprzednich. Uczenie maszyny funkcji odbywa się tak, że dla małych losowych zadań sprawdzamy, czy funkcja odpowiada “dobrze”, a jeśli nie, to zmieniamy ją delikatnie tak, żeby odpowiadała “mniej źle”. Powtórzyć milion razy.

W porównaniu z systemem n-gramowym, word embeddings z 2003 roku osiągnęły wynik lepszy o jedną trzecią – na tych samych danych treningowych i testowych. Uderzającą (choć przede wszystkim teoretyczną) cechą wektorów właściwościowych jest głębsza odpowiedniość między odległościami między wektorami w matematycznej przestrzeni, a dobrze znanymi relacjami semantycznymi i gramatycznymi (zob. obrazek 1).

obrazek1

obrazek 1 (Mikolov et. al. 2013)

Oto i metoda wektorów właściwościowych, która odegrała znaczącą rolę w rozwoju przetwarzania języka w ostatnim dziesięcioleciu. Poza wspomaganiem rozpoznawania pisma i mowy korporacyjne badania rozszerzały jej stosowalność na przykład na tłumaczenia międzyjęzykowe. Teraz, ku końcowi drugiej dekady wieku, metody stają się jeszcze bardziej wyrafinowane; w tym tekście chciałbym jeszcze króciutko opowiedzieć o złożonych reprezentacjach dla jednostek języka wyższych niż wyrazy: zdań i całych wypowiedzi.

Uzyskujemy je, aplikując odpowiednią funkcję do wektorów wyrazów-składników. Rzecz jasna, wektory powstające w ten sposób są jeszcze bardziej wyabstrahowane od właściwości poszczególnych słów jako takich; ale w obliczeniowej praktyce nie jest to problemem.

obrazek 2

obrazek 2 (Hermann et al. 2014)

Szczególnie fascynujące perspektywy zastosowań takiej koncepcji zarysowują Hermann et al., 2014***. Autorzy owej pracy wykorzystali korpusy tekstów, dla których dostępne są równoległe tłumaczenia w wielu językach, takie jak protokoły obrad Parlamentu Europejskiego czy wystąpienia TED (międzynarodowych konferencji, gdzie mówcy przedstawiają różne idee). Bezpośrednim zadaniem, jakie stawiają przed siecią neuronową, jest klasyfikacja tekstów według kategorii: edukacja, technologia, wzornictwo itd.

Jedna sieć, można powiedzieć, uczy się jednocześnie wielu języków. Ich reprezentacje znowu układają się w ciekawy i dość sensowny sposób (obrazek 2). Oprócz wektorów dla słów i zdań autorzy wykorzystali wektory dla zdań i reprezentacje dla całych tekstów. Gdyby uzyskać bardzo dobre reprezentacje, można by sobie wyobrazić tłumaczenie wypowiedzi za ich pośrednictwem. Reprezentacje tekstów rozkładałyby się na wektory poszczególnych słów docelowego języka: w procesie odwrotnym do tego, w jakim program najpierw analizował tekst w języku źródłowym. Zamiast więc zastanawiać się, czy „tak” to w jakimś kontekście “yes” czy “so”, przekładalibyśmy od razu całą wypowiedź.

obrazek 3

obrazek 3 (Hermann et al. 2014)

Żeby postawić jasno sprawę, wyniki takich czysto informatyczno-statystycznych przedsięwzięć są jeszcze bardzo dalekie od tego, by zbliżyć komputery do ludzkich kompetencji posługiwania się językiem. Matematyczna “wiwisekcja” sieci neuronowej, mającej uczyć się relacji semantycznych, często wykazuje, że na przykład Putin ma na imię Miedwiediew, a narodową potrawą Francji są… tapas (obrazek 3). (Choć trzeba zauważyć, że te odpowiedzi nie są całkiem przypadkowe – w istocie, determinuje je korpus treningowy: po prostu słowa Putin i Miedwiediew występowały w danych treningowych równie często, co imiona i nazwiska innych polityków).

Największym (i wielce ogólnym) wnioskiem dla lingwistyki z opisanych tu przygód jest dobrze zakorzeniona przynależność języka do sfery czystej abstrakcji. Nie musi on mieć widocznego związku z materialnym światem, może pozostawiać systemem liczb; świat to jedynie plastyczny materiał, który ludzie organizują według swoich systemów znaków. I to one są naprawdę interesujące.

Ten wpis, i w ogóle moje zainteresowanie sieciami neuronowymi, wiele zawdzięcza blogowi Christophera Olaha: http://colah.github.io/posts/2014-07-NLP-RNNs-Representations/

* Léon Bottou, From machine learning to machine reasoning: an essay, Machine Learning, 94:133-149, January 2014. http://leon.bottou.org/papers/bottou-mlj-2013

** Yoshua Bengio et al., A neural probabilistic language model, Journal of Machine Learning Research, 3:1137–1155, March 2003. http://jmlr.org/papers/volume3/bengio03a/bengio03a.pdf

*** Karl Moritz Hermann, Phil Blunsom, Multilingual Models for Compositional Distributed Semantics, in proceedings of ICLR (International Conference on Learning Representations), 2014. http://arxiv.org/abs/1404.4641 Dostępne jest także nagranie prezentacji: http://techtalks.tv/talks/multilingual-models-for-compositional-distributed-semantics/60371/

Mikolov et al. 2013: T. Mikolov et al., Linguistic regularities in continuous spaceword representations. In Proceedings of HLT-NAACL (Human Language Technologies – Annual Conference of the North American Chapter of the Association for Computational Linguistics), 2013. http://research.microsoft.com/apps/pubs/default.aspx?id=189726

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *