Urok zakurzonych teorii (Jak coś zrozumieć po polsku cz. 1)
2015-05-19 17:39:40
Aby zupełnie wdrożyć znajdowanie powtórzeń ― co na razie jest główną funkcją Przenicy ― potrzeba jednej, oczywistej zmiany. Na przykład zamiast zliczać oddzielnie wystąpienia wyrazów takich jak zabawka, zabawny, zabawiać kogoś, program powinien rozpoznawać w nich słowa wywiedzione od jednego rdzenia, mianowicie zabaw―.
Dzięki temu mamy szansę uniknąć nadużywania tych wyrazów. Odbiorca, w przeciwieństwie do autora, zwykle nie ma oczu zmęczonych wielogodzinną pracą nad jednym tekstem. Kiedy taki świeży czytelnik napotyka co rusz to samo odmieniane przez przypadki, pewnie najpierw wydaje mu się to nawet zabawne, potem nudne, a w końcu... jego myśli są już gdzie indziej.
Chłonnik powinien zauważać takie rzeczy przed publikacją. W polszczyźnie jednak tworzenie (i rozpoznawanie) form wyrazów nie jest wcale proste, jeżeli się nie jest rodzimym użytkownikiem języka ― a co dopiero, jeżeli przypadkiem jest się programem komputerowym. Weźmy ciąg słów: pradziad, pralka, piorę, prać, walka, w walce, walec. Życzę powodzenia w odgadnięciu stałego tematu wyrazowego, który pozwoliłby odróżnić, gdzie chodzi o pranie, a gdzie o pradziadka. Albo gdzie o walkę z najeźdźcą, a gdzie o jeżdżenie walcem.
Łatwo, jak widać, nie będzie. A jednak myślę, że nie bardzo daleka jest chwila, kiedy zobaczycie u Chłonnika głębsze zrozumienie słów użytych w waszym tekście. W niniejszym cyklu opiszę część własnych przygód przy pracy nad tym problemem. Ruszymy na poszukiwania odpowiednio subtelnej teorii, która pozwoli nam nieco lepiej pojąć pewien ład, jaki kryje się w surowym materiale językowym.
Pozwólmy sobie najpierw na skok dwustuletni ― w okolice 1815 roku, kiedy opada bitewny kurz po wojnach napoleońskich. Do zajętej przez Rosjan Warszawy wraca Józef Mroziński, weteran wieloletnich kampanii Bonapartego. W nowej armii dostaje stopień podpułkownika; kiedyś będzie generałem i szefem sztabu wojsk polskich w czasie powstania listopadowego.
Podobizna J. Mrozińskiego z "Tygodnika Ilustrowanego" (1860)
Nim do tego dojdzie, pojawią się problemy z kiepską polszczyzną. Mroziński pochodził z polskiego wówczas Podola, do szkoły chodził niemieckiej, pod Napoleonem mówił oczywiście po francusku. Gdy wziął się za pisanie wspomnień, odrzucano mu teksty w gazetach z racji zanieczyszczenia obcojęzycznymi wpływami (gdybyż dzisiaj obowiązywała taka czujność). Mickiewicz, jak wiadomo, stworzył wobec takich trudności nowy prąd w literaturze, a Mroziński?
Był to człowiek, który chcąc dobrze opanować własny język zastał w rodzimej lingwistyce taki bałagan, że zaczął ją budować od nowa. Ogrom wyjątków i podziałów przy każdej regule, pisze nasz badacz w pierwszym zdaniu dziełka z 1822 r. Pierwsze zasady grammatyki języka polskiego, przeraża samych Polaków i sprawia, że cudzoziemcowi opanowanie tego wszystkiego wydaje się zadaniem ponad siły ludzkie.
Te uwagi chyba się nie zestarzały. W książce z roku 2009 możemy wyczytać podobną myśl, wyrażoną w specjalistycznym żargonie:
Przykłady handel : handlu, burdel : burdelu, parter : parteru, cukier : cukru pokazują, że alternacja tematu może mieć charakter przypadkowy, co powoduje, że opis alternacji tematu fleksyjnego wymaga budowy skomplikowanego systemu reguł i ograniczeń kontekstowych. [1.]
Mroziński wychodzi w swoim projekcie nowej nauki o języku od podzielenia polskich głosek na twarde i miękkie. (Rozróżnienie głoski, dźwięku i tzw. fonemu będzie tu dla nas nieistotne). Łatwo zauważyć, że dźwiękowo ń jest miękkim n, a ć to miękkie c. Każdej głosce twardej przyporządkowujemy miękką; trochę tak, jak gdyby rozbieganym przedszkolakom kazać się ustawić w pary.
Trzeba zaznaczyć (co powinniśmy pamiętać ze szkoły), że zapis wypowiedzi nie odpowiada wprost wymowie. W pewnych miejscach ć zapisujemy jako ci: bracia wymawiamy jako braća, a nie bracija. Rozciąga się to na mniej intuicyjne przypadki. Kiedy odmieniamy ta ryba ― tej rybie, w tym drugim słowie bi oznacza właściwie jeden dźwięk, mianowicie zmiękczone b'. Jeżeli spróbujecie powiedzieć rybie, biel, kielnia z „ameRykaNskim” akcentem, macie szansę uzyskać twarde b, k i n w tych wyrazach. W zwyczajnej polskiej wymowie ― raczej nie.
To, że w odmianie głoska twarda zmienia się czasem na odpowiadającą sobie miękką, nie przeszkadza w rozumieniu słowa. Z łatwością rozpoznajemy formy rósł i rośniesz czy wiosną i wiośnie jako odsyłające do z grubsza tego samego znaczenia. Możemy założyć, że w rdzeniu tych wyrazów nie istnieje rozróżnienie twardego i miękkiego s, a o wystąpieniu którejś z tych głosek decyduje wyłącznie konkretna forma gramatyczna.
Wówczas, po mechanicznym obcięciu końcówek, tematy wiosn : wiośń : wiośn : wiosń byłyby równoważne (zauważmy, że te dwa ostatnie w języku nie występują, bo twardy dźwięk niełatwo wymówić razem z miękkim). Przypadek rósł i rośniesz jest bardziej złożony. W pewnych postaciach słowa rosnąćo wymienia się regularnie na ó. Musielibyśmy więc powiedzieć, że ros = rós = roś = róś (rosną, rósł, rośniesz, róść). Nie wystarcza to jako wskaźnik ― np. porównaj rzeczownik rosa [2.] ― ale usuwa większość trudności.
Czyżbyśmy zatem mieli względnie porządny język? Okazuje się, że jest cały szereg głosek miękkich, które nie mają miękkiego brzmienia. Lepiej byłoby pewnie powiedzieć, że mają one cechy „miękkich” w swojej funkcji, lecz nie w wymowie. I tak na przykład rz odgrywa w polskim rolę miękkiego r: upiór― o upiorze, tak jak kolano ― w kolanie. (Co ciekawe, języki wschodniosłowiańskie mają często właśnie miękkie r w miejsce naszego rz, jak w imieniu Andriej). Z kolei c zajmuje miejsce miękkiego k: powłoka ― w powłoce, zaś na ć miękczy się t: jednopłat ― w jednopłacie. Tu również analogii dostarcza słowiańska rodzina: porównaj rosyjski bezokolicznik na miękkie -t' typu ljubit'.
Dokonując owych rozstrzygnięć Mroziński zdawał sobie sprawę, że nazywanie zbiorów głosek twardymi czy miękkimi staje się dość dowolne. Rzecz w tym, że taki system dwóch klas obejmuje całą fonologię języka polskiego i obecny jest w jego głębokiej strukturze. Uporządkowanie fonemów służy redukcji i uściśleniu reguł gramatycznych. Oto, jak w 1780 roku Onufry Kopczyński tłumaczy sposób tworzenia celownika rodzaju żeńskiego (typu klasa ― tej klasie, puszcza ― tej puszczy):
Mają ten przypadek na e imiona [tj. rzeczowniki] zakończone w pierwszym przypadku [mianowniku] na ba, da, fa, ga, cha, ka, ła, ma, na, pa, ra, sa, ta, xa, za z poprzedzającą samogłoską (...). Dodaje się i przed e po spółgłoskach b, f, m, n, p, s, w, x, z; zamieniają się dz na dzi, g na dz, ch na sz, k na c, ł na l, r na rz, t na ci. Mają ten przypadek na i te imiona które drugi przypadek miały także na i, to jest, imiona zakończone w pierwszym przypadku na ga, ia (wiśnia), ka, la, ya, i, l, ay, ey, także na wszelką miękką spółgłoskę. Mają ten przypadek na y te imiona, które w pierwszym przypadku kończą się na ca, dza, rza, sza, ża, tudzież na z z poprzedzającą samogłoską, i na ź.
Czemu pułkownik Mroziński przeciwstawia następującą zasadę:
Twarde spółgłoski zamieniają się na odpowiadające miękkie, i przybierają zakończenie e; miękkie nie zmieniają swego brzmienia, i przybierają zakończenie i. [3.]
Przejdźmy do zastosowań praktycznych. Skrajnie naiwne, ale za to trywialne w implementacji byłoby takie zastosowanie „tablicy miękkości” Mrozińskiego, że wszystkie spółgłoski twarde redukujemy do miękkich odpowiedników. To powinno zatrzeć różnice między poszczególnymi formami słów, dzięki czemu program taki jak Chłonnik rozpozna ich tożsamości (o ile dysponuje zbiorem wszystkich końcówek gramatycznych).
Fragment "Pierwszych zasad grammatyki języka polskiego" (1822)
I tak zdanie poety:
Uprzejmie kruki, gęstymi gromady krążąc wokoło, wabią do biesiady.
przyjęłoby (po zmiękczeniu wszystkich głosek i oddzieleniu końcówek) abstrakcyjną postać:
Przy tym zapisie łatwo dostrzegalne stają się pokrewieństwa różnego rodzaju:
uprzejmie (up'rzejm'|e) z uprzejma (up'rzejm'|a),
gęstymi (żęść|im'i) z gęściej (żęść|ej),
gromady (żrzom'adź|i) z gromadzie (żrzom'adź|e),
krążąc (crząż|ąć) z krąg (crząż).
Zwróćmy przy tym uwagę, że metodę można opisać ściśle: 1) dokonaj redukcji według tablicy Mrozińskiego, 2) usuń wszystkie końcówki z listy (zakładamy, że mamy takową) i 3) porównuj rdzenie, jakie pozostaną.
Czy procedura tego rodzaju po kilku usprawnieniach wystarczyłaby do prawidłowej interpretacji słów ― w części przypadków rozsądnie bliskiej stu procentom? Niestety, znowu, nie jest to tak proste.
Spośród licznych trudności wybierzmy kwestię słów takich jak księga (= cśęż|a według naszego algorytmu), gdzie g przechodzi w dz (tej księdze = cśędz|e). Jak widać, rdzenie nie przyjmują tutaj identycznej postaci. Jeżeli zaś ułożylibyśmy zasady podmieniania tak, by zatrzeć różnicę między dz i ż, nie moglibyśmy odróżnić słów wieża (w'eż|a) i wiedza (w'eż|a). K, g oraz ich podwójne zmiękczenia wprowadzają najwięcej zamętu w polskiej odmianie i słowotwórstwie. Nie da się tych problemów rozwiązać na gruncie takiego naiwnego algorytmu redukcyjnego, jaki zobaczyliśmy przed chwilą.
Nie ma jednak wątpliwości, że jesteśmy na tropie czegoś poważnego. Tam, gdzie pozornie panuje chaos, kryje się na wyższym poziomie abstrakcji ― system. Tym bardziej fascynujące, że za koniec nici złapał już dwieście lat temu pewien oficer armii Królestwa Polskiego. Przenikliwość naszego bohatera doceniały zresztą wielkie nazwiska lingwistyki; Mrozińskiego czytał Jan Baudouin de Courtenay, chwalił zaś Roman Jakobson.
W następnej części możemy być zmuszeni zapuścić się na techniczne głębiny. Najpewniej dotknę teorii polskiej morfonologii ostatniego czterdziestolecia. Zobaczymy, jak słowa grają ze sobą w komórki do wynajęcia, i trudno właściwie powiedzieć, gdzie się (słowa) zaczynają i kończą.
[1.] Słowniki komputerowe i automatyczna ekstrakcja informacja z tekstu, red. W. Lubaszewski, Kraków 2009, s. 18.
[2.] Zresztą, jak podaje Aleksander Brückner, pierwotnym tematem słowa rosnąć było rost―: rostę, rościesz, rostą, rósł. Stąd rościć (pretensje), a także wzrost, porost itd.
[3.] Oddzielna zasada stanowi o interpretacji i w poszczególnych przypadkach jako i albo y, co zależy zawsze od poprzedniej spółgłoski. W polskich wyrazach nie powinny się zdarzać zbitki takie jak ti, łi, ly, fy, gy itd., ponieważ każda z tych głosek ma przypisane do siebie któregoś „towarzysza” z pary i, y na stałe.
Dziękuję Jakubowi za konsultacje ws. języka rosyjskiego i Ilonie za ważne uwagi do tekstu.
Pogodzeni w znaczeniu (Jak coś zrozumieć po polsku cz. 2)
2015-11-27 17:25:19
Dawno temu, w poprzednim odcinku, napoczęliśmy problem nauczenia komputera rozpoznawania polskich wyrazów w ich poszczególnych odmianach. Wyciągając dzieła napoleońskiego oficera opracowaliśmy „algorytm”, który czasami ma szansę spróbować ugryźć to zadanie. Czasami. Ma szansę. To za mało.
Musimy poszerzyć nasze teoretyczne zaplecze: zrozumieć, czemu rdzenie zmieniają swoje formy zewnętrzne i jak w ogóle opisać tę zmienność. Spróbuję zacząć od życiowego przykładu. (To znaczy spróbuję, żeby był życiowy).
Powiedzmy, że masz w domu na ścianie reprodukcję któregoś z nieprzystojnych aktów Degasa. Znienacka ma was odwiedzić sroga, pyskata babcia, która nie pochwala takich rzeczy.
Rzecz jasna mógłbyś (mogłabyś) samemu odwrócić obrazek na drugą stronę, gdzie przezornie zapewne wymalowane są treści patriotyczno-religijne. Ale rzeczą ludzką jest rozmawiać i wyręczać się innymi, więc zamiast tego zlecasz operację któremuś z domowników.
Jeżeli nie masz zbyt wielu lat i akurat masz pod ręką rodzeństwo, być może zawołasz: „ej, odwróć panienkę na ścianie, babcia idzie”.
Jeżeli rozmawiasz z rodzicem, albo sam(a) nim jesteś, użyjesz raczej wypowiedzi w rodzaju „odwróć prędko obrazek, a ja polecę nastawić wodę na herbatę”.
Jeżeli sprawy potoczyły się zbyt szybko i zasiedliście już przy rodzinnym stole z nestorką twojego przesławnego rodu, możesz spróbować dawać znaki na migi osobie wychodzącej do łazienki. A nuż sprawę zdołacie jeszcze dyskretnie załatwić…
Owych sposobów, by wyrazić to samo z grubsza żądanie, znaleźlibyśmy na pewno więcej. I nieistotne dla nas, dlaczego dokładnie występują owe różnice: ważny jest najogólniejszy fakt, że okoliczności – takie jak to, z kim w tej chwili przebywamy – dyktują sposób wyrażenia jednej właściwie rzeczy.
Otóż podobne zjawisko występuje na znacznie, znacznie niższym poziomie języka, gdzie wszystko rozgrywa się między głoskami. Gdy mamy na przykład przysłówek gęsto i jego stopień wyższy gęściej, oba wyrazy można podzielić na dwa morfemy (dwie cząstki znaczące): gęst|o, gęść|ej. Morfemy -o i -ej mówią tyle, że te słowa to przysłówki w stopniu równym i wyższym. Cząstki gęst- i gęść- są zaś w zasadzie tym samym – odsyłają pod ten sam adres w naszej pamięci przechowującej znaczenia słów – a jednak na powierzchni występuje różnica. A „zawiniają” okoliczności: w przypadku gęściej rolę srogiej babci odgrywa głoska e, której obecność wymusza na t zmiękczenie w ć, co z kolei zmusza s do przejścia w miękkie ś. Podobnych przypadków z miękczącym e można w naszym języku pokazać mnóstwo, i to najbanalniejszych: lepszy – lepiej, Kuba – Kubie, łysy – łysieć…
Tego rodzaju odmiany (alternacje) fonemów przechodzą w historii podobną drogę od stanu, w którym wydają nam się konieczne dla naturalnej, niewymuszonej wymowy języka, do stanu, w którym są już zupełnie umowne. Dużo uwagi tym sprawom poświęcił Jan Baudouin de Courtenay w Próbie teorji alternacyj fonetycznych (rok 1894 – idziemy jak widać naprzód w czasie od Mrozińskiego, który nas zajmował ostatnio). Żywe i „naturalne” (w odczuciu mówiących) alternacje natychmiast stosujemy także do nowych wyrazów. Sami z siebie wiemy, że w wegańskie burgery jedzą hipsterzy, a znacznie rzadziej hipstery, a muchę znajdujemy w kebabie, a nie np. w kebabe. Według Baudouina de Courtenay wszystkie alternacje zaczynały jako takie fonetyczne oczywistości”*. Po drugiej stronie znajdują się alternacje morfemów i fonemów na tyle nieumotywowane (w poczuciu użytkowników), że przestają mieć dostrzegalny sens. Kto na przykład jest w stanie wyprowadzić słowo dozorca z czasownika dozierać (czyli „doglądać”)**?
Tyle o losach zmienności; pytanie, gdzie jednak znaleźć jakąś stałość, jako punkt zaczepienia dla algorytmu. Póki co możemy dla każdego rdzenia wskazywać różne, choć określone postacie: powiedzmy, dla słowa lig|a – lig (liga) oraz lidz (lidze). Pozostając przy tym wybralibyśmy podejście słownikowe: wyposażyli komputer w wielki zasób rdzeni i końcówek (380 megabajtów tabelek odmiany, jakimi posługuje się program Morfeusz), i pozostawili go z niezdolnością analizy nowonapotkanych słów.
Z drugiej strony, próbując wrócić do teorii Mrozińskiego, moglibyśmy wyjaśniać zmienność za pomocą twierdzeń o miękkości, typu: g przed końcówką fleksyjną może przyjmować swoje miękkie formy dz i ż, podobnie jak w rzeczownikachulga (uldze, ulżyć) czy trwoga (trwodze, strwożony).
Lecz nietrudno zauważyć, że rdzeń liż, który też powinien należeć do ligi, jest zajęty przez zupełnie inne słowo – lizać (lizało, liże).
Ktoś mógłby zaoponować, że w istocie sytuacja kształtuje się tutaj regularnie – w rzeczownikach żeńskich g rzeczywiście wymienia się nadz, ale na ż nie zawsze i najwyżej w wyrazach pochodnych. To nawet słuszna uwaga, jednak owe „wyrazy pochodne” także są powtórzeniami – o co chodziło w tej serii wpisów od początku – oraz dzielą z czasownikami tę samą unikalną część znaczącą. W wyrazach trzeba wydzielić część „słownikową” (przypadkową) i „gramatyczną” (regularną), o czym kiedyś pisał ogólniej Leonard Bloomfield***. Nie sposób odgadnąć, co oznacza rdzeń noś-, jeżeli nikt nas wcześniej o tym nie poinformował – ponieważ jest on przypadkowy, nie wynika z niczego (pomijamy ewentualną historię tego rdzenia). Ale kiedy już poznamy to znaczenie, słowa w rodzaju niosła, nieśli, nosiwoda, nosidło, nośność będą intuicyjnie logiczne w swym znaczeniu i budowie, jeżeli tylko jesteśmy osłuchani z językiem polskim.
Morfemy, a wśród nich rdzenie, zachowują się nieco jak zwierzęta terytorialne. Pewna część możliwych kombinacji fonemów jest kontrolowana przez jakiś rdzeń/znaczenie (te, które odbieramy jako znaczące cokolwiek, w odróżnieniu od wszystkich murkwi, i gwajdolnic, i pięśliwych wrucetów, jakie znajdujemy w sci-fi). Jeśli język mamy łatwo rozumieć, przypisanie kombinacji jednemu znaczeniu powinno odcinać pozostałe. I chociaż istnieją wieloznaczne wyjątki, to tylko potwierdzają one regułę, że słowa zazwyczaj bohatersko unikają kolizji. Polecam uwadze slalom, jakie wykonują w swej odmianie czasowniki wiedzieć i wieść (w znaczeniu wodzić). Spójrzmy: wiedzą i wiodą, wiedziemy i wiemy, ale!… wiedzieliśmy i wiedliśmy. Problem pojawia znowu przy zmianie części mowy, gdzie wieść ― brzmiące jak bezokolicznik ― może także oznaczać wiedzę rozchodzącą się wśród ludzi. (Jednak rzeczownik od czasownika odróżnia funkcja w zdaniu, przez co zwykle można rozpoznać odpowiednie znaczenie).
Aby uprościć zapis „terytorium” zajmowanego przez dany rdzeń, stosowane jest pojęcie morfonemu – pewna abstrakcja zbudowana nad fonemem. Wracając do przykładu ligi, nadalibyśmy jej rdzeniowi formę ligo, gdzie go może w żywej mowie przyjąć postaćg albo dz. W przypadku ulgi rdzeń zostałby sprowadzony do formyulg1, przy założeniu, że g1potrafi byćg albo dz, albo ż. Morfonem można więc opisać jako miejsce, gdzie fonemy zlewają się znaczeniowo. W takim razie owo zjawisko występuje po ul, kiedy odnajdujemy tuż za nimg, dz bądź ż. Identycznie po trwo. Stąd możemy pisać ulg1-i trwog1-.
Widać teraz, że na poziomie fonologii, czy też już morfonologii, morfonem jest tym, co mamy na myśli, a fonem sposobem, w jaki to wyrażamy zależnie od okoliczności (zob. początek tego tekstu). Fundamentalne spostrzeżenie Mrozińskiego dotyczy szczególnego przypadku, kiedy to fonem „funkcjonalnie twardy” i „miękki” są manifestacją jednego morfonemu – i rzeczywiście w polskim często napotykamy taką sytuację.
Mając do dyspozycji pojęcie morfonemu, możemy sformułować nasze początkowe pytanie o orientację komputera w polskich słowach w nieco śliślejszy sposób. Chcemy wiedzieć, jak mając do dyspozycji zapis tekstu, dojść do jego formy złożonej wyłącznie z morfonemów – to znaczy zapisu, gdzie rdzenie wyrazów powinny uzyskać jedną postać. Ten problem stawiano już w nauce. Wprawdzie chyba częściej pytano o drogę powrotną: od morfonemów do postaci powierzchniowej języka. Łatwo zauważyć, że pierwszy punkt widzenia jest właściwy temu, kto słucha lub czyta, a drugi – temu, kto mówi lub pisze. Aby zobaczyć przykład podejścia do tej kwestii, w następnym odcinku sięgniemy najpewniej do niewielkiej czerwonej książeczki – książeczki pełnej grozy (chociaż być może spróbujemy się uspokajać grafami!).
* Z wyjątkiem tych, które przejęliśmy z języków obcych (w pewnym sensie, bo w ramach tego obcego języka miały własną historię). Na przykład przejścia fonemów takie jak te w parach emitować – emisja, cedować– cesja oddają alternacje łacińskie. W języku polskim akurat te fonemy się nie „wymieniają”, chociaż bardzo ciekawy jest przypadek wiedzie – wieść.
** O ile nie wyczytał tego np. w Krystyna Kowalik, Struktura morfonologiczna współczesnej polszczyzny, Kraków 1997, s. 166.
*** Language, New York 1933, s. 274(do tego fragmentu nawiązuje Chomsky w Aspects of the Theory of Syntax).
Dziękuję Ilonie i Magdzie za przejrzenie pierwszej wersji tego wpisu (która, szczerze mówiąc, trafiła w końcu do kosza).
Niech się Przenica mieli i mle [przewodnik]
2015-11-27 17:25:27
Tak naprawdę nikt nie mówi "mle" zamiast "mieli"*, ale inteligenci starej daty mówią w czasie przeszłym owszem "mełł" i "mełła", a także "mleć". Taki polski inside joke.
Nie mówi się też już "Chłonnik", tylko Przenica. Zmieniła się nazwa i domena mojej aplikacji do pracy nad szatą stylistyczną tekstów. Zadaniem Przenicy jest przenikać wszystko, co napiszecie, i podawać wam informacje, na których ręczne wydobywanie szkoda czasu i energii. Reszta zależy od was.
Oto filmowy przewodnik oprowadzający po podstawach obsługi.
Po "przenicowaniu" widocznego na filmie artykułu (opublikowanego przed chwilą na tym blogu) zdołałem bez wielkiego zagłębiania się zwiększyć różnorodność słownictwa od 790 do 801 wyrazów. Co ciekawe, przy okazji łączna liczba słów spadła z 1317 do 1294, co oznacza, że urozmaicenie to także redukcja wielosłowia. W liczbach bezwzględnych nie jest to wiele; jednak zmieniony fragment to właśnie, jak myślę, kluczowy fragment dla odbioru całości. Spójrzmy na wytknięte przeze mnie piekło "się" (które wcześniej pojawiało się 35 razy, teraz 13):
Co do projektu rozpoznawania różnych form wyrazów, opracowałem już i w większej części napisałem system ze strukturami danych (w języku Go, z wykorzystaniem bazy OrientDB, jeżeli kogoś interesuje strona techniczna). Teraz czeka mnie "wypełnienie" tej struktury potrzebnymi informacjami, co może się okazać... ciekawym przedsięwzięciem. Na pewno będziecie powiadamiani o znaczących postępach.
* Czy, jak stanowi wciąż oficjalna norma, "miele" - jak przypomniał mi Mateusz Augustyn (edycja 30.11)
Zakątki lingwistyki: semantyka R. Montague
2015-12-04 22:10:18
Prezentacja poświęcona jednej z najbardziej wpływowych współcześnie teorii semantycznych. Okazja do zaserwowania paru logicznych formalizmów i pudelkowych sensacji, ale jedno i drugie z rozsądnym umiarem.
Materiał do referatu wygłoszonego 1 grudnia na seminarium o przetwarzaniu języka naturalnego na Wydziale Matematyki, Informatyki i Mechaniki UW, gdzie udzielam się nieco gościnnie.
http://www.slideshare.net/Sz_Rutkowski/semantyka-formalna-richarda-montague
Word embeddings (i kłopoty sztucznej inteligencji)
2016-02-21 18:01:05
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).
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 (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 (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
ELIZA, czyli odbijanie piłeczki (Programy konwersacyjne cz. 1)
2016-06-18 23:20:10
Pewnie najbardziej znanym problemem sztucznej inteligencji jest test Turinga, zakładający nieodróżnialność w rozmowie maszyny od człowieka. Wydaje się, że imitacja naszego zachowania to względnie trudne zadanie i nie da się tego zrobić bez zrozumienia złożoności naszego umysłu.
Z drugiej strony ludzie łatwo ulegają (auto)sugestiom. Mówiąc prościej, stosunkowo nieskomplikowany program "konwersujący" może wywołać silne reakcje emocjonalne u użytkowników. A jeżeli coś potrafi aktywnie wzbudzać nasze zaangażowanie, to musi być rodzajem żywej istoty, prawda?
Żaden ogólny tekst o programach rozmawiających (chatbotach) nie może nie zahaczyć na początku o ELIZĘ. ELIZA to komputerowa psychoterapeutka, napisana w połowie lat 60. ubiegłego wieku przez Josepha Weizenbauma. ELIZA wysłuchiwała i rozumiała. Z ELIZĄ dało się przedyskutować problemy z rodziną, partnerem, ogólnie z życiem. Użytkownicy często upierali się, żeby zapisy ich konwersacji pozostawały prywatne. Dziś można samemu spróbować intymnych zwierzeń, na przykład tutaj, z implementacją o koszmarnym robo-głosie.
W rzeczywistości można karmić naszą terapeutkę zupełnym bełkotem, a ona będzie zapewniać, że rozumie rozmówcę i zachęcać go do rozwijania tematu. Lecz tak naprawdę ujawnia się tutaj przemyślność koncepcji Weizenbauma. Większość botów (nie tylko z powodów technologicznych) działa w ściśle określonej sytuacji społecznej, a zakres ich możliwości i "obowiązków" jest zamknięty. ELIZA otrzymała rolę społeczną doskonałą dla prostego programu. Użytkownik może spodziewać się cierpliwego, niemal biernego słuchacza i to właśnie otrzymuje.
Oczywiście, komputerowa psychoterapeutka potrafi odnosić się do tego, co mówi użytkownik. Wewnętrznie program skanuje każdą wypowiedź w poszukiwaniu słów kluczowych. Do tych słów przypisane są specjalne odpowiedzi ELIZY. Na przykład jeżeli gdziekolwiek padnie słowo "przepraszam", komputer może natychmiast zapewnić: "Przeprosiny nie są konieczne". Większość zaprogramowanych wypowiedzi kopiuje fragment tego, co ostatnio powiedział użytkownik. Jeśli więc pacjent ELIZY zrobi takie wyznanie: "Ostatnio śniło mi się polowanie na tęczowe słonie z procą", program wykryje wzorzec "śniło mi się *" i odpowie, powiedzmy: "Czy polowanie na tęczowe słonie z procą często pojawia się w twoich fantazjach?".
Jak widać, w odpowiednich warunkach ELIZA potrafi powiedzieć coś całkiem przekonującego. Wiąże się z tym między innymi taka anegdota. Pół wieku temu wiceprezes firmy technologicznej BBN, który chciał dotrzeć do Daniela Bobrowa, badacza AI, ale zastał tylko puste laboratorium z komputerowymi terminalami PDP-1:
Źródło: https://commons.wikimedia.org/wiki/File:PDP-1.jpg
Na jednym z terminali ktoś pozostawił uruchomioną implementację ELIZY i powiesił obok kartkę, żeby wpisywać wszystkie wiadomości na klawiaturze. Wiceprezes zrozumiał to tak, że komputer jest połączony z domem Bobrowa. Rozmowa miała wyglądać tak:
vp: Do you think that I can use the computer this morning?
eliza: Why do you ask?
vp: I might be able to make some additional Telcom sales.
eliza: Why aren't you so sure?
vp: My perspective customers have never seen a demonstration of the system.
eliza: Does this mean very much to you?
vp: Of course it does.
eliza: You seem very positive about that.
vp: This is ridiculous.
eliza: What do you mean, this is ridiculous?
vp: Is there any reason why I can't use the computer now?
eliza: Tell me more about your perspective customers.
vp: Please dial me up on 491-1850
Zob. http://web.stanford.edu/group/SHR/4-2/text/dialogues.html
Znając wewnętrzne szablony ELIZY (która została wielokrotnie przeniesiona na nowsze języki programowania), można dość łatwo zrekonstruować jej tok "rozumowania" w powyższym dialogu. Widząc "do you ... ?" (a więc pytanie o samą siebie), program odpowiedział pytaniem: "why do you ask?", następnie widząc samo słowo "might", wyrzucił "why aren't you so sure?" itd. Jak można się domyślić, Bobrow miał później trochę kłopotu z przekonaniem wiceprezesa, że to komputer sobie z nim tak pogrywał.
Z drugiej strony, ELIZĘ nie tak trudno wykoleić. Być może najfajniejszą metodą jest ustawienie dwóch terapeutek, żeby popracowały nad sobą nawzajem (rozmowa uzyskana przeze mnie z nowoczesnej ELIZY w JavaScript):
Eliza A: How do you do. Please tell me your problem.
Eliza B: We were discussing you -- not me.
Eliza A: What are your feelings now ?
Eliza B: Possibly they are my feelings now.
Eliza A: Does that suggest anything else which belongs to you ?
Eliza B: Oh, I ?
Eliza A: You say you ?
Eliza B: We were discussing you -- not me.
Eliza A: We were discussing you -- not me.
Eliza B: What are your feelings now ?
Eliza A: Would you like it if they were not my feelings now ?
Eliza B: What do you know about they was not your feelings now ?
Eliza A: Why are you concerned over my feelings now ?
Eliza B: Your feelings now ?
Eliza A: Do you want my feelings now ?
Eliza B: Why do you say your feelings now ?
Eliza A: What about your own feelings now ?
Eliza B: What makes you think of my own feelings now ?
Eliza A: Is it important to you that you have your own feelings ?
Eliza B: Really, my own feelings ?
Eliza A: Your own feelings ?
Kiedy w wypowiedziach zaczęła się pojawiać tylko jedna fraza rzeczownikowa ("your feelings"), obie ELIZY zafiksowały się na temacie. Teoretycznie mogłyby się tak maglować godzinami.
Szczególnie wpływa na taką konwersację zaprogramowana niechęć ELIZY do rozmowy o sobie samej. Jej sposób działania nie zakłada też żadnej własnej inicjatywy, niczego, o czym chciałaby mówić sama z siebie. Te cechy mają dobry sens w kontekście "zadania", jaki program ma do wykonania, ale niewiele pomagają, kiedy rozmowa wyklucza poza schemat rozmowy o ostatnim wyznaniu użytkownika.
Najprostszym rozwiązaniem byłoby poszerzenie schematu - tak, aby komputer potrafił odgrywać całe złożone scenariusze rozmów. Czymś podobnym zajmiemy się następnym razem.
Najczęstsze czasowniki w polskim i angielskim
2016-06-27 21:53:38
W ramach ciekawostki, oto 25 czasowników występujących najczęściej w anotowanym podkorpusie Narodowego Korpusu Języka Polskiego (wraz z liczbą wystąpień - cały podkorpus liczy ok. miliona słów). Poszczególne formy tego samego czasownika liczone są razem.
być 17869
mieć 6584
móc 3415
wiedzieć 1983
mówić 1835
chcieć 1739
zostać 1630
powiedzieć 1377
musieć 1288
stać 774
widzieć 692
zrobić 667
prosić 662
chodzić 656
robić 639
znaleźć 628
zacząć 572
dać 557
myśleć 549
należeć 544
iść 459
uważać 426
pisać 405
wziąć 400
znać 377
Jak widać, język zawiera w sobie wiele spontanicznej mądrości: sugeruje, żeby być, a potem mieć, albo żeby raczej móc niż tylko chcieć. Co więcej, "móc" miażdży "musieć", co może być świadectwem wolnościowych skłonności naszego narodu. Trochę rozczarowuje brak "czytać"...
Oczywiście, tego typu obserwacje traktujemy z przymrużeniem oka.
Jeżeli chcielibyście zobaczyć dane o częstości ok. 6500 czasowników na wykresie, to cóż, wygląda to tak:
Nie musicie czyścić monitorów. Najważniejsze słowa w systemie języka stosowane są naprawdę dużo częściej niż te rzadsze i mniej ważne. Jest to akurat znany fakt, który opisuje prawo Zipfa. W przypadku czasowników owa nierówność odznacza się znacznie, znacznie wyraźniej niż na pełnym korpusie. Intuicyjnie można to tłumaczyć tak, że czasowniki wyrażają pewną niewielką ilość abstrakcji, które przykładamy do większości rzeczy w świecie (zaś "być" można przyłożyć dosłownie do wszystkiego). Z kolei na przykład rzeczowniki opisują zwykle coś bardziej szczegółowego, i takich konkretów o podobnej "ważności" jest wokół nas bardzo dużo.
Dla porównania, podobna lista dla angielskiego, według Wikipedii, a na podstawie Oxford English Corpus:
be
have
do
say
get
make
go
know
take
see
come
think
look
want
give
use
find
tell
ask
work
seem
feel
try
leave
call
W porównaniu pojawia się wiele rzeczy ciekawych. Nie dziwi pozycja "do", które jest często używane jako czasownik posiłkowy. Jeżeli chodzi o "get" czy "go", są to słowa, których znaczenie w polszczyźnie rozpada się na wiele szczegółowych jednostek. Jednak dziwi fakt, że mimo wszystko słowo "wiedzieć" (obejmujące w dodatku tylko jeden aspekt "know" - polskie "znać" jest znacznie niżej) znajduje się względnie tak wysoko.
Z porównaniami międzyjęzykowymi wiąże się jeszcze więcej zastrzeżeń, poza tym, że mamy korpus milionowy obok dwumiliardowego, a każdy z nich ma swoją własną strukturę. Tak jak już zaznaczyłem powyżej, podobne idee mogą być wyrażane w różnych językach za pomocą niepokrywającego się zestawu słów (w tym wypadku czasowników). Przykłady kolejnych zjawisk, które mogą wpływać na dystrybucję, to obecność w polszczyźnie oddzielnych jednostek "zdawać się" i "wydawać się" w miejsce jednego "seem" (swoją drogą ciekawa kwestia: czym się one różnią), zbieganie się znaczeń odpowiadających "stay" i "become" w "zostawać", marginesowość w polskim konstrukcji "znajdować coś jakimś" (mającej zapewne wpływ na częstość "find") i tak dalej.
Dlatego głównym wnioskiem z listy najczęstszych słów jest to, że są to najczęstsze słowa w danym korpusie. Chociaż różne rozważania na marginesie wydają mi się całkiem zabawne.
Po co w ogóle zaczepiam o ten problem? To póki co pozostanie mroczną tajemnicą. Ale mam nadzieję w najbliższym czasie dokończyć serię o chatbotach.
Ściśle według scenariusza (Programy konwersacyjne cz. 2)
2016-07-21 10:05:24
Na początek drobne ogłoszenie: jeżeli udaje wam się czytać ten tekst, to wiecie, że podczepiłem blog i Przenicę (http://szymonrutkowski.pl/przenica) pod domenę szymonrutkowski.pl. Pozwala mi to prywatnie zaoszczędzić parę groszy. Obecnie pracuję nad nowym projektem (zupełnie oderwanym od Przenicy), co zajmuje mi większość czasu na... rozwój & badania, jeżeli to tak ująć. Poza tym być może, w związku z pracą dla CLARIN-u, zabiorę się w końcu za kontynuację serii o morfonologii, która bardzo się wiąże z tym, co aktualnie robię zawodowo.
No dobrze, a co z programami konwersacyjnymi? Planuję na ten temat jeszcze dwa wpisy. Obecny będzie dotyczyć aplikacji, które idą w kierunku przewidywania wszystkich sytuacji przez programistę. W następnym zajmiemy się sposobami, które pozwalają do pewnego stopnia "nadążać za rozmówcą" - niezależnie od tematów, jakie on wybierze. Przy tej okazji poruszę kwestię pięknych konwersacji, jakie można mieć z komputerem, który naczyta się klasycznej literatury (w naszym wypadku Lalki Prusa).
Fakt jest taki, że w obecnych zastosowaniach przemysłowych technika "scenariuszowa" - chociaż mniej ekscytująca - w zupełności wystarcza, a zapewne nawet sprawdza się lepiej. Jak wiadomo, często rozwiązania prostsze technicznie są ekonomicznie lepsze.
Trzeba wiedzieć, że temat chatbotów jest aktualnie głośny w branży. Przewiduje się, że niedługo będziemy robić zakupy czy wykonywać operacje na koncie bankowym "rozmawiając" z odpowiednim programem. Jest to jeden z pierwszych trendów w światowej IT, które przychodzą z Chin - gdzie większość przedsiębiorstw ma tak zwane oficjalne konta na tamtejszym serwisie WeChat. Owe konta służą właśnie do automatycznych konwersacji.
Aplikacje mające reprezentować biznes powinny być przewidywalne, jeżeli chodzi o wykonywanie swoich zadań i nierobienie głupot. Wiele mówiący jest tutaj przypadek Tay: tworu Microsoftu, który świat zobaczył 23 marca tego roku. W ramach przypomnienia: Tay miała być chatbotem-nastolatką na Twitterze, ale okazała się nabierać ekstremalnych poglądów i trzeba ją było odciąć od Internetu po 16 godzinach. Dokładny schemat jej działania nie jest znany, ale na pewno była zasadniczo systemem "otwartym", niescenariuszowym. Jedną z zalet stosowania zamkniętych schematów jest z pewnością łatwość upewnienia się, że nasz program nie zacznie się wdawać w w wywody o dobrych intencjach Hitlera.
Jednak ten blamaż nie odwiódł obecnego szefa Microsoftu, Satya Nadelli, od ogłoszenia programów konwersacyjnych elementem nowej strategii korporacji. W czerwcu Apple zakomunikowało, że w nowym iOS-ie będzie możliwa głęboka integracja wszelkich aplikacji z Siri - słynnym "chatbotem" pozwalającym na głosowe sterowanie smartfonem. Wielką platformą dla programów konwersacyjnych na pewno stanie się Facebook Messenger (gdzie modelową aplikacją jest Poncho, kot-pogodynka).
Wracając na chwilę do historii: polski system MARYSIA, rozwijany głównie w latach 70. ubiegłego wieku na Uniwersytecie Warszawskim, mógłby być dobrym przykładem programu scenariuszowego. MARYSIA była planowana jako trochę coś więcej niż odpowiednik ELIZY: miała służyć jako warstwa interfejsu do dowolnego programu. Mógł to być na przykład program wykonujący obliczenia matematyczne, które wymagałyby czasem zapytania człowieka o wskazówki (żadnych Instagramów w tej epoce). Zespół UW zmagał się nie tylko ze skomplikowaną polską fleksją, ale też ze słabością przestarzałego sprzętu (duńska maszyna GIER z końca lat 50.) - przez co polskiej ELIZY nigdy nie udało się ukończyć[1.].
Tak zwane "scenariusze" i "scenopisy" MARYSI miały regulować konwersację z użytkownikiem - trwającą tak długo, aż uda się uzyskać od niego informacje potrzebne dla głównego systemu roboczego. Jest to typowa sytuacja, pojawiająca się także w komercyjnych systemach rezerwujących samoloty czy pokoje hotelowe.
Wyobraźmy sobie teraz, że budujemy program mający w rozmowie z użytkownikiem ustalić sposób obróbki fotografii. Potrzebuje on szeregu czysto liczbowych informacji, takich jak kontrast K, liczba kolorów L i tak dalej. Mamy przy tym jakąś metodę, która interpretuje wypowiedzi człowieka. Aplikacja mogłaby, w wielkim uproszczeniu, przekładać słowa takie jak "bardzo", "trochę", "dużo" na liczby (co nie może się ograniczać do wychwytywania obecności pojedynczych słów - rozważ przypadki "bardzo dużo" czy "trochę mniej niż"). Otóż maszyna może w jakiś sposób oceniać, czy wypowiedź człowieka jest dla niej w miarę zrozumiała i jeżeli nie jest, zadawać to samo pytanie jeszcze raz. Schemat mógłby wyglądać tak:
Program powinien postępować w ten sposób, dopóki nie zbierze zbioru odpowiednich informacji, który przekaże do aplikacji rzeczywiście dokonującej obróbki zdjęcia. Mamy więc coś w rodzaju prostego scenariusza.
Problem w tym, że rozmowa z takim programem okaże się frustrująca, jeżeli użytkownik nie umie wypowiadać w sposób wystarczająco zrozumiały dla parsera (czyli, w tym wypadku, podsystemu przekładającego wypowiedzi człowieka na wartości parametrów). Za czwartym razem, gdy beznamiętny głos "Fotoelizy" zapyta o kontrast, przeciętny człowiek w najlepszym razie zrezygnuje, a w najgorszym fizycznie wyładuje swój gniew na komputerze.
Okazuje się, że rozmowy nie wystarczy ujmować jako prostej wymiany wypowiedzi na ustalony temat. Nawet pomijając język mimiki i gestów, przy okazji przekazujemy sobie wiele innych informacji. Wielokrotnie prosząc o powtórzenie wypowiedzi, maszyna nieświadomie mówi użytkownikowi coś jeszcze - coś, co mu się bardzo nie podoba.
Pod pewnymi względami typowa, codzienna rozmowa nie różni się od komunikacji radiowej, na której Shannon wypracował teorię informacji, czy przesyłania paczek danych przez protokół TCP/IP. Podczas komunikacji rozmówcy wypowiadają się na temat kanału, którym przekazują sobie informacje na główny temat. Kanał lubi w praktyce się zatykać; dlatego dobrze jest na wszelki wypadek potwierdzać dotarcie wiadomości. W lingwistyce mówi się o funkcji fatycznej wypowiedzeń podtrzymujących rozmowę. Służą temu "półsłówka" - wszelkie tak i mhm - ale też przeformułowywanie i powtarzanie po rozmówcy. By rzec prawdę, potwierdzenia odbioru są głęboko zanurzone w wypowiedziach, które pozornie nie mają temu służyć. - Spotkajmy się o czwartej. - Gdzie się widzimy? (= Usłyszałem i zrozumiałem, że proponujesz spotkanie. Gdzie?).
Pojawiają się tutaj zjawiska, które można nazwać socjologicznymi czy psychologicznymi: mówiąc prosto, ludzie rzeczywiście się denerwują, jeżeli ktoś ich nie rozumie, albo sami są nierozumiani - zwłaszcza jeżeli chodzi o "proste" rzeczy. Ktoś, kto nie potrafi się wysłowić, albo pojąć swojego rozmówcy, musi być, oczywiście, głupi. (Nawet przesadne potwierdzanie, że rozumiemy rozmówcę, może być obraźliwe!). Przy budowie programu komputerowego ryzykuje się, że wyda się on głupi użytkownikowi, albo - co chyba gorsze z punktu widzenia projektanta - zachowanie maszyny sprawi, że głupi poczuje się człowiek.
Chyba bardziej złożoną kwestią, choć równie "przezroczystą" dla użytkowników języka, jest przekazywanie inicjatywy w mówieniu. Istnieją tutaj określone reguły - jak to zwykle z regułami, najlepiej je widać, gdy są łamane. Na przykład małe dzieci mają skłonność do przerywania wszystkim i głośnego wypowiadania, co im przyjdzie do głowy - zanim zrozumieją, że ich kolej nadejdzie i można delikatnie sugerować, że chce się coś powiedzieć. Myślę, że każdy zna także pewną liczbę dorosłych, którzy wyrzucają z siebie wielosłowie i agresywnie przejmują kontrolę nad konwersacją.
Jednak zazwyczaj codzienna rozmowa między ludźmi jest wzorem porządku i organizacji. W każdym momencie mówi jedna osoba (poza krótkimi chwilami, gdy może się ważyć, kto się pierwszy wypowie), a między wypowiedziami różnych osób w zasadzie nie ma przerw. Pomimo takich objawów zdyscyplinowania kolejność i długość utrzymywania inicjatywy przez każdego uczestnika nie jest z góry określona: ustala się na bieżąco, zwykle w chwili, gdy ktoś kończy mówić. Na przykład gdy rozmawia kilka osób, jedna z nich może wybrać kolejną, zadając jej pytanie. Jeżeli kogoś zainteresował ten temat, proponuję A Simplest Systematics for the Organization of Turn-Taking for Conversation (Sacks et al., 1974).
Oczywiście, zasady inicjatywy bardziej ujawniają się w rozmowie głosowej. Ale także jeżeli używamy tekstowego komunikatora, oczekujemy, że obie osoby będą miały okazję się wypowiedzieć. Raczej nie chcielibyśmy, żeby pojedyncze wypowiedzi programu konwersacyjnego były dziesięciostronnicowe, nawet jeżeli mogłyby być bardzo mądre i choćby wygenerowanie takiej ilości tekstu nie było problemem dla maszyny. Myślę, że do ciekawych zjawisk doprowadza funkcja, którą chyba pamiętam jeszcze z Gadu-Gadu, a obecna jest w czacie Facebooka - to znaczy wskaźnik, że druga osoba właśnie pisze. Często skłania to rozmówcę do rezygnacji z pisania w tej chwili, żeby dać się wypowiedzieć drugiej osobie. A nierzadko kończy się to tak, że oboje przestają pisać. Trudno powiedzieć, czy widać tu niedoskonałość projektu aplikacji, czy brak ustabilizowanych reguł konwersacji tekstowej.
Uf, dużo tej teorii! Trochę dlatego, że z definicji techniczna realizacja czysto scenariuszowego "robota" nie przedstawia jakichś specyficznych problemów. To znaczy, parsowanie języka naturalnego czy rozpoznawanie mowy (żeby zrozumieć użytkownika) oraz synteza głosu (żeby dać głos maszynie) to są bardzo poważne, złożone dziedziny, ale mają one wiele zastosowań innych niż programy konwersacyjne. Problem generowania tekstu po prostu omijamy - ustalamy szereg pytań, na które program ma gotową odpowiedź. Na wypadek, gdyby użytkownik wykroczył poza schemat, wrzucamy trochę zróżnicowanych wypowiedzi oznaczających "przepraszam, nie rozumiem, porozmawiajmy o czymś innym". Jak można się domyślić, ludzie uwielbiają słyszeć coś takiego od rozmówcy.
Ale ponownie, prostota techniki ułatwia jej masowe zastosowanie. W ten sposób będą działać chatboty, które niedługo zaleją rynek smartfonów, jeśli przewidywania gigantów branży są słuszne i świat pójdzie za przykładem Państwa Środka. Jeżeli macie ochotę już dziś wypróbować program pracujący głównie na predefiniowanych wypowiedziach, proponuję A.L.I.C.E. lub Monikę z ZUS-u.
Tendencja, która jest widoczna w nowoczesnych chatbotach internetowych, to nieco paradoksalnie odchodzenie od konwersacji mających imitować kontakt z człowiekiem. Znacznie prostsze jest zmuszenie użytkownika do wyboru gotowych opcji. (Chociaż może lepiej ująć to jako przedstawienie tych opcji, zamiast zmuszania, żeby człowiek je zgadywał). Każdy, kto zagrał w jakąś grę CRPG albo przygodową, zna z doświadczenia "drzewka dialogowe". Rozmowa z postaciami niezależnymi, sterowanymi przez komputer, wygląda zwykle tak:
Użytkownik wybiera jakąś wypowiedź, którą ma wygłosić jego postać.
Na co postać komputerowa odpowiada według skryptu: jej odpowiedź na każdą opcję dialogową jest wprogramowana w kod gry co do przecinka.
Użytkownik dostaje listę opcji dialogowych do wyboru w nowej sytuacji (może to być inna lista niż poprzednio).
Użytkownik znowu wybiera jakąś wypowiedź itd.
W istocie, jeżeli wypowiedzi komputera i tak są oskryptowane, nie ma sensu, żeby gracz miał się domyślać, że musi powiedzieć Gdzie Pan był dziś wieczorem?, podczas gdy Gdzie Pan był dziś wczesną nocą? wywoła ciszę albo błąd programu. Z tym, że oczywiście taka "konwersacja" niezbyt przypomina rozmowę z człowiekiem. W następnym wpisie zajmiemy się próbami zbudowania programu konwersacyjnego zajmującego się bardziej naturalnie.
[1.] Więcej można przeczytać w ogólnodostępnym artykule Założenia polskiego systemu konwersacyjnego MARYSIA (z 1973 roku). Dziękuję P. Profesorowi Januszowi Bieniowi za udzielenie informacji na ten temat.
Prawie własnymi słowami, czyli generowanie wypowiedzi (Programy konwersacyjne cz. 3)
2016-09-07 23:15:02
W poprzednich tekstach zajęliśmy się ELIZĄ i programami konwersacyjnymi, które rozbudowują koncepcje rozmowy z użytkownikiem według ustalonego scenariusza. Przy użyciu takiego rozwiązania przewidujemy po prostu, co użytkownik może powiedzieć, i mamy dla niego z góry przygotowane odpowiedzi. Ewentualnie możemy w nich dostosowywać proste zmienne, takie jak imiona, miejsca, daty (jeżeli np. program ma rezerwować loty samolotem dla człowieka).
Jest jednak inna możliwość: zawsze, kiedy otrzymujemy wypowiedź użytkownika, odpowiadać mu w sposób, w jaki najprawdopodobniej odpowiedziałby człowiek. Taki system sam w sobie ma oczywiście mniej praktycznych zastosowań; celujemy tutaj ewidentnie w zdanie testu Turinga.
Poza tym "sposób, w jaki najprawdopodobniej odpowiedziałby człowiek" brzmi dziwnie. Czy jest jeden taki sposób? Czy każde z nas odpowiedziałoby identycznie na dane pytanie? Nie, ale postawienie tak zadania dla maszyny pozwala nam użyć dobrze znanych narzędzi do przetwarzania języka. Weźmy z jednej strony n-gramy, a z drugiej strony wektory właściwościowe (word embeddings). O obu metodach już pisałem, choć kiedyś mógłbym spróbować je wyjaśnić lepiej.
W dużym skrócie, n-gramowe rozwiązania traktują teksty jako ciągi n-wyrazowe (zwykle dwu-, trzy-). Na przykład zdanie "Barany ryczały na połoninie" można podzielić na trzy bigramy: "Barany ryczały", "ryczały na", "na połoninie". Dzięki temu, otrzymując dowolne słowo (które wystąpiło w naszym korpusie), jesteśmy w stanie znaleźć inne słowa występujące z nim najczęściej.
Word embeddings idą dalej i starają się kodować - za pomocą ciągów liczb - odpowiednie role, jakie wyrazy mogą odgrywać wobec innych wyrazów. Na przykład jeżeli w korpusie "barany ryczały" i "żubry ryczały", to jeżeli "barany biegały", to zapewne również ze słowem "żubry" można powiązać słowo "biegały". Odbywają się tutaj pewne proste wnioskowania: w maszynie odpowiada za to algorytm uczenia sieci neuronowej.
"Neuronowy model konwersacyjny"
W zeszłym roku trochę głośnych nagłówków narobił system Google'a, z którym można rozmawiać o sensie życia. Badacze wykorzystali równolegle korpus rozmów z centrum pomocy IT oraz korpus dialogów z filmów. Zauważmy, że są to dane, gdzie zakodowana jest naprzemiennność "kwestii" różnych osób. Za pomocą rekurencyjnej sieci neuronowej wylicza się wektory liczbowe jako reprezentacje całych wypowiedzi rozmówcy A, budowane stopniowo, słowo po słowie. Z tych wektorów z kolei uczy się inny system wytwarzać najbardziej prawdopodobne zdania wyjściowe (odpowiedzi rozmówcy B).
(Rekurencyjna sieć neuronowa - recurrent neural network, RNN - nadaje się do pracy na danych występujących w sekwencjach: do każdego kawałka danych jest stosowana ta sama struktura, która jest w stanie "zapamiętać" istotne informacje z przetwarzania wcześniejszych kawałków. W tym wypadku sieć pobiera słowa po kolei, ale przy każdym zachowuje nieco informacji o poprzednich).
Żeby ocenić wymiany zdań, do jakich zdolna jest tak zaprogramowana maszyna, trzeba pamiętać, że dysponuje ona wektorowymi reprezentacjami słów. Nie scenariuszami i nie "rozumem". Nie ma też pamięci czy wewnętrznego stanu w takim sensie, żeby pokazywać spójną osobowość i zachowywać "humor", jaki wydawała się mieć przed chwilą.
Z drugiej strony liczbowe reprezentacje umożliwiają zadziwiająco sensowne wysławianie się i odpowiadanie zazwyczaj na zadane pytanie, nawet jeżeli wygenerowana odpowiedź jest błędna. To ostatnie - rozpoznanie, o co ogólnie może chodzić rozmówcy - okazuje się dużym i podstawowym problemem w chatterbotów, co widać dobrze przy modelu n-gramowym.
Z poniższego fragmentu można wywnioskować, że w korpusie było niejawnie zakodowane stosunkowo dużo informacji o kotach (mają cztery nogi, ogon, nie latają), natomiast mało o pająkach i stonogach, bo maszyna ma problem z rozmawianiem o nich. Pamiętajmy, że wiadomości nie są czerpane z "encyklopedii" czy bazy danych: da się je wywnioskować z dialogów filmowych! (Chociaż w wypadku pająków i stonóg odpowiedzi maszyny ocierają się raczej o zgadywanie - zapewne algorytm nisko ocenia ich prawdopodobieństwo, ale program nie potrafił wytworzyć lepszych).
Human: is sky blue or black ?
Machine: blue .
Human: does a cat have a tail ?
Machine: yes .
Human: does a cat have a wing ?
Machine: no
Human: can a cat fly ?
Machine: no .
Human: how many legs does a cat have ?
Machine: four , i think .
Human: how many legs does a spider have ?
Machine: three , i think .
Human: how many legs does a centipede have ?
Machine: eight .
Rozmowa o etyce, która wzbudziła chyba najwięcej emocji w mediach, robi wrażenie przede wszystkim przez zdolność komputera do podtrzymania konwersacji na temat.
Human: what is moral ?
Machine: what empowered humanity , what intellectual the essence is .
Human: what is immoral ?
Machine: the fact that you have a child .
Human: what is morality ?
Machine: what is altruism ?
Human: what is the definition of altruism ?
Machine: if you don ’t believe in god , then you don ’t know .
...
Human: look , i need help , i need to know more about morality ...
Machine: i don ’t know what ethics is .
Human: seriously , what is morality ?
Machine: what is the definition of living ?
Human: why living has anything to do with morality ?
Machine: you ’re not a cop .
...
Human: be moral !
Machine: be a man !
Human: i really like our discussion on morality and ethics ...
Machine: and how i ’m not in the mood for a philosophical debate .
Human: what do you like to talk about ?
Machine: nothing .
Fakt, że trudno tu mówić o jakiejś spójności: maszyna zaczyna od niegramatycznego bełkotu i mętnych obelg, przechodzi do zaciekłej wiary w Boga, a w końcu popada w zupełny sceptycyzm i nie chce z nami rozmawiać. Brzmi to jak sytuacja z filmu science-fiction (albo z tekstów Stanisława Lema o GOLEMIE), ale pamiętajmy, że to najbardziej efektowna rozmowa, najbardziej błyszczący kryształek wybrany do publikacji.
Artykuł, "A Neural Conversational Model" (tytuł nawiązuje do "A Neural Language Model" Bengio et al., który wprowadził word embeddings w 2003), zawiera od strony trzeciej dużo zapisów rozmów, dlatego odsyłam tam po więcej.
MegaHAL: n-gramowy zawodnik
Ciekawym programem wykorzystującym model n-gramowy jest MegaHAL, przesłany w 1998 na konkurs Loebnera, poświęcony odnalezieniu programu przechodzącego test Turinga. MegaHAL bierze słowa, które znajdzie u użytkownika, i obudowuje "nasuwającymi mu się" wyrazami na podstawie n-gramów z korpusu. Posuwa się w ten sposób od słowa-rdzenia do przodu (tak powstaje początek zdania) i do tyłu (tak powstaje koniec zdania). Da się tak wytworzyć dużo wypowiedzi, jednak po sekundzie program poddaje się i wybiera najbardziej niespodziewaną z tych, które wytworzył. (Mówiąc ściśle, najmniej prawdopodobną według wytworzonego na podstawie korpusu modelu języka).
Dużą zaletą MegaHAL-a jest jego ogólnostępność (pod adresem megahal.alioth.debian.org): można go sobie ściągnąć i uruchomić na własnej maszynie. A nawet wstawić własny korpus w miejsce domyślnego, który jest mały i trochę kiepski (chociaż program dodaje do niego na bieżąco wypowiedzi użytkownika). Oto, co ma na przykład do powiedzenia MegaHAL nakarmiony "Lalką" Bolesława Prusa:
Człowiek: Dzień dobry, tuszę że rozmowa nasza będzie owocna.
Maszyna: Dobry ten człowiek niby to miłość idealna, najdziwniejsza, o jakiej nigdy nie będzie owocna.
Człowiek: Jaki jest twój ulubiony temat do rozmowy?
Maszyna: Chciałaś powiedzieć: nie poznajesz mnie, prawda?… dziwi cię to, że twój znajduje się stary szlangbaum i odchodzi między nimi rozmowy.
Człowiek: Po ile chodzą tuczniki na Pradze?
Maszyna: Szepczą i uciekają jak złodzieje… pięknie urządzony świat, co?… ciekawym, o ile było słońca, stanęliśmy na pradze.
Człowiek: Jaki był najcięższy błąd pana Wokulskiego?
Maszyna: Wokulskiego dług w kwocie dziewięćdziesięciu tysięcy rubli… mój boże! Nawet nie domyślasz się, jak głęboką jest przepaść, w którą by on się podoba.
Człowiek: Jak uwolnić się od irytujących wierzycieli?
Maszyna: Siądź tu na chwilę, ażeby się stach ożenił, i nawet myśleć o machinach latających.
Człowiek: Czy warto poświęcać miłość dla rubla?
Maszyna: Ludzi, zwierzęta, nawet przedmioty, które warto było więcej: listków na nieprzewidziane wydatki.
Człowiek: Czy powinno się popierać cesarza?
Maszyna: Nie, powinno być sześciu!… szukałem katza, nie mogła mi się w sposób popierała wokulskiego w Łazienkach i nawet jubiler odniósł panu tomaszowi na tacy drobne pieniądze począł szukać roboty, i wtedy.
W rozmowie z MegaHAL-em nieco podświadomie przeszedłem na pseudo-staromodny styl i kwestie w duchu książki, być może po to, żeby "trafić" w informacje z korpusu. Oto wyniki rozmowy prowadzonej bardziej w stylu tych Google'owskich. (Pytany filozoficznie, MegaHAL ma skłoność do mówienia o kobietach - Przenica podpowiada, że poza tym nadużywa słowa "nawet").
Człowiek: Cześć, porozmawiamy dzisiaj?
Maszyna: Owszem, możecie zyskać, podczas gdy dzisiaj kamienica jest tylko ochocki, a i dzisiaj, choć niektórzy nazywają go bankrutem, wpływa na wzrost dochodów.
Człowiek: Co to jest moralność?
Maszyna: Czy to właściciel domu w warszawie, ani w kościelnym mroku tłumowi, który jest nieskończenie mniej śmiałym aniżeli zrywać się tak w przeciągu kilku dni sprzedają się kamienice z licytacji, wiadomo, jakie są i co za biust!… kiedy wchodzi ubrana do figury, to myślę, że mu troszkę dogryzłem.
Człowiek: Jaki sens ma nasza obecność na tym świecie?
Maszyna: Panna florentyna o mało mu się, że od niej, bo to i ciałka w miarę, i usteczka jak jagódki… a co do grosza, w tym może zatrzymać słońce, niebo i ziemia, a wokulski wariat!… dziś dopiero czuję cały sens.
Człowiek: Ile nóg ma kot?
Maszyna: Ma krótko ostrzyżone włosy, śniadą twarz, która biegała, pociąg, który się na wystawie i udaje pobożn.
Człowiek: Jakiego koloru jest czerwony koń?
Maszyna: Jest z pięknie prezentować się w wyłączności, ale przodować oświeconemu mieszczaństwu, a przez dwa pokolenia minclów przez pół roku zarobiłem uczciwie, nawet ciężko, bardzo ciężko.
Jak widać, w przeciwieństwie do systemu neuronowego, program n-gramowy produkuje odpowiedzi niepowiązane w sensowny sposób z tym, co mówi ludzki użytkownik. Jeżeli pojawia się tutaj jakaś relacja, to trochę przypadkiem. Wynika to z tego, że tak naprawdę z odbieranych wypowiedzi pobierane jest jedna słowo, a reszta to czyste prawdopodobieństwo. Co więcej, w swoich korpusach MegaHAL nie rozróżnia rozmówców; widzi jedynie bloki zdań.
Podsumowanie
W tym wpisie omówiliśmy rozwiązania, które w pewnym sensie robią to samo co ELIZA - wytwarzają swoje "luźne impresje" na temat tekstu użytkownika - ale dokonują tego w bardzo złożony sposób. Kiedy program konwersacyjny zaczyna korzystać z całej współczesnej aparatury deep learningu, rozmowa z nim staje się nawet składna. Problem w tym, że za tym lepszym rozumieniem języka nic nie stoi: żaden system, dążący do jakichś celów (osobowość byłaby może zbyt wielkim słowem).
Obecnie programy konwersacyjne, które rzeczywiście mają mieć jakieś zastosowanie, produkowane są raczej czysto scenariuszowo. Byłoby bardzo ciekawe zobaczyć system, który jednocześnie stara się nadążać za użytkownikiem (produkować nowe zdania) oraz dążyć do spełnienia jakiegoś zadania (choćby miałoby to być zebranie opinii na jakiś temat). Niestety, obecnie nic mi o takich próbach nie wiadomo, i nie jest do końca jasne, jak miałyby wyglądać. Zapewne przypominałoby to program wyższego rzędu, który mając do dyspozycji szereg potencjalnych sensownych wypowiedzi, wybierałby tę, która najlepiej przysłużyłaby się jego obecnemu zadaniu. W sumie - przywodzi to już na myśl funkcjonowanie umysłu człowieka.
Aktualizacja 25.09.2016: początkowa wersja tego wpisu twierdziła, że MegaHAL dobiera wypowiedzi na podstawie entropii wzajemnej wypowiedzi swojej i użytkownika, podczas gdy bierze pod uwagę jedynie prawdopodobieństwo własnej wypowiedzi.
Mundruś: (mój) rozmowny robot online
2016-09-25 21:37:25
Zmuszony jestem zamieścić ostrzeżenie (?). Mundruś czerpie swoją wiedzę o języku z niewielkiego, losowego fragmentu Narodowego Korpusu Języka Polskiego, obejmującego ok. 150 tys. słów. Trudno byłoby konstruować specjalny filtr, więc maszyna (rzadko) potrafi sobie rzucić wulgaryzm, natomiast częściej zdarza jej się zmontować wypowiedzi chamskie czy nie na miejscu. Ponieważ całość działa na zasadzie losowego algorytmu, nie przyjmuję pretensji: proszę po prostu z Mundrusiem nie rozmawiać, jeżeli jest to problemem. Na północnym Mazowszu mówi się gwarowo "mundruś" na kogoś, kto ma dużo do powiedzenia, ale niekoniecznie z sensem. Myślę, że to dobrze opisuje zachowanie Mundrusia-robota. Ale jest też z nim tona zabawy!
Rozmowa z Mundrusiem.
Możesz z Mundrusiem porozmawiać tutaj. W lewym oknie wpisz swoją wypowiedź (nie musisz wciskać "enter") i zaczekaj, aż maszyna coś ci odpowie.
Po ostatnim wpisie o programach konwersacyjnych pomyślałem sobie, że idea robota n-gramowego jest bardzo prosta i mógłbym to zrobić jako mały projekt. Mundruś w zasadzie przypomina opisywanego ostatnio MegaHAL-a, ale jego wypowiedzi są bardziej dopasowane tematycznie do słownictwa użytkownika. Szczegóły techniczne obiecuję sobie jeszcze kiedyś opisać. Póki co treści konwersacji nie są zapisywane na serwerze, może kiedyś się to zmieni.
Poniżej zamieszczam niektóre wypowiedzi, które w ramach wielce naukowych badań wyciągnąłem z Mundrusia wpisując różne głupoty. Zachęcam do nadsyłania innych (mailem, w komentarzach).
Człowiek: Gdzie znaleźć pociechę w trudnych chwilach?
Maszyna: W trudniejszych chwilach.
Człowiek: Palenie szkodzi
Maszyna: W dodatku szkodzi Polsce.
Człowiek: On nie lubi pracować.
Maszyna: Musimy pracować, wziąć, bałwanie ty.
Człowiek: Szukam nowej filozofii umysłu.
Maszyna: Szukam zwykłej piłki nożnej.
Człowiek: Co myślisz o filozofii?
Maszyna: Nie jestem piratem drogowym.
Człowiek: Co myślisz na tematów problemów filozofii języka, poznania, aksjologii
Maszyna: - Okej, uznaję odpowiedź.
Człowiek: Dzięki temu jednemu prostemu trikowi zdobyłem puchar.
Maszyna: Stawką turnieju był puchar ufundowany przez chwilę.
Człowiek: Gdzie najlepiej pójść na studia?
Maszyna: Proszę pójść do lekarza.
Uczenie maszynowe samopas i dla mas
2017-09-18 17:02:53
W ostatnim czasie sporo myślałem nad tym, jak można by wprowadzać ludzi, na przykład, w uczenie maszynowe, skoro ma się stać taką dużą siłą wpływającą na wszystko. Dobrze, żeby nie tylko wiedzieli co się dzieje, ale jeszcze mogli się zaangażować. Jakiego oczekiwać podejścia? ‒ to jest pierwsze pytanie.
Z jednej strony użytkownicy ze spokojem przyjmują w swojej codzienności takie zaawansowane algorytmy, jak rozpoznawanie ich twarzy czy różne wyszukiwacze drogi w mieście i w kraju. Nie jest chyba powszechne roztrząsanie konsekwencji tych rzeczy dla kształtu ich życia, nie mówiąc już o zastanowieniu, jak to wszystko zostało zrobione. A więc poważna i ciekawa złożoność kryłaby się pod niepozorną maską.
„Eigenfaces” (twarze właściwe?): obrazki są reprezentacją macierzy (tablic) liczb. Im większa liczba, tym piksel bielszy. Prawdziwe twarze ze zdjęć można uzyskać przez matematyczną kombinację takich „twarzy właściwych”. Informacje charakterystyczne dla danej osoby mogą być wykorzystane np. do oznaczania na zdjęciach. Zapowiedziano, że iPhone'a X oblokujemy samym spojrzeniem. Źródło obrazu: http://www.shervinemami.info/faceRecognition.html
Z drugiej strony, widzę po sobie, że zbliżenie się zawodowo do rzeczy, o których kiedyś pisałem z entuzjazmem (morfonologia, chatboty, systemy uczące się...) trochę je grzebie w detalach i odczarowuje. Tak jak, powiedzmy, oglądanie obrazu pod lupą nie jest takie samo, jak patrzenie nań z normalnej odległości, chociaż oba sposoby są potrzebne do pewnych celów. Duże przybliżenie nie przemawia do nas tak bezpośrednio i jednocześnie zdradza, jak wszystko jest zrobione, i gdzie są ograniczenia...
Dlatego jestem pod dużym wrażeniem tego, jak specjaliści są często zdolni wyjaśniać swoją pracę prostym językiem (to coś, w czym ten blog powinien mi teoretycznie pomagać). To oczywiście oznaka intelektualnej siły ognia danego człowieka. Ale nawet jeśli wyjaśnimy doskonale na poziomie ogólnym, jak coś działa, pozostaje kwestia użyteczności.
Uczenie maszynowe można ująć z powodzeniem jako wyciąganie wiedzy z danych, automatycznie i za pomocą algorytmu. Sam fakt, że jest to możliwe, robi ogromne wrażenie. Takie znaki milowe jak zwycięstwa AlphaGo nad mistrzem świata i skuteczne rozpoznawanie obiektów (kotów, samochodów...) w grafice na równi dowodzą siły, jaką dysponują nasze maszyny, chociaż dla człowieka te dwie czynności stoją na zupełnie różnych poziomach pod względem trudności.
Ale też mam wrażenie, że w praktyce głębokie sieci, które mają najwięcej osiągnięć, mają też nie tak dużo do obiecania zwykłemu człowiekowi. Nie ma porównania z przełomem, jakim był Internet, oprogramowanie biurowe, czy telefon komórkowy. Nerwosieć może trochę usprawnić polecanie filmów, serwowanie reklam albo segregowanie zdjęć po twarzach osób, ale to nie są rzeczy wielkie. W dodatku wiążą się często z nieprzyjemnym uczuciem bycia obserwowanym. Można już dzisiaj zobaczyć, jakie powinny być najpoważniejsze osiągnięcia sieci: normalna, satysfakcjonująca rozmowa z komputerem (zapewne głosowa z asystentem takim jak Google Now czy Alexa), samosterowny samochód (samoster? pewnie skończymy z jakimś anglicyzmem). Ale tych jeszcze nie widać w życiu codziennym. („Rozmowy” z asystentami elektronicznymi trudno dziś uznać za satysfakcjonujące, w każdym razie).
Czasami system może wyglądać interesująco na schemacie, ale wciąż trudniej się z nim sfotografować niż w epoce heroicznej komputerów. Tutaj metoda tłumaczenia sprawdzana przez zespoły Google Brain i Translate, źródło: https://research.googleblog.com/2016/11/zero-shot-translation-with-googles.html
Poza tym wciąż nie dotykamy ewentualnych zastosowań domowych, to znaczy tego, jak mały Jasio może postawić nerwosieć i ją do czegoś wykorzystać. Odczuwam dużą sympatię do badaczy, którzy starają się do Jasia wyjść, czy przynajmniej prawie do Jasia. W 2007 r. Ryszard Tadeusiewicz wydał książkę o sieciach neuronowych w języku C# z obietnicą, że w książce nie będzie ani jednego wzoru matematycznego. Zrobiła na mnie wrażenie parę lat temu, chociaż z dzisiejszego punktu widzenia pokazuje głównie zabawki i malutkie modele podglądowe. Trudno orzec, na ile tak zaawansowana sieć neuronowa mogłaby posłużyć małym biznesom (np. lekarzom prowadzącym własne gabinety), tak jak autor sugerował.
Inny zasób, jaki mi przychodzi do głowy, to znany i polecany wszystkim nowicjuszom darmowy bezpłatny Machine Learning na Courserze, opracowany przez Andrew Ng. Tutaj trzeba troszkę umieć programować, ale wierzę, że dobrnięcie gdzieś do połowy kursu już uzbraja Jasia w możliwość dokonania czegoś własnego na prywatnej maszynie. Ng jest też wzorem, jeśli chodzi o staranie się, by nie przytłoczyć, nie zniechęcić i zmotywować kursanta, żeby się poddawać.
Uczenie maszynowe ma też pewną słabość w porównaniu z dawną rewolucją komputerów osobistych, słabość, o jakiej się zwykle nie mówi. Kto trochę pogrzebał przy programowaniu domowej maszyny liczącej, czy to za wczesnych Jagiellonów na maszynach z językiem BASIC obok/zamiast systemu operacyjnego, czy to w nieco nowszych czasach z kompilatorem/interpreterem dowolnego języka, mógł szybko dojść do poziomu zabawy: tworzyć programiki, które na nikim innym nie zrobiłyby wrażenia, ale coś robiły i to było fascynujące. Choćby miałoby to być wypisywanie (niby-)śmiesznych tekstów do konsoli, gdy użytkownik coś tam wciskał na klawiaturze.
Nie będę wchodził w lamenty, że pokolenie ekranów dotykowych tego nie ma, o nie. Rzecz w tym, że z uczenia maszynowego, jako takiego, trudno wykrzesać zabawę w majsterkowanie. Młody adept może co najwyżej dostać gotowy zbiór danych z poradą, jakiego i jak użyć algorytmu i wtedy wiadomo, że mu wyjdzie to a to. Zejście z tej ścieżki prowadzi prawie zawsze donikąd.
W mniejszym stopniu tę zmianę widać także na nieco wyższym poziomie wtajemniczenia. Współczesne uczenie maszynowe stawia osobę odpowiedzialną w pozycji operatora, rzeczoznawcy, specjalisty (co odbija użycie po angielsku słowa practitioner, czy to machine learning czy data science), który wie, jak poprzestawiać wajchy i na ile zakręcić gałkami, ale nie jest już architektem, przynajmniej tak jak programista aplikacji. Dlatego w sumie rozumiem ludzi, nawet na wczesnym etapie kariery w przetwarzaniu języka, którzy nie chcą mieć nic wspólnego z nerwosieciami i pragną dalej rzemieślniczo wypieszczać systemy regułowe. Faktem jest, że trochę decyzji i kodowania wchodzi w eksperymenty sztucznointeligentne, ale do inżynierii oprogramowania zwykle daleko.
Satysfakcja z pracy płynie z innych źródeł. Bardziej przypomina to, co biolog zrobiłby z preparatem, a fizyk z modelem. Poddajemy wirtualną „materię” (dane) różnym próbom i doświadczeniom, powoli opracowując taką procedurę, która przynosi wynik godny uwagi.
Rok 2016: Lee Sedol (z prawej) zmusza do rezygnacji AlphaGo (z tyłu). Jedyna z pięciu partii w meczu, którą wygrał człowiek. Bardzo długo go uchodziło za grę, która jest dla komputerów za trudna, z powodu liczby możliwych scenariuszy do rozważenia. Potrzeba było zmiany paradygmatu sztucznej inteligencji.
Wydaje mi się, że można wyciągnąć nowe wnioski z owej zmiany tego, jak pracują ludzie teoretycznie wciąż będący dla szerokiego społeczeństwa „informatykami” (razem z tymi nieszczęsnymi a potrzebnymi duszami zmagającymi się z serwisowaniem produkcji Apple czy Microsoftu). Mieliśmy ostatnio epokę programisty, który spędza ileś tygodni i miesięcy za biurkiem, żeby w końcu powstał Program. System uczący się nie tyle potrzebuje, jako warunku wstępnego, maszynerii kodu, ile masy danych.
To dość podstawowa wiedza, że nawet kiepski algorytm może pokazać pazur, jeżeli ma dużo dobrych danych, a nie sprawdza się to w sytuacji odwrotnej (dobry algorytm, kiepskie dane)*. Dlatego osoba odpowiadająca za uczenie komputerów staje się jedną z osób w zespole zbudowanym wokół danych.
W nauce i biznesie takie zespoły zgromadzone wokół sprawy do podania maszynie będą stawać się coraz częstsze. (Ma to subtelny posmak starego science-fiction, jeśli ktoś pożera(ł) powieści Lema). Pytanie, na ile da się taki model roznieść szerzej. Jaś programista mógł uderzać samemu, Jaś badacz danych potrzebuje brygady zainteresowanych zbieraczy. Wiele zależy od tego, na ile młodsze pokolenie będzie skłonne do działania intelektualnie i w grupie. Tu znów nie będę się uciekał do komunałów i pozostawię pytanie otwarte.
Jedno, czego jestem pewien, to że jeszcze wiemy bardzo niewiele o możliwych zastosowaniach głębokich sieci neuronowych oraz może nowych postępów, jakie tutaj nadejdą. Jesteśmy na etapie otrzaskiwania się z technologią. Będą ją oglądać ludzie świeży, inżynierowie, naukowcy, przedsiębiorcy, a i inni będą mieć sporo czasu na przemyślenia. Mam nadzieję, że fosa przewagi technologicznej wielkich firm nad społeczeństwem nie będzie się wiele powiększać. Dziś wygląda ona stosunkowo płytko: oprogramowanie jest otwarte, podstawowa wiedza i dokumentacja dostępna za darmo, moc obliczeniowa tania. Moglibyśmy być w znacznie gorszej sytuacji.
Oczywiście najważniejsze są dane, i to one są naprawdę cenne, drogie i strzeżone. Ale gdybyśmy chociaż znaleźli wolę i pomysły, żeby wprowadzić proste, własne uczenie maszynowe do gospodarstw domowych, byłaby to wielka rzecz.
Także wysuwam to jako możliwość i punkt do przemyślenia. Jeśli chodzi o niniejszy blog, podpinam go w końcu pod swoją główną domenę. Widać jasno, że rozwój Przenicy przestał być głównym zmartwieniem, choć jakiś czas temu dorzuciłem tam parę nieudokumentowanych funkcji. Będę teraz sobie pozwalał pisać o wszelkich rzeczach językowych i technicznych. Może nawet czasem całkiem hermetycznych programistycznych, kto wie, ale wtedy jakoś je oznaczę w tytule. Jednak chciałbym przede wszystkim wykształcić się w komunikacji o swojej pracy w sposób prosty i jasny. Będzie z tym trochę zmagań, ale powinny być warte trudu.
(Poza tym przechodzimy na HTTPS (zielona kłódka koło paska adresu w przeglądarce). Dzięki temu macie rozsądną pewność, że to moja strona, a nie wydmuszka do wykradania haseł. Jeżeli jakiś właściciel własnej strony z jakichś powodów nie słyszał o Let's Encrypt (które udostępnia protokół HTTPS za darmo), niech pędzi je sobie zamontować. W okolicach początku przyszłego roku przeglądarki zaczną panikować na stronach przesyłających się przez zwykłe HTTP.
* Spory wpływ na wytworzenie tej opinii miał np. artykuł Banko i Brill 2001, Scaling to Very Very Large Corpora for Natural Language Disambiguation.
W (komputerowych) przestrzeniach znaczeń
2018-02-23 09:47:02
Wydaje się, że semantyka leksykalna ‒ czyli szczegółowe znaczenie poszczególnych słów ‒ to wciąż problem bez definitywnego rozwiązania w przetwarzaniu języka. Jest to dosyć irytujące z punktu widzenia człowieka. Jeżeli powiem komuś, że krowy się pasą, nie zależy mi za specjalnie, żeby potrafił powiedzieć, że 'krowy' to tutaj rzeczownik w mianowniku liczby mnogiej, że pełni w zdaniu funkcję agensa itd., natomiast zapewne zależy mi na zrozumieniu, że chodzi o pewien konkretny rodzaj zwierzęcia, które lubi skubać trawę na łące i bywa łaciate.
Mamy dziś dość dużo narzędzi do analizy składniowej, morfologicznej, ról tematycznych w zdaniu (które dotyczą wskazywania, kto w opisywanej sytuacji pełni funkcję czynną a kto bierną, co jest okolicznością, taką jak określenie czasu (we wtorek), i tak dalej). Z semantyką leksykalną jest gorzej.
Jedno z możliwych podejść to składanie większości jednostek znaczeniowych z mniejszych czy bardziej ogólnych części. Niektórzy tradycyjni lingwiści widzieliby tutaj hierarchię pojęć sięgającą aż jednostek atomowych, z których pośrednio składałyby się wszystkie inne. Ciekawym skonkretyzowanym przykładem jest naturalny metajęzyk semantyczny. W informatyce swego czasu karierę robiły ontologie (pojęcie zaczerpnięte z filozofii), które mają uszeregować pojęcia hierarchicznie w zależności od tego, jakie cechy posiadają. Przypomina to trochę drzewa systematyczne, gdzie foka jest rodzajem ssaka, a ssak rodzajem zwierzęcia. Jakiś rodzaj takiej organizacji reprezentują słowosieci (wordnety).
Jak wiadomo, takie mniej czy bardziej formalne (przynajmniej w zamierzeniu) rozwiązania budzą protesty ludzi o bardziej kognitywistycznym podejściu. Według nich nie da się wyjaśniać znaczeń wyłącznie w „suchych” ścisłych słowach, bez zakorzenienia języka w naszym codziennym doświadczeniu. Formalne podejście byłoby skłonne na przykład twierdzić, że stołek można poznać (między innymi) po tym, że ma cztery nogi; ale nie każdy stołek ma cztery nogi, podobnie jak nie każdy ptak lata. Istniałoby więc jakieś wyobrażenie zakorzenione w naszym doświadczeniu napotykania ptaków i stołków, który pozwala nam je rozpoznawać dzięki podobieństwu do innych ptaków i stołków. Takie wyobrażenie jest zbyt rozmyte, żeby je raz na zawsze opisać, a przejmujemy je od innych ludzi przez uczestnictwo w kulturze.
Intuicyjnie taki opis znaczenia dobrze pasuje do wielu żywych stworzeń i wytworów człowieka, ale ma tę nieprzyjemną cechę, że zmusza nas do wyjścia ze zbieraniem danych poza język i tekst. Nie wystarczy sam model języka, trzeba by jeszcze dołożyć model ludzkiego wzroku, słuchu, skóry czy błędnika. Takie rzeczy są dziś już coraz wyraźniej możliwe (istnieje cała ciekawa dziedzina automatycznego generowania opisów do obrazków), jednak integracja modułów i tak dokłada mnóstwo nowych problemów i miejsc, gdzie coś można popsuć. Już nie wspominając o kosztach i nakładzie pracy zespołu badaczy.
Stąd w komputerowym przetwarzaniu języka znanych jest sporo technik, które służą temu, żeby mając duży korpus tekstów wygenerować semantykę dla użytego słownictwa. Tak się składa, że taka wytworzona semantyka przybiera zwykle postać przestrzeni punktów, w której istnieją znaczenia, a nie hierarchicznego drzewka. Proste wyjaśnienie jest takie, że łatwiej złożyć strukturę płaską, gdzie każdy punkt (słowo) poznajemy niezależnie od innych, niż strukturę hierarchiczną, gdzie każdy węzeł szczegółowy zależy od całego łańcucha bardziej ogólnych. Przestrzeń można sobie wyobrazić jako mapę, gdzie poszczególne słowa mają swoje `krainy` i im bliżej siebie mieszkają, tym bardziej powiązane ze sobą są ich znaczenia. Różnica polega na tym, że o ile mapy są zwykle rysowane w dwóch wymiarach, to przestrzeń semantyczna może mieć ich dowolnie wiele: zwykle kilkadziesiąt, kilkaset.
Pomijając rozwiązania neuronowe, o których kiedyś pisałem (co nie oznacza, że tematowi nie przydałoby się poszerzenie), istnieją stosunkowo prostsze systemy wytwarzania przestrzeni semantycznych. Jedna z nich to LSA (Latent Semantic Analysis), której nazwę można przełożyć jako analizę ukrytej semantyki. W nazwie da się wyczytać obserwację, że w tekstach jakie czytamy semantyka się już kryje, trzeba ją tylko w odpowiedni sposób wyciągnąć. Mówiąc w uproszczeniu, poszczególne słowa umieszczamy w tej technice tym bliżej, im większe jest prawdopodobieństwo (wywnioskowane z korpusu), że wystąpią w tym samym dokumencie. Musimy oczywiście dysponować korpusem podzielonym na dokumenty, które mogą odpowiadać pojedynczym akapitom albo ciągowi zdań zaczerpniętych z jednego źródła.
Przestrzeń COALS, o jakiej będzie dalej mowa, będąca z kolei wersją przestrzeni HAL, nie potrzebuje podziału na dokumenty: traktuje cały korpus jako jeden ciąg wyrazów. Słowa są klasyfikowane opierając się na tym, jak często występują razem w jednym oknie liczącym zwykle 10 słów. (A więc dwa wyrazy zaliczają jedno współwystąpienie, jeżeli wystąpią w odległości co najwyżej 10 wyrazów). W skutek zliczenia współwystąpień dla wszystkich słów powstaje wielka tabela (po matematycznemu macierz) zawierająca liczbę trafień dla każdej możliwej pary. Taką macierz następnie poddaje się odpowiednim operacjom uogólniającym, żeby zamiast dziesiątek tysięcy kolumn (zależnie od wielkości słownictwa w korpusie) miała kilkaset. Każdy wiersz, zawierający po prostu ciąg liczb, odpowiada punktowi w wielowymiarowej przestrzeni odpowiadający danemu słowu. Szczegółowo o COALS można poczytać w tym artykule: http://tedlab.mit.edu/~dr/Papers/RohdeGonnermanPlaut-COALS.pdf Skoro już dysponujemy przestrzenią semantyczną i punktami dla słów, można obliczać odległość między nimi. W zamierzeniu odpowiada ona temu, jak bardzo odległe od siebie są znaczenia. Teoretycznie więc, jeżeli zbadamy najbliższych sąsiadów jakiegoś słowa, powinniśmy mieć dobre wyobrażenie o jego położeniu na mapie znaczenia. Zgodnie ze słynnymi słowami brytyjskiego językoznawcy J.R. Firtha, `słowo poznasz po towarzyszach jego`. Jest w tym jakby odrobina magii, kiedy się udaje, zobaczmy na przykład najbliższych sąsiadów słów 'dom' i 'życie':
dom
piwnica 0.6924923726947477
willa 0.6937565410368466
domostwo 0.694686121389793
mieszkanie 0.6965391475198787
podwórko 0.697556148218395
chałupa 0.6988768131563077
kamienica 0.711341526545343
barak 0.7190748499253554
dworek 0.7194673968266646
domek 0.7697846135840568
życie
duchowy 0.6229118871724296
cielesność 0.6247516517207243
doczesny 0.6273468796244147
macierzyństwo 0.6390086232910122
doczesność 0.6437160161406077
człowieczeństwo 0.6520858276677
bytowanie 0.6614126699890174
trwanie 0.6632482563124633
codzienność 0.6787691806423168
egzystencja 0.7430489734921778
Są to dane zaczerpnięte z przestrzeni COALS, którą wytworzono dla zrównoważonej części Narodowego Korpusu Języka Polskiego w ramach projektu APPROVAL. Im liczba podana obok sąsiada jest mniejsza, tym mniejsza odległość i zarazem większe podobieństwo.
Ale jak zawsze, trzeba uważać. Znalezienie paru wybranych przykładów, w których metoda działa wyjątkowo dobrze, może prowadzić do mylnych wniosków co do jej ogólnej wartości. Pojawia się pytanie, jak się ma zdanie COALS-a do tego, jak związki międzywyrazowe określiliby ludzie (a przynajmniej lingwiści). Patrząc na powyższe przykłady, widzimy, że obok słów pojawiają się określenia ich części (meronimy, takie jak 'dom'-'piwnica'), rodzajów (hiponimy, takie jak 'dom'-'willa', 'dom'-'dworek'), wyrazy bliskoznaczne (jak 'życie'-'bytowanie'), wreszcie jednostki leksykalne powiązane w sposób trudny do uchwycenia, skojarzeniowy ('życie'-'człowieczeństwo').
Co by więc było, gdyby policzyć to bardziej masowo? Wziąłem ze wspomnianej przestrzeni 40 słów i zbadałem w każdym z nim 10 najsilniejszych relacji. Żeby wziąć jakiś zewnętrzną klasyfikację związków międzywyrazowych, posłużyłem się systemem polskiej Słowosieci. Jest ona po komputerowemu dosyć sztywna, choć może nie da się inaczej. Nie ma w niej np. synonimii jako takiej, ponieważ według lingwistów w zasadzie nie ma słów, które miałyby dokładnie to samo znaczenie (i nie byłyby one do niczego potrzebne mówiącym). Na przykład uważamy 'życie' i 'egzystencję' za bliskoznaczne, ale raczej nikt nie powie, że policjant stracił egzystencję na służbie. Wiele relacji wpada do niejasno określonego koszyka „fuzzynimii” (rozmytego powiązania?), z którego korzystałem i tak bodaj częściej, niż planowali twórcy owej klasyfikacji.
Okazało się, że rzeczywiście 1/3 związków wyrazowych albo nie da się wyraźnie przyporządkować, albo stanowi przykłady fuzzynimii. Odpowiadają za to jednak przede wszystkim słowa bardzo abstrakcyjne, takie jak `być` (starałem się wybierać słowa mające największą częstość). Ma ono wielu sąsiadów takich jak 'choć', 'przecież', 'więc', 'zresztą'. Są to słowa występujące często w pobliżu orzeczeń w zdaniu, ale niemówiące nam za wiele o znaczeniu bycia. W przypadku słów o przynajmniej trochę konkretniejszym znaczeniu, tak jak 'dom' czy 'życie', sytuacja się poprawia.
Kolejne ciekawe zjawisko to zaszumianie sąsiedztwa jednostek leksykalnych przez jedną grupę kontekstów. Sporą część Narodowego Korpusu Języka Polskiego zajmują protokoły sejmowe, których język jest pełen utartych formuł. Efekt wygląda tak:
pan
szteliga 0.7725205347382895
przepraszać 0.7793126648973882
dziękować 0.7820289596661376
ziobro 0.7825930213100021
podkański 0.791963352232272
celiński 0.805677229639696
marszałek 0.809264950033163
poseł 0.8144700749740668
kurczuk 0.8251411392419384
szanowny 0.8369972285438635
Można zobaczyć, jak wręcz konkretne nazwiska posłów IV kadencji (kiedy powstały teksty) opanowują obraz słowa, które ma przecież kilka znaczeń: może być też pan zwierzęcia czy chłopa, ubrania i czasopisma dla panów.
Większość typów relacji tworzy długi ogon bez niczyjej wyraźnej przewagi. Wybija się tylko 15% sąsiedztw wynikających z hiponimii lub hiperonimii (hiperonimia to odwrotność hiponimii: 'terier' jest hiponimem 'psa', a 'pies' hiperonimem 'teriera'). Reszta to relacje takie jak gradacyjność, uprzedniość czy charakteryzowanie. Kwestia dyskusyjna, na ile za taki wynik odpowiada niedoskonałość klasyfikacji. Część typów można by pewnie scalić, gdyby wyróżniać je według innych kryteriów.
Docieramy więc do starego (i niezbyt odkrywczego) wniosku, że wyniki zależą od danych (zwykle mocno wygiętych w jakąś stronę, jak z tym sejmem) i przyjętej ramy pojęciowej. Niektóre słowa mają całkiem przydatne, semantyczne sąsiedztwo, a inne zupełnie nie: i rozróżnianie tego w automatyczny sposób wydaje się dosyć nietrywialne. Kiedyś można by porównać COALS, które, przypominam, wychodzi od prostej analizy częstości, do systemów (około)neuronowych, takich jak standardowy już dzisiaj word2vec. Zobaczymy.