Maschinelles Lernen für Java-Entwickler, Teil 1: Algorithmen für maschinelles Lernen

Selbstfahrende Autos, Gesichtserkennungssoftware und sprachgesteuerte Lautsprecher basieren auf Technologien und Frameworks für maschinelles Lernen - und dies ist nur die erste Welle. In den nächsten zehn Jahren wird eine neue Produktgeneration unsere Welt verändern und neue Ansätze für die Softwareentwicklung sowie für die von uns erstellten und verwendeten Anwendungen und Produkte einleiten.

Als Java-Entwickler möchten Sie dieser Kurve einen Schritt voraus sein, insbesondere weil Tech-Unternehmen anfangen, ernsthaft in maschinelles Lernen zu investieren. Was Sie heute lernen, können Sie in den nächsten fünf Jahren weiter ausbauen, aber Sie müssen irgendwo anfangen.

Mit diesem Artikel können Sie loslegen. Sie beginnen mit einem ersten Eindruck der Funktionsweise des maschinellen Lernens, gefolgt von einer kurzen Anleitung zur Implementierung und Schulung eines Algorithmus für maschinelles Lernen. Nachdem Sie die Interna des Lernalgorithmus und die Funktionen studiert haben, mit denen Sie die am besten passende Vorhersagefunktion trainieren, bewerten und auswählen können, erhalten Sie einen Überblick über die Verwendung eines JVM-Frameworks, Weka, zum Erstellen von Lösungen für maschinelles Lernen. Dieser Artikel konzentriert sich auf überwachtes maschinelles Lernen, das der häufigste Ansatz zur Entwicklung intelligenter Anwendungen ist.

Maschinelles Lernen für Java-Entwickler, Teil 2

Bist du bereit für den nächsten Schritt? Die zweite Hälfte dieses Tutorials zeigt Ihnen, wie Sie Ihre Datenpipeline für maschinelles Lernen entwickeln und bereitstellen.

Maschinelles Lernen und künstliche Intelligenz

Maschinelles Lernen hat sich aus dem Bereich der künstlichen Intelligenz entwickelt, die Maschinen herstellen will, die die menschliche Intelligenz nachahmen können. Obwohl maschinelles Lernen ein aufkommender Trend in der Informatik ist, ist künstliche Intelligenz kein neues wissenschaftliches Gebiet. Der Turing-Test, der Anfang der 1950er Jahre von Alan Turing entwickelt wurde, war einer der ersten Tests, mit denen festgestellt wurde, ob ein Computer über echte Intelligenz verfügen kann. Nach dem Turing-Test könnte ein Computer die menschliche Intelligenz beweisen, indem er einen Menschen dazu bringt, zu glauben, er sei auch ein Mensch.

Viele hochmoderne Ansätze des maschinellen Lernens basieren auf jahrzehntealten Konzepten. Was sich in den letzten zehn Jahren geändert hat, ist, dass Computer (und verteilte Computerplattformen) jetzt über die für Algorithmen für maschinelles Lernen erforderliche Verarbeitungsleistung verfügen. Die meisten Algorithmen für maschinelles Lernen erfordern eine große Anzahl von Matrixmultiplikationen und anderen mathematischen Operationen, die verarbeitet werden müssen. Die Computertechnologie zur Verwaltung dieser Berechnungen gab es noch vor zwei Jahrzehnten nicht, aber heute.

Durch maschinelles Lernen können Programme Qualitätsverbesserungsprozesse ausführen und ihre Fähigkeiten ohne menschliches Eingreifen erweitern. Ein mit maschinellem Lernen erstelltes Programm kann seinen eigenen Code aktualisieren oder erweitern.

Überwachtes Lernen vs. unbeaufsichtigtes Lernen

Betreutes Lernen und unbeaufsichtigtes Lernen sind die beliebtesten Ansätze für maschinelles Lernen. Beide erfordern das Zuführen einer großen Anzahl von Datensätzen, um zu korrelieren und daraus zu lernen. Solche gesammelten Datensätze sind allgemein als Merkmalsvektoren bekannt. Im Fall eines einzelnen Hauses kann ein Merkmalsvektor aus Merkmalen wie der Gesamthausgröße, der Anzahl der Zimmer und dem Alter des Hauses bestehen.

Beim überwachten Lernen wird ein Algorithmus für maschinelles Lernen trainiert, um Fragen im Zusammenhang mit Merkmalsvektoren korrekt zu beantworten. Um einen Algorithmus zu trainieren, wird der Maschine ein Satz von Merkmalsvektoren und ein zugehöriges Etikett zugeführt. Beschriftungen werden normalerweise von einem menschlichen Annotator bereitgestellt und stellen die richtige "Antwort" auf eine bestimmte Frage dar. Der Lernalgorithmus analysiert Merkmalsvektoren und ihre korrekten Bezeichnungen, um interne Strukturen und Beziehungen zwischen ihnen zu finden. Auf diese Weise lernt die Maschine, auf Anfragen richtig zu antworten.

