• Nie Znaleziono Wyników

1.5. Indukcja gramatyk bezkontekstowych

1.5.7. Algorytm CYK

Indukcja gramatyki bezkontekstowej, niezależnie od przyjętego modelu uczenia, a w ramach modelu zastosowanej metody inferencji, wymusza odpowiedź na tzw. pytanie o przynależność (membership query): dla danej gramatyki bezkontekstowej

G = (N, T, P, S) i łańcucha xT*, czy xL(G)? W literaturze znanych jest kilka algorytmów udzielających odpowiedzi na powyższe pytanie, złożoność obliczeniowa najszybszych46 jest proporcjonalna do sześcianu długości łańcucha x (Hopcroft i Ullman 1979). Najbardziej znanymi metodami testowania należenia łańcucha do gramatyki CFG

46 Teoretycznie najszybszym asymptotycznie algorytmem parsowania bezkontekstowego jest algo-rytm Valianta (1975), który redukuje zadanie parsowania do problemu mnożenia macierzy. Najlepszy znany obecnie algorytm mnożenia macierzy wymaga Θ(n2,376)kroków, jednak praktyczne stosowanie metody Valianta nie jest już tak efektywne (Lee 2002).

są algorytm CYK (Kasami 1965, Younger 1967) oraz algorytm Earleya (Earley 1970). Złożoność obliczeniowa obydwu algorytmów jest Θ(gn3), gdzie g jest rozmiarem CFG, a n długością łańcuchów (Graham i in. 1980).

Algorytm Cocke’a–Yongera–Kasamiego, znany jako algorytm CYK47, opiera się na metodzie programowania dynamicznego i wymaga podania gramatyki bezkontek-stowej w postaci normalnej Chomsky’ego48. Działanie algorytmu polega na spraw-dzaniu, czy dla dowolnego symbolu nieterminalnego A istnieje wyprowadzenie

, *

ij

x

A⎯⎯→ gdzie xij jest podłańcuchem o długości j, rozpoczynającym się od i-tej pozycji łańcucha x. Jeżeli takie wyprowadzenie istnieje, to algorytm zapamiętuje, że z danego symbolu nieterminalnego można wyprowadzić określony podłańcuch. Sto-sując indukcję po j, czyli rozpatrując coraz dłuższe podłańcuchy, zastępujemy w każ-dym kroku prawe strony wyprowadzeń symbolami ze strony lewej. Po osiągnięciu

j = n możemy rozstrzygnąć, czy * 1 . j

x

S⎯⎯→ Ponieważ x1n = zatem x, xL(G) wte-dy i tylko wtewte-dy, gwte-dy * 1 .

n

x S⎯⎯→

Poniżej przedstawiono formalny zapis algorytmu CYK, posługując się notacją za-czerpniętą z pracy (Hopcroft i Ullman 1979). Symbol Vij oznacza zbiór symboli nie-terminalnych A, dla których * :

ij x A⎯⎯→ procedure CYK begin for i := 1 to n do

Vi1 := {A | A → a jest produkcją, a jest i-tym symbolem łańcucha x};

for j := 2 to n do for i := 1 to n – j + 1 do begin Vij := 0; for k := 1 to j – 1 do Vij := Vij{A | A → BC jest produkcją, BViki CVi+k,jk} end end.

Algorytm CYK zapisuje wyniki swego działania w trójkątnej tablicy o wymiarach

n × n, gdzie n jest długością analizowanego łańcucha x. Jeżeli w komórce tablicy o współrzędnych i, j znajdzie się symbol nieterminalny A, oznacza to, że istnieje

47 W literaturze anglojęzycznej spotyka się też skrót CKY (Lee 2002).

48 Ograniczenie gramatyki do PNC nie zawęża zakresu zastosowania algorytmu CYK, gdyż znane jest twierdzenie mówiące, że każdą gramatykę bezkontekstową niegenerującą zdania pustego, można przekształcić do postaci PNC (Hopcroft i Ullman 1979).

prowadzenie A⎯⎯→* xij, gdzie xij jest podłańcuchem o długości j, rozpoczynającym się od i-tej pozycji łańcucha x. Wszystkie symbole z komórki [i, j] tworzą zbiór Vij. Tablica algorytmu CYK wypełniana jest zgodnie z rosnącym indeksem j, a zatem wzdłuż kolejnych wierszy tablicy, z których każdy reprezentuje podciągi łańcucha x o długości j. Podczas wypełniania pierwszego wiersza tablicy wyszukiwane są w gra-matyce produkcje przepisujące symbole terminalne typu A → a. Wstawienie symbolu nieterminalnego A do komórki tablicy kolejnych wierszy jest możliwe tylko wtedy, gdy w zbiorze produkcji gramatyki istnieje taka produkcja A → BC, gdzie B wypro-wadza pierwszą część podciągu, a C część drugą. Symbole B oraz C są poszukiwane w odpowiednich komórkach tablicy CYK, reprezentujących możliwe odpowiednio pierwsze i drugie części wyprowadzanego podciągu. Zapis symbolu startowego grama-tyki S do komórki [1, n] oznacza pozytywną odpowiedź na pytanie o przynależność łańcucha x do L(G). Jednocześnie, wypełniona tablica CYK zawiera wszystkie możli-we rozbiory analizowanego łańcucha.

