ai-academy Online Akademie für künstliche Intelligenz und Deep Learning

Deep Learning Examples with PyTorch and fastai: A Developers' Cookbook

Deep Learning for Coder

Für alle, die noch weiter in die Programmierung von künstlicher Intelligenz mithilfe von Deep Learning einsteigen wollen, empfehlen wir unser Buch “Deep Learning Examples with PyTorch and fastai: A Developers’ Cookbook”.

Dieses Buch ist voll mit praktischen Code-Beispielen, wie man konkrete Aufgabenstellungen mithilfe der Deep Learning Frameworks PyTorch und fastai lösen kann.

Themenbereiche im Buch

Welche Themenbereich werden in diesem Buch anhand von Beispielen behandelt? Welche konkreten Projekte kann man mit Deep Learning umsetzen und wie sind diese mit fastai bzw. PyTorch zu lösen?

  • Build an Image Classifier from Scratch
  • How does SGD – Stochastic Gradient Descent - work?
  • Multi-Label Classification
  • Cross-Fold-Validation
  • FastAI – A Glance on the internal API of the deep learning framework
  • Image Segmentation
  • Style-Transfer
  • Server deployment of deep learning models
  • Keypoints Detection
  • Object Detection
  • Super-resolution GANs
  • Siamese Twins
  • Tabular Data with FastAI
  • Ensembling Models with TabularData
  • Analyzing Neural Nets with the SHAP Library
  • Introduction to Natural Language Processing

Alle Beispiele stammen hauptsächlich aus den Bereichen Computer Vision und Natural Language Understanding.

Verfügbare Varianten des Deep Learning Buchs

Gedrucktes Taschenbuch bestellen

eBook als PDF Version bestellen

eBook für amazon kindle Reader bestellen

Deep Learning Examples with PyTorch and fastai Buchcover

Die Inhalte unseres Deep Learning Buches

Als Motivation, warum wir die Themen in unser Buch aufgenommen haben, wollen wir an dieser Stelle einige Hintergrundinformationen geben.

SGD - Stochastic Gradient Descent

Stochastic gradient descent (meist mit SGD abgekürzt) ist eine Methode, mit deren Hilfe man eine Zielfunktion mit der erforderlichen Genauigkeit approximieren kann. Der begriffliche Zusatz stochastic bezieht sich auf die Approximation des gradient descent Algorithmus, weil dieser den tatsächlichen Gradienten durch eine approximierte Schätzung ersetzt.

Gradient Descent ist heute sozusagen der Quasistandard für das Training und die Optimierung neuronaler Netze und als Standard-Optimizer in praktisch allen Machine Learning und Deep Learning Frameworks von SkLearn über Tensorflow und Keras bis hin zu PyTorch und fastai enthalten.

Vielfach werden Optimierungsalgorithmen jedoch als Blackbox betrachtet und das Verhalten, wie sie zu der Optimierung des neuronalen Netzes kommen wird oft hintenan gestellt. Wir möchten hier auch einen kurzen Einblick in die Funktionsweise von (stochastic) gradient descent geben.

Mithilfe von Gradient Descent können wir eine Zielfunktion (Loss-Funktion) minimieren. Die Learningrate gibt dabei die Schrittweite vor, mit der wir die Optimierung in unserem neuronalen Netz durchführen, um ein lokales Minimum zu erreichen. Der gradient descent Optimizer folgt also der negativen Steigung der Funktion talwärts. Hier findest du eine gute Erklärung, wie der Gradient Descent Algorithmus zur Optimierung der Parameter eines neuronalen Netzes funktioniert.

In weiterer Folge beschreiben wir nun einige Variante des gradient descent Algorithmus.

Batch Gradient Descent Optimizer

Der Batch Gradient Descent Optimizer in der Basisversion berechnet die Gradienten für alle Elemente des gesamten Trainingsdatensets.

[theta = \theta - \eta \cdot \nabla_\theta J( \theta)]

Da diese Basisimplementierung von Gradient Descent die Optimierung für alle Elemente des Trainingsdatensets in einem Schritt berechnet, kann er zum einen recht langsam sein und zum anderen ungeeignet für große Datensets, die nicht zur Gänze in den Speicher passen. Aus diesem Grund können wir das Modell auch nicht in Echtzeit mithilfe von neuen Trainingsdaten optimieren.

