Podstawy Uczenie maszynowe

Przeszło jedna dyskietka na sekundę. Jedna dyskietka to 1,44 MB. Tyle w tej chwili produkowanych jest danych na każdego człowieka na naszej planecie. Daje to dziesiątki zetta bajtów już istniejących danych. Czyli liczb do których zapisu potrzebujemy 23 cyfr. Co "gorsza", co roku liczba ta wzrasta o 40%.
Żyjemy więc w czasach przetwarzania olbrzymiej ilości informacji. Na szczęście możemy spróbować okiełznać te dane. Możemy skorzystać z samouczących się algorytmów i przekształcić te dane w rzeczywistą i przydatną wiedzę. Możemy użyć uczenia maszynowego.

Uczenie maszynowe

W tym wpisie postaram się przedstawić podstawowe pojęcia z nim związane oraz zdefiniować jego główne rodzaje.
Uczenie maszynowe (ang. machine learning) wyewoluowało w drugiej połowie XX wieku z badań nad sztutczną inteligencją. Dzięki uczeniu maszynowemu nie marnujemy już pracy wielu ludzi na ręczne określanie reguł oraz tworzenie modeli poprzez analizowanie wielkich ilości danych. Możemy teraz efektywniej poprawiać skuteczność modeli predykcyjnych oraz podejmować lepsze decyzje na podstawie danych.

Czym jest uczenie maszynowe? Myślę, najlepiej określił to Arthur Samuel: "dziedzina nauki, która zajmuje się sprawianiem aby komputery mogły uczyć się bez ich zaprogramowania wprost".

Schemat

Schemat działania uczenia maszynowego możemy (w dużym uproszczeniu) podzielić na dwie części:

  • tworzenie modelu

  • schemat uczenia maszynowego - tworzenie modelu

  • pozyskiwanie informacji za pomocą modelu

  • schemat uczenia maszynowego - wykorzystanie modelu

Trzy podejścia

W miarę rozwoju uczenia maszynowego oraz przy powstawaniu coraz to nowszych typów problemów, które ono rozwiązuje wytworzyły się trzy główne sposoby, w jaki nasze algorytmy uczą się. Każdy z tych typów jest "specjalistą" jeśli chodzi o klasę problemów do rozwiązania. Typy te to:

  • uczenie nadzorowane (ang. supervised learning)
  • uczenie nienadzorowane (ang. unsupervised learning)
  • uczenie przez wzmacnianie (ang. reinforcement learning)
Opiszę pokrótce każdy z tych typów oraz podam przykładową klasę problemów, do któych są najczęściej używane.

Uczenie nadzorowane

supervisor

Celem numer jeden tego typu uczenia jest wytrenowanie modelu za pomocą oznakowanych danych uczących (ang. training data). Możemy dzięki temu przewidywać informacje wygenerowane w przyszłości. Gdzie tutaj mamy zatem nadzór? Nadzorem jest to, że posiadamy zestaw próbek, dla których sygnały wyjściowe są znane i posiadają etykiety. Są to tzw. dane uczące. Możemy więc przedstawić ogólny schemat uczenia nadzorowanego:

ogólny schemat uczenia nadzorowanego
Aby schemat był bliższy prawdy powinienem jeszcze zaznaczyć, że etykiety dotyczą również danych testowych, ale o tym czym one są napiszę w następnym wpisie. Wracając do uczenia nadzorowanego, to posiada ono dwie główne podkategorie: klasyfikację oraz regresję.

Klasyfikacja

Główną cechą klasyfikacji jest to, że etykiety, które posiadamy dla naszych danych stanowią zbiór dyskretnych wartości. Wartości te są dodatkowo nieuporządkowane. Możemy więc powiedzieć, że każda instancja należy do jakieś określonej klasy. Trochę to może brzmi zawile więc kilka przykładów i typów klasyfikatorów na pewno pomoże to rozjaśnić.

Najprostszy podział na klasy (grupy etc.) jest wtedy, gdy mamy dwie grupy. Dorosły/dziecko, legalny/nielegalny, mail/spam, dzień/noc, pozytywny/negatywny itd. Mamy tu do czynienia z klasyfikacją binarną. I w naszym przypadku chcemy posiadać algorytm odróżniający te dwie klasy np. filtrujący niechciane wiadomości w naszej skrzynce pocztowej.

Oczywiście etykiet/klas, które posiadamy może być więcej. Wtedy mówimy już o klasyfikacji wieloklasowej. Możemy mieć zatem dziesięć klas, gdy rozpoznajemy cyfry arabskie, kilkadziesiąt, gdy rozpoznajemy litery lub zwierzęta na obrazkach itd.

Regresja

W przypadku regresji również mamy do dyspozycji dane dla których znamy "wynik". Tutaj jednak wynikiem może być dowolna wartość (np. liczba rzeczywista). Zadaniem algorytmu jest rozpoznanie relacji pomiędzy danymi wejściowymi (zwanymi zmiennymi objaśniającymi/niezależnymi) a danymi wyjściowymi (zwanymi zmiennymi objaśnianymi/zależnymi). Dzięki temu będziemy mogli w przyszłości podać wynik dla nowej danej wejściowej.