Jako przykład działania algorytmu CYK rozważmy następującą gramatykę bez-kontekstową:

G = ({A, B, C, S}, {a, b, c},{S → AB, S → AC, C → SB, C → a, B → BB, B → b, A → a}, S)

oraz łańcuch wejściowy aabb. Tablicę algorytmu CYK pokazano na rys. 1.

a a b b i → 1 2 3 4 1 A, C A, C B B 2 S S B j↓ 3 C C, S 4 C, S

Rys. 1. Wypełniona tablica CYK dla łańcucha aabb Fig.1. CYK table filled for the input string aabb

Przykładowo, aby wypełnić komórkę [2, 3], należy znaleźć wszystkie symbole nie-terminalne, które wyprowadzają podciąg łańcucha wejściowego rozpoczynający się od pozycji numer 2 i długości 3 (podciąg abb). Dzielimy podciąg na dwie części. Część pierwsza podciągu może zaczynać się od pozycji 2 i mieć długość 1 lub 2, części drugie muszą być uzupełnieniem części pierwszej do ciągu o długości 3. Rozpoczynamy od analizy V21 = {A, C} oraz V32 = {B}. Możliwymi prawymi stronami produkcji reguły V21

V32 są AB i CB. W zbiorze produkcji gramatyki istnieje reguła S → AB, a zatem do ko-mórki [2, 3] (zbioru V23) wpisujemy symbol S. Następnie analizujemy drugi z możli-wych podziałów ciągu, czyli V22 = {S} oraz V41 = {B}. Ciąg SB jest prawą stroną pro-dukcji C → SB, a więc dodajemy symbol C do zbioru V23. Obecność symbolu startowego S w komórce [1, 4] dowodzi przynależności łańcucha do gramatyki.

a a a a i → 1 2 3 4 1 S S S S 2 S S S j↓ 3 S, S S, S 4 S, S, S, S, S

Rys. 2. Tablica CYK z powielonymi symbolami nieterminalnymi Fig. 2. CYK table with duplicate nonterminal symbols

Złożoność obliczeniowa algorytmu CYK może wzrosnąć do Θ(expn) w przypadku, gdy komórki tablicy będą zawierały powielone symbole nieterminalne. Na rysunku 2 zilustrowano zawartość tablicy CYK dla gramatyki G = ({S}, {a}, {S → SS, S → a},

S) podczas rozbioru ciągu aaaa. Możliwy wykładniczy wzrost złożoności algorytmu

CYK wynika z faktu, że liczba wszystkich możliwych struktur gramatycznych (alter-natywnych rozbiorów) dla ciągu o długości n jest funkcją wykładniczą n (Sakakibara 2005).

Pod pojęciem ewolucyjnych metod uczenia się rozumiemy systemy uczące się działające na zasadach, jakie można zaobserwować w ewolucji żywych organizmów49. Zazwyczaj do dziedziny ewolucyjnych algorytmów zalicza się następujące metody (Michalewicz 1996, Arabas 2001, Kwaśnicka i Spirydowicz 2004)50:

• programowanie ewolucyjne, • strategie ewolucyjne, • algorytmy genetyczne, • programowanie genetyczne.

Wymienione wyżej metody były historycznie rozwijane przez niezależne grupy badaczy, obecnie jednak obserwuje się zacieranie granic między oddzielnymi jeszcze do niedawna metodami (De Jong 1998, Fogel i Michalewicz 1999)51. Cechą charakte-rystyczną metod ewolucyjnych jest stosowana terminologia, która wywodzi się wprost z genetyki i ewolucji. Każdy osobnik składa się z chromosomów52, a chromosom z genów. Zestaw wszystkich genów osobnika tworzy jego genotyp. Zestaw zewnętrz-nych cech osobnika, z których każda może zależeć od jednego lub kilku genów, na-zywany jest fenotypem osobnika (genotyp osobnika koduje jego fenotyp).

49 Michalewicz proponuje stosowanie wspólnego terminu programy ewolucyjne (evolution programs) dla wszystkich metod korzystających z zasad ewolucji (Michalewicz 1996).

50 Wielu autorów, jak chociażby Goldberg (1989) czy Michalewicz (1996), do metod algorytmów ewolucyjnych zalicza również uczące się systemy klasyfikujące. Jednak ich konstrukcja, odbiegająca w sposób istotny od budowy metod ewolucyjnych, a przede wszystkim fakt, że istnieją udane aplikacje systemów klasyfikujących, które nie stosują algorytmów ewolucyjnych, sugeruje odrębne ich trakto-wanie.

