Jejku rety, maszyna myśli! Słów kilka o uczeniu maszynowym.

Bez cienia wątpliwości, przechodzimy rewolucję technologiczną. Było ich zresztą już kilka, lecz ta jest inna niż wszystkie wcześniejsze (hmm, wcześniejsze zresztą też były inne niż je poprzedzające), Lecz ta jest jednak wyjątkowa. Stoimy bowiem w przededniu rozwoju Sztucznej Inteligencji, inteligencji którą to my sami budujemy. Możliwości, jakie oferują już w tej chwili algorytmy uczenia maszynowego, są niewiarygodne, przewyższające znacznie nasze wcześniejsze wyobrażenia.

Wielu z Was zastanawia się, jako to możliwe, że mój komputer, właściwie jego oprogramowanie było zdolne do „uczenia się” i wykonywania z tak niezwykłą precyzją skomplikowanych operacji, do których niejednokrotnie człowiek dochodził latami swojej ciężkiej pracy, żmudnie zbierając doświadczenia i stale pogłębiając swoją wiedzę? W tym artykule postaram się przybliżyć Wam ideę (tak, tak, znowu tak matematyka…) stojącą za uczeniem maszynowym i dlaczego i w jaki sposób to działa.

Więc jak to działa? Jak komputer się „uczy”?

Istnieje wiele różnych algorytmów uczenia maszynowego. Każdy z nich w trochę inny sposób dokonuje rozpoznawania wzorów, w inny sposób określa przynależność nieznanych (nowych) danych do określonego wzorca. Jednym z popularniejszych (i łatwych do zrozumienia) jest Naiwny Klasyfikator Bayesa, i na jego podstawie omówię proces uczenia.

Proces „uczenia się” klasyfikatora obejmuje przypisywanie pewnych obiektów do dwóch lub większej ilości klas decyzyjnych, np. mamy owoce (to nasze obiekty) i klasyfikujemy je na jabłka, gruszki, pomarańcze (to nasze klasy decyzyjne). By algorytm mógł tego dokonać, konieczne jest dostarczenie mu danych uczących, gdzie danemu obiektowi przypisano już właściwą klasę decyzyjną (czyli wyciągnięty z kosza owoc nr 1 jest jabłkiem, owoc nr 2 jest gruszką, itd.)

Naiwny Klasyfikator Bayesa.

UWAGA! W przedstawionym przykładzie zastosowano szereg uproszczeń, by idea uczenia maszynowego opartego na wybranym klasyfikatorze była zrozumiała dla czytelnika. Niemniej jednak dysponując większą ilością danych uczących niż pokazano w poniższym przykładzie, opisana idea w prawidłowy sposób (i z wysokim prawdopodobieństwem) dokona rozpoznania nowego, nieznanego wzorach – nauczy się 🙂

Działanie Naiwnego Klasyfikatora Bayesa polega na obliczeniu prawdopodobieństwa przynależności danego obiektu do określonych klas decyzyjnych (a więc na ile prawdopodobne jest to, że wyciągnięty z kosza owoc to jabłko, a na ile prawdopodobne jest to że to jednak jest gruszka). Jak więc obliczyć to prawdopodobieństwo? Z pomocą przychodzi nam Twierdzenie Bayesa o prawdopodobieństwie warunkowym dwóch zdarzeń:

P(A│B)=  {(P(A ∩B)) \over (P(B))}=  {(P(B│A)*P(A)) \over (P(B))}

Tak, wiem …. matematyka. Brzmi skomplikowanie? Jak wykorzystać to twierdzenie?

Skonstruujmy więc sobie pewien zbiór danych. Załóżmy, że mamy wiele elementów (egzemplarzy) pewnych obiektów. Egzemplarze różnią się pomiędzy sobą, ale wszystkie należą do kilku zdefiniowanych, znanych i opisanych klas. Każdy egzemplarz posiada kilka cech (znanych, opisanych i mierzalnych)  O przynależności danego egzemplarza do danej klasy decydują wartości tych cech. Najłatwiej wyobrazić to sobie mając np.  taką tabelę:

Lp.Cecha 1Cecha 2Cecha 3Cecha 4Cecha 5Klasa egzemplarza
1TAKNIENIETAKTAKołówek
2NIETAKNIENIETAKdługopis
3NIENIETAKTAKNIEpióro
4NIENIENIENIETAKołówek
5TAKTAKNIENIETAKpióro
6NIENIETAKNIETAKołówek
7TAKNIETAKTAKTAKdługopis
Tabela 1. Zbiór wartości poszczególnych cech, reprezentujących klasy: ołówek, długopis, pióro

Dane te, możemy zapisać też w postaci pewnego wektora cech, wraz z nazwą (etykietą) klasy do jakiej dany egzemplarz należy:

pióro|NIE,NIE,TAK,NIE,TAK

Co oczywiście możemy uogólnić do:

klasa|f_1,f_2,f_3,f_4,f_5

