Jakiś czas temu napisałem artykuł, w którym przedstawiałem moją interpretacją terminu Data Science. Teraz chciałbym zająć się moim sposobem rozumienia hasła Machine Learning, czyli po polsku: Uczenie Maszynowe.
Historia
Hasło Machine Learning pojawiło się po raz pierwszy w roku 1959 w publikacji Artura Samuela na temat nowego pomysłu na program do gry w warcaby. Pomysł, na który wpadł Artur, polegał na tym, że nie zakodował w swoim programie reguł gry w warcaby, ale skonstruował algorytm w taki sposób, żeby program był w stanie sam się nauczyć najbardziej wartościowych zagrań.
Nie brzmi to może zbyt rewolucyjnie, ale w całym tym procesie faktycznie pojawiła się pewna nowość. Do tej pory, każdy program miał zdefiniowany zestaw reguł, według których funkcjonował. Reguły te bazowały na wiedzy eksperckiej projektantów i programistów. Jeśli oni czegoś nie wiedzieli, to nie zostało to uwzględnione w programie.
Natomiast Artur Samuel podszedł to tematu zupełnie odmiennie. Napisał swój program z minimalną ilością zasad, które są niezbędne do wykonywania poprawnych działań w warcabach. Następnie uruchomił go w celu treningu, który polegał na rozgrywaniu kolejnych partii. Ostatecznie, po około 10 godzinach program ten był wytrenowany na tyle dobrze, że grał w warcaby lepiej niż Artur. Widać więc, że program sam się czegoś nauczył. No i właśnie tego typu proces nazywamy uczeniem maszynowym.
Typy machine learning
Współcześnie uczenie maszynowe dzielimy na różne grupy. Najpopularniejszym podziałem jest chyba podział ze względu na typ problemu, jaki chcemy rozwiązać. Mamy tutaj podział na trzy grupy: uczenie nadzorowane, nienadzorowane oraz ze wzmacnianiem.
Uczenie nadzorowane
Uczenie nadzorowane (supervised learning) jest często uznawane za „nisko wiszący owoc” uczenia maszynowego. Chodzi o to, że niskim nakładem pracy możemy uzyskać całkiem przydatne wyniki. Na czym to polega? Spójrzmy na poniższe dane wybrane ze zbioru danych Boston Housing:
INDUS | NOX | RM | AGE | DIS | RAD | TAX | PTRATIO | LSTAT | MEDV | |
---|---|---|---|---|---|---|---|---|---|---|
0 | 2.31 | 0.538 | 6.575 | 65.2 | 4.0900 | 1.0 | 296.0 | 15.3 | 4.98 | 24.0 |
1 | 7.07 | 0.469 | 6.421 | 78.9 | 4.9671 | 2.0 | 242.0 | 17.8 | 9.14 | 21.6 |
2 | 7.07 | 0.469 | 7.185 | 61.1 | 4.9671 | 2.0 | 242.0 | 17.8 | 4.03 | 34.7 |
3 | 2.18 | 0.458 | 6.998 | 45.8 | 6.0622 | 3.0 | 222.0 | 18.7 | 2.94 | 33.4 |
4 | 2.18 | 0.458 | 7.147 | 54.2 | 6.0622 | 3.0 | 222.0 | 18.7 | 5.33 | 36.2 |
Widzimy tutaj tabelkę z różnymi wartościami. Po lewej stronie mamy indeks zaczynający się od 0. Indeks ten służy nam w tym przypadku do identyfikacji obserwacji. Obserwacją jest u nas grupa domów. Po indeksie mamy serię kolumn, które opisują poszczególne domy. Mamy np. kolumnę PTRATIO, która mówi nam o średniej ilości uczniów przypadających na nauczyciela w regionie. Na końcu mamy kolumnę nazwaną MEDV. Z dokumentacji dostarczonej z tym zbiorem danych wiemy, że ta kolumna jest dla nas najbardziej interesująca. Jest to mediana wartości domów w danym miejscu.
Możemy sobie wyobrazić, że prowadzimy biuro nieruchomości. Zarabiamy na prowizjach od sprzedaży i zastanawiamy się, gdzie możemy znaleźć potencjalnie najwartościowsze domy. Okazuje się, że mamy dostęp do danych geograficznych i demograficznych na obszarze całych Stanów Zjednoczonych. Możemy więc zbudować sobie taką tabelkę, ale oprócz ostatniej kolumny. Nie znamy ostatniej kolumny, bo nie działamy w tamtych obszarach, a konkurencja tanio nam takich informacji nie odsprzeda. Co możemy więc zrobić?
No i właśnie w tym miejscu na scenę wchodzi uczenie maszynowe. Możemy wziąć dane z regionu, w którym działamy, napisać program, który połączy ostatnią kolumnę z wszystkimi pozostałymi w taki sposób, że gdy będzie widział tylko te pozostałe kolumny, będzie w stanie wyliczyć wartości w tej ostatniej. Ten program po fazie trenowania nauczy się „przewidywać” wartości w ostatniej kolumnie, mając do dyspozycji wcześniejsze kolumny.
Bierzemy teraz kolumny przygotowane dla innych obszarów, każemy naszemu programowi przewidzieć ostatnią kolumnę (przypominam – wartość domu) i voilà, nasz program wyliczył informację, której nie mamy. Dzięki takiemu (w dużym uproszczeniu) procesowi, możemy podjąć decyzję, w które obszary kraju warto potencjalnie skierować nasze działania.
Elementy tego działania były następujące:
- dane niezależne
- dane zależne
- program budujący model
- nowe dane
- predykcje
Podsumowując więc nasz proces, wyglądało to mniej więcej tak: Mamy jakieś dane i jakąś informację, która z nich wynika. Nie wiemy, jak ta informacja jest z nimi powiązana, piszemy więc specjalny program, który będzie tak długo „kombinował”, aż znajdzie dla nas satysfakcjonujące powiązanie. Bierzemy teraz nowe dane i nasze wyliczone powiązanie i dokonujemy na jego podstawie predykcji nowej informacji.
Dlatego, że w naszym procesie mamy konkretną informacją (dane zależne) możemy w naszym procesie skoncentrować się na efektywności jej przewidywania. Chowamy trochę danych na bok, przeprowadzamy cały proces i bazując na ukrytych danych, oceniamy, jak dobrze przewidujemy to, czego nie wiemy. No i ten element (sprawdzanie jakości predykcji) jest nadzorem nad procesem. Dlatego tego typu procesy nazywamy uczeniem maszynowym nadzorowanym.
Uczenie nienadzorowane
W uczeniu nadzorowanym najważniejszym elementem była kolumna, którą chcemy przewidzieć w przyszłości, a którą już mamy dla innych obserwacji. W powyższym przykładzie była to wartość nieruchomości. Co natomiast z sytuacją, gdy nie mamy żadnej szczególnie dla nas ważnej kolumny?
W takiej sytuacji wciąż możemy uzyskać jakieś przydatne dla nas informacje, ale skorzystamy z innych technik uczenia maszynowego. Techniki te nazywane są uczeniem maszynowym nienadzorowanym (unsupervised learning). Najczęściej chyba używaną techniką z tego zbioru to analiza skupień.
Analiza skupień polega na identyfikacji podobnych do siebie obserwacji. Możemy sobie wyobrazić zbiór taki jak w przykładzie powyżej, tylko że bez kolumny MEDV. Mamy więc jakieś miejsca w danym regionie i informacje o nich. Działamy już w części z nich. Mamy opracowany marketing, mamy określonego klienta docelowego, mamy również znajomość największych problemów w okolicy. Chcemy dokonać ekspansji na kolejne miejsca, ale nie chcemy zmieniać profilu naszej działalności. Możemy wiec wykorzystać powyższe dane do pogrupowania regionów pod względem jak największego podobieństwa. Po takim grupowaniu możemy namierzyć grupę, w której najwięcej aktualnie działamy i od razu wytypować kolejne miejsca do ekspansji.
Trudność w rozwiązywaniu tego typu problemów wynika z tego, że nie możemy jednoznacznie i obiektywnie ocenić jakości naszego rozwiązania. W uczeniu nadzorowanym mamy kolumnę, którą chcemy przewidzieć. Jeśli przewidujemy trafnie (np. duży współczynnik trafień w klasyfikacji), to ma to sens, jeśli mamy słabe wyniki to musimy więcej powalczyć. Możemy też porównywać modele między sobą. W uczeniu nienadzorowanym nie mamy możliwości odniesienia się do takiej obiektywnej informacji. Co więcej, jeśli zbudujemy kilka różnych modeli, to możemy mieć całkiem spory problem z ich porównaniem. Jest tutaj dostępna co najmniej jedna technika, która pozwala się z tym uporać, ale nie jest tak mocna, jak techniki w uczeniu nadzorowanym.
Uczenie ze wzmacnianiem
Uczenie ze wzmacnianiem (reinforcement learning) jest najtrudniejszym i jednocześnie najbardziej obiecującym działem uczenia maszynowego. Jest najbardziej obiecujący, gdyż dąży do stworzenia procesu, który kopiuje ludzki sposób uczenia się. Powyższe dziedziny uczenia maszynowego wykorzystywały techniki bazujące na pracy z danymi tabelarycznymi. W kontekście uczenia maszynowego taka tabelka jest nazywana ramką danych. Nie każdy problem da się przedstawić w takiej postaci, jednakże prawie wszystkie zbiory danych używane w technikach nadzorowanych i nienadzorowanych są właśnie w niej.
Uczenie ze wzmacnianiem rezygnuje z tego rozwiązania i zastępuje je symulacją. Symulacją, czyli jakimś układem dynamicznym, z którym w interakcje będzie wchodził nasz program. Zadaniem naszego programu będzie zdobycie jak najwięcej punktów w symulacji. Na potrzeby uczenia ze wzmacnianiem taki program jest nazywany agentem.
Jak to działa w praktyce? Nasz agent może podejmować jakieś określone działania wewnątrz symulacji. Po podjęciu działania może obserwować zmiany w układzie. Co jakiś czas symulacja punktuje dodatnio naszego agenta, jeśli działanie, które podjął, było zgodne z naszym celem. Jeśli działanie oddaliło go od osiągnięcia celu, to agent zostaje punktowany negatywnie. Na podstawie sytuacji w układzie i wcześniej uzyskanych (lub) straconych punktów agent podejmuje decyzję o kolejnym ruchu. I tak aż do rozwiązania problemu albo doprowadzenia do sytuacji, w której problem jest nierozwiązywalny. Po zakończeniu procesu agent jest jeszcze raz oceniany całościowo – np. dostanie dużo punktów, jeśli rozwiązał problem.
Ten sposób rozwiązywania problemów przypomina trochę proces uczenia się przez człowieka. Możemy sobie np. wyobrazić proces uczenia się chodzenia przez niemowlaka. Punkty dodatnie to dla takiego niemowlaka np. uśmiech i radość rodziców, możliwość zerknięcia w nowe miejsce, możliwość przemieszczania się tam, gdzie dzieje się coś ciekawego itp. Natomiast punkty negatywne to ból po upadku. No i dziecko takie, wybiera te sposoby poruszania kończynami, które pozwalają mu iść tam, gdzie chce, jednocześnie zmniejszając ryzyko bólu. A podsumowaniem takiego procesu może być np. uzyskanie medalu w zawodach biegowych – zakończenie procesu treningu, który daje mnóstwo pozytywnych punktów.
Ten rodzaj uczenia maszynowego jest problematyczny z wielu powodów. Raz, że musimy zorganizować odpowiednio dynamiczne środowisko do interakcji z agentem. Dwa – to środowisko powinno odzwierciedlać jak najwięcej sytuacji, które mogą wystąpić w rzeczywistości. Trzy – musimy tak zorganizować naszego agenta, żeby mógł gromadzić wiedzę i ją wykorzystywać. No i cztery – musimy wymyślić system punktowania w trakcie i po zakończeniu procesu, w taki sposób, żeby agent miał odpowiednie wskazówki odnośnie do poszukiwania rozwiązania krótko i długo terminowego.
Brzmi to słabo i tak aktualnie jest. Najbardziej jednak obiecujące jest to, że jeśli uda nam się ogarnąć wszystkie te elementy w danym problemie, to będziemy mogli wytrenować agenta, który będzie go rozwiązywał lepiej niż ludzie.
Zawód – machine learning engineer?
Okej, wróćmy do przyziemnej rzeczywistości i zastanówmy się, czego potrzebujemy, jeśli chcemy zacząć pracować jako inżynier do spraw uczenia maszynowego.
Po pierwsze, musimy umieć całkiem nieźle programować. O ile w analityce wystarczy po prostu umiejętność używania odpowiednich narzędzi na odpowiednio przygotowanych danych, to tutaj im lepiej umiemy programować, tym lepiej. Oczywiście, nie każdy inżynier uczenia maszynowego będzie implementował nowe modele w tydzień po pojawieniu się publikacji. Jednakże będzie odpowiedzialny za możliwe przyspieszanie obliczeń albo w ogóle ich umożliwianie.
Matematyka też może tutaj być przydatna, szczególnie gdy będziemy chcieli znaleźć bug w naszym procesie. Czasem będzie to bug związany stricte z programowaniem, a czasem może to wynikać właśnie z nieodpowiedniego interpretowania jakiś wcześniejszych założeń.
Uczenie maszynowe może być ciekawą alternatywą dla nauki o danych (data science). Mam wrażenie, że w tym pierwszym więcej obcujemy z programowaniem i sprzętem, a w tym drugim z ludźmi i biznesem. Oczywiście i w jednym i drugim przypadku przez większość czasu pracujemy z danymi, jednakże w moim skromnym zdaniu są to po prostu dwa końce tego samego patyka.
Czyli co to jest machine learning?
Trochę się rozpisałem i być może zamieszałem Ci w głowie drogi Czytelniku. W tym akapicie chciałbym to odkręcić. Czym jest więc uczenie maszynowe? Jest to po prostu pisanie programów z myślą, że te właśnie programy będą wydobywać przydatną dla nas informację z danych. Ich zadaniem będzie wczytanie danych, znalezienie i stworzenie reguł, a na końcu użycie tych reguł na danych, których nie widziały. Czasem będzie to przewidzenie przyszłości (np. czy przedłuży subskrypcję), czasem grupowanie pozornie różnych obserwacji, a czasem stworzenie bota, który będzie inwestował na giełdzie. Zawsze jednak będzie stworzenie czegoś, co działa lepiej niż my sami, przy pomocy danych.
Kursy Online
Jeśli jesteś zainteresowany zakupem wideo kursów online które przygotowałem, sprawdź tę stronę – może akurat opublikowałem tam kupony zniżkowe. 🙂
Internet jest mały 😀 kupiłem Twój kurs zanim trafiłem na Twój blog 😀 w ogóle ekstra blog zrobił Pan 🙂 jak go oglądam przez te parę dni to już kilka to już kilka razy miałem taką myśl: „Kurcze, dlaczego ten gość nie zrobi kursu? Przecież na blogu tak genialnie tłumaczy wszystko.”
A tu się okazało, że Ten Gość ma i bloga i kurs, który już kupiłem. 😉
Nie doczekam się w takim razie Panie Damianie rozpoczęcie Pana kursu. Jest w kolejce 🙂
Mam nadzieję, że kurs już chociaż rozpoczęty? Miłej zabawy życzę 😀