In purem Python Code sieht die Trainingssschleife für Batch Gradient Descent folgendermaßen aus:

for i in range(nb_epochs):
    params_grad = evaluate_gradient(loss_function, data, params)
    params = params - learning_rate * params_grad

Der Optimizer berechnet also für die gewünschte Anzahl an Trainingsdurchgängen (epochs) den Gradienten-Vektor params_grad der Loss-Funktion für das gesamte Trainingsdatenset hinsichtlich des Parameter-Vektors.

Stochastic Gradient Descent

Im Unterschied zum “Standard-Gradient-Descent” Algorithmus berechnet stochastic gradient descent die Gradienten für jeden Element aus den Trainingsdaten:

\theta = \theta - \eta \cdot \nabla_\theta J( \theta; x^{(i)}; y^{(i)}

SGD (stochastic gradient descent) entfernt die Redudanz in der Berechnng der Gradienten, die mit der Standardimplementierung von Gradient Descent einhergeht. Aus diesem Grund arbeitet stochastic gradient descent in der Regel bedeutend schneller und ermöglicht auch Aktualisierung in Echtzeit.

Die Arbeitsweise von SGD ermöglicht dem Optimizer, nicht nur ein lokales Minimum der Loss-Funktion zu erreichen, sondern auch direkt zu einem anderen Optimum zu springen. Wenn wir jedoch die Learningrate konstant verringert, nähert sich das Verhalten von stochastic gradient descent immer stärker jenem von batch gradient descent an.

Mini-Batch Gradient Descent

Der Mini-Batch Gradient Descent Algorithmus verbindet sozusagen das Besten aus beiden Welten, indem er die Gradienten-Aktualisierungen jeweils für einen Mini-Batch berechnet:

$(\theta = \theta - \eta \cdot \nabla_\theta J( \theta; x^{(i:i+n)}; y^{(i:i+n)}))$

Auf diese Weise verringert mini-batch gradient descent die Anzahl an Aktualisierungsvorgänge, was zu einer deutlichen Verbesserung der Stabilität im Lernprozess des neuronalen Netzes führt. Weiters nutzt er hoch optimierte Matrixmultiplikationen, die von allen state-of-the-art deep learning Frameworks wie fastai, pytorch oder tensorflow angeboten werden.

Die Größe der einzelnen Mini-Batches muss an das konkrete deep learning Problem angepasst werden, befindet sich jedoch in der Regel in einem Bereich zwischen 50 und 256 Elementen.

Da mini-batch gradient descent inzwischen praktisch einen Quasi-Standard zur Optimierung von tiefen neuronalen Netzen darstellt, wird auch häufig nur der Begriff Gradient Descent für Mini-Batch Gradient Descent gewählt.

K-Fold Cross Validation

Die Cross Fold Validation ist eine Variant, die Generalisierbarkeit eines Machine bzw. deep learning Modells zu testen. Allgemein ist es schwierig zu sagen, wie gut ein Modell ist, bevor man es nicht mit Daten getestet hat, die weder im Training noch im Validating vorgekommen sind.

Mithilfe von Cross Validation kann die Performance von machine learning Modellen anhand von unabhängigen Daten getestet werden. Mit dieser Technik kann man abschätzen, wie treffsicher unser Modell in der tatsächlichen produktiven Umgebung sein wird.

Für unser Machine Learning Problem teilen wir unsere Daten in der Regel in ein Trainingsdateset und in ein Testdatenset. Mithilfe von Cross-Validation können wir die Performance unseres Modells schon während des Trainings gegen die Testdaten testen. Während der Trainingsphase können wir so unser Modell auf Overfitting testen und abschätzen, ob unser Modell gut generalisiert.

Während jeder Runde teilen wir unsere Trainingsdaten in:

  • das Cross validation training set und
  • das Cross validation testing set bzw. Validation set

Wir trainieren unser Modell mit den Daten aus dem Cross Validation Trainingset und testen gegen die Daten aus dem Cross Validation Testing Datenset.

Eine häufig eingesetzte Variante ist K-Fold Cross Validation, die nach folgendem Schema abläuft:

  • Wir teilen das gesamte Trainingsdatenset in k gleiche Subsets. Jedes dieser Subsets bezeichnen wir als fold. Wir können diese einzelnen Subsets als f1, f2, …. fk bezeichnen.
  • for i=1 to i=k:
    • Behalte Fold fi als Validationset und verwendet alle anderen Folds für das Training.
    • Berechne die entsprechenden Metriken des Modells anhand dieser Datenkonstellation
  • Schätze die Genauigkeit des gesamten Modells mithilfe des Mittelwerts der Genauigkeiten aus allen k möglichen Folds.

Mithilfe von K-Fold Cross Validation werden alle Elemente aus den verfügbaren Daten sowohl für das Training, wie auch für die Validierung des machine learning bzw. deep learning Modells verwendet.

Mithilfe von k-fold Cross Validation können wir die Performance von unterschiedlichen Modellen auf den gleichen Trainingsdaten leichter vergleichen. Doch auch bei der Auswahl konkreter Werte für verschiedene Parameter unseres Modell kann k-fold cross Validation wertvolle Dienste leisten.

Um k-fold cross Validation erfolgreich einsetzen zu können, müssen die Daten für Training und für Validation aus der gleichen Grundgesamtheit (Population) stammen. Menschlicher Einfluss auf die Daten muss ebenfalls ausgeschlossen werden können.

FastAI – A Glance on the internal API of the deep learning framework

Das FastAI Framework ist ein aktuelles Deep Learning Framework, das auf PyTorch (dem am häufigsten in der Wissenschaft genutztem deep learning Framework) aufbaut. FastAI kann einerseits so ähnlich verstanden und eingesetzt werden wie Keras. Keras bildet sozusagen eine On-the-Top Abstrahierungsschicht über Tensorflow - fastai stellt ebenso diesen Highlevel Zugang zum darunter liegenden PyTorch Framework für KI-Anwendungen zur Verfügungen. Dabei hat fastai bereits viele der aktuellsten Forschungsergebnisse aus den Bereichen künstliche Intelligenz (artificial intelligence) und Deep Learning direkt in seinen Funktionen implementiert.

Egal ob KI-Anwendungen für Bilddaten, wie Bild-Classifiers, etc. oder KI-Anwendungen für Text (NLU - Natural Language Understanding) oder den Einsatz von tabellarischen Daten für die Erstellung von Recommender Systemen - das fastai deep learning Framework liefert für alle diese Bereich High-End Zugänge, mit denen es möglich ist state-of-the-art deep learning Modell für KI-Anwendungen mit nur wenigen Zeilen Code zu entwickeln.

Doch fastai kann bedeutend mehr. Wenn wir weiter in die Tiefe gehen wollen und unsere deep learning Modelle noch weiter anpassen und individualisieren wollen, so können wir mithilfe verschiedener Einsprungpunkte, Callbacks und Hooks, die Abläufe in unseren KI-Algorithmen beliebig anpassen.

Image Segmentation

Was bedeutet Image Segmentation im Kontext von künstlicher Intelligenz bzw. Deep Learning? Im Unterschied zur Klassifizierung von einzelnen Bildern, bei der das gesamte Bild einer Kategorie zugeordnet wird, ordnen wir bei der Image Segmentation jeden einzelnen Pixel im Bild einer bestimmten Klasse zu. Auf diese Weise können wir ein Bild mithilfe künstlicher Intelligenz und Deep Learning in verschiedene Bereiche (Segmente) aufteilen und auf dieser Basis eine “Maske” für das Bild erstellen.

Legen wir dann die Segmentierungsmaske über das Bild können wir die unterschiedlichen Bereich im Bild genau eingrenzen und z.B. verschiedene Arten von Objekte wie Fahrzeuge, Fußgänger, Häuser, etc. in einer Szenerie auf dem Bild unterscheiden.

Die Technik der Image Segmentation findet somit natürlich im Teilbereich Computer Vision die größte Anwendung. Computer Vision subsummiert alle Problemstellungen, die mithilfe von künstlicher Intelligenz gelöst werden und Bilddaten als Eingangswerte verwenden.

Verwandte Techniken zu Image Segmentation sind etwa: Image Classification, Image Caption Generation, Object Detection, u.v.m.

(Image) Style-Transfer

Unter Image Style-Transfer verstehen wir eine Deep Learning Technik, die es ermöglicht, den Stil eines Bildes zu extrahieren und auf anderen Bildern anzuwenden. Im Bereich der Computerkunst (deep art) können so Bilder eines Malers im Stil eines anderen Malers dargestellt werden.

Doch auch etwa zur Vorbeugung vor Unterschriftenbetrug kann die deep learning Technik Image Style Transfer verwendet werden, indem der “Stil” einer individuellen handschriftlichen Unterschrift herausgelöst und mit dem Stil der zu überprüfenden Probe verglichen wird. So kann künstliche Intelligenz und deep learning helfen, die Echtheit einer persönlichen Unterschrift zu verifizieren.

Server deployment of deep learning models

Vielfach finden wir zwar Anleitungen und Tutorials, wie wir deep learning Modelle für künstliche Intelligenz erstellen können, doch damit ist nur die halbe Miete bezahlt. Interessant wird es für den End-User erst dann, wenn zB in Form eines Web-Interfaces auch tatsächlich von der Funktionalität der deep learning Modelle und der künstlichen Intelligenz profitieren kann.

Aus diesem Grund müssen wir uns überlegen, wie wir die fertiggestellten Deep Learning Modelle auch tatsächlich auf einem Server deployen und so den Endanwendern zur Verfügung stellen können.

Das rasche und agile Deployment von deep learning und KI-Modellen stellt einen wesentlichen Punkt von KI-Projekten dar und sollte deshalb nicht vernachlässigt werden.

Wenngleich eine große Stärke von Tensorflow im Bereich des Deployments liegt und aus diesem Grund auch das Tensorflow Framework in der Industrie sehr weite Verbreitung findet, so hat PyTorch und fastai in den letzten Jahren deutlich aufgeholt. Inzwischen kann auch für PyTorch und das fastai deep learning Framework, sehr leicht eine produktive Umgebung für die trainierten KI-Modelle angegeben werden. Insbesondere der Einsatz von fastAPI - einem asynchronen Serverbackend auf der Basis von Python - ist an dieser Stelle hervorzuheben. Wir zeigen in unserem Buch, wie man mit Pytorch oder fastai trainierte Modelle mithilfe von fastAPI als Server-Backend auf Basis einer REST-Architektur zur Verfügung stellen (deployment) kann.

Keypoints Detection Deep Learning

Unter Keypoints Detection versteht man das Markieren von besonderen Punkte auf Bildern. Beispielsweise definiert hand-keypoint-detection das Auffinden von Fingern oder auch Fingerspitzen auf Bildern von Personen auf einem Bild. Facial-Keypoint-Detection bzw. Facial-Landmark-Detection bezieht sich auf das Auffinden von herausragenden Punkten im Gesicht wie Augenpartie, Nase, Mund, Lippen, etc.

Um facial keypoints mit neuronalen Netzen und deep learning Technologien berechnen zu können müssen wir das Wissen aus dem Bereich Computer Vision mit verschiedenen deep learning Technologien vereinen.

Haben wir ein Modell für facial keypoints detection erstellt, so können wir dieses verwenden, um zum Beispiel auch bestimmte Personen oder Gesichter in Videos zu verfolgen.

Auch für spezielle deep learning Modelle, die wir zur Erkennung von facial keypoints einsetzen können, hat sich gezeigt, dass wir massiv vom Einsatz von transfer-learning profitieren können und so die Performance unserer Machine Learning Modelle stark steigern können. Insbesondere die ResNet-Architektur eignet sich für sämtliche Themen der Bildbearbeitung außerordentlich gut. Mit dem fastai Framework können wir ganz einfach ResNet-Modelle - wie ResNet34 oder ResNet50 - als Basismodell für unsere eigenen deep learning Modelle verwenden.

Object Detection mit künstlicher Intelligenz

Mithilfe von deep learning Object Detection Algorithmen können bestimmte Objekte auf Bildern und in Videos erkannt, klassifiziert und markiert werden. Object Detection spielt in verschiedenen Bereichen der künstlichen Intelligenz eine wesentliche Rolle. Ein umfassendes Anwendungsgebiet stellt auf jeden Fall das autonome Fahren dar.

Zur Entwicklung von Object Detection Algorithmen werden in der Regel Convolutional Neural Networks eingesetzt. CNNs sind in der Lage, sehr performant mit Bilddaten umgehen zu können.

Viele Menschen denken, dass Object-Detection ein zu komplizierter Bereich der künstlichen Intelligenz darstellt, um hier selbst Algorithmen und Programme entwickeln und programmieren zu können. Aus diesem Grund greifen sie dann lieber auf bestehende Cloud-Services zurück, die Object Detection as a Service anbieten.

Diese Object-Detection Cloud Services funktionieren für eine Reihe von Anwendung auch sehr gut und zurverlässig, doch sollten die laufenden Kosten nicht außer Acht gelassen werden. Möchte ich lediglich einen Prototyp bauen und zeigen, wie Object Detection meinen aktuellen Business Case positiv beeinflusst, sind Cloud-Services sicher eine gute Wahl und schnell zu implementieren. Geht das Projekt jedoch in einen produktiven Status über, so können die Kosten schnell explodieren.

Wir zeigen in diesem Buch, wie jeder mithilfe des deep learning Frameworks fastai und pytorch recht einfach Algorithmen zur Object Detection implementieren kann.

Super-Resolution GANs Deep Learning

Super Resolution GANs (SRGANs) ist ein Konzept, das ursprünglich von Wissenschaftern von Twitter in einem Paper vorgeschlagen wurde. Diese Deep Learning Architektur zielt darauf ab, Bilder ohne Qualitätsverlust hochskalieren zu können. Andere Technologien, die dafür in Einsatz kommen können sind etwa Bilineare Interpolation. Doch solche alternativen Technologien sind vielfach mit einem Informations- und damit Qualitätsverlust des Bildes verbunden. Super Resolution GANs können entweder als Architektur mit GAN (Generative Adverserial Network) oder als Architektur ohne GAN - SRResNet - eingesetzt werden.

Genauso wie ein GAN (Generative Adverserial Network) besteht auch ein SRGAN aus zwei Elementen: Generator und Discriminator. Der Generator des Super Resolution GANs erzeugt Fake-Daten auf Basis einer Wahrscheinlichkeitsverteilung, während der Discriminator versucht, die generierten von den tatsächlichen Daten erfolgreich zu unterscheiden.

Danach versucht der Generator sein Modell anzupassen (Lernen), um so noch bessere Bilder erzeugen zu können und dem Discriminator des SRGANs die Entscheidung zu erschweren.

Der Generator in einem Super Resolution GAN besteht aus einem Residual Network anstatt eines Deep Convolutional Network, weil ResNets leichter zu trainieren sind und tendentiell stärker in die Tiefe gehen können (aufgrund des Konzepts der Skip-Connections).

Residual Networks und Skipconnections werden auch in einem Kapitel unseres Spezialkurses “Convolutional Neural Networks - Hinter den Kulissen” behandelt.

Die Aufgabe des Discriminator in unserem Super Resolution GAN besteht darin, die echten Bilder aus dem Traingsdaten von jenen, die der Generator erstellt hat, erfolgreich zu unterscheiden.

Wir zeigen anhand eines Beispiels, wie mithilfe des fastai Frameworks ein Deep Learning Modell künstlicher Intelligenz aufgebaut werden kann, das eine Super Resolution GAN Architektur implementiert.

Siamese Twins Modell mit fastai

Die Siamese Twins Architektur im deep learning ist von dem medizinischen Phänomen der siamesischen Zwillinge inspiriert. Siamese Twins Architekturen im Kontext der künstlichen Intelligenz weisen folgende wesentliche Eigenschaften auf:

  • Siamese Twin Models akzeptieren zwei verschiedene Inputs, die durch unterschiedliche Sub-Modelle mit der gleichen Architektur geschleust werden.
  • Die beiden Submodelle spiegeln einander - genauso wie siamesische Zwillingen. Jede Veränderungen an dem einen Modell wird direkt auch auf das andere Modell übertragen.
  • Die beiden Submodelle liefern einen Output, mit dem der Unterschied der beiden Inputs berechnet werden kann.
  • Das Ziel einer Siamese Twins Architektur im deep learning ist zu entscheiden, ob es sich bei den beiden Input-Werten um das gleiche Element handelt
  • Also sind die beiden Bilder, die in das Modell eingebracht werden ident?

Siamese Twin Modelle fallen in die Gattung von deep learning Modellen und finden in unterschiedlichen Szenarien hinsichtliche dem Einsatz künstlicher Intelligenz Anwendung. Allen voran:

  • Validierung von Unterschriften
  • Gesichtserkennung
  • Vergleich von Fingerabdrücken
  • Berechnung der Auswirkung von bestimmten Krankheiten basierend auf klinischen Pfaden
  • Ähnlichkeiten von Text zur Erkennung von Plagiaten

Was bedeutet der Begriff One-Shot-Classification im Kontext von siamese twins Modellen?

Ein One-Shot-Classification generiert Prognosen anhand eines einzigen Trainingsbeispiels für jede neue Klasse. Siamese Twin Networks verwenden einen supervised training Ansatz, um allgemeine Features aus den Daten zu erlernen. Danach generiert das siamese twin Modell Prognosen auf Basis der unbekannten Verteilung der Daten in die einzelnen Klassen.

Trainierte siamese twin Netzwerke setzen das one-shot-learning Konzept zur Prognose der Gleicheit oder Ungleichheit der Eingangsdaten ein, auch wenn nur wenige Trainingsbeispiele für die jeweilige Klasse vorliegen.

Wir zeigen in unserem Buch, wie man mit dem fastai deep learning Framework auch selbst siamese twins Modelle erstellen und trainieren kann.

Verarbeitung von Tabular Data mit FastAI

Viele Daten liegen in Tabellenform vor. Insbesonders wenn es sich um strukturierte Daten handelt, die leicht in verschiedene Spalten aufteilbar sind, sprechen wir von tabellarischen Daten oder auch tabular data.

Neben dem Einsatz von Decision Trees (Entscheidungsbäumen) und Random Forest Modellen zeigen wir anahnd konkreter Beispiele, dass auch neuronale Netze in der Lage sind, sehr gut aus tabellarischen Daten zu lernen.

Neuronale Netze und deep learning sind immer dann im Vorteil, wenn es darum geht, Zusammenhänge verschiedener Features untereinander zu erlernen.

Das deep learning Framework fastai bietet auch für tabellarische Daten spezielle Klassen und Funktionen an, mit denen leicht ein neuronales Netz für tabellarische Daten programmiert werden kann.

In unserem Spezialkurs “Deep Learning mit tabellarischen Daten - Decision Trees, Random Forest und Neuronale Netze” gehen wir im Detail auf die Funktionen fastai hinsichtlich tabular data ein.

Ensembling Models with TabularData

Eine weit verbreitete Methodik zur Schärfung von deep learning und machine learning Modellen ist das Zusammenfügen (ensemble) von mehreren Modellen. Auch wenn jedes der einzelnen Modelle (wie etwa ein einzelner Entscheidungsbaum) nur wenig Aussagekraft hat, so kann ein ensemble mehrere solcher Decision Trees zu einem Random Forest eine viel präzisere Aussagekraft aufweisen.

Wir zeigen, wie wir mithilfe von fastai mehrere selbst erstellte Modelle zu einem ensemble Model zusammenführen können und gehen auf Vorteile, wie auch auf Nachteile dieser ensemble Technik im deep learning ein.

Natural Language Processing / Natural Language Understanding

Ein besonders aufstrebender Bereich in der künstlichen Intelligenz betrifft die Verarbeitung von geschriebener und auch gesprochener Sprache (Text) - zusammengefasst unter dem Titel “NLU” bzw. Natural Language Understanding.

Wir widmen diesr Anwendung künstlicher Intelligenz einen großen Bereich in unserem Buch und zeigen, wie wir mit fastai die Idee von Transferlearning auch für den Bereich Natural Language Understanding nutzen können und so auf Basis von unstrukturierten Texten state-of-the-art language models für deep learning programmieren können.

In Zuge der Verarbeitung von Text und Sprache ist der aktuelle Goldstandard der Einsatz von Recurrent Neural Networks (RNNs) bzw. Long Short Term Memory Cells (LSTMs). Auch bei der Anwendung von LSTM zeigen sich viele Vorzüge von fastai.

Aufgrund der regen Nachfrage nach Material zum Thema Natural Language Understanding widmen wir uns diesem Thema ebenfalls in einem Spezialkurs: “NLU - Natural Language Understanding mit PyTorch und Fastai”.