Zu diesem Buch – sowie zu vielen weiteren dpunkt.büchern – können Sie auch das entsprechende E-Book im PDF-Format herunterladen. Werden Sie dazu einfach Mitglied bei dpunkt.plus+: www.dpunkt.plus |
Von der Python-Codezeile
zur Deep-Learning-Anwendung
Paolo Perrotta
Lektorat: Dr. Michael Barabas
Übersetzung & Satz: G&U Language & Publishing Services GmbH, Flensburg, www.gundu.com
Copy-Editing: Claudia Lötschert, www.richtiger-text.de
Herstellung: Stefanie Weidner
Umschlaggestaltung: Helmut Kraus, www.exclam.de
Bibliografische Information der Deutschen Nationalbibliothek
Die Deutsche Nationalbibliothek verzeichnet diese Publikation in der Deutschen Nationalbibliografie; detaillierte bibliografische Daten sind im Internet über http://dnb.d-nb.de abrufbar.
ISBN:
Print 978-3-86490-787-6
PDF 978-3-96910-025-7
ePub 978-3-96910-026-4
mobi 978-3-96910-027-1
1. Auflage 2020
Translation Copyright für die deutschsprachige Ausgabe © 2020 dpunkt.verlag GmbH
Wieblinger Weg 17
69123 Heidelberg
Original Copyright © 2020 The Pragmatic Programmers, LLC.
All rights reserved. No part of this publication may be reproduced, stored in a retrieval system, or transmitted, in any form, or by any means, electronic, mechanical, photocopying, recording, or otherwise, without the prior consent of the publisher.
Original ISBN: 978-1-68050-660-0
Hinweis:
Dieses Buch wurde auf PEFC-zertifiziertem Papier aus nachhaltiger Waldwirtschaft gedruckt. Der Umwelt zuliebe verzichten wir zusätzlich auf die Einschweißfolie.
Schreiben Sie uns:
Falls Sie Anregungen, Wünsche und Kommentare haben, lassen Sie es uns wissen: hallo@dpunkt.de.
Die vorliegende Publikation ist urheberrechtlich geschützt. Alle Rechte vorbehalten. Die Verwendung der Texte und Abbildungen, auch auszugsweise, ist ohne die schriftliche Zustimmung des Verlags urheberrechtswidrig und daher strafbar. Dies gilt insbesondere für die Vervielfältigung, Übersetzung oder die Verwendung in elektronischen Systemen.
Es wird darauf hingewiesen, dass die im Buch verwendeten Soft- und Hardware-Bezeichnungen sowie Markennamen und Produktbezeichnungen der jeweiligen Firmen im Allgemeinen warenzeichen-, marken- oder patentrechtlichem Schutz unterliegen.
Alle Angaben und Programme in diesem Buch wurden mit größter Sorgfalt kontrolliert. Weder Autor noch Verlag noch Übersetzer können jedoch für Schäden haftbar gemacht werden, die in Zusammenhang mit der Verwendung dieses Buches stehen.
5 4 3 2 1 0
Danksagung
Wie um alles in der Welt ist so etwas möglich?
Über dieses Buch
Bevor wir beginnen
Teil 1Von null auf Bilderkennung
1 Einführung in Machine Learning
Programmierung und Machine Learning im Vergleich
Überwachtes Lernen
Die Mathematik hinter dem Zaubertrick
Das System einrichten
2 Ihr erstes ML-Programm
Die Aufgabenstellung
Pizzavorhersage mit überwachtem Lernen
Zusammenhänge in den Daten erkennen
Eine lineare Regression programmieren
Das Modell definieren
Eine Vorhersage treffen
Das Training implementieren
Los geht’s!
Bias hinzufügen
Zusammenfassung
Praktische Übung: Die Lernrate optimieren
3 Am Gradienten entlang
Unser Algorithmus bringt es nicht
Das Gradientenverfahren
Ein wenig Mathematik
Abwärts
Die dritte Dimension
Partielle Ableitung
Die Probe aufs Exempel
Probleme beim Gradientenverfahren
Zusammenfassung
Praktische Übung: Über das Ziel hinaus
4 Hyperräume
Noch mehr Dimensionen
Matrizenrechnung
Matrizen multiplizieren
Matrizen transponieren
Das ML-Programm erweitern
Die Daten aufbereiten
Die Vorhersagefunktion anpassen
Die Verlustfunktion anpassen
Die Gradientenfunktion anpassen
Der Code im Ganzen
Bye-bye, Bias!
Ein letzter Testlauf
Zusammenfassung
Praktische Übung: Statistik in der Praxis
5 Ein binärer Klassifizierer
Grenzen der linearen Regression
Invasion der Sigmoiden
Konfidenz
Glätten
Den Gradienten anpassen
Was ist mit der Modellfunktion geschehen?
Klassifizierung in Aktion
Zusammenfassung
Praktische Übung: Gewichtige Entscheidungen
6 Eine Aufgabe aus der Praxis
Die Daten
MNIST
Trainings- und Testdatensatz
Unsere eigene MNIST-Bibliothek
Die Eingabematrizen vorbereiten
Die Daten aufbereiten
Anwendung in der Praxis
Zusammenfassung
Praktische Übung: Knifflige Ziffern
7 Die große Herausforderung
Von zwei zu mehr Klassen
1-aus-n-Codierung
1-aus-n-Codierung in Aktion
Die Antworten des Klassifizierers decodieren
Mehr Gewichte
Die Matrixdimensionen überprüfen
Der Augenblick der Wahrheit
Zusammenfassung
Praktische Übung: Minensucher
8 Das Perzeptron
Gestatten, das Perzeptron!
Perzeptrone kombinieren
Die Grenzen von Perzeptronen
Linear separierbare Daten
Nicht linear separierbare Daten
Die Geschichte des Perzeptrons
Der entscheidende Schlag
Nachwehen
Teil 2Neuronale Netze
9 Das Netz entwerfen
Ein neuronales Netz aus Perzeptronen zusammenstellen
Perzeptrone verketten
Wie viele Knoten?
Die Softmax-Funktion
Der Entwurf
Zusammenfassung
Praktische Übung: Auf eigene Faust
10 Das Netz erstellen
Die Forward-Propagation programmieren
Die Softmax-Funktion schreiben
Die Klassifizierungsfunktionen schreiben
Kreuzentropie
Zusammenfassung
Praktische Übung: Test durch Zeitreise
11 Das Netz trainieren
Wozu Backpropagation?
Von der Kettenregel zur Backpropagation
Die Kettenregel in einem einfachen Netz
Es wird komplizierter
Backpropagation anwenden
Auf Kurs bleiben
Den Gradienten von w2 berechnen
Den Gradienten von w1 berechnen
Die Funktion back() erstellen
Die Gewichte initialisieren
Gefährliche Symmetrie
Tote Neuronen
Korrekte Gewichtsinitialisierung
Das fertige neuronale Netz
Zusammenfassung
Praktische Übung: Fehlstart
12 Funktionsweise von Klassifizierern
Eine Entscheidungsgrenze einzeichnen
Heimspiel für das Perzeptron
Klassifizierung verstehen
Eine Gerade reicht nicht aus
Die Entscheidungsgrenze krümmen
Zusammenfassung
Praktische Übung: Albtraumdaten
13 Das Mini-Batch-Verfahren
Der Lernvorgang grafisch dargestellt
Batch für Batch
Batches erstellen
Training mit Batches
Was geschieht bei verschiedenen Batchgrößen?
Ein Zickzackpfad
Große und kleine Batches
Vor- und Nachteile von Batches
Zusammenfassung
Praktische Übung: Das kleinste Batch
14 Die Kunst des Testens
Die Gefahr der Überanpassung
Das Problem mit dem Testdatensatz
Zusammenfassung
Praktische Übung: Überlegungen zum Testen
15 Entwicklung
Daten aufbereiten
Den Wertebereich der Eingabevariablen prüfen
Eingabevariablen standardisieren
Standardisierung in der Praxis
Die Hyperparameter anpassen
Die Anzahl der Epochen festlegen
Die Anzahl der verdeckten Knoten einstellen
Die Lernrate einstellen
Die Batchgröße festlegen
Der Abschlusstest
Auf dem Weg zu 99 %
Praktische Übung: 99 % erreichen
Zusammenfassung und Vorschau
Teil 3Deep Learning
16 Tiefere Netze
Der Echidna-Datensatz
Neuronale Netze mit Keras erstellen
Den Aufbau des Netzes planen und der erste Code
Die Daten laden
Das Modell erstellen
Das Modell kompilieren
Das Netz trainieren
Die Entscheidungsgrenze einzeichnen
Das Netz ausführen
Ein tieferes Netz
Zusammenfassung
Praktische Übung: Keras-Spielwiese
17 Überanpassung vermeiden
Was ist Überanpassung?
Ursachen der Überanpassung
Unteranpassung
Das Modell regularisieren
Eine Untersuchung unseres tiefen Netzes
L1- und L2-Regularisierung
Weitere Möglichkeiten zur Regularisierung
Zusammenfassung
Praktische Übung: Weitere Regularisierungstechniken
18 Tiefe Netze zähmen
Aktivierungsfunktionen
Wozu Aktivierungsfunktionen gut sind
Die sigmoide Aktivierungsfunktion und ihre Auswirkungen
Verschwindender Gradient
Alternativen zur Sigmoidfunktion
Gestatten, die ReLU-Aktivierungsfunktion
Die richtige Funktion auswählen
Weitere Techniken
Bessere Gewichtsinitialisierung
Gradientenabstieg auf Speed
Regularisierung für Fortgeschrittene
Batchnormalisierung
Zusammenfassung
Praktische Übung: Die 10-Epochen-Aufgabe
19 Jenseits von Standardnetzen
Der CIFAR-10-Datensatz
Was ist CIFAR-10?
Das CIFAR-Waterloo
Die Bausteine von Faltungsnetzen
Ein Bild ist ein Bild
Faltung
Konvolutionsschichten
Ein Faltungsnetz ausführen
Zusammenfassung
Praktische Übung: Massenweise Hyperparameter
20 Der Weg in die Tiefe
Der Aufstieg des Deep Learning
Es braut sich etwas zusammen
Der Wendepunkt
Fortsetzung folgt
Unverhältnismäßige Effektivität
Was nun?
Maschinelles Sehen
Sprache
Bildgenerierung
Das Gesamtbild
Praktischer Einstieg
Sie sind am Zug
Anhang
A Grundlagen von Python
Wie sieht Python-Code aus?
Dynamische Typisierung
Einrückungen
Die Bausteine von Python
Datentypen und Operatoren
Datenstrukturen
Strings
Schleifen
Funktionen definieren und aufrufen
Schlüsselwortargumente
Standardargumente
Module und Pakete
Module definieren und importieren
Das __main__-Idiom
Pakete verwalten
Objekte erstellen und verwenden
Das war’s
B Wörterbuch des Machine Learning
Stichwortverzeichnis
Für meine Frau.
Na, wie klingt das, Irene?
Danksagung
Ein besonderes Dankeschön gilt meinen Fachgutachtern: Alessandro Bahgat, Arno Bastenhof, Roberto Bettazzoni, Guido »Zen« Bolognesi, Juan de Bravo, Simone Busoli, Pieter Buteneers, Andrea Cisternino, Sebastian Hennebrüder, Alberto Lumbreras, Russ Olsen, Luca Ongaro, Pierpaolo Pantone, Karol Przystalski, Dan Sheikh, Leonie Sieger, Gal Tsubery, l’ùmarèin pugnàtta di Casalecchio und Giancarlo Valente. Ich schulde euch eine ganze Menge! Ja, unter anderem auch ein Bier!
Vielen Dank auch den großzügigen Lesern, die mir in der Betaphase Kommentare und Errata geschickt haben: Marco Arena, Glen Aultman-Bettridge, Zbynek Bazanowski, Jamis Buck, Charles de Bueger, Leonardo Carotti, Helge Eichhorn, George Ellis, Bruno Girin, Elton Goci, Dave Halliday, Darren Hunt, Peter Lin, Karen Mauney, Bradley Mirly, Vasileios Ntarlagiannis, Volkmar Petschnig, David Pinto, Conlan Rios, Roman Romanchuk, Ionut Simion, Drew Thomas und Jeroen Wenting. Sollten wir uns mal auf einer Konferenz begegnen, dann sprecht mich ruhig an!
Danke auch an Annamaria Di Sebastiano, die mir die Geschichte vom Anfang des ersten Kapitels erzählt hat. Lange nicht mehr gesehen!
Des Weiteren danke ich Marc Schnierle für seine hervorragende Web-App LaTeX4technics1, mit der ich die Formeln erstellt habe; Kimberly Geswein für die Gestaltung der Schriftart Indie Flower, die ich in den Diagrammen verwendet habe; den Designern der in der Originalausgabe ausgiebig verwendeten Schriftarten DejaVu Sans und DejaVu Sans Mono; und dem Stadtrat von Brisbane für die Veröffentlichung des Fotos mit dem Ameisenigel2, das in leicht veränderter Form in einem der späteren Kapitel auftaucht.
Dieses Buch ging durch die Hände von drei hervorragenden Lektorinnen. Vielen Dank an Meghan Blanchette und Susan Conant, die mich von den ersten Entwürfen bis zur Mitte des Buchs brachten. Entschuldigt bitte, wenn ich hier noch Unterschiede mache, aber mein besonderer Dank gilt Katherine Dvorak für die unglaubliche Arbeit, die sie in dieses Buch investiert hat, und ihre feste, aber immer geduldige Führung. Du bist eine erstaunliche Lektorin, Katie.
Vielen Dank auch an Dad, Mom, Anna und Susanna sowie an meine erweiterte Familie von Freunden und Verwandten, die weit verstreut rund um die Welt leben. Es ist mir immer eine große Freude, euch um mich zu haben.
Und schließlich danke ich meiner Frau Irene: Du warst da, als ich mit dem Schreiben begann, und hast mich in diesem rauen Sommer sehr unterstützt. Jetzt, da das Buch in den Druck geht, bist du immer noch da, unerschütterlich und unbeirrbar. Ich verdanke dir alles. Dieses Buch ist dir gewidmet.
Wie um alles in der Welt ist so etwas möglich?
Machine Learning kann wie Zauberei wirken. Wie kann ein Computer die Objekte in einem Bild erkennen? Wie kann ein Auto selbstständig fahren?
Diese Leistungen sind nicht nur für Laien verblüffend, sondern auch für viele Softwareentwickler wie Sie und mich. Obwohl ich schon viele Jahre lang Code schrieb, war es mir völlig unklar, wie Machine Learning überhaupt funktionieren konnte. Während ich ein bisschen mit den neuesten Web-Frameworks herumbastelte, schrieben andere Leute faszinierende Software, die wie Science-Fiction wirkte und die ich einfach nicht fassen konnte.
Ich wollte mitmachen. Ich wollte selbst in der Lage sein, solche Dinge zu tun.
Da ich schon wusste, wie man Software schreibt, glaubte ich, ich könnte Machine Learning schnell begreifen. Wie schwer konnte das auch schon sein? Also setzte ich ein zuversichtliches Lächeln auf und widmete mich dem Studium dieses Themas. Mein zuversichtliches Lächeln gefror, als ich gegen ganze Batterien von Wänden anrannte.
Für Entwickler wie mich fühlt sich Machine Learning fremdartig an. Diese Disziplin quillt über von mathematischer Terminologie, akademischen Konventionen und, mal ganz ehrlich gesagt, schlechtem Code. Anstatt auf Tutorials werden Sie auf Vorträge und Forschungsberichte verwiesen. Für viele von uns ist Machine Learning ebenso einschüchternd wie faszinierend.
Dieses Buch ist das, was ich selbst gut hätte gebrauchen können, als ich mich mit Machine Learning zu befassen begann: eine Einführung, die sich an Entwickler richtet und in unserer Sprache geschrieben ist. Nach der Lektüre werden Sie mit den Grundlagen vertraut und in der Lage sein, Machine-Learning-Programme zu schreiben. Höchstwahrscheinlich werden Sie dann zwar immer noch nicht ihr eigenes selbstfahrendes Auto konstruieren können, aber zumindest werden Sie wissen, wie um alles in der Welt so etwas möglich ist.
Über dieses Buch
Dies ist ein Buch für Entwicklerinnen und Programmierer, die Machine Learning von der Pike auf lernen wollen.
Machine Learning ist ein sehr breit gefächertes Gebiet, das sich in einem einzelnen Buch nicht vollständig abhandeln lässt. Der Schwerpunkt liegt hier daher auf den drei Aspekten des Machine Learning, die heutzutage als die wichtigsten gelten: auf überwachtem Lernen, neuronalen Netzen und Deep Learning. Was es mit diesen Begriffen auf sich hat, werden wir uns im Verlauf dieses Buchs noch ansehen, aber für den Anfang finden Sie hier schon einmal eine Skizze sowie einige Definitionen in Kurzfassung:
Die Wirklichkeit ist natürlich nicht so sauber geordnet, wie unser Bild anzudeuten scheint. Beispielsweise kommen neuronale Netze nicht nur beim überwachten Lernen, sondern auch auf anderen Gebieten des Machine Learning zum Einsatz. Allerdings bildet dieses Diagramm einen guten Ausgangspunkt, um ein Gefühl für die einzelnen Themen in diesem Buch und ihre Beziehungen zueinander zu gewinnen.
Bevor wir beginnen
Dieses Buch macht Sie nicht über Nacht zu einem Machine-Learning-Profi, aber es kann Ihnen ein anschauliches, praktisches Verständnis dafür vermitteln, wie Machine Learning funktioniert. Ich will Ihnen einen Blick hinter die Kulissen dieser Disziplin gewähren, Ihnen die verborgenen Mechanismen zeigen und den Schleier des Geheimnisvollen lüften. Wenn Sie erst einmal die Grundprinzipien des Machine Learning kennen, ist es für Sie einfacher, selbst weiter nachzuforschen, diese Techniken in Ihre Berufspraxis einfließen zu ließen und vielleicht sogar eine Karriere als ML-Ingenieur einzuschlagen.
Sie müssen kein erfahrener Entwickler sein, um dieses Buch verstehen zu können. Allerdings sollten Sie schon damit vertraut sein, kurze Programme zu schreiben. Wenn Sie Python kennen, dann umso besser, denn das ist die Sprache, die ich hier durchgängig verwende. Wenn nicht, ist das jedoch auch kein Beinbruch. Die Sprache ist sehr benutzerfreundlich, und der Code in diesem Buch ist nicht kompliziert. Zur Einführung können Sie Anhang A, »Grundlagen von Python«, lesen, und wenn Sie nicht mehr weiterwissen, finden Sie im Internet weitere Informationen.
Mit Machine Learning ist eine Menge Mathematik verbunden. Ich werde sie nicht vereinfachen, aber so anschaulich darstellen wie möglich. Für das Verständnis dieses Buchs brauchen Sie schon etwas Oberstufenmathematik. Ich gehe davon aus, dass Sie mit kartesischen Koordinatensystemen vertraut sind, wissen, was Achsen und ein Ursprung sind, und etwas mit einem Funktionsgraphen anfangen können. Darüber hinaus brauchen Sie nicht viel mathematisches Fachwissen. Sie können auch versuchen, das Buch zu lesen, wenn Sie glauben, ganz furchtbar schlecht in Mathe zu sein – aber bereiten Sie sich in diesem Fall schon einmal darauf vor, dass es vielleicht doch nicht möglich ist.
Wenn Sie sich dagegen mit linearer Algebra und Analysis gut auskennen, werden Ihnen einige der mathematischen Aspekte wahrscheinlich selbstverständlich erscheinen. In diesem Fall können Sie die Erklärungen, die Sie nicht brauchen, natürlich auch gern überspringen.
Mathematischer Hintergrund
Eine anschauliche Darstellung von mathematischen Dingen ist immer sehr hilfreich, aber manchmal sind auch formalere Erklärungen sinnvoll. Wenn Sie bei der einen oder anderen Formel den Faden verlieren oder wenn Ihnen Mathematik liegt und Sie gern mehr über ein Thema erfahren wollen, dann schauen Sie sich die Kästen mit dem Titel »Mathematischer Hintergrund« an. Darin weise ich Sie auf die Mathematiklektionen der hervorragenden Khan Academy1 hin. Dort werden Sie etwas Passendes für sich finden, wie gut oder schlecht Ihre Vorkenntnisse in Mathematik auch immer sein mögen.
Um es ganz klar zu sagen: Diese zusätzlichen Lektionen sind optional. Es ist nicht erforderlich, sie sich anzusehen, um dieses Buch verstehen zu können. Sie dienen lediglich dazu, Ihre Kenntnisse über die Mathematik des Machine Learning zu vertiefen.
Machine Learning bringt seine eigene umfangreiche und besondere Terminologie mit. Sie werden daher wahrscheinlich auf neue Wörter und auf neue Bedeutungen bekannter Wörter stoßen. Gehen Sie es ruhig an. Sie müssen sich nicht sofort alles merken. Im Zweifelsfall können Sie immer in Anhang B, »Wörterbuch des Machine Learning«, nachschlagen.
Viele der Datenmengen, die ich als Beispiele verwende, bestehen aus Bildern. Mit Machine Learning können Sie jedoch mehr tun, als nur Bilder zu erkennen: Sie können Text analysieren, Musik generieren und sogar Unterhaltungen führen. Allerdings eignet sich gerade die Bilderkennung für anschauliche Beispiele, weshalb ich diese Disziplin im ganzen Buch als Standardanwendung benutze.
Es gibt auch einige Onlineressourcen, die Sie kennen sollten. Eine davon ist die offizielle Webseite2 zur Originalausgabe dieses Buchs auf Pragmatic Bookshelf. Von dort können Sie auch den Quellcode der Beispiele herunterladen.
Verweise auf ProgML sind auf diese Weise gestaltet.
Des Weiteren gibt es zu diesem Buch eine Begleitwebsite namens ProgML3. Sie enthält (in englischer Sprache) einige zusätzliche Erklärungen und Einzelheiten, die nicht mehr in dieses Buch passten. An den entsprechenden Stellen im Text habe ich Verweise darauf angegeben.
Genug der Vorrede – legen wir nun los mit Teil I!
Teil 1
Von null auf Bilderkennung
Dieser Teil gibt eine Einführung in überwachtes Lernen. Innerhalb von nur zwei Kapiteln werden wir ein erstes Machine-Learning-System programmieren, das wir anschließend Schritt für Schritt weiterentwickeln, bis es leistungsfähig genug ist, um handgeschriebene Ziffern zu erkennen.
Ja, Sie haben richtig gelesen: Auf den nächsten etwa 100 Seiten werden wir ein Programm zur Bilderkennung schreiben. Was noch besser ist: Wir werden dazu keine Machine-Learning-Bibliothek verwenden. Abgesehen von einigen Allzweckfunktionen für arithmetische Berechnungen und grafische Darstellung schreiben wir den ganzen Code selbst.
Es ist sehr unwahrscheinlich, dass Sie in Ihrer zukünftigen Karriere jemals Machine-Learning-Algorithmen von Grund auf selbst schreiben müssen. Aber es einmal zu tun, um die Grundlagen richtig zu verstehen, ist von unschätzbarem Wert. Sie werden genau wissen, was jede einzelne Zeile des fertigen Programms tut. Danach wird Machine Learning für Sie nie wieder wie schwarze Magie wirken.
1
Einführung in Machine Learning
Softwareentwickler erzählen sich gern Veteranengeschichten. Sobald ein paar von uns in einer Kneipe zusammensitzen, fragt einer: »An was für Projekten arbeitet ihr gerade?« Dann nicken wir heftig und hören uns die amüsanten und teilweise furchtbaren Geschichten der anderen an.
Bei einem dieser abendlichen Geplänkel Mitte der 90er erzählte mir eine Freundin von dem unmöglichen Auftrag, an dem sie gerade arbeitete. Ihre Vorgesetzten wünschten sich von ihr ein Programm, das Röntgenaufnahmen analysieren und dadurch Krankheiten erkennen konnte, etwa eine Lungenentzündung.
Meine Freundin warnte die Geschäftsleitung vor, dass das ein hoffnungsloses Unterfangen sei, aber man wollte ihr nicht glauben. Wenn ein Radiologe das leisten konnte, so argumentierten die Manager, warum dann nicht auch ein Visual-Basic-Programm? Sie stellten ihr sogar einen Radiologen zur Seite, damit sie lernte, wie er vorging, und dies in Code umsetzen konnte. Diese Erfahrung bestärkte sie jedoch nur in ihrer Meinung, dass Radiologie menschliches Urteilsvermögen und menschliche Intelligenz erforderte.
Wir lachten über die Sinnlosigkeit dieser Aufgabe. Ein paar Monate später wurde das Projekt aufgegeben.
Doch kehren wir nun in die Gegenwart zurück. 2017 veröffentlichte ein Forschungsteam der Stanford University einen Algorithmus, um Lungenentzündung anhand von Röntgenbildern zu erkennen.1 Er erfüllte nicht nur seine Aufgabe, sondern war sogar zuverlässiger als ein professioneller Radiologe. Das hatte als unmöglich gegolten. Wie hatten die Forscher es geschafft, diesen Code zu schreiben?
Die Antwort lautet: gar nicht. Anstatt Code zu schreiben, setzten sie Machine Learning ein. Sehen wir uns an, was das bedeutet.
Programmierung und Machine Learning im Vergleich
Das folgende Beispiel zeigt den Unterschied zwischen Machine Learning (oder kurz ML) und gewöhnlicher Programmierung. Stellen Sie sich vor, Sie sollen ein Programm erstellen, das Videospiele spielt. Bei der traditionellen Programmierung würden Sie dazu Code wie den folgenden schreiben:
enemy = get_nearest_enemy()
if enemy.distance() < 100:
decelerate()
if enemy.is_shooting():
raise_shield()
else:
if health() > 0.25:
shoot()
else:
rotate_away_from(enemy)
else:
# ... und noch viel mehr Code
Und so weiter. Der Großteil des Codes würde aus einer Riesenmenge von if... else-Anweisungen vermischt mit Befehlen wie shoot() bestehen.
Moderne Sprachen bieten uns zwar Möglichkeiten, diese hässlichen, verschachtelten if-Anweisungen durch angenehmere Konstruktionen wie Polymorphismus, Mustererkennung oder ereignisgestützte Aufrufe zu ersetzen, aber das Grundprinzip der Programmierung bleibt unverändert: Sie sagen dem Computer, wonach er Ausschau halten und was er tun soll. Dabei müssen Sie jede mögliche Bedingung aufführen und jede mögliche Aktion definieren.
Mit dieser Vorgehensweise sind wir weit gekommen, aber sie hat auch einige Nachteile. Erstens dürfen Sie nichts auslassen. Wahrscheinlich können Sie sich Dutzende oder gar Hunderte von besonderen Situationen vorstellen, die Sie in dem Videospielprogramm berücksichtigen müssen. Was geschieht, wenn sich ein Gegner nähert, sich aber ein Power-up zwischen Ihnen und ihm befindet, das Sie vor seinen Schüssen schützen kann? Ein menschlicher Spieler wird eine solche Situation schnell erkennen und zu seinem Vorteil nutzen. Kann ein Programm das auch? Das hängt ganz von dem Programm ab. Wenn Sie diesen Sonderfall beim Schreiben des Codes berücksichtigt haben, dann kann das Programm damit umgehen. Allerdings wissen wir, wie schwer es ist, selbst in so eng umrissenen Aufgabenfeldern wie der Buchhaltung jegliche Sonderfälle abzudecken. Wenn Sie sämtliche Sonderfälle auf so komplexen Gebieten wie dem Spielen von Videospielen, dem Fahren eines Lkw oder dem Erkennen eines Bilds auflisten wollen, kann ich Ihnen dazu nur viel Glück wünschen.
Es reicht aber nicht nur, all diese Fälle aufzulisten; Sie müssen auch wissen, wie Sie dabei jeweils eine Entscheidung fällen. Das ist die zweite große Einschränkung bei der Programmierung, die in manchen Fachgebieten schon das Aus bedeutet. Betrachten Sie zum Beispiel eine Aufgabe aus dem Bereich des maschinellen Sehens wie das bereits erwähnte Erkennen einer Lungenentzündung anhand einer Röntgenaufnahme.
Wir wissen nicht genau, wie ein Radiologe eine Lungenentzündung erkennt. Wir haben zwar eine grobe Vorstellung davon, dass er nach undurchsichtigen Bereichen sucht, aber wir wissen nicht, wie sein Gehirn solche undurchsichtigen Bereiche erkennt und bewertet. Manchmal kann ein solcher Experte selbst nicht erklären, wie er zu der Diagnose gekommen ist, sondern nur vage Begründungen geben wie: »Ich weiß aus Erfahrung, dass eine Lungenentzündung nicht so aussieht.« Da wir nicht wissen, wie solche Entscheidungen ablaufen, können wir einen Computer auch nicht anweisen, sie zu fällen. Dieses Problem stellt sich bei allen typisch menschlichen Aufgaben, etwa dem Verkosten von Bier oder dem Verstehen eines Satzes.
Machine Learning dagegen stellt das Prinzip der traditionellen Programmierung auf den Kopf: Der Computer erhält keine Anweisungen, sondern Daten, und wird aufgefordert, selbst herauszufinden, was er tun soll.
Dass der Computer selbst etwas herausfinden soll, klingt wie Wunschdenken. Allerdings gibt es tatsächlich einige Möglichkeiten, um das zu erreichen. Für alle diese Vorgehensweisen ist nach wie vor die Ausführung von Code erforderlich, allerdings ist dieser Code im Gegensatz zur herkömmlichen Programmierung keine schrittweise Anleitung, um das vorliegende Problem zu lösen. Beim Machine Learning teilt der Code dem Computer mit, wie er die Daten verarbeiten soll, um das Problem selbst zu lösen.
Betrachten wir als Beispiel wieder einen Computer, der herausfinden soll, wie man ein Videospiel spielt. Stellen Sie sich einen Algorithmus vor, der durch Versuch und Irrtum zu spielen lernt. Zu Anfang gibt er zufällige Befehle: schießen, bremsen, drehen usw. Er merkt sich, wann die Befehle zum Erfolg führen, etwa zu einem höheren Punktestand, aber auch, wann sie in einem Fehlschlag wie dem Tod der Spielfigur resultieren. Außerdem registriert er den Spielzustand: wo sich die Gegner, die Hindernisse und die Power-ups befinden, wie viele Gesundheitspunkte die Figur hat usw.
Wenn der Algorithmus später einem ähnlichen Spielzustand begegnet, wird er mit höherer Wahrscheinlichkeit erfolgreiche Aktionen durchführen. Eine Vielzahl solcher Trial-and-Error-Durchläufe kann aus dem Programm einen fähigen Spieler machen. Mit dieser Vorgehensweise erreichte ein System im Jahr 2013 geradezu übermenschliche Fähigkeiten bei einer Reihe alter Atari-Spiele.2
Diese Form von ML wird als bestärkendes Lernen oder Reinforcement Learning bezeichnet. Es funktioniert fast genauso wie Hundetraining: »Gutes« Verhalten wird belohnt, sodass der Hund es häufiger an den Tag legt. (Ich habe das auch mit meiner Katze versucht, aber bislang ohne Erfolg.)
Reinforcement Learning ist jedoch nur eine Möglichkeit, mit der ein Computer die Lösung eines Problems herausfinden kann. Der Schwerpunkt dieses Buchs liegt dagegen auf einer anderen Form von Machine Learning, nämlich der wahrscheinlich am häufigsten verwendeten. Sehen wir uns das genauer an.
Überwachtes Lernen
Unter den verschiedenen Ansätzen des ML hat das überwachte Lernen (Supervised Learning) bisher die beeindruckendsten Ergebnisse hervorgebracht. Damit lassen sich auch Aufgaben wie die Diagnose einer Lungenentzündung lösen.
Ausgangspunkt des überwachten Lernens ist eine Reihe von Beispielen, die jeweils mit Labels versehen sind, aus denen der Computer etwas lernen kann:
Zweck |
Beispiel |
Label |
Ein System, das aus dem Bellen eines Hundes die Hunderasse bestimmt |
.wav-Datei mit Hundegebell |
Die Hunderasse, also etwa »Windhund«, »Beagle« usw. |
Ein System, das eine Lungenentzündung erkennen kann |
Röntgenaufnahme |
Ein boolesches Flag: 1, wenn die Aufnahme eine Lungenentzündung zeigt, anderenfalls 0 |
Ein System, das die Einnahmen einer Eisdiele anhand des Wetters vorhersagt |
Aufgezeichnete Temperaturen an einem vergangenen Tag |
Die aufgezeichneten Einnahmen an diesem Tag |
Ein System, das erkennt, welche Stimmung der Tweet eines Politikers vermittelt |
Ein Tweet |
Eine Stimmung wie »entrüstet«, »verärgert« oder »wütend« |
Wie Sie sehen, können als Beispiele viele verschiedene Dinge genutzt werden: Daten, Text, Klänge, Videos usw. Es gibt auch zwei Arten von Labels: Numerische Labels sind einfach nur Zahlen, wie es etwa bei dem Temperatur- Eisdielenumsätze-Umrechner der Fall ist. Kategorielabels dagegen stehen wie bei dem Hunderassendetektor für eine Kategorie (oder Klasse) aus einer vordefinierten Menge. Wenn Sie Ihre Fantasie spielen lassen, werden Ihnen noch viele weitere Möglichkeiten einfallen, um etwas – seien es Zahlen oder Kategorien – aus etwas anderem zu bestimmen.
Nehmen wir an, dass wir bereits eine Reihe solcher Beispiele mit Labels zusammengestellt haben. Daran schließen sich nun die beiden folgenden Phasen des überwachten Lernens an:
Auch das folgende System zur Erkennung von Tierarten ist ein Beispiel für überwachtes Lernen. Hier sind die einzelnen Eingaben die Bilder von Tieren mit der Angabe der Art als Label. In der Trainingsphase zeigen wir dem Algorithmus Bilder mit Labels und in der Vorhersagephase Bilder ohne Labels, wobei der Algorithmus die Labels rät:
Ich habe bereits gesagt, dass der Computer beim Machine Learning etwas aus den Daten »herausfindet«. Das überwachte Lernen ist ein Beispiel eines solchen Vorgangs. Bei der herkömmlichen Programmierung führen Sie den Computer mit Ihrem Code von der Eingabe zur Ausgabe. Beim überwachten Lernen dagegen stellen Sie dem Computer Beispiele von Ein- und Ausgaben zur Verfügung, anhand derer er selbst herausfindet, wie er von den einen zu den anderen kommt.
Möglicherweise hat dieser grobe Überblick über das überwachte Lernen mehr Fragen aufgeworfen als beantwortet. Wir haben gesagt, dass ein Programm zum überwachten Lernen Muster und gemeinsame Merkmale in den Daten »erkennt«. Aber wie macht es das? Schauen wir uns also genauer an, wie dieses Zauberkunststück tatsächlich funktioniert.
Die Mathematik hinter dem Zaubertrick
Um die Beziehung zwischen Daten und ihren Labels zu erkennen, nutzt ein System zum überwachten Lernen das mathematische Prinzip der Näherungsfunktion aus. Sehen wir uns an einem konkreten Beispiel an, was das bedeutet.
Nehmen wir an, Sie haben eine Solaranlage auf Ihrem Dach und wollen ein System zum überwachten Lernen konstruieren, das lernt, in welchem Maße diese Anlage Energie erzeugt, und die in Zukunft generierten Energiemengen vorhersagen kann.
Der Ertrag einer Solaranlage hängt von verschiedenen Variablen ab, darunter der Tageszeit, dem Wetter usw. Besonders wichtig scheint die Tageszeit zu sein, weshalb Sie sich darauf konzentrieren. In der typischen Vorgehensweise für überwachtes Lernen sammeln Sie Beispiele für die an verschiedenen Tageszeiten produzierte Energie. Nach einigen Wochen, in denen Sie zufällige Stichproben aufgenommen haben, liegt Ihnen die folgende Tabelle vor:
Uhrzeit |
Energie (Wattstunden) |
09:01 |
153 |
11:48 |
280 |
05:20 |
0 |
... usw.
Jede Zeile dieser Tabelle ist ein Beispiel, das jeweils aus einer Eingabevariablen (der Uhrzeit) und einem Label (der produzierten Energie) besteht. Das ist genauso wie bei dem System zum Erkennen von Tieren, bei denen ein Bild als Eingabe diente und der Name des Tiers als Label angegeben wurde.
Wenn Sie die Beispiele wie folgt in ein Diagramm einzeichnen, können Sie unmittelbar ablesen, in welchem Zusammenhang die Uhrzeit zur produzierten Energie steht:
Unser menschliches Gehirn erkennt auf den ersten Blick, dass die Solaranlage nachts keine Energie produziert und dass der Ertrag um die Mittagszeit einen Spitzenwert annimmt. Einem System zum überwachten Lernen fehlt eine Luxuseinrichtung wie unser Gehirn, allerdings kann es die Daten verstehen, indem es sie durch eine Funktion annähert, wie Sie im folgenden Diagramm sehen:
Die passende Näherungsfunktion zu den Beispielen zu finden, ist der schwierige Teil. Dies ist, was ich früher als »Trainingsphase« bezeichnet habe. Die anschließende Vorhersagephase dagegen ist einfach: Das System kümmert sich dann nicht mehr um die Beispiele, sondern nutzt die Funktion, um die von der Solaranlage produzierte Energie vorherzusagen, etwa zur Mittagszeit an beliebigen Tagen:
Das war es, was ich weiter vorn mit der Aussage meinte, beim überwachten Lernen werde das Prinzip der Näherungsfunktion genutzt: Das System erhält reale Daten, die gemeinhin unsauber und unvollständig sind. In der Trainingsphase nähert es diese komplizierten Daten durch eine relativ einfache Funktion an, die es dann in der Vorhersagephase nutzt, um unbekannte Daten zu prognostizieren.
Als Programmierer sind Sie es gewohnt, an all die verschiedenen Dinge zu denken, die schiefgehen können. Wahrscheinlich sind Ihnen deshalb bereits zahlreiche Möglichkeiten eingefallen, um unser Beispiel komplizierter zu machen. Erstens hängt der Ertrag einer Solaranlage noch von anderen Variablen ab als der Uhrzeit, etwa der Bewölkung und der Jahreszeit. Wenn wir auch diese Variablen erfassen, haben wir eine mehrdimensionale Wolke aus Datenpunkten, die wir nicht mehr in einem Diagramm wie dem vorherigen grafisch darstellen können. Außerdem wollen wir im Fall unserer Solaranlage ein numerisches Label voraussagen. Wahrscheinlich fragen Sie sich, wie sich die hier gezeigte Methode auch für nicht numerische Labels wie Tiernamen, also für Kategorielabels, umsetzen lässt.
All diese Dinge werden wir uns in diesem Buch noch ansehen. Für den Augenblick wollen wir jedoch nur festhalten, dass das Grundprinzip des überwachten Lernens unabhängig von allen zusätzlichen Komplikationen der hier gegebenen Beschreibung folgt: Wir gehen von einer Reihe von Beispielen aus und suchen eine Näherungsfunktion dafür.
Moderne Systeme für überwachtes Lernen sind sehr gut darin, diese Annäherung vorzunehmen. Sie können selbst komplizierte Beziehungen wie die zwischen Röntgenbildern und einer medizinischen Diagnose annähern. Die Annäherungsfunktion dafür sieht für Menschen zwar wahnsinnig kompliziert aus, ist für solche Systeme aber nichts Ungewöhnliches.
Und das ist auch schon kurz und bündig, worum es beim überwachten Lernen geht. Die Einzelheiten ... nun, die sehen wir uns im Verlaufe dieses Buchs an. Im Folgenden wollen wir daher unsere Computer einrichten, damit wir mit dem Programmieren beginnen können.
Und was ist mit unüberwachtem Lernen?
Es gibt verschiedene Spielarten des Machine Learning. In den meisten Lehrbüchern werden drei erwähnt: bestärkendes Lernen (Reinforcement Learning), überwachtes Lernen (Supervised Learning) und als dritte Variante das unüberwachte Lernen (Unsupervised Learning). Wir haben zur Einführung in die Grundlagen von ML Reinforcement Learning herangezogen und werden uns im Rest dieses Buchs mit überwachtem Lernen beschäftigen. Was aber ist unüberwachtes Lernen?
Theoretisch besteht der Unterschied zwischen überwachtem und unüberwachtem Lernen darin, dass die Beispieldaten in letzterem Fall keine Labels haben. In der Praxis hat unüberwachtes Lernen jedoch nicht viel mit unserer üblichen Vorstellung von »Lernen« zu tun, sondern wirkt eher wie eine äußerst anspruchsvolle Art von Datenverarbeitung.
Als Beispiel für unüberwachtes Lernen stellen Sie sich vor, dass Sie Marktforschung für einen Onlineshop betreiben und dabei alle Daten über die Kunden vorliegen haben: wie viel sie ausgeben, wie oft sie den Shop besuchen usw. Ein Algorithmus für unüberwaches Lernen kann Ihnen helfen, sinnvolle Zusammenhänge aus diesen Daten abzulesen, indem er ähnliche Kunden zu Gruppen zusammenfasst – ein Vorgang, der als Clustering bezeichnet wird.
Unüberwachtes Lernen kann sehr praktisch sein, steht heutzutage aber nicht so sehr im Rampenlicht wie die anderen Varianten von ML. Für dieses Buch musste ich mich auf ein Thema beschränken und habe mich deshalb auf überwachtes Lernen konzentriert.
Das System einrichten
Den ersten Teil dieses Buchs nimmt ein ML-Tutorial ein. Wir fangen dabei bei null an und haben am Ende ein funktionierendes Programm für maschinelles Sehen, das uns später als Ausgangspunkt dient, um die höheren Weihen zu empfangen: neuronale Netze in Teil II und Deep Learning in Teil III.
Am besten ist es, das Tutorial gleich bei der Lektüre durchzuarbeiten, also den angegebenen Quellcode auszuführen und die Übungsaufgaben zu lösen, die am Ende der meisten Kapitel stehen. Es ist jedoch auch möglich, erst alles zu lesen, um sich einen Überblick zu verschaffen, und erst dann zur Tastatur zu greifen. Beide Vorgehensweisen sind geeignet, wobei Programmierer jedoch gewöhnlich die erste bevorzugen.
Es dauert auch nicht lange, Ihr System so einzurichten, dass Sie den angegebenen Code ausführen können. ML erfordert zwar gewöhnlich eine hohe Rechenleistung, doch der Code in diesem Buch läuft auch auf einem normalen Laptop sehr gut. Sie müssen lediglich etwas Software installieren.
Vor allem benötigen Sie Python, die am häufigsten für ML verwendete Sprache, in der auch die Beispiele in diesem Buch geschrieben sind. Machen Sie sich keine Sorgen, falls Sie noch nie in Python programmiert haben – Sie werden überrascht sein, wie gut lesbar diese Sprache ist. Wenn Sie Schwierigkeiten haben sollten, den Python-Code zu verstehen, lesen Sie Anhang 1, »Grundlagen von Python«. Darin erfahren Sie alles, was Sie für dieses Buch benötigen.
Hinweis für erfahrene Pythonistas
Wenn Sie sich mit Python auskennen, werden Sie bemerken, dass der Code in diesem Buch teilweise von den üblichen Konventionen abweicht. Beispielsweise habe ich bewusst auf einige sprachspezifische Konstruktionen wie die Listennotation verzichtet, die den Code für Einsteiger unnötig kompliziert machen. In demselben Bemühen, mich möglichst verständlich auszudrücken, verwende ich auch manche Fachbegriffe etwas lockerer, z. B. »Funktion« statt »Methode«. Für meine Verstöße gegen die Python-Etikette möchte ich mich bereits im Voraus entschuldigen.
Fangen wir an! Als Erstes müssen Sie prüfen, ob Python bei Ihnen installiert ist. Führen Sie folgenden Befehl aus:
python3 --version
Wenn Sie Python 3 nicht haben, dann beschaffen Sie es sich, bevor Sie weiterlesen. In Anhang 1, »Grundlagen von Python«, erfahren Sie, wie Sie die Sprache installieren.
Achtung: Auf manchen Systemen können Sie Python 3 auch mit python ohne die angehängte 3 ausführen, während dieser Befehl auf anderen Systemen stattdessen Python 2 ausführt. Um Verwirrung und mysteriöse Fehler aufgrund der Verwendung einer älteren Python-Version zu verhindern, sollten Sie immer den Befehl python3 verwenden.
Wenn Sie die Sprache installiert haben, müssen wir noch ein Wort über die Bibliotheken verlieren. Für den Anfang benötigen Sie drei davon. An erster Stelle steht dabei NumPy, eine Bibliothek für wissenschaftliche Berechnungen. Außerdem verwenden wir zwei Bibliotheken zur Ausgabe von Diagrammen. Matplotlib ist der De-facto-Standard für Diagramme in Python. Seaborn baut auf Matplotlib auf und dient vor allem dazu, Diagrammen ein angenehmes Erscheinungsbild zu verleihen.
Um diese Bibliotheken zu installieren, können Sie entweder pip verwenden, den offiziellen Paketmanager von Python, oder Conda, einen anspruchsvollen Umgebungsmanager, der insbesondere im Umfeld von ML sehr beliebt ist. Im Abschnitt »Pakete mit Conda installieren« auf Seite 340 werden die Unterschiede zwischen pip und Conda genauer beleuchtet. Im Zweifelsfall nehmen Sie pip.
Zur Installation der Bibliotheken mit pip führen Sie die folgenden Befehle aus:
pip3 install numpy==1.15.2
pip3 install matplotlib==3.1.2
pip3 install seaborn==0.9.0
Das war es auch schon! Wenn Sie lieber Conda verwenden, richten Sie sich nach den Anweisungen in der Datei readme.txt, die Sie im Wurzelverzeichnis des Quellcodes finden.
Schließlich brauchen Sie auch noch eine Programmierumgebung. In vielen ML-Tutorials wird Jupyter Notebook verwendet, womit Sie den Code im Browser bearbeiten und ausführen können. Für die Beispiele in diesem Buch ist es jedoch nicht unbedingt erforderlich, Jupyter Notebook einzusetzen. Als Entwickler sind Sie ja schon damit vertraut, Programme zu schreiben und auszuführen. Nutzen Sie also einfach den Texteditor oder die IDE Ihrer Wahl. Für den Fall, dass Sie Jupyter bereits kennen und verwenden, finden Sie im Verzeichnis notebooks die Jupyter-Version des Codes zu diesem Buch.