Mając dane tak przedstawione jak powyżej, to co możemy z nich jeszcze wywnioskować. Czy na bazie znajomości tylko samych klas egzemplarza i częstotliwości ich występowanie, możemy przewidzieć jaka byłaby następna klasa? Żeby ułatwić nasze przewidywania, policzmy trochę – obliczmy prawdopodobieństwo wystąpienia każdej z klas. Prawdopodobieństwo obliczany ze wzoru:

P(element)=  {(liczba \space danych \space elementów) \over (liczba \space wszystkich \space elementów)}

Więc dla naszego przypadku, prawdopodobieństwo wystąpienia każdej z klas wynosi;

Dla \space ołówka = {3 \over 7} ≈ 42 \%
Dla \space długopisu = {2 \over 7} ≈ 28\%
Dla \space pióra = {2 \over 7} ≈ 28\%

A więc (upraszczając!) mamy około 42% pewności, że następnym elementem zbioru będzie ołówek, a tylko 28% że następnym elementem będzie długopis. W ten oto sposób wyznaczyliśmy więc prawdopodobieństwo zdarzenia – P(A) – dla poszczególnych klas do których należą egzemplarze naszych danych. Mamy już pierwszy element ze wzoru Bayesa 🙂

Jak więc wyznaczyć jaką klasę będzie miał egzemplarz o następujących cechach:

Cecha 1Cecha 2Cecha 3Cecha 4Cecha 5
NIENIENIETAKTAK
Tabela 2. Wartości poszczególnych cech, nieznanego egzemplarza danych (bez określania przynależności do danej klasy).

Jak więc algorytm dysponującymi danymi (patrz: Tabela 1), określa do jakiej klasy decyzyjnej należy ten nowy egzemplarz danych? Obliczmy więc pewne prawdopodobieństwo warunkowe wystąpienia nowych danych (nowego egzemplarza)  dla każdej istniejącej decyzji (czyli, jak bardzo prawdopodobne jest, że wartość danej cechy danego egzemplarza wystąpiła w danych uczących i do jakiej klasy była przyporządkowana).  Ideą uczenia maszynowego jest, że posiadany egzemplarz raczej na pewno nie wystąpił w danych uczących, a algorytm musi oszacować do jakiej klasy nasze nowe dane należą.

Uprośćmy sobie powyższą tabelę:

NazwaCecha 1Cecha 2Cecha 3Cecha 4Cecha 5
symbola1a2a3a4a5
wartośćNIENIENIETAKTAK
Tabela 3. Wartości poszczególnych cech, nieznanego egzemplarza danych, wraz z przypisanymi im symbolami.

Od teraz zamiast długiej nazwy „Cecha 1” możemy zapisać elegancki matematyczny symbol a1, lub ogólnie cały egzemplarz nowych danych możemy zapisać jako:

f= a_1,…,a_i   \space\space\space\space dla \space i=1,…,n

gdzie: n – liczba naturalna, większa od zera

Pomęczę Was jeszcze trochę matematyką. Tak się składa, że zrozumienie jej, jest niezwykle istotne do zrozumienia zasady działania uczenia się tego (i innych też) klasyfikatora, Mając więc matematycznie zdefiniowany pewien wektor danych (czyli nasz nowy, nieznany egzemplarz), wróćmy na chwilę do wzoru Bayesa. Żeby móc określić do jakiej klasy należy nasz egzemplarz danych, znamy już wszystkie prawdopodobieństwa P(A) dla poszczególnych klas („ołówek”, „długopis”, „pióro”), pora więc na wyliczenie prawdopodobieństwa przynależności naszego nowego, nieznanego egzemplarza danych do poszczególnych klas – P(B|A).

Jak się zabrać za te obliczenia? Dokonajmy więc znów pewnego uproszczenia (tak, tak, w uczeniu maszynowym, upraszczanie to słowo klucz ). Zapiszmy to prawdopodobieństwo w taki sposób:

P(B│A)=P(a_1│d_i )*….*P(a_k |d_i)

Co ogólniej możemy zapisać jako (matematycy będą zadowoleni) :

