Uczenie maszynowe dla programistów Java, część 1: Algorytmy uczenia maszynowego

Samojezdne samochody, oprogramowanie do wykrywania twarzy i głośniki sterowane głosem są oparte na technologiach i strukturach uczenia maszynowego - a to dopiero pierwsza fala. W ciągu następnej dekady nowa generacja produktów zmieni nasz świat, inicjując nowe podejście do tworzenia oprogramowania oraz aplikacji i produktów, które tworzymy i używamy.

Jako programista Java chcesz wyprzedzić tę krzywą, zwłaszcza że firmy technologiczne zaczynają poważnie inwestować w uczenie maszynowe. To, czego się dziś nauczysz, możesz wykorzystać w ciągu następnych pięciu lat, ale od czegoś trzeba zacząć.

Ten artykuł pomoże Ci zacząć. Zaczniesz od pierwszego wrażenia na temat działania uczenia maszynowego, a następnie krótkiego przewodnika po implementacji i szkoleniu algorytmu uczenia maszynowego. Po przestudiowaniu wewnętrznych elementów algorytmu uczenia się i funkcji, których możesz użyć do trenowania, oceniania i wybierania najlepiej dopasowanej funkcji przewidywania, uzyskasz przegląd korzystania z platformy JVM, Weka, do tworzenia rozwiązań uczenia maszynowego. W tym artykule skupiono się na nadzorowanym uczeniu maszynowym, które jest najczęstszym podejściem do tworzenia inteligentnych aplikacji.

Uczenie maszynowe dla programistów Java, część 2

Czy jesteś gotowy na następny krok? W drugiej połowie tego samouczka pokazano, jak opracować i wdrożyć potok danych uczenia maszynowego.

Uczenie maszynowe i sztuczna inteligencja

Uczenie maszynowe wyewoluowało z dziedziny sztucznej inteligencji, która stara się produkować maszyny zdolne naśladować ludzką inteligencję. Chociaż uczenie maszynowe to wyłaniający się trend w informatyce, sztuczna inteligencja nie jest nową dziedziną nauki. Test Turinga, opracowany przez Alana Turinga we wczesnych latach pięćdziesiątych XX wieku, był jednym z pierwszych testów stworzonych w celu ustalenia, czy komputer może mieć prawdziwą inteligencję. Zgodnie z testem Turinga komputer może udowodnić ludzką inteligencję, oszukując człowieka, aby uwierzył, że jest również człowiekiem.

Wiele nowoczesnych metod uczenia maszynowego opiera się na koncepcjach sprzed dziesięcioleci. To, co zmieniło się w ciągu ostatniej dekady, to fakt, że komputery (i rozproszone platformy komputerowe) mają teraz moc obliczeniową wymaganą przez algorytmy uczenia maszynowego. Większość algorytmów uczenia maszynowego wymaga do przetworzenia ogromnej liczby mnożeń macierzowych i innych operacji matematycznych. Technologia obliczeniowa do zarządzania tymi obliczeniami nie istniała nawet dwie dekady temu, ale istnieje dzisiaj.

Uczenie maszynowe umożliwia programom wykonywanie procesów poprawy jakości i rozszerzanie ich możliwości bez udziału człowieka. Program oparty na uczeniu maszynowym może aktualizować lub rozszerzać swój własny kod.

Uczenie się nadzorowane a uczenie się nienadzorowane

Uczenie nadzorowane i uczenie nienadzorowane to najpopularniejsze podejścia do uczenia maszynowego. Oba wymagają dostarczenia do maszyny ogromnej liczby rekordów danych do korelacji i uczenia się z nich. Tak zebrane rekordy danych są powszechnie znane jako wektory cech. W przypadku pojedynczego domu wektor cech może składać się z takich cech, jak całkowita wielkość domu, liczba pokoi i wiek domu.

W uczeniu nadzorowanym algorytm uczenia maszynowego jest szkolony, aby poprawnie odpowiadać na pytania związane z wektorami cech. Aby wytrenować algorytm, maszyna otrzymuje zestaw wektorów cech i powiązaną etykietę. Etykiety są zwykle dostarczane przez ludzkiego adnotatora i reprezentują właściwą „odpowiedź” na dane pytanie. Algorytm uczący się analizuje wektory cech i ich prawidłowe etykiety, aby znaleźć wewnętrzne struktury i relacje między nimi. W ten sposób maszyna uczy się poprawnie odpowiadać na zapytania.

Na przykład inteligentna aplikacja dotycząca nieruchomości może zostać przeszkolona za pomocą wektorów cech, w tym rozmiaru, liczby pokoi i odpowiedniego wieku dla szeregu domów. Osoba etykietująca oznaczałaby każdy dom prawidłową ceną domu na podstawie tych czynników. Analizując te dane, aplikacja nieruchomości zostanie przeszkolona, ​​aby odpowiedzieć na pytanie: „ Ile pieniędzy mogę dostać na ten dom?

Po zakończeniu procesu uczenia nowe dane wejściowe nie będą oznaczane. Maszyna będzie w stanie poprawnie odpowiadać na zapytania, nawet w przypadku niewidocznych, nieoznakowanych wektorów cech.