Beispielsweise könnte eine intelligente Immobilienanwendung mit Merkmalsvektoren trainiert werden, einschließlich der Größe, Anzahl der Räume und des jeweiligen Alters für eine Reihe von Häusern. Ein menschlicher Etikettierer würde jedes Haus basierend auf diesen Faktoren mit dem richtigen Hauspreis kennzeichnen. Durch die Analyse dieser Daten würde die Immobilienanwendung geschult, um die Frage zu beantworten: " Wie viel Geld könnte ich für dieses Haus bekommen? "

Nach Abschluss des Trainings werden neue Eingabedaten nicht mehr gekennzeichnet. Das Gerät kann auf Anfragen auch für unsichtbare, unbeschriftete Merkmalsvektoren korrekt reagieren.

Beim unbeaufsichtigten Lernen ist der Algorithmus so programmiert, dass Antworten ohne menschliche Kennzeichnung oder sogar Fragen vorhergesagt werden. Anstatt Labels vorab festzulegen oder die Ergebnisse festzulegen, nutzt unbeaufsichtigtes Lernen massive Datensätze und Verarbeitungsleistung, um bisher unbekannte Korrelationen zu entdecken. Im Marketing von Konsumgütern könnte beispielsweise unbeaufsichtigtes Lernen verwendet werden, um versteckte Beziehungen oder Konsumentengruppen zu identifizieren, was schließlich zu neuen oder verbesserten Marketingstrategien führen kann.

Dieser Artikel konzentriert sich auf überwachtes maschinelles Lernen, das heute der gängigste Ansatz für maschinelles Lernen ist.

Überwachtes maschinelles Lernen

Alles maschinelle Lernen basiert auf Daten. Für ein überwachtes maschinelles Lernprojekt müssen Sie die Daten auf sinnvolle Weise für das gewünschte Ergebnis kennzeichnen. Beachten Sie in Tabelle 1, dass jede Zeile des Hausdatensatzes eine Bezeichnung für "Hauspreis" enthält. Durch die Korrelation von Zeilendaten mit dem Hauspreisetikett kann der Algorithmus schließlich den Marktpreis für ein Haus vorhersagen, das nicht in seinem Datensatz enthalten ist (beachten Sie, dass die Hausgröße auf Quadratmetern und der Hauspreis auf Euro basiert).

Tabelle 1. Hausaufzeichnungen

MERKMAL MERKMAL MERKMAL ETIKETTE
Größe des Hauses Anzahl der Räume Alter des Hauses Geschätzte Hauskosten
90 m2 2 Zimmer 23 Jahre 249.000 €
101 m2 / 331 ft 3 Zimmer n / a 338.000 €
1330 m2 / 4363 ft 11 Zimmer 12 Jahre 6.500.000 €

In einem frühen Stadium werden Sie Datensätze wahrscheinlich von Hand beschriften, aber Sie könnten Ihr Programm eventuell trainieren, um diesen Prozess zu automatisieren. Sie haben dies wahrscheinlich bei E-Mail-Anwendungen gesehen, bei denen das Verschieben von E-Mails in Ihren Spam-Ordner zur Abfrage "Ist das Spam?" Führt. Wenn Sie antworten, trainieren Sie das Programm, um E-Mails zu erkennen, die Sie nicht sehen möchten. Der Spamfilter der Anwendung lernt, zukünftige E-Mails aus derselben Quelle oder mit ähnlichen Inhalten zu kennzeichnen und zu entsorgen.

Beschriftete Datensätze werden nur zu Schulungs- und Testzwecken benötigt. Nach Ablauf dieser Phase arbeitet der Algorithmus für maschinelles Lernen mit unbeschrifteten Dateninstanzen. Zum Beispiel könnten Sie dem Vorhersagealgorithmus einen neuen, unbeschrifteten Hausdatensatz zuführen und er würde automatisch den erwarteten Hauspreis basierend auf Trainingsdaten vorhersagen.

Wie Maschinen vorhersagen lernen

Die Herausforderung des überwachten maschinellen Lernens besteht darin, die richtige Vorhersagefunktion für eine bestimmte Frage zu finden. Mathematisch besteht die Herausforderung darin, die Eingabe-Ausgabe-Funktion zu finden, die die Eingabevariablen x verwendet und den Vorhersagewert y zurückgibt . Diese Hypothesenfunktion (h & thgr; ) ist die Ausgabe des Trainingsprozesses. Oft wird die Hypothesenfunktion auch als Ziel- oder Vorhersagefunktion bezeichnet.

Gregor Roth

In den meisten Fällen steht x für einen Punkt mit mehreren Daten. In unserem Beispiel könnte dies eine zweidimensionale Datenpunkt eines einzelnen Hauses durch das definiert sein Haus-size - Wert und der Anzahl von-Zimmern Wert. Das Array dieser Werte wird als Merkmalsvektor bezeichnet . Bei einer konkreten Zielfunktion kann die Funktion verwendet werden, um eine Vorhersage für jeden Merkmalsvektor x zu erstellen . Um den Preis eines einzelnen Hauses vorherzusagen, können Sie die Zielfunktion mithilfe des Merkmalsvektors {101.0, 3.0} aufrufen, der die Hausgröße und die Anzahl der Räume enthält:

 // 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); 