∏(P(a_j |d_i)

Co tu się właściwie stało? Obliczamy więc niezależnie prawdopodobieństwo wystąpienia wartości każdej cechy przynależnej do danej klasy decyzyjnej. Każdą wartość cechy (atrybutu) traktujemy niezależnie, tak jakby nie miała wpływu na pozostałe cechy i klasę do jakiej dany egzemplarz należy. Podejście takie nazywamy „naiwne” – stąd też nazwa algorytmu – Naiwny Klasyfikator Bayesa.

„Dobrze” – pomyślicie – „Brzmi to fajnie, naukowo, ale nadal nie wiem jak komputer „się uczy”, ale jak mogę to zastosować do faktycznego uczenia się algorytmu?”.  I jak to obliczyć?

Patrząc na powyższy wzór, musimy obliczyć prawdopodobieństwo wystąpienia wartości poszczególnych cech (atrybutów) dla każdej możliwej klasy. Czyli: prawdopodobieństwo wystąpienia wartości NIE cechy 1 dla klasy „pióro”, wystąpienie wartości NIE cechy 1 dla klasy „ołówek”,  wystąpienie wartości NIE cechy 1 dla klasy „długopis”, wystąpienie wartości NIE cechy 2 dla klasy „pióro”, i tak dalej, i tak dalej, aż do obliczenia wartości prawdopodobieństwo wszystkich cech dla wszystkich klas. No to do dzieła.

Prawdopodobieństwo wartości poszczególnych cech dla klasy „ołówek”:

P(a_1│d_1 )=P(NIE│ołówek)=   {2 \over 3}
P(a_2│d_1 )=P(NIE│ołówek)=  1
P(a_3│d_1 )=P(NIE│ołówek)=   {2 \over 3}
P(a_4│d_1 )=P(TAK│ołówek)=   {1 \over 2}
P(a_5│d_1 )=P(TAK│ołówek)=  1

Prawdopodobieństwo wartości poszczególnych cech dla klasy „długopis”:

P(a_1│d_2 )=P(NIE│długopis)=   {1 \over 2}
P(a_2│d_2 )=P(NIE│długopis)=   {1 \over 2}
P(a_3│d_2 )=P(NIE│długopis)=   {1 \over 2}
P(a_4│d_2 )=P(TAK│długopis)=   {1 \over 2}
P(a_5│d_2 )=P(TAK│długopis)=  1

Prawdopodobieństwo wartości poszczególnych cech dla klasy „pióro”:

P(a_1│d_3 )=P(NIE│pióro)=   {1 \over 2}
P(a_2│d_3 )=P(NIE│pióro)=   {1 \over 2}
P(a_3│d_3 )=P(NIE│pióro)=   {1 \over 2}
P(a_4│d_3 )=P(TAK│pióro)=   {1 \over 2}
P(a_5│d_3 )=P(TAK│pióro)=   {1 \over 2}

Mamy poszczególne składowe iloczynu prawdopodobieństwa, pora więc na obliczenie prawdopodobieństwa:

(P(B│A)*P(A))

Dla klasy „ołówek”:

P(ołówek│a_i )={2 \over 3}*1*{2 \over 3}*{1 \over 3}*1*{3 \over 7}={4 \over 63}≈0,0634920634920635≈0,063

Dla klasy „długopis”:

P(długopis│a_i )={1 \over 2}*{1 \over 2}*{1 \over 2}*{1 \over 2}*1*{2 \over 7}={1 \over 56}≈0,0178571428571429≈0,017

Dla klasy „pióro”:

P(pióro│a_i )=  {1 \over 2}*{1 \over 2}*{1 \over 2}*{1 \over 2}*{1 \over 2}*{2 \over 7}={1 \over 12}≈0,0089285714285714≈0,008

Uff! Przebrnęliśmy przez żmudny proces wyliczania prawdopodobieństw dla każdego atrybutu i każdej możliwej klasy decyzyjnej. Mamy wyniki końcowe. Pozostała już nam tylko ostatnia rzecz. Porównanie prawdopodobieństw względem siebie i wybranie tego prawdopodobieństwa które jest najwyższe.

0,063 > 0,017 > 0,008

Mamy więc zwycięzcę!. Nowym egzemplarzem danych jest …. ołówek! *

* – pewnie się zastanawiasz, co się stało z mianownikiem ze wzoru Bayesa, przedstawionym na początku. Otóż, w procesie uczenia maszynowego, przedstawione przybliżenie (tak, tak, magiczne uproszczenie), jest wystarczające by już określić przynależność egzemplarza danych do klasy. Dlatego jest on pomijany.

To już?! Tak! To cała magia uczenia maszynowego (oczywiście – a jakże – w uproszczeniu! ).

Pamiętaj! Omówiony przykład jest poprawny matematycznie, jednakże do rzeczywistego modelu będziesz potrzebował większej ilości danych uczących niż w modelu omówionym powyżej.

Do czego można zastosować Naiwny Klasyfikator Bayesa? Jednym z popularniejszych zastosowań jest wykrywanie spamu w wiadomościach email. Zbiorem uczącym jest więc treść otrzymywanych wiadomości email, która jest przypisana do dwóch klas: „wiadomości pożądane” i „spam” (wiadomości niechciane). Pojedyncza wiadomość email, traktowana jest jako egzemplarz danych, a treść (poszczególne słowa) to kolejne atrybuty (cechy) danego egzemplarza. Widzimy tu kolejną zaletę stosowania uczenia maszynowego – ilość atrybutów w każdym kolejnym egzemplarzy danych może być różna (wiadomości email zawierają różną treść, różną długość, a więc ilość słów jest różna), a pomimo to i tak, algorytm uczenia maszynowego, poprawnie przypisze otrzymaną wiadomość do właściwej klasy.

Mam nadzieje, że zainteresowałem Cię ideą uczenia maszynowego i wyjaśniłem w jaki sposób algorytm potrafi na podstawie zbioru uczącego poprawie dokonać rozpoznania nieznanego sobie wcześniej obiektu.

Jeżeli chcesz dowiedzieć się więcej na temat uczenia maszynowego, odwiedzaj regularnie naszeg blog, systematycznie będziemy publikować nowe treści z tej tematyki. Jeżeli chciałbym by pojawił się konkretny artykuł, napisz do nas!

Zostaw komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *

Przewijanie do góry