W uczeniu się bez nadzoru algorytm jest zaprogramowany do przewidywania odpowiedzi bez etykietowania przez ludzi, a nawet pytań. Zamiast z góry określać etykiety lub jakie powinny być wyniki, uczenie się bez nadzoru wykorzystuje ogromne zbiory danych i moc obliczeniową, aby odkryć wcześniej nieznane korelacje. Na przykład w marketingu produktów konsumenckich uczenie się bez nadzoru można wykorzystać do identyfikacji ukrytych relacji lub grupowania konsumentów, ostatecznie prowadząc do nowych lub ulepszonych strategii marketingowych.

Ten artykuł skupia się na nadzorowanym uczeniu maszynowym, które jest obecnie najpopularniejszym podejściem do uczenia maszynowego.

Nadzorowane uczenie maszynowe

Wszystkie systemy uczące się są oparte na danych. W przypadku nadzorowanego projektu uczenia maszynowego będziesz musiał oznaczyć dane w sposób znaczący dla oczekiwanego wyniku. W tabeli 1 zwróć uwagę, że każdy wiersz rejestru domu zawiera etykietę „cena domu”. Korelując dane w wierszach z etykietą ceny domu, algorytm ostatecznie będzie w stanie przewidzieć cenę rynkową domu spoza zestawu danych (należy zauważyć, że wielkość domu jest oparta na metrach kwadratowych, a cena domu w euro).

Tabela 1. Zapisy domów

FUNKCJA FUNKCJA FUNKCJA ETYKIETA
Wielkość domu Liczba pokoi Wiek domu Szacunkowy koszt domu
90 m2 / 295 stóp 2 pokoje 23 lata 249 000 €
101 m2 / 331 stóp 3 pokoje n / a 338 000 €
1330 m2 / 4363 ft 11 pokoi 12 lat 6 500 000 €

Na wczesnych etapach prawdopodobnie będziesz oznaczać rekordy danych ręcznie, ale w końcu możesz wyszkolić program w celu zautomatyzowania tego procesu. Prawdopodobnie widziałeś to w aplikacjach pocztowych, gdzie przeniesienie wiadomości e-mail do folderu ze spamem powoduje wyświetlenie zapytania „Czy to spam?” Odpowiadając, szkolisz program w rozpoznawaniu poczty, której nie chcesz widzieć. Filtr spamu aplikacji uczy się oznaczać przyszłe wiadomości z tego samego źródła lub zawierające podobną zawartość i usuwać je.

Oznaczone zestawy danych są wymagane tylko do celów szkoleniowych i testowych. Po zakończeniu tej fazy algorytm uczenia maszynowego działa na nieoznaczonych wystąpieniach danych. Na przykład, możesz podać algorytmowi prognozowania nowy, nieoznaczony rekord domu, który automatycznie przewidziałby oczekiwaną cenę domu na podstawie danych szkoleniowych.

Jak maszyny uczą się przewidywać

Wyzwaniem związanym z nadzorowanym uczeniem maszynowym jest znalezienie odpowiedniej funkcji predykcyjnej dla konkretnego pytania. Matematycznie wyzwaniem jest znalezienie funkcji wejścia-wyjścia, która pobiera zmienne wejściowe x i zwraca wartość prognozy y . Ta funkcja hipotezy (h θ ) jest wynikiem procesu uczenia. Często funkcja hipotezy jest również nazywana funkcją celu lub funkcji przewidywania .

Gregor Roth

W większości przypadków x reprezentuje punkt wielu danych. W naszym przykładzie może to być dwuwymiarowy punkt danych pojedynczego domu zdefiniowany przez wartość rozmiaru domu i wartość liczby pokoi . Tablica tych wartości jest nazywana wektorem cech . Mając konkretną funkcję celu, można ją wykorzystać do prognozowania dla każdego wektora cech x . Aby przewidzieć cenę pojedynczego domu, możesz wywołać funkcję celu, używając wektora cech {101.0, 3.0} zawierającego wielkość domu i liczbę pokoi:

 // target function h (which is the output of the learn process) Function h = ...; // set the feature vector with house size=101 and number-of-rooms=3 Double[] x = new Double[] { 101.0, 3.0 }; // and predicted the house price (label) double y = h.apply(x); 

Na liście 1 zmienna tablicowa x wartość reprezentuje wektor cech domu. Wartość y zwracana przez funkcję target to przewidywana cena domu.

Wyzwaniem uczenia maszynowego jest zdefiniowanie funkcji docelowej, która będzie działać tak dokładnie, jak to możliwe, dla nieznanych, niewidocznych instancji danych. W uczeniu maszynowym funkcja celu (h θ ) jest czasami nazywana modelem . Ten model jest wynikiem procesu uczenia się.

Gregor Roth

Na podstawie oznaczonych przykładów szkoleniowych algorytm uczenia się szuka struktur lub wzorców w danych szkoleniowych. Na ich podstawie tworzy model, który dobrze uogólnia te dane.

Zazwyczaj proces uczenia się ma charakter eksploracyjny . W większości przypadków proces będzie wykonywany wiele razy przy użyciu różnych odmian algorytmów uczenia się i konfiguracji.

