Software Blog
Deep Learning mit Matlab
von Daniel Lämmerhofer
Einführung
Im Zusammenhang mit maschinellen Lernen und künstlicher Intelligenz fällt heutzutage immer öfter der Begriff Deep Learning (DL). Die Bedeutung von DL ist nicht ganz klar definiert - aber hinter dem neuen Schlagwort stecken meist (sehr) große und tiefe künstliche neuronale Netzwerke. DL ist also nicht komplett etwas Neues, sondern vielmehr ist es aufgrund heutiger Computer bzw. Hardware besser möglich größere Modelle mit sehr vielen Trainingsdaten (Stichwort Big Data) in adäquater Zeit zu trainieren. Zusätzlich verbessern und erweitern sich die verschiedenen Algorithmen und Methoden in diesem Themengebiet laufend.
Einige Kernpunkte die Experten im Zusammenhang mit DL nennen sind:
- Verwendung bestimmter Topologien, wie beispielsweise vielschichtige neuronale Netze oder sogenannte Convolutional Neural Networks
- Backpropagation-Algorithmus
- Verwendung unterschiedliche Layer-Arten (z.B. SoftMax, Dropout, Pooling)
- Implizierte Feature-Extraktion
- Verwendung bestimmter Aktivierungsfunktionen zwischen den Schichten (z.B. poslin)
- Regularisierung
- Dropout
- Verwendung von Hardware-Ressourcen wie GPUs
DL-Netzwerke bestehen aus mehreren (unterschiedlichen) nichtlinearen Verarbeitungsschichten. Mit solchen Architekturen können u.a. sehr gute Resultate bei der Spracherkennung, Objekterkennung in Videos, Bildklassifizierung oder anderen Klassifikations- bzw. Regressionsproblemen erreicht werden.
Eine wichtige Größe, um zwischen flachen (shallow) und tiefen Lernen zu unterscheiden, ist die Tiefe eines Netzwerkes - dies entspricht einfach gesagt der Anzahl an Verbindungen zwischen Input und Output. Bei herkömmlichen neuronalen Netzen kann die Tiefe gleich mit der Anzahl an versteckten Layern plus der Ausgangsschicht gesehen werden. Laut Experten braucht man mindestens eine Tiefe von 3 um von DL zu sprechen. Ab einer Tiefe von 10 handelt es sich um "sehr tiefes" lernen - in der Praxis werden oft 10-20 Schichten verwendet bzw. empfohlen, da diese Größe u.a. performant trainierbar ist.
Was bietet MATLAB in Richtung Deep Learning?
Mit der Neural Network Toolbox™ ist die Firma MathWorks® ja seit Jahrzehnten einer der ersten Anbieter für ein professionelles Software-Paket zur Entwicklung und Anwendung von künstlichen neuronalen Netzen. Neben bekannten Software Bibliotheken bzw. Frameworks wie beispielsweise TensorFlow™, Caffe oder Torch, bietet auch MathWorks® in den aktuellsten MATLAB-Versionen eine mächtige DL-Lösung mit einigen Methoden an. Erwähnenswert sind dabei zwei gängige DL-Architekturen, die in der Neural Network Toolbox™ sehr umfangreich integriert sind: zum einen die s.g. Autoencoders bzw. Stacked Autoencoders (SAE) seit der Version R2015b und zum anderen seit R2016a die s.g. Convolutional Neural Networks (CNNs). Für beide DL-Ansätze sind einige Klassen, Methoden und Funktionen zum konfigurieren, trainieren und evaluieren von tiefen Netzen vorhanden.
Mit SAEs können u.a. Features direkt aus den Rohdaten gelernt, extrahiert und weiterverwendet werden - ein wesentlicher Unterschied zum herkömmlichen Machine-Learning-Ansatz, bei dem Feature-Engineering standardmäßig vom Menschen durchgeführt wird. Bei CNNs handelt es sich um eine bekannte Architektur, die vor allem in der Bilderkennung mittlerweile state-of-the-art ist. Auch hier "reichen" als Input des konfigurierten Netzwerkes die rohen RGB-Bilddaten, um eine entsprechende Erkennungs- bzw. Klassifikationsperformance zu erreichen. Für mehr Informationen zu Themen wie Objekterkennung in Bildern und Videos wird an dieser Stelle auf die Computer Vision System Toolbox™ verwiesen. CNNs können aber auch für andere Anwendungsgebiete wie etwa Spracherkennung oder Verarbeitung natürlicher Sprache verwendet werden.
Aufgrund der Rechenzeit und den verfügbaren Trainingsdaten wird bei CNNs zwischen den beiden folgenden Herangehensweisen unterschieden:
#Trainingsdaten | Rechenzeit | Trainingszeit | Performance | |
---|---|---|---|---|
CNN selbst trainieren | ~ 1.000 - 1.000.000 | Sehr hoch (GPU erforderlich) | Tage (bis Wochen) | Sehr gut/hoch (Gefahr von Overfitting wenn zu wenig Trainingsdaten) |
Verwendung eines vortrainierten CNN | ~ 100 - 1.000 | Mittel (GPU optional) | Sekunden bis Minuten | Gut (abhängig vom vortrainierten CNN) |
Da das Training von CNNs sehr lange dauern kann, ist es oftmals sinnvoll, für die zu lösende Problemstellung bereits trainierte Netze zu verwenden. Diese können für zwei unterschiedliche Anwendungsfälle verwendet werden:
- Feature Extraction: das trainierte CNN wird verwendet, um Features von den Daten zu extrahieren, die als Input für das Training eines anderen Klassifikators (z.B. Support Vector Machine) verwendet werden können
- Transfer Learning: die letzten Layers des auf eine große Datenmenge trainierten CNN's werden mit einem kleineren Datenset "nachtrainiert" bzw. adaptiert.
Für die Bilderkennung findet man im Internet einige vortrainierte CNNs. Ein Beispiel dafür nennt sich AlexNet und kann u.a. hier heruntergeladen werden bzw. ist seit der Version R2016b der Neural Network Toolbox™ ein eigenes Package mit diesem Netzwerk dabei (mehr dazu hier). Dieses Netzwerk wurde mit Bildern der bekannten ImageNet Datenbank trainiert. Diese umfasst zirka 1000 Kategorien mit jeweils ca. 1000 Beispielbildern.
Die folgende Tabelle fasst die Möglichkeiten bzw. die verfügbaren MATLAB-Klassen und Funktionen für die beschriebenen Architekturen sowie weitere Methoden und Aspekte im Deep Learning Kontext mit Stand Ende 2016 zusammen:
Thema | Klassen-/Funktionsname | Beschreibung | ab Version | Toolbox |
---|---|---|---|---|
(Stacked) Autoencoders konfigurieren, trainieren, auswerten bzw. hintereinander stapeln |
Autoencoder | Klasse für Autoencoder die u.a. das trainierte Netz, Trainingsparameter sowie die Transferfunktionen für En- und Decoder beinhaltet | R2015b | Neural Network |
trainAutoencoder | Training (unsupervised) eines Autoencoder Netzwerkes; kann umfangreich parametrisiert werden (u.a. Anzahl an Neuronen in den versteckten Schichten, Transferfunktionen für En- und Decoder, Koeffizient für L2-Regularisierung der Gewichte, Trainingsalgorithmus oder Verlustfunktion) | |||
trainSoftmaxLayer | Training eines s.g. Softmax-Layer Netzes zur Klassifikation. Der Output eines Autoencoders kann beispielsweise als Input-Features verwendet werden | |||
stack | Diese Funktion schichtet n Autoencoders und optional als Letztes ein Netz zur Klassifikation (z.B. mit trainSoftmaxLayer erstellt) hintereinander. Mit der herkömmlichen train Funktion kann ein Fine-Tuning des "gestapelten" bzw. tiefen Netzwerks vorgenommen werden. |
|||
encode | Funktion um die Input-Daten auf die Repräsentation der versteckten Schicht (Größe bzw. Dimesion abhängig vom Trainingsparameter hiddenSize ) zu mappen; kann z.B. zur Feature-Extraktion für einen anderen Klassifikator verwendet werden |
|||
decode | Die Funktion transferiert Daten von der versteckten Schicht zurück auf die originalen Input-Daten des Netzes | |||
Layers für ein CNN erstellen bzw. konfigurieren |
mehrere (siehe Beschreibung) |
Für die Konfiguration und den Aufbau von beliebig tiefen CNNs stehen unterschiedliche Arten von Layers zur Verfügung. Jede Layerart kann für sich umfangreich konfiguriert werden - hier eine Auflistung der wichtigsten Klassen: ImageInputLayer, Convolution2DLayer, ReLULayer (entspricht der altbekannte poslin Aktivierungsfunktion), AveragePooling2DLayer, MaxPooling2DLayer, FullyConnectedLayer, DropoutLayer (näheres siehe Dropout), SoftmaxLayer (u.a. für Klassifikationsprobleme, siehe auch trainSoftmaxLayer), ClassificationOutputLayer |
R2016a | Neural Network |
Netzwerk konfigurieren und trainieren |
trainingOptions | Funktion zur Definition der Trainingsparameter für ein neuronales Netz wie Algorithmus (z.B. Stochastic Gradient Descent with Momentum), Lernrate, Trainingsepochen oder L2-Regularisierungsfaktor; zugehörige Klasse: TrainingOptionsSGDM | R2016a | Neural Network |
trainNetwork |
Training eines (tiefen) Netzes - der Funktion werden die konfigurierten Layers sowie die Trainingsoptionen (Rückgabe von trainingOptions) übergeben. |
R2016a | Neural Network, Parallel Computing* |
|
Trainierte Netzwerke auswerten |
classify | Auswertung des Netzes (z.B. CNN bzw. SeriesNetwork Objekt) mit (neuen) Input-Daten. Zurückgegeben werden die Klassennamen und zusätzlich ein Konfidenzmaß der Prädiktion | R2016a |
Neural Network, Parallel Computing* |
predict | Diese Methode gibt (nur) die prädizierten Wahrscheinlichkeiten jeder Klasse retour | |||
Transfer Learning bzw. Feature-Extraktion |
activations | Mit dieser Methode kann der Output jeder einzelnen Schicht eines trainierten CNNs (SeriesNetwork) ausgegeben werden. Der Output kann als Input bzw. Features für das Training eines beliebigen Machine-Learning-Modells (SVM, Entscheidungsbaum, usw.) mit gezielten Trainingsdaten verwendet werden. | R2016a |
Neural Network, Parallel Computing* |
Regularisierung | Parameter | Kann in vielen Trainingsmethoden konfiguriert werden (z.B. bei trainAutoencoder heißt der Parameter L2WeightRegularization ) bzw. kann der Regularisierungsfaktor als Parameter (L2Regularization ) in trainingOptions definiert werden. |
R2015b bzw. R2016a |
Neural Network |
Ensemble | viele | Ensembles sind in MATLAB schon seit längerer Zeit vorhanden, erwähnenswert an dieser Stelle sind die beiden neuen Funktionen fitcensemble und fitrensemble seit der Version R2016b. Diese bieten eine bessere Schnittstelle um Klassifikations- oder Regressionsensembles zu trainieren. | Statistics and Machine Learning | |
Dropout | dropoutLayer |
Maßnahme um Overfitting zu vermeiden: während dem Training werden zufällig Neuronen in den versteckten Schichten auf 0 gesetzt. |
R2016a | Neural Network |
Verlustfunktion | crossentropy | Alternative Performance- bzw. Kostenfunktion für neuronale Netze; Ab R2015b auch für 2-Klassen Klassifikationsprobleme | R2013b | Neural Network |
* ... bringt bessere Performance (siehe nächster Abschnitt)
Diese softwaretechnischen Möglichkeiten in MATLAB beziehen sich auf den aktuellen Stand (d.h. bis Version R2016b). Aufgrund der aktuellen Präsenz und dem "Tempo" von Deep Learning werden sich die Möglichkeiten und der Funktionsumfang in den kommenden Releases sicherlich weiter steigern.
Wie geht MATLAB mit der erhöhten Performance-Anforderung für Deep Learning um?
Je nach Tiefe bzw. Komplexität und Anzahl der Daten können Training und Auswertung eines Netzwerks lange dauern. Um eine ansprechende Performance zu gewährleisten, wurden in den letzten Versionen einige Funktionen der Neural Network Toolbox™ verbessert.
Hier eine kurze Auflistung betroffener Funktionen:
- Schnellere und speichereffizientere Implementierung der beiden Trainingsalgorithmen Levenberg-Marquardt (trainlm) und Bayesian Regularization (trainbr)
- Ab R2015b
- Verwendung der eingebauten GPU zur Beschleunigung von Training (trainNetwork) und Auswertungen (classify, predict, activations) von CNNs
- Ab R2016a
- Voraussetzung: Parallel Computing Toolbox™ und CUDA®-fähige NVIDIA® GPU (3.0 oder höher)
- Verwendung der CPU als ausführende Hardware-Umgebung für Auswertungen von trainierten CNNs
- Ab R2016b
- In den Funktionen classify, predict und activations wurde der Parameter
ExecutionEnvironment
eingeführt, der angibt, ob die GPU oder CPU verwendet werden soll
- Schnelleres Training von CNNs zur Bilderkennung, wenn ImageDatastore Objekte verwendet werden
- Ab R2016b
Kann Deep Learning auch in den ANDATA Tools angewendet werden?
In der ANDATA Tool-Umgebung bietet der BRAINER eine graphische Benutzeroberfläche zur Durchführung von Machine-Learning-Aufgaben u.a. auf Basis der Neural Network und Statistics and Machine Learning Toolbox™. Die bewährten Neuerungen und Verbesserungen in den MATLAB Toolboxen werden natürlich auch in unserem Tool integriert. Einige der oben angeführten Deep Learning Aspekte sind in der aktuellen BRAINER Version folgendermaßen verfügbar:
- Stacked Autoencoders sind komplett als eigener Modelltyp integriert: in der Trainingsparameter-GUI können für n Autoencoders sowie dem Softmax-Layer alle Trainingsparameter konfiguriert werden
- Die Verlustfunktion crossentropy ist für die Modelltypen Backpropagation und Stacked Autoencoders verfügbar
- Regularisierung bei den Modelltypen Backpropagation und Stacked Autoencoders mittels eigenem Parameterfeld definierbar
- Bei Backpropagation-Modellen steht die poslin bzw. ReLU (Rectified Linear Unit) Aktivierungs- bzw. Transferfunktion für die letzte oder versteckten Schichten zur Verfügung
- Diverse Ensemble- und Komitee-Methoden sind als eigene Modelltypen vorhanden:
- Boosting: zur Aggregation der Einzelmodelle können verschiedene Algorithmen ausgewählt werden (z.B. AdaBoost, LogitBoost, RUSBoost)
- Cluster and Select
- Fusion: mehrere Methoden zur Fusion der Einzelmodelle implementiert - u.a. Mehrheitsentschluss (majority vote), Gewichtung (Bagging wenn gleiche Gewichte), Stacking
- Random Forests: Training mehrerer Entscheidungsbäume (näheres siehe TreeBagger)
- Die Verwendung von paralleler und/oder GPU-Berechnung für das Training und/oder Auswertungen kann bei folgenden Modelltypen aktiviert werden:
- Backpropagation, Generalized Regression und Probabilistic Neural Network, Radial Basis Network
- Voraussetzung: Parallel Computing Toolbox™ und CUDA®-fähige NVIDIA® GPU
Als nächstes wollen wir den Funktionsumfang der seit R2016a verfügbaren CNNs in Form eines eigenen BRAINER-Modelltypen direkt im Tool mitaufnehmen und unterstützen. Bisher musste man diese manuell über Custom-Modelle einbinden.
Generell ist abschließend zu sagen, dass viele Aspekte des Deep Learnings schon länger in MATLAB und in unseren Tools verfügbar sind - u.a. können schon immer beliebig tiefe neuronale Netze mittels der Anzahl von versteckten Schichten bzw. Neuronen konfiguriert werden. Weiters besteht die Möglichkeit einzelne Modelle mittels Komitee bzw. Ensemble zu kombinieren auch schon seit einigen Versionen. Aktuell hypt der Begriff Deep Learning, u.a. weil die dahinterliegenden Methoden und Architekturen viele beachtliche Erfolge feiern und den neuronalen Netzen damit endlich zum breiten Durchbruch verhelfen. In der Themenstellung ist momentan aber derart viel in Bewegung, dass man weiter ständig die Augen nach neuen Methoden und Implementierungen offen halten sollte! Dementsprechend bildet dieser Blog nur einen Schnappschuss zum Ende des Jahres 2016.
Kommentare
Einen Kommentar schreiben