In Listing 1 repräsentiert der Wert der Arrayvariablen x den Merkmalsvektor des Hauses. Der von der Zielfunktion zurückgegebene y- Wert ist der vorhergesagte Immobilienpreis.

Die Herausforderung des maschinellen Lernens besteht darin, eine Zielfunktion zu definieren, die für unbekannte, unsichtbare Dateninstanzen so genau wie möglich funktioniert. Beim maschinellen Lernen wird die Zielfunktion (h & thgr; ) manchmal als Modell bezeichnet . Dieses Modell ist das Ergebnis des Lernprozesses.

Gregor Roth

Basierend auf beschrifteten Trainingsbeispielen sucht der Lernalgorithmus nach Strukturen oder Mustern in den Trainingsdaten. Daraus ergibt sich ein Modell, das sich gut aus diesen Daten verallgemeinern lässt.

In der Regel ist der Lernprozess explorativ . In den meisten Fällen wird der Prozess mehrmals ausgeführt, indem verschiedene Variationen von Lernalgorithmen und -konfigurationen verwendet werden.

Schließlich werden alle Modelle anhand von Leistungsmetriken bewertet und das beste ausgewählt. Dieses Modell wird dann verwendet, um Vorhersagen für zukünftige unbeschriftete Dateninstanzen zu berechnen.

Lineare Regression

Um eine Maschine zum Denken zu trainieren, müssen Sie zunächst den Lernalgorithmus auswählen, den Sie verwenden. Die lineare Regression ist einer der einfachsten und beliebtesten überwachten Lernalgorithmen. Dieser Algorithmus nimmt an, dass die Beziehung zwischen Eingabemerkmalen und dem ausgegebenen Etikett linear ist. Die folgende generische lineare Regressionsfunktion gibt den vorhergesagten Wert zurück, indem jedes Element des Merkmalsvektors multipliziert mit einem Theta-Parameter (θ) zusammengefasst wird . Die Theta-Parameter werden innerhalb des Trainingsprozesses verwendet, um die Regressionsfunktion basierend auf den Trainingsdaten anzupassen oder "abzustimmen".

Gregor Roth

In the linear regression function, theta parameters and feature parameters are enumerated by a subscription number. The subscription number indicates the position of theta parameters (θ) and feature parameters (x) within the vector. Note that feature x0 is a constant offset term set with the value 1 for computational purposes. As a result, the index of a domain-specific feature such as house-size will start with x1. As an example, if x1 is set for the first value of the House feature vector, house size, then x2 will be set for the next value, number-of-rooms, and so forth.

Listing 2 shows a Java implementation of this linear regression function, shown mathematically as hθ(x). For simplicity, the calculation is done using the data type double. Within the apply() method, it is expected that the first element of the array has been set with a value of 1.0 outside of this function.

Listing 2. Linear regression in Java

 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); } } 

In order to create a new instance of the LinearRegressionFunction, you must set the theta parameter. The theta parameter, or vector, is used to adapt the generic regression function to the underlying training data. The program's theta parameters will be tuned during the learning process, based on training examples. The quality of the trained target function can only be as good as the quality of the given training data.

Im folgenden Beispiel LinearRegressionFunctionwird das instanziiert, um den Hauspreis basierend auf der Hausgröße vorherzusagen. Wenn man bedenkt, dass x 0 ein konstanter Wert von 1,0 sein muss, wird die Zielfunktion unter Verwendung von zwei Theta-Parametern instanziiert. Die Theta-Parameter sind das Ergebnis eines Lernprozesses. Nach dem Erstellen der neuen Instanz wird der Preis eines Hauses mit einer Größe von 1330 Quadratmetern wie folgt vorhergesagt:

 // 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); 

Die Vorhersagelinie der Zielfunktion wird in der folgenden Tabelle als blaue Linie angezeigt. Die Linie wurde berechnet, indem die Zielfunktion für alle Hausgrößenwerte ausgeführt wurde. Die Tabelle enthält auch die Preis-Größen-Paare, die für das Training verwendet werden.

Gregor Roth

Bisher scheint das Vorhersagediagramm gut genug zu passen. Die Graphkoordinaten (Achsenabschnitt und Steigung) werden durch den Theta-Vektor definiert { 1.004579, 5.286822 }. Aber woher wissen Sie, dass dieser Theta-Vektor am besten zu Ihrer Anwendung passt? Würde die Funktion besser passen, wenn Sie den ersten oder zweiten Theta-Parameter ändern würden? Um den am besten passenden Theta-Parametervektor zu identifizieren, benötigen Sie eine Utility-Funktion , mit der bewertet wird, wie gut die Zielfunktion funktioniert.

Bewertung der Zielfunktion

Beim maschinellen Lernen wird eine Kostenfunktion (J (θ)) verwendet, um den mittleren Fehler oder die "Kosten" einer gegebenen Zielfunktion zu berechnen.

Gregor Roth