Ostatecznie wszystkie modele zostaną ocenione na podstawie wskaźników wydajności, a najlepszy z nich zostanie wybrany. Model ten zostanie następnie użyty do obliczenia prognoz dla przyszłych nieoznaczonych wystąpień danych.

Regresja liniowa

Aby nauczyć maszynę myśleć, pierwszym krokiem jest wybranie algorytmu uczenia się, którego będziesz używać. Regresja liniowa jest jednym z najprostszych i najpopularniejszych algorytmów uczenia nadzorowanego. Algorytm ten zakłada, że ​​związek między cechami wejściowymi a wyjściową etykietą jest liniowy. Poniższa ogólna funkcja regresji liniowej zwraca przewidywaną wartość, sumując każdy element wektora cech pomnożony przez parametr theta (θ) . Parametry theta są używane w procesie uczenia do dostosowania lub „dostrojenia” funkcji regresji na podstawie danych uczących.

Gregor Roth

W funkcji regresji liniowej parametry theta i parametry funkcji są wyliczane według numeru subskrypcji. Numer subskrypcji wskazuje położenie parametrów theta (θ) i parametrów funkcji (x) w wektorze. Należy zauważyć, że cecha x 0 jest ustalonym terminem stałego przesunięcia z wartością 1 do celów obliczeniowych. W rezultacie indeks funkcji specyficznej dla domeny, takiej jak wielkość domu, będzie zaczynał się od x 1 . Na przykład, jeśli x 1 jest ustawione dla pierwszej wartości wektora cech domu, rozmiaru domu, to x 2 zostanie ustawione dla następnej wartości, liczby pokoi i tak dalej.

Listing 2 przedstawia implementację tej funkcji regresji liniowej w języku Java, przedstawioną matematycznie jako h θ (x). Dla uproszczenia obliczenia są wykonywane przy użyciu typu danych double. W ramach apply()metody oczekuje się, że pierwszy element tablicy został ustawiony na wartość 1.0 poza tą funkcją.

Listing 2. Regresja liniowa w Javie

 public class LinearRegressionFunction implements Function { private final double[] thetaVector; LinearRegressionFunction(double[] thetaVector) { this.thetaVector = Arrays.copyOf(thetaVector, thetaVector.length); } public Double apply(Double[] featureVector) { // for computational reasons the first element has to be 1.0 assert featureVector[0] == 1.0; // simple, sequential implementation double prediction = 0; for (int j = 0; j < thetaVector.length; j++) { prediction += thetaVector[j] * featureVector[j]; } return prediction; } public double[] getThetas() { return Arrays.copyOf(thetaVector, thetaVector.length); } } 

Aby utworzyć nową instancję LinearRegressionFunction, należy ustawić parametr theta. Parametr theta lub wektor służy do dostosowania ogólnej funkcji regresji do podstawowych danych szkoleniowych. Parametry theta programu zostaną dostrojone podczas procesu uczenia się na podstawie przykładów szkoleniowych. Jakość wytrenowanej funkcji celu może być tylko tak dobra, jak jakość danych szkoleniowych.

W poniższym przykładzie LinearRegressionFunctionzostanie utworzona instancja, aby przewidzieć cenę domu na podstawie wielkości domu. Biorąc pod uwagę, że x 0 musi być stałą wartością 1,0, instancja funkcji celu jest tworzona przy użyciu dwóch parametrów theta. Parametry theta są wynikiem procesu uczenia się. Po utworzeniu nowej instancji cena domu o powierzchni 1330 metrów kwadratowych będzie prognozowana następująco:

 // the theta vector used here was output of a train process double[] thetaVector = new double[] { 1.004579, 5.286822 }; LinearRegressionFunction targetFunction = new LinearRegressionFunction(thetaVector); // create the feature vector function with x0=1 (for computational reasons) and x1=house-size Double[] featureVector = new Double[] { 1.0, 1330.0 }; // make the prediction double predictedPrice = targetFunction.apply(featureVector); 

Linia prognozy funkcji docelowej jest pokazana jako niebieska linia na poniższym wykresie. Linia została obliczona przez wykonanie funkcji docelowej dla wszystkich wartości wielkości domu. Wykres zawiera również pary cena-rozmiar używane do treningu.

Gregor Roth

Jak dotąd wykres prognozy wydaje się pasować wystarczająco dobrze. Współrzędne wykresu (punkt przecięcia i nachylenie) są określone przez wektor theta { 1.004579, 5.286822 }. Ale skąd wiesz, że ten wektor theta najlepiej pasuje do twojej aplikacji? Czy funkcja byłaby lepsza, gdybyś zmienił pierwszy lub drugi parametr theta? Aby zidentyfikować najlepiej dopasowany wektor parametrów theta, potrzebna jest funkcja narzędziowa , która oceni, jak dobrze działa funkcja docelowa.

Punktacja funkcji docelowej

W uczeniu maszynowym funkcja kosztu (J (θ)) służy do obliczania średniego błędu lub „kosztu” danej funkcji docelowej.

Gregor Roth