51 Obecnie większość praktycznie wykorzystywanych ewolucyjnych metod uczenia się trudno za-kwalifikować w sposób jednoznaczny do którejkolwiek z wymienionych metod. Powstają natomiast nowe techniki ewolucyjne, jak nieuporządkowane algorytmy genetyczne (messy genetic algorithms) (Goldberg i in. 1989), komórkowe algorytmy genetyczne (cellular genetic algorithms) (Gruau i in. 1996), hybrydowe strategie genetyczne (hybrid genetic strategies) (Guerra-Salcedo i in. 1999), połączenia sieci neuronowych i algorytmów genetycznych (Schaffer i in. 1992) czy wyspowy model algorytmów gene-tycznych (island model genetic algorithms) (Whitley i in. 1997).

52 Najczęściej w metodach ewolucyjnych osobnik ma tylko jeden chromosom, tzw. chromosom

Wszystkie metody ewolucyjne symulują ewolucję osobników w zadanym środo-wisku, używając selekcji i reprodukcji. Podobnie jak w naturze, o przeżyciu i/lub po-zostawieniu potomka decyduje jakość przystosowania osobnika do środowiska (

fit-ness)53. Przystosowanie osobnika oceniane jest na podstawie jego fenotypu.

Ewolucyjne algorytmy poszukują rozwiązania zadanego problemu poprzez prze-twarzanie populacji osobników, z których każdy koduje rozwiązanie zadania. Dla każdego osobnika (a ściślej mówiąc jego fenotypu) obliczana jest funkcja przystoso-wania – osobniki o większej wartości funkcji przystosoprzystoso-wania mają większe szanse reprodukcji (co odpowiada procesowi eksploatacji). Potomstwo różni się od rodziców dzięki zastosowaniu operatorów genetycznych, z których najczęściej używa się ope-ratora mutacji (mutation) działającego na jednym osobniku (tzw. reprodukcja aseksu-alna) oraz krzyżowania54 (crossover) – operatora działającego na co najmniej dwóch osobnikach (tzw. reprodukcja seksualna). Obydwa operatory, poprzez zaburzenie osobników rodzicielskich, zapewniają niezbędną w metodzie eksplorację przestrzeni rozwiązań.

procedure Algorytm Ewolucyjny begin

inicjuj populację oceń populację

while (not kryterium stopu) do begin

wybierz osobniki do reprodukcji zastosuj operatory genetyczne oceń populację

wybierz osobniki do następnej generacji

end end

Rys. 3. Pseudokod algorytmu ewolucyjnego Fig. 3. Pseudocode of evolutionary algorithm

Na rysunku 3 przedstawiony został pseudokod typowego algorytmu ewolucyjnego. Po zainicjowaniu populacji osobników, następuje w pętli ewolucja osobników poprzez następujące po sobie: reprodukcję, operacje genetyczne, ocenę i sukcesję. Zadaniem

53 Według Russella i Norviga (1995) algorytmy ewolucyjne są metodami uczenia ze wzmocnieniem, w którym potomek jest traktowany jako nagroda.

54 Zdaniem Arabasa (2001) odpowiedniejszym tłumaczeniem słowa crossover jest krosowanie, gdyż termin krzyżowanie w biologii odnosi się do gatunków, odmian i ras, a nie do procesu molekularnego zachodzącego podczas płciowego rozmnażania. Z tego względu bardziej odpowiednim terminem zdaje się być rekombinacja.

reprodukcji jest wybór z populacji (bazowej) osobników rodzicielskich, które następ-nie poddawane są operacjom genetycznym. Uzyskana w ten sposób populacja (po-tomna) poddawana jest ocenie środowiska, po czym następuje wybór osobników, któ-re przechodzą do następnej generacji algorytmu. Nowa populacja bazowa może składać się zarówno z populacji potomnej, jak i poprzedniej populacji bazowej.

Inicjacja populacji polega zazwyczaj na losowym wygenerowaniu zadanej liczby osobników, chociaż zaleca się, jeżeli jest taka możliwość, wykorzystanie wiedzy o problemie przy tworzeniu początkowej populacji, np. generując osobniki częściowo dostosowane do środowiska. Funkcją oceny może być zarówno prosta funkcja mate-matyczna, jak i obliczeniowo złożone, osobne zadanie obliczeniowe55. Pętla ewolucji może zakończyć się wówczas, gdy przystosowanie osobników osiągnie zadawalającą wartość, minie zadana liczba iteracji lub gdy stwierdzi się, że algorytm osiągnął stan stagnacji, czyli przystosowanie osobników nie jest zadawalające, ale też od dłuższego czasu nie zmienia się.

W dokumencie Ewolucyjne wnioskowanie gramatyczne (Stron 35-41)