Prosty przykład regresji, jaki przychodzi mi na myśl to: wyznaczenie ceny mieszkania na podstawie jego powierzchni. Mamy tutaj do czynienia z najprostszą wersją regresji - regresją liniową. Gdybyśmy pokusili się o graficzne przestawienie tego problemu, dostalibyśmy dwuwymiarowy wykres z naniesionymi punktami odpowiadającymi naszym próbkom. Wartością x próbki byłaby wartość zmiennej objaśnianej czyli powierzchnia mieszkania. Wartością y próbki byłaby wartość zmiennej objaśnianej czyli cena. W przpadku regresji liniowej chcielibyśmy dostać linię najbardziej zbliżoną do tych punktów. Póżniej po otrzymaniu nowej zmiennej (tylko nowej wartości x) sprawdzilibyśmy jaka wartość y odpowiada tej wartości x na naszej linii. Oczywiście przykład z mieszkaniami jest nieco naiwny. Celowo. Cena mieszkania nie zależy tylko od jego powierzchni, a regresja może posiadać wiele zmiennych objaśniających.

Uczenie nienadzorowane

jump

W odróżnieniu od uczenia nazdzorowanego, gdzie znamy wynik/odpowiedź dla pewnego zbioru danych uczących, tutaj mamy do dyspozycji tylko dane nieoznakowane. Co zatem możemy zrobić. Możemy zastosować ten typ uczenia do innych problemów. Dwa główne z nich to: grupowanie (zwane klasteryzacją) oraz redukowanie wymiarowości.

Grupowanie

Jak sama nazwa mówi, chcemy aby nasz algorytm podzielił nam dane wejściowe na grupy. Na ile grup. tego nie wiemy. Jednak nasze dane posiadają pewne cechy, które zbliżają lub oddalają je od siebie. To właśnie pozwoli mu na dokonanie podziału. Przykładowe zastosowanie tej metody to tematyczny podział stron internetowych. Innym jest podział obrazu na regiony, co znajduje zastosowanie np. w diagnostyce obrazowej.

Redukcja wymiarowości

We wspomnianym przykładzie mieszkaniowym mieliśmy jako zmienną objaśniającą tylko powierzchnię mieszkania. Możemy oczywiście zebrać dużo więcej informacji odnośnie każdego mieszkania. Dużo więcej jego cech. Później za ich pomocą lepiej wyznaczać cenę mieszkania. Może jednak się okazać, że co za dużo to niezrdowo. Możemy uzyskać zbyt wiele wartości pomiarowych. Zbyt wiele, bo np. część z nich jest nieistotna. Wtedy z pomocą przychodzi nam redukcja wymiarowości. Pomoże ona nam pozbyć się nieistotnych cech/wymiarów z danych wejściowych i pozostawić tylko te istotne (np. do obliczenia ceny mieszkania). Dzięki temu algorytm regresji użyty później będzie działał sprawniej (szybciej, dokładniej, etc.).

Zmniejszona liczba wymiarów pomaga również ludziom. Czytelne (dla człowieka) przedstawienie danych na wielu wymiarach jest raczej trudne. Możemy więc spróbować dla niektórych danych przedstawić je w formie np. dwuwymiarowego, a więc płaskiego obrazu, który z łatwością można zaprezentować w książce czy też na stronie internetowej. Tego typu obraz może pozwolić nam znaleźć jakieś wzorce w danych. Oczywiście nie zawsze jest to sensowne.

Uczenie przez wzmocnienie

reinforcment

Pośrednim typem uczenia jest uczenie przez wzmocnienie. Dlaczego pośrednim? Otóż nie mamy tutaj do dyspozycji etykiet opisujących każdą daną wejściową, jak w przypadku uczenia nadzorowanego, jednak mamy do dyspozycji coś co stymuluje algorytm to poprawy swojego działania. To coś to sygnał nagrody (swego rodzaju sprzężenie zwrotne), który informuje nasz alorytm podczas jego uczenia czy jego odpowiedź jest lepsza bądź gorsza. Oczywiście dążymy do maksymalizacji nagrody robimy to np. metodą prób i błędów.

Najlepszymi przykładami zastosowania tego typu uczenia są gry, gdzie algorytmy prześcignęły już ludzi i gdzie prosto można zdefiniować nagrodę - będzie to wygrana lub wysoki wynik. Podobnym zastosowaiem mogą być szeroko rozumiane finanse. Wiadomo, program ma zarobić dużo kokosów dla nas. Oczywiście ten typ uczenia może być zastosowany w wielu innych miejscach np. do otymalizacji kontroli pamięci komputera, gdzie chcemy aby procesor jak najszybciej dostawał do przeprocesowania interesujące go informacje.


To tyle na dzisiaj. Następny wpis będzie dotyczył tego jak tworzymy systemy uczenia maszynowego. Potem już mam nadzieję zajmiemy się mięskiem ;-)