Ausgehend von den Grundlagen neuronaler Netzwerke wird anhand von Deep Convolutional Neural Networks für die Objekterkennung in Bildern erklärt, wie Deep Learning funktioniert. Neben einigen praktischen Anwendungen gibt dieser Beitrag auch einen Überblick über die zahlreichen verfügbaren Frameworks und Standarddatensätze für Deep Learning.
Deep Learning erfreut sich in den letzten Jahren einer rasant zunehmenden Aufmerksamkeit. In Konferenzen zur Bildverarbeitung befasst sich inzwischen ein Viertel aller Beiträge mit diesem Thema. Aber auch die industrielle Anwendung von Deep-Learning-Ansätzen hat großes Potenzial und beginnt ebenfalls stark zuzunehmen. Um dieses Potenzial nutzen zu können, werden in diesem Kapitel die Grundlagen von Deep Learning sowie die Anwendung anhand von Beispielen beschrieben. Dabei wird der Fokus auf das Lernen mit tiefen neuronalen Netzwerken gelegt, die sicherlich die prominenteste, wenn auch keinesfalls die einzige Art des Deep Learning darstellen. Auf der Anwendungsseite steht das Erkennen von Objekten in Bildern im Vordergrund, wenngleich auch in der Text- und Spracherkennung gewaltige Fortschritte durch die Anwendung von Deep Learning erzielt wurden.
Bevor die Grundlagen tiefer neuronaler Netzwerke erklärt werden, sollen zwei Fragen vorab geklärt werden: Was ist eigentlich Deep Learning bzw. worin unterscheidet es sich von »nicht tiefem« maschinellem Lernen und warum ist es gerade jetzt so aktuell?
Bei klassischem maschinellem Lernen war es nötig, aus den Rohdaten Low-Level-Features zu extrahieren, anhand derer dann ein neuronales Netzwerk oder eine Support Vector Machine oder ähnliche Ansätze High-Level-Features lernen konnten. Bei der Bilderkennung mussten zuvor z.B. Kantenerkennungsalgorithmen, Mustererkennungen und vieles mehr durchgeführt werden, um für den Learner möglichst abstrakte Inputdaten zu erhalten. Dieser Prozess des Feature Engineering war meist sehr aufwendig, da er in der Regel nur von Experten durchgeführt werden konnte und meist sehr domänenabhängig war. Das heißt, bei jeder Änderung des Problems war ein neues Feature Engineering nötig. Beim Deep Learning werden im Gegensatz dazu die Rohdaten direkt an das neuronale Netzwerk angelegt. Bei der Bilderkennung sind die Input-Neuronen direkt mit den Pixeln des Bildes verbunden. Das Feature Engineering wird vom tiefen neuronalen Netzwerk selbst übernommen. Es genügt jetzt, dem Netzwerk zu sagen, was auf dem Bild zu sehen ist. Das können auch Anwender von Deep Learning, ohne Experten maschinellen Lernens zu sein.
Die Grundlagen für Deep Learning wurden schon vor mehr als 30 Jahren z.B. mit der Einführung mehrschichtiger neuronaler Netzwerke gelegt. Trotzdem wurde das Thema erst jetzt sehr aktuell. Das hat mehrere Gründe. Deep Learning benötigt große Datenmengen (und umgekehrt). Das Lernen ist umso erfolgreicher, je mehr Trainingsdaten man zur Verfügung hat. Und die Menge an Daten hat unstrittig zugenommen. Dazu zwei Beispiele: In YouTube werden jede Minute 500 Stunden Videos [Kroker 2017], in Facebook täglich 300 Millionen Bilder [Meg 2017] hochgeladen. Deep Learning benötigt außerdem extrem starke Rechenpower. Das Lernen mit einem tiefen neuronalen Netzwerk kann leicht Tage dauern. Mit der Verfügbarkeit von schnellen Grafikkarten (GPUs) kann diese Zeit auf einen Bruchteil davon reduziert werden, da die Berechnungen, die in neuronalen Netzwerken durchgeführt werden müssen, besonders schnell auf GPUs ausgeführt werden können. Auch wurden in den letzten Jahren neue und verbesserte Algorithmen für Deep Learning entwickelt, die die Qualität des Lernens erheblich steigern können. Beispielhaft sei hier die Optimizer-Komponente genannt. Schließlich trägt auch ein weiterer Aspekt zur aktuellen Popularität von Deep Learning bei: die freie Verfügbarkeit von Frameworks, Beispieldatensätzen und sogar fertig trainierten Netzwerken. Damit gestaltet sich der Aufwand für den Einstieg ins Deep Learning erheblich einfacher, da die wesentlichen Komponenten für Deep Learning bereits frei verfügbar sind.
Zunächst werden im Folgenden die Grundlagen neuronaler Netzwerke ausgehend vom menschlichen Gehirn über das Modell einer einzelnen Nervenzelle, einem einschichtigen Netzwerk von mehreren Nervenzellen bis zu mehrschichtigen neuronalen Netzwerken erklärt. Danach folgt eine Beschreibung von Deep Convolutional Networks, die heute der De-facto-Standard in der Bilderkennung sind. Zum Schluss soll insbesondere der Anwendung von Deep Learning ausreichend Platz zukommen.
Inspiriert ist das Lernen mit neuronalen Netzwerken sicherlich durch das zunehmende Verständnis der Vorgänge im menschlichen Gehirn. So entsprang beispielsweise die hebbsche Lernregel [Hebb 1949] der Erkenntnis, dass zwei nahe beieinanderliegende Nervenzellen ihre Verbindung verstärken, wenn sie häufig gleichzeitig aktiv sind. Die Neuronen heutiger tiefer neuronaler Netzwerke funktionieren im Prinzip immer noch ähnlich ihrem biologischen Vorbild. Die künstlichen neuronalen Netzwerke als Ganzes weichen aber von der Arbeitsweise im Gehirn teilweise recht deutlich ab. Dennoch soll das Grundprinzip neuronaler Verarbeitung im menschlichen Gehirn kurz erläutert werden.
Das menschliche Gehirn besteht schätzungsweise aus 86 Milliarden Nervenzellen [Wurm 2015], den Neuronen. Jedes Neuron ist im Mittel mit 10.000 anderen Neuronen verbunden. Was viele nicht wissen: Das Wachstum dieser Neuronen und deren Vernetzung sind im Alter von zwei Jahren im Wesentlichen bereits abgeschlossen. Das Lernen erfolgt dann hauptsächlich nur noch durch das Verstärken oder Abschwächen von Verbindungen zwischen Neuronen.
Abb. 7–1Schemazeichnung eines menschlichen Neurons
Ein Neuron (vgl. Abb. 7–1) ist durch seine Dendriten mit anderen Neuronen verbunden. Diese Verbindung ist durch eine Synapse unterbrochen, deren Leitfähigkeit von der Verfügbarkeit von Neurotransmittern abhängt und somit die Stärke der Verbindung repräsentiert. Diese Stärke der Verbindung ist variabel und wird durch das Lernen angepasst. Die elektrischen Potenziale der eingehenden Verbindungen summiert das Neuron und feuert selbst, wenn die Summe der Eingänge einen Grenzwert überschreitet. Über das Axon wird dann ein einheitliches Signal des Neurons an seine nachfolgenden Neuronen weitergegeben. Diese prinzipielle Funktionsweise eines Neurons kann man auf einem Computer ohne Weiteres simulieren.
Ein künstliches Neuron kann als Recheneinheit gesehen und modelliert werden. Das Feuern des Neurons entspricht einem Output von 1, das Nicht-Feuern einer 0. Die unterschiedliche Stärke der Synapsen wird durch eine reelle Zahl, dem Gewicht der Verbindung, repräsentiert, die positiv ist, wenn das Feuern eines Neurons seinen Nachfolger aktiviert, und negativ, wenn das Feuern den Nachfolger hemmen soll. Das Aufsummieren der elektrischen Potenziale wird durch Summenbildung der Produkte aus Input und Gewicht der Verbindung modelliert. Überschreitet diese Summe einen Schwellenwert, feuert das Neuron, ansonsten nicht. Diese Verarbeitung eines Neurons ist in folgender Formel mathematisch dargestellt, wobei x den Input, w ein Gewicht, t den Schwellenwert und o den Output darstellt. Der Index j steht für ein Output-Neuron, i für ein Input-Neuron. Step ist eine einfache Stufenfunktion, die alle Werte kleiner t auf 0 und größer gleich t auf 1 abbildet.
Ein solches künstliches Neuron ist in der Lage, eine mehrdimensionale Funktion zu repräsentieren, also verschiedene, mehrstellige Eingaben auf die gewünschten Ausgaben abzubilden. Abbildung 7–2 zeigt dies am Beispiel der logischen Und- Funktion. Jeder zweidimensionale Input wird nur dann auf 1 abgebildet, wenn beide Eingaben 1 sind, sonst auf 0 (tabellarisch in a) dargestellt mit y als dem gewünschten Output, als Diagramm in b) mit hell = 0, dunkel = 1). Das künstliche Neuron in c) repräsentiert mit den angegebenen Gewichten und dem Schwellenwert diese Funktion. Bildteil d) veranschaulicht, wie die Gewichte die Richtung von zunehmenden Aktivierungen des Neurons festlegen (Pfeil), während der Schwellenwert t angibt, wo der Übergang von Nicht-Feuern zu Feuern des Neurons liegt (dunkle Linie). Es ist leicht zu sehen, dass ein Neuron mit denselben Gewichten und kleinerem t die Oder-Funktion repräsentieren würde.
Abb. 7–2Repräsentation der logischen Und-Funktion durch ein künstliches Neuron
Mit den richtigen Gewichten und dem richtigen Schwellenwert lassen sich also Inputs auf die gewünschten Outputs abbilden. Das Lernen eines Neurons besteht jetzt darin, diese passenden Gewichte selbstständig zu finden. Dazu beginnt man mit anfänglich zufälligen Gewichten. Dann werden nacheinander die Inputs an das Neuron angelegt, der Output berechnet und mithilfe der Fehlerfunktion (loss function) und des gewünschten Outputs der Fehler bestimmt. Als Fehlerfunktion kommt meist die halbe euklidische Distanz (auch L2-Norm genannt) zum Einsatz:
Dieser Fehler l (engl. loss) soll minimiert werden. Die Komponente, die die Minimierung dieses Fehlers durch Anpassung der Gewichte durchführt, wird Optimizer oder Updater genannt. Sie berechnet den Gradienten des Netzwerks an der Stelle des aktuellen Inputs, d.h. die Richtung, in die die Gewichte angepasst werden müssen, um den Fehler möglichst gut zu minimieren. In diese Richtung werden die Gewichte dann in kleinen Schritten angepasst, bis der Fehler null oder klein genug ist. Die Größe der Schritte wird durch die Lernrate α angegeben. Für die Berechnung des Gradienten ist allerdings die Step-Funktion nicht gut geeignet. Daher werden in den später aufgeführten Netzwerken andere Aktivierungsfunktionen verwendet.
Ein Perzeptron-Netzwerk [Rosenblatt 1958] ist ein einschichtiges Netzwerk, das aus einer ganzen Ansammlung solcher Modellneuronen besteht. Es wurde anfangs insbesondere zur Erkennung von Ziffern eingesetzt. Die Neuronen der Inputschicht sind fest über nicht lernbare Gewichte teilweise zufällig mit den Stimulus-Zellen der Retina verbunden. Jedes Neuron der Outputschicht ist über lernbare Gewichte (daher ein einschichtiges Netzwerk) mit jedem Neuron der Inputschicht verbunden. Bei der Erkennung von Ziffern repräsentiert jedes Output-Neuron beispielsweise eine Ziffer und soll genau dann feuern, und nur dann, wenn die entsprechende Ziffer erkannt wurde (vgl. Abb. 7–3).
Abb. 7–3Perzeptron-Netzwerk zur Ziffernerkennung
Das Lernen in Perzeptron-Netzwerken funktioniert wie oben beschrieben: Es werden so lange immer wieder nacheinander die Inputmuster an das Netzwerk angelegt und die Gewichte angepasst, bis der Fehler einen gewünschten Wert unterschreitet. Die anfänglich zufälligen Gewichte werden mithilfe der Delta-Lernregel angepasst:
wi,j = wi,j + α · xi · (yj – oj)
Der neue Wert eines Gewichts von Neuron i zu Neuron j entspricht also dem alten Wert plus dem Produkt aus Lernrate, Aktivierung des Vorgängerneurons und der Differenz aus gewünschtem und tatsächlichem Output. Ist der tatsächliche Output zu klein, wird das Gewicht erhöht, ist er zu groß, wird es entsprechend erniedrigt.
Auch wenn diese Perzeptron-Netzwerke zu ihrer Zeit einen enormen Fortschritt darstellten, zeigten sich jedoch auch Schwächen. Zum einen kann man anhand von Abbildung 7–3 schon recht gut ahnen, dass die Erkennung von Ziffern oder Objekten sehr anfällig gegenüber der Translation oder Skalierung der Ziffern war. Dieses Problem wird in Abschnitt 7.2 näher betrachtet und gelöst. Schwerwiegender war aber die Einschränkung, die von Minsky und Papert [Minsky & Papert 1969] bezüglich der Repräsentationsfähigkeit von Perzeptrons nachgewiesen wurde. Sie zeigten, dass die Klassifikation nur dann fehlerfrei von einem Perzeptron durchgeführt werden kann, wenn die unterschiedlichen Instanzen eines n-dimensionalen Problems sich durch eine n-1-dimensionale Hyperebene trennen lassen. So kann zum Beispiel das einfache zweidimensionale XOR-Muster nicht gelernt werden, weil es nicht durch eine eindimensionale Linie separiert werden kann (vgl. Abb. 7–4). Man kann aber leicht zeigen, dass ein mehrschichtiges Netzwerk die XOR-Funktion problemlos repräsentieren kann. Das Lernen von mehrschichtigen Netzwerken scheiterte zunächst daran, dass man nicht wusste, wie man den Fehler eines Neurons einer verdeckten Schicht berechnen und damit die Gewichte zu verdeckten Schichten anpassen kann.
Abb. 7–4Problem der linearen Separierbarkeit von XOR
Die Lösung dieses Problems wurde 1986 mit dem Backpropagation-Algorithmus vorgestellt [Rumelhart et al. 1986]. Mit ihm gelingt es, den Fehler in der Outputschicht zurück in die verdeckten Schichten zu propagieren. Dazu muss zunächst die Aktivierungsfunktion, also die Funktion, die die Aktivierung eines Neurons auf den tatsächlichen Output abbildet, verändert werden. Sie muss nichtlinear und differenzierbar sein. Die Nichtlinearität ist wichtig, damit ein mehrschichtiges Netzwerk überhaupt ausdrucksfähiger ist als ein einschichtiges Netzwerk mit entsprechend mehr Neuronen. Die Differenzierbarkeit wird benötigt, um den Gradienten der Aktivierungsfunktion berechnen zu können. Als Aktivierungsfunktion wurde zunächst meist die Sigmoid-Funktion wegen ihrer einfachen Ableitung verwendet, heute kommt häufig auch der Tangens Hyperbolicus oder die Rectified-Linear-Unit(ReLU)-Funktion zum Einsatz (vgl. Abb. 7–5). Damit ist die Ausgabe eines Neurons auch nicht mehr diskret, sondern nimmt Werte zwischen 0 und 1 im Fall von Sigmoid, zwischen -1 und 1 im Fall von Tanh und zwischen 0 und nach oben nicht begrenzt für ReLU an.
Abb. 7–5Aktivierungsfunktionen
Die Lernregel für die Gewichte eines Backpropagation-Netzwerks ist dann zweigeteilt. Zunächst wird ein Input angelegt und die Aktivierung vorwärts durchs Netzwerk bis zur Outputschicht berechnet. Mit dem Vergleich zum gewünschten Output lässt sich der Fehler der Neuronen in der Outputschicht sowie die Gewichtsanpassung zu dieser Schicht berechnen:
wj,k = wj,k + α · oj · Δk mit Δk = σ' (ink) · (yk – ok)
Δk ist dabei der Fehler von Neuron k in der Outputschicht, σ’(ink) die Ableitung der Aktivierungsfunktion. Dieser Fehler kann jetzt rückwärts zur vorherigen Schicht propagiert werden, in der die Gewichtsanpassung wie folgt berechnet wird:
Damit lassen sich prinzipiell Netzwerke mit beliebig vielen Schichten berechnen und lernen, indem diese Gewichtsanpassung immer wieder rückwärts bis zur Inputschicht angewandt wird.
Gelernt wird wie bei Perzeptron-Netzwerken, indem man dieses Vorgehen Muster für Muster wiederholt, bis der Fehler einen gewünschten Wert unterschreitet oder keine weitere Fehlerreduktion mehr erfolgt. Legt man die Muster immer einzeln ans Netzwerk an, wird es passieren, dass der Gradientenabstieg für dieses Muster zwar eine Verkleinerung des Fehlers verursacht, bei früher bereits gelernten Mustern aber wieder zu einer Verschlechterung führt. Möchte man dies vermeiden, muss der Gradient für eine ganze Menge (Batch) von Inputmustern gemeinsam berechnet werden, was allerdings mehr Speicherplatz benötigt. Man spricht von Batch-Optimization, die Anzahl der für eine Gewichtsanpassung gemeinsam verwendeten Muster ist die Batch Size.
Die Umstellung auf kontinuierliche Outputs der Neuronen bringt noch eine weitere Notwendigkeit mit sich. Für die in Abbildung 7–3 dargestellte Aufgabe der Ziffernerkennung würde ein Backpropagation-Netzwerk keine diskreten Ausgaben mehr machen. Es muss also an der Ausgabeschicht eine Outputfunktion eingeführt werden, die basierend auf den kontinuierlichen Outputs eine Entscheidung trifft. Bei der Klassifikation ist dies meist die »Winner takes all«-Funktion; der höchste Output gewinnt. Häufig ist aber auch wünschenswert zu wissen, wie sicher sich das Netzwerk ist. Allerdings ist die absolute Größe der Ausgabe abhängig von der Größe der anfänglich zufällig gewählten Gewichte sowie von der verwendeten Aktivierungsfunktion und hat damit keine absolute Aussagekraft. In solchen Fällen verwendet man zusätzlich die SoftMax-Outputfunktion, die die Größe der Outputs so normiert, dass alle im Bereich zwischen null und eins liegen und ihre Summe eins ergibt.
Dann kann der einzelne Output eines Neurons als Wahrscheinlichkeit für diese Klasse verstanden werden. Eine Ausgabe von o3 =0,78 in obigem Beispiel würde also bedeuten, dass das Netzwerk den Input mit 78% Wahrscheinlichkeit für eine Drei hält.
Wie viele Schichten und wie viele Neuronen in diesen Schichten soll ein Backpropagation-Netzwerk haben? Diese Frage lässt sich leider nur empirisch beantworten. Hat das Netzwerk zu wenig Neuronen, kann es die Trainingsdaten nur unvollständig repräsentieren und schneidet entsprechend auch bei unbekannten Daten schlecht ab (Underfitting). Hat das Netzwerk zu viele Schichten und Neuronen, kann es zwar die Trainingsdaten auswendig lernen, schneidet aber ebenfalls bei der Klassifikation unbekannter Daten schlecht ab, weil das Netzwerk die Fehler der Trainingsdaten mitgelernt hat und nicht gut generalisiert (Overfitting). Was zu viel und was zu wenig ist, hängt aber vom konkreten Problem ab und kann nicht verallgemeinert werden.
Da die Schichten bei Backpropagation-Netzwerken vollständig vernetzt sind, haben auch schon eher kleine Netzwerke viele lernbare Gewichte und damit viele Freiheitsgrade. Ein Netzwerk mit 40 Input-Neuronen, einer verdeckten Schicht mit acht Neuronen und zehn Output-Neuronen, wie in Abbildung 7–3 dargestellt, hätte 40 × 8 + 8 × 10 = 400 lernbare Gewichte. Für die Aufgabe der Bilderkennung in einem HD-Farbbild hätte alleine schon die Inputschicht 6,2 Millionen Neuronen. Kombiniert mit den zahlreichen verdeckten Schichten eines tiefen neuronalen Netzwerks würde die Zahl der Gewichte so groß werden, dass ein Overfitting kaum zu vermeiden wäre. Die Abhilfe brachten Convolutional Neural Networks.
Bei der Erkennung von Objekten in Bildern kann man einige Annahmen machen:
Diesen Annahmen wird in Deep Convolutional Neural Networks Rechnung getragen. Sie bestehen aus einer Folge mehrerer Convolution- und Pooling-Schichten gefolgt von wenigen vollständig vernetzten Backpropagation-Schichten. Als Input werden die rohen Pixel des Bildes ans Netzwerk angelegt, meist als dreidimensionales Array mit der Größe Länge × Breite × 3 (RGB) (vgl. Abb. 7–6). Dieses Beispielnetzwerk soll es einem fußballspielenden Roboter erlauben, acht verschiedene Kategorien von Objekten zu erkennen, z.B. einen Ball.
Abb. 7–6Deep Convolutional Neural Network
Die herausragende Eigenschaft von Convolution-Schichten [LeCun et al. 1999; Fukushima 1980] ist, dass dieselben Gewichte für alle Neuronen wiederverwendet werden. Die Berechnung der Aktivierung der nachfolgenden Schicht benutzt für jedes Neuron dieselbe Matrix von Gewichten, die auch Filter oder Kernel genannt wird. Dieser Filter wandert Pixel für Pixel über die Inputschicht (engl. convolve) wie in Abbildung 7–7 zweidimensional dargestellt. Die Aktivierung eines Neurons ergibt sich als Produkt aus den Gewichten des Filters mal dem Teil der Inputmatrix, der dem nachfolgenden Neuron entspricht (grafisch markiert) plus dem Bias b, der eine ähnliche Funktion wie der Schwellenwert in Perzeptrons hat. Als Aktivierungsfunktion wird meist ReLU verwendet.
Die Größe eines solchen Filters beträgt typischerweise 3 × 3 × 3 oder 5 × 5 × 3, also 3 bzw. 5 Pixel in Länge und Breite und 3 in der Tiefe (RGB). Die Anzahl solcher Filter einer Schicht bildet die Tiefe der nächsten Schicht, die auch Activation Map genannt wird. Im Beispiel in Abbildung 7–6 sind es 16 solcher Filter der Größe 3 × 3 × 3. Damit ergibt sich, dass die erste Convolution-Schicht gerade einmal 3 × 3 × 3 × 16 = 432 lernbare Gewichte enthält. Diese Zahl ist unabhängig von der Größe des Inputbildes, wäre also auch bei einem HD-Bild genauso niedrig. Lediglich die Laufzeit für die Berechnung der Convolution-Schicht wäre höher, da mehr Convolutions durchgeführt werden müssten.
Abb. 7–7Berechnung der Aktivierung o eines Neurons durch Convolution des Filters W über den Input x und den Bias b
Üblicherweise wird als Schrittweite (Strides) für die Convolutions 1, 1 gewählt, d.h., die Gewichtsmatrix wird Pixel für Pixel sowohl in der Spalte als auch in der Zeile verschoben. Würde man größere Werte, z.B. 2, 2 wählen, wäre die nachfolgende Activation Map in den ersten beiden Dimensionen jeweils nur noch halb so groß. Die Aufgabe der Verkleinerung der Activation Maps überlässt man aber üblicherweise den Pooling-Schichten.
Das Padding legt fest, wie mit dem Rand umgegangen wird. Legt man einen 3 × 3-Filter nur an tatsächlich vorhandene Pixel an, würde daraus folgen, dass die nachfolgende Activation Map auf jeder Seite um einen Pixel kleiner wäre (Padding = none). Wenn man das nicht will, muss der Filter auch über den Rand des Inputs hinaus angelegt werden, wie es in Abbildung 7–7 bei der gestrichelt markierten Convolution der Fall ist. Als Werte für den Input und Bias werden üblicherweise die Werte der Nachbarneuronen verwendet. Damit erhält die nachfolgende Activation Map in den ersten beiden Dimensionen dieselbe Größe wie der Input (Padding = same).
Die Filter der ersten Schichten erkennen sehr lokale Low-Level-Features, wie z.B. senkrechte, waagrechte oder schräge Linienstücke, Kurven oder auch Muster. Je weiter weg vom Input eine Convolution-Schicht liegt, desto abstrakter sind dann die erkannten Features (vgl. Abb. 7–8). Die Tiefe der Activation Maps lässt man in der Regel steigen, damit die Anzahl der erkennbaren Features größer wird, während die Fläche der Maps durch die Pooling-Schichten reduziert wird. Damit stellen Convolution-Schichten eine Lösung für alle vier oben genannten Annahmen dar. Die Filter erkennen lokale Features. Durch die Convolutions ist es egal, wo im Bild sich das Feature befindet. Der Hierarchie vieler Objekte sowie der unterschiedlichen Größe von Objekten im Bild wird durch das Hintereinanderschalten mehrerer Convolution-Schichten Rechnung getragen.
Abb. 7–8Visualisierung der Convolution-Schichten (nach [Harley 2015])
Das Beispielnetzwerk soll es einem fußballspielenden Roboter erlauben, acht verschiedene Kategorien von Objekten in Bildern erkennen zu können. Das heißt, der anfänglich 96 × 96 × 3 große Inputvektor muss am Ende auf einen acht Elemente großen Output abgebildet werden. Einen Teil der Komprimierung dieser Daten übernehmen die Pooling-Schichten.
Diese Pooling-Schichten enthalten keine lernbaren Gewichte, sondern führen stattdessen eine hartcodierte Funktion auf einem Bereich der Inputs aus, der ebenfalls über den Input wandert. Typisch sind 2 × 2 große Fenster mit Stride 2, 2 und der max-Funktion (Max-Pooling). Der Wert des Output-Neurons entspricht also dem Maximalwert des ihm zugeordneten 2 × 2 großen Inputbereichs. Dadurch halbieren sich die ersten beiden Dimensionen der nächsten Schicht, wie in Abbildung 7–9 zu sehen ist.
Ein Neuron der ersten Max-Pooling-Schicht enthält also Informationen von 4 × 4 Neuronen der Inputschicht. In der nächsten Max-Pooling-Schicht ist der Einflussbereich im obigen Beispiel bereits 10 × 10 Neuronen groß. In der letzten Max-Pooling-Schicht sind es mit 78 × 78 Neuronen fast das gesamte Inputbild.
Abb. 7–9Berechnung der Aktivierung in einer Max-Pooling-Schicht
Die fully connected layers (auch dense layers), also vollständig vernetzten Schichten, eines Deep Convolutional Network entsprechen den bereits bekannten Backpropagation-Schichten. Die Aufgabe der Backpropagation-Schichten ist die Klassifikation der durch die früheren Convolution- und Pooling-Schichten erkannten High-Level-Features in die finalen Zielklassifikatoren.
Die erste Schicht von Neuronen entsteht dabei durch einfache Glättung der dreidimensionalen Matrix der letzten Pooling-Schicht in einen eindimensionalen Vektor. Die Zahl der Gewichte zwischen den ersten beiden Backpropagation-Schichten in obigem Beispiel beträgt beachtliche 4608 × 2048 = 9,4 Millionen. Das heißt, der Großteil der lernbaren Gewichte liegt in dieser Schicht. In neueren Netzwerken wurde daher die Größe dieser Schichten reduziert oder teilweise sogar ganz auf diese Schichten verzichtet, um Overfitting entgegenzuwirken.
Deep Reinforcement Learning (DRL) ist eine spezielle Form von Deep Learning, die klassisches Reinforcement Learning mit Deep Learning kombiniert. Reinforcement Learning, also Lernen durch Verstärkung, kommt häufig in autonomen Systemen zum Einsatz.
Beim Reinforcement Learning handelt es sich um einen sogenannten Markov-Entscheidungsprozess. Wie man in Abbildung 7–10 sehen kann, ist dieser grundsätzlich iterativ. Das autonome System nimmt seine Umgebung wahr. Basierend darauf trifft es dann seine nächste Entscheidung und führt eine passende Aktion aus, die die Umgebung verändern kann. Zusätzlich zu den unbewerteten Wahrnehmungen hat das System auch bewertete Wahrnehmungen, sogenannte Reinforcements. Ein Beispiel für bewertete Wahrnehmungen beim Menschen sind Schmerzen. Mithilfe der Reinforcements kann sich das autonome System an seine Umgebung anpassen und versuchen, seine Entscheidungen so zu verändern, dass der Nutzen des Systems auf lange Sicht optimiert wird.
Das autonome System lernt also eine möglichst optimale Policy, die beschreibt, wie es sich in seiner Umgebung verhalten soll. In der Praxis kann dies zum Beispiel bedeuten, eine möglichst große Punktezahl in einem Spiel zu erreichen. Damit das Ganze funktioniert, muss der Algorithmus eine gute Balance zwischen Exploration (Finden neuer Ansätze/Aktionen) und Exploitation (nach bisher Gelerntem agieren) finden.
Abb. 7–10Modell eines Reinforcement-Learning-Agenten
Vereinfacht gesagt wird beim Deep Reinforcement Learning dann das Konzept des regulären Reinforcement Learning dafür benutzt, um ein neuronales (Policy-) Netzwerk zu trainieren. In diesem Fall repräsentieren dann die Inputs des Netzwerks den Zustandsraum der Wahrnehmungen und die Outputs den Aktionsraum der Aktionen. Dementsprechend wächst auch die Größe des Netzwerks, je mehr Parameter Zustands- und Aktionsraum besitzen. Das tiefe neuronale Netzwerk leistet dabei den Part der Generalisierung, um ähnliche Zustände auf ähnliche Aktionen abzubilden.
Es existiert inzwischen eine Vielzahl von unterschiedlichen Algorithmen für Deep Reinforcement Learning. So gibt es zum Beispiel eine grundsätzliche Unterscheidung nach diskreten (0, 1, 2, …) und kontinuierlichen (Gleitkommazahlen) Aktions- bzw. Zustandsräumen. Für manche Anwendungsfälle wie ATARI-Spiele genügen diskrete Aktions- und Zustandsräume. Bei anderen wie der Steuerung eines Roboters benötigt man kontinuierliche Werte, um z.B. die Motoren zu steuern.
DRL-Algorithmen lassen sich in drei Hauptkategorien unterteilen [Stooke & Abbeel 2019]:
Ein konkreter Anwendungsfall von Deep Reinforcement Learning wird in Abschnitt 7.4.3 vorgestellt.
Die Anwendung von Deep Learning wird durch die Verfügbarkeit zahlreicher Deep-Learning-Frameworks vereinfacht, ist jedoch nicht ohne den einen oder anderen Kniff zu bewerkstelligen. In diesem Kapitel werden einige Frameworks kurz vorgestellt. Dabei wird auch auf verfügbare Standarddatensätze fürs Lernen sowie Standardnetzwerkarchitekturen eingegangen. Davor werden anhand von zwei Beispielanwendungen an der Hochschule Offenburg typische Vorgehensweisen und Best Practices gezeigt.
Der humanoide, autonome Roboter Sweaty [Hochschule Offenburg 2018]1 muss, um Fußball spielen zu können, Objekte auf dem Spielfeld erkennen. Um sich zu lokalisieren und auf das Tor kicken zu können, muss er z. B. die Torpfosten oder Linienmarkierungen auf dem Spielfeld in seinen Kamerabildern erkennen genauso wie den Ball oder gegnerische Roboter (vgl. Abb. 7–11). Dazu wurde unter anderem ein 26-schichtiges Deep Convolutional Neural Network eingesetzt [Schnekenburger et al. 2017], das auf dem pytorch-Framework2 basiert. Insgesamt können so acht Kategorien von Objekten erkannt werden, wobei die Genauigkeit z. B. beim Ball 99,2 % beträgt mit einer False-Detection-Rate von 0,8 %. Das ist beachtlich, da durch die Bewegung des Roboters viele Bilder auch bewegungsunscharf sind oder viele Bälle teilweise verdeckt sind. Bei einer Auflösung von 640 × 512 Pixeln erreicht das Netzwerk bis zu 60Hz. Nicht zuletzt aufgrund der stabilen Bilderkennung wurde Sweaty 2016 – 2019 Vizeweltmeister im Roboterfußball.
Abb. 7–11Objekterkennung des humanoiden Roboters Sweaty
Ein generelles Problem bei einem tiefen neuronalen Netzwerk mit so vielen freien Parametern ist Overfitting, dass also zwar die Trainingsbilder gelernt werden können, aber Objekte in unbekannten Bildern nicht zuverlässig erkannt werden. Im Falle von Sweaty wurden im Wesentlichen drei Maßnahmen dagegen ergriffen.
Zunächst wurden 2400 Bilder manuell getaggt, also alle Objekte auf den Bildern durch Rechtecke markiert und klassifiziert. 2150 davon wurden zum Lernen, die restlichen 250 zum Testen verwendet. Nicht nur diese Bilder wurden an das Netzwerk angelegt, sondern auch augmentierte Versionen, also zufällig rotierte, horizontal gespiegelte, mit Unschärfe versehene oder in der Helligkeit variierte Bilder (vgl. Abb. 7–12). Damit lässt sich die Zahl der Trainingsdaten ohne großen Mehraufwand deutlich erhöhen. Man könnte dabei meinen, dass das horizontale Spiegeln eines Balls keinen Einfluss auf das Lernen haben sollte. Das stimmt aber selbst dann nicht, wenn der Ball ein symmetrisches Muster hätte, weil z. B. auch der Schatten des Balls die Seite wechselt. Tatsächlich spielt das Umfeld um getaggte Objekte durchaus eine Rolle. Beim Lernen der Erkennung der eigenen Füße von Sweaty wurde festgestellt, dass die Füße nur erkannt wurden, wenn der Ball in der Nähe lag. Tatsächlich war auf allen Trainingsbildern ein Ball in der Nähe der Füße, sodass das Netzwerk das als wichtiges Merkmal mitgelernt hat, auch wenn der Ball nicht im getaggten Rechteck lag. Abhilfe schafften zusätzliche Bilder der Füße ohne Ball.
Abb. 7–12Veranschaulichung der Bildaugmentierung
Ein weiteres wichtiges Werkzeug zur Vermeidung von Overfitting ist es, das Netzwerk selbst Bilder taggen zu lassen. Wenn ein tiefes Netzwerk nach einer ersten Lernphase in der Lage ist, die ersten Objekte einigermaßen zuverlässig zu erkennen, kann man damit unbekannte Bilder taggen lassen und muss dann nur noch die Fehler manuell korrigieren, was wesentlich Zeit spart. Mit den so neu gewonnenen zusätzlichen Bildern wird dann erneut eine Lernphase gestartet, mit der in der Regel durch die zusätzlichen Bilder und die Korrektur der Fehler noch einmal bessere Ergebnisse erzielt werden.
Generell hilft gegen Overfitting in tiefen neuronalen Netzwerken ein Mechanismus, der Dropout genannt wird. Dabei werden beim Lernen eine nicht unerhebliche Anzahl von Neuronen zufällig deaktiviert (der Output auf 0 gesetzt). Dadurch wird vermieden, dass es einzelne, wichtige Neuronen für ein Feature im Netzwerk gibt. Stattdessen wird das Wissen möglichst gleichmäßig über das Netzwerk verteilt. In allen gängigen Frameworks ist Dropout verfügbar. Die Dropout-Rate wird meist zwischen 20 % und 50 % gewählt.
Das Team taco der Hochschule Offenburg nahm 2017 am Audi Autonomous Driving Cup3 teil und belegte einen sehr guten zweiten Platz. In diesem Wettbewerb fahren Modellfahrzeuge autonom durch einen Parcours mit verschiedenen Herausforderungen. Ein zentraler Aspekt beim autonomen Fahren ist natürlich die Erkennung von Objekten in Kamerabildern. So müssen andere Fahrzeuge, erwachsene Personen und Kinder (dargestellt durch Puppen) sowie Verkehrszeichen und Fahrbahnmarkierungen erkannt werden (vgl. Abb. 7–13).
Abb. 7–13Objekterkennung eines autonomen Modellfahrzeugs
In diesem Projekt wurde die Tensorflow Object Detection API4 mit einem auf COCO5 vortrainierten ResNet-1016 verwendet. Damit wurde für die verschiedenen Objekte eine sehr hohe Erkennungsrate erzielt, allerdings auf der On-Board-Hardware nur mit ca. 5 Hz, was für sehr schnelle Fahrten nicht ausreichend wäre.
Die Verwendung eines vortrainierten Netzes stellt eine weitere Stärke von Deep Learning dar. Die Features, die insbesondere in den Inputnahen Schichten gelernt wurden, sind so einfach und dadurch generell, dass sie auch in anderen Domänen verwendet werden können. Selbst wenn also das vortrainierte Netzwerk auf völlig anderen Objekten trainiert wurde, kann man es für die Erkennung der eigenen Objekte mithilfe relativ weniger (hier ca. 8.000) Bilder »umlernen«. Dabei werden häufig die niederen Convolution-Schichten ganz vom Lernen ausgeschlossen und nur noch die hinteren Schichten mit den eigenen Bildern gelernt. Die niedrigen Schichten sind, im Fall des COCO-Satzes, mit 200.000 Bildern ausreichend vortrainiert.
Zur Reduktion von Overfitting wurde in dieser Domäne noch eine weitere Maßnahme ergriffen. Neben den mit sehr großem Aufwand manuell getaggten Bildern wurde die Zahl der Bilder durch synthetische Bilder deutlich erhöht [Isenmann 2018]. Mit einem Grafikprogramm können Fahrbahnbilder künstlich erzeugt werden, auf denen dann die Objekte durch die Software selbst getaggt werden können, weil das Programm ja weiß, wo es die Objekte gezeichnet hat (vgl. Abb. 7–14). So können nach einmaliger Erstellung der Software 3.000 Bilder in nur fünf Minuten erstellt und mit Tags versehen werden.
Abb. 7–14Synthetisches, automatisch getaggtes Bild von Fahrbahnmarkierungen
Eine wichtige Erkenntnis beim Taggen von Bildern ist auch, dass alle zu erkennenden Objekte in einem Bild getaggt werden müssen. Sollen also mit einem Netzwerk Autos, Personen und Mittellinien erkannt werden, müssen auf jedem Trainingsbild alle Vorkommen dieser Objekte getaggt werden. Werden auf einigen Bildern z. B. die Autos nicht getaggt, versucht das Netzwerk, den Unterschied zwischen den getaggten und nicht getaggten Autos zu lernen, was kaum gelingen kann und zu einer deutlichen Verschlechterung der Erkennungsleistung führt.
In der 3D-Simulationsliga des RoboCups spielen 22 simulierte Nao-Roboter7 gegeneinander Fußball (vgl. Abb. 7–15). Dabei kommt eine Physiksimulation zum Einsatz, bei der jedes einzelne der insgesamt bis zu 24 Gelenke eines Roboters 50-mal pro Sekunde angesteuert werden muss. Zusätzlich ist die Umgebung nicht deterministisch und die Wahrnehmungen sind verrauscht. Bewegungen wie das Laufen auf zwei Beinen oder das Kicken des Balls sind daher in dieser Umgebung wie auch bei echten Robotern komplex.
Abb. 7–15Simulierte Nao-Roboter in der 3D-Simulationsliga des RoboCups
Machine Learning, zum Beispiel in Form von genetischen Algorithmen, gehören hier schon länger zur Tagesordnung. Seit 2019 setzen Teams auch Deep Reinforcement Learning für Verhaltensweisen (Behaviors) wie das Rennen ein. Während man mit modellbasierten Ansätzen und Parameteroptimierung ein ca. 1 m/s schnelles Laufen erreicht, wurden mit DRL Anfang 2019 2,5 m/s erreicht, wohlgemerkt mit denselben Robotern [Abreu et al. 2019]. Wenige Monate später wurde dieser Wert noch einmal deutlich auf etwa 3,9 m/s gesteigert [Melo & Maximo 2019]. In Zukunft wird man wohl um Deep Reinforcement Learning nicht herumkommen, wenn man in der 3D-Simulationsliga vorne mit dabei sein will. Das Team magmaOffenburg der Hochschule Offenburg, das nun schon drei Mal Vizeweltmeister geworden ist, arbeitet aktuell ebenfalls daran, mithilfe von DRL bessere Behaviors für das Laufen und Kicken zu trainieren.
Der Aktionsraum steuert dabei direkt die Gelenke. Pro Gelenk und pro Zyklus gibt jeweils ein Outputwert den Zielwinkel und die Geschwindigkeit an. Bei 24 Gelenken hat der Aktionsraum also eine Größe von 48. Der Zustandsraum besteht in erster Linie aus rohen Sensordaten und deren Ableitungen: der aktuelle Winkel und die aktuelle Geschwindigkeit jedes Gelenks, Fußdrucksensoren, Accelerometer und Gyroskop. Einige der Inputs sind auch abgeleitet, wie z.B. Rotationswinkel und Ballposition im lokalen Koordinatensystem des Roboters (vor allem für Kicks relevant). Zusätzlich gibt es noch einen »Counter«, der jeden Zyklus um eins erhöht. Alles in allem ergeben sich damit über 100 Inputwerte für das neuronale Netzwerk. Sowohl Inputs als auch Outputs werden in einem Intervall von -1 bis 1 normalisiert. Das Netzwerk selbst ist ein Backpropagation-Netzwerk mit zwei verdeckten Schichten von jeweils 64 Neuronen.
Ein Video8 zeigt die ersten Gehversuche von magmaOffenburg mit Deep Reinforcement Learning (Stand März 2020). Das gelernte Laufen sieht noch etwas unorthodox aus, vermutlich vor allem deshalb, weil der Roboter die Armgelenke nicht mitbenutzen durfte. Die Dauer eines solchen Lernvorgangs erstreckt sich über mehrere Tage und mehr als 300 Millionen TensorFlow Steps.
Besonders die Verfügbarkeit von zahlreichen Softwareframeworks für Deep Learning vereinfacht den Einstieg in das Thema erheblich. Den Zusammenhang zwischen den einzelnen Komponenten einer fertigen Anwendung zeigt Abbildung 7–16. Die GPU wird meist über die Cuda9-Schnittstelle vom Deep-Learning-Framework eingebunden und beschleunigt das Lernen und den Recall von Netzen insbesondere bei größeren Bildern erheblich, z.B. um Faktor 10 beim AudiCup-Projekt. Das Deep-Learning-Framework stellt alle Komponenten tiefer neuronaler Netzwerke meist für verschiedene Programmiersprachen zur Verfügung. Der Benutzer kann damit relativ leicht ein eigenes Netzwerkmodell erstellen. Alternativ stehen bereits vorhandene Standardnetzwerkmodelle zur Verfügung, die teilweise schon mit Standarddatensätzen vortrainiert sein können. In der Regel wird man dann das Netzwerk noch mit eigenen Datensätzen für das eigene Problem weiter trainieren.
Abb. 7–16Architektur einer Deep-Learning-Anwendung
Tabelle 7–1 zeigt einige gängige Frameworks. Daneben gibt es zahlreiche weitere.10
Framework |
URL |
Sprachen |
Ursprung |
TensorFlow |
Java, R, Python, C/C++, Go |
Google Brain Team |
|
Torch |
Lua, LuaJIT, C, Python (PyTorch) |
Ronan Collobert, Koray Kavukcuoglu, Clement Farabet |
|
Deep-learning4J |
Java, Clojure, Scala, Kotlin, Python |
Adam Gibson, Skymind Engineering Team, DL4J Community |
|
Caffe |
Python, C++, MATLAB |
Berkeley Vision and Learning Center |
|
Theano |
Python |
Université de Montréal |
|
Cognitive Toolkit (CNTK) |
Python, C++, Commandline |
Microsoft |
|
Keras |
https://keras.io/ (API für TensorFlow, Theano, CNTK) |
Python, R |
François Chollet |
Tab. 7–1Gängige Deep-Learning-Frameworks
Durch die große Zahl an lernbaren Parametern benötigen tiefe neuronale Netzwerke viele Daten, um erfolgreich trainiert zu werden. Um die Forschung auf diesem Gebiet voranzubringen, haben zahlreiche Forscher, Hochschulen, Universitäten und Unternehmen Standarddatensätze für das Benchmarking und Training von Deep-Learning-Ansätzen veröffentlicht. Eine erste Übersicht liefert Deep-Learning.net.11 Drei Datensätze seien hier besonders erwähnt.
MNIST12 ist ein Datensatz mit 70.000 handgeschriebenen Ziffern inklusive Labels von 250 Schreibern zum Benchmarking von Software für die Handschrifterkennung. Wegen der überschaubaren Größe ist er ein beliebter Datensatz für die Evaluation von Deep-Learning-Ansätzen zur Bilderkennung.
Der wohl größte verfügbare Standarddatensatz ist ImageNet.13 Es ist auch der Datensatz für den gleichnamigen jährlichen Wettbewerb zur Objekterkennung. Er enthält rund 14 Millionen getaggte Bilder mit 21.000 unterschiedlichen Objektkategorien, also mehr als 500 Bilder pro Kategorie.
Bei COCO14 (Common Objects in Context) [Lin et al. 2014] sind die 1,5 Millionen Objekte in den 200.000 Bildern nicht nur getaggt, sondern auch segmentiert. Das heißt, es wurde genau markiert, welche Region im Bild durch das Objekt eingenommen wird. Zusätzlich sind die Tags oder Labels mit Kontextinformation versehen wie »Eine Person mit einem Regenschirm auf der Straße«.
Darüber hinaus gibt es zahlreiche andere Datensätze für Musik, Spracherkennung, Texterkennung, Gesichtserkennung und vieles mehr.
Es gibt zahlreiche Modelle von Netzwerkarchitekturen, die sich als erfolgreich erwiesen haben und deswegen einen gewissen Standardstatus erlangt haben. Zumindest die bekannteren seien hier aufgeführt.
Das LeNet-5 [LeCun et al. 1998] ist ein siebenschichtiges Netzwerk mit vier Convolution-Schichten und drei Backpropagation-Schichten. Es wurde bereits in den 90er-Jahren sehr erfolgreich zur Handschrifterkennung eingesetzt.
Das AlexNet [Krizhevsky et al. 2012] war sicher einer der Auslöser für den heutigen Boom von Deep Learning. Im ImageNet-Wettbewerb 2012 siegte es mit einem Erkennungsfehler von 16,4% mit haushohem Vorsprung vor dem Zweitplatzierten (26,2%). Es ist als achtschichtiges Netzwerk mit fünf Convolution- und drei Backpropagation-Schichten konzipiert und hat ca. 16 Millionen lernbare Gewichte.
2014 gewann das GoogLeNet [Szegedy et al. 2015] den ImageNet-Wettbewerb erneut mit einer deutlichen Reduzierung der Fehlerrate auf nun mehr 6,7%. Das 22-schichtige Netzwerk benötigt dank zahlreicher Optimierungen vergleichbar viele Rechenressourcen wie flachere Netzwerke dieser Zeit.
Diese Fehlerrate wurde im ImageNet-Wettbewerb 2015 noch einmal unterboten vom ResNet-152 [He et al. 2016] mit 3,6%. Es ist damit besser als menschliche Versuchspersonen, die bei derselben Aufgabe mit einer Fehlerquote von 5 % abschneiden. Durch den modularen Aufbau lassen sich leicht unterschiedlich tiefe Netzwerke erstellen. So sind auch Varianten mit 50 oder 101 Schichten verfügbar.
Die Möglichkeiten der Bilderkennung werden auch in zahlreichen anderen Gebieten genutzt, beispielsweise um Text in Bildern durch eine übersetzte Version zu überblenden15 oder in der Medizintechnik zur Erkennung von Hautkrebs16 oder zur Erkennung des Risikos von Herzinfarkten.17 Entsprechende Techniken erlauben es umgekehrt, Schwarz-Weiß-Bilder nachträglich mit Farbe zu versehen18 oder komplette, fotorealistische Bilder mithilfe von Generative Adversarial Networks (GANs) zu erzeugen (vgl. Abb. 7–17).
Abb. 7–17Mit GAN erzeugte, künstliche Gesichter19
Neben der Bilderkennung gibt es heute bereits zahlreiche andere Anwendungsfelder für Deep Learning. In der Spracherkennung wurden Systeme wie Alexa, Siri oder Google Now deutlich robuster und sprecherunabhängig mithilfe von Deep Learning. Auch die Sprachgenerierung in WaveNet oder Deep Speech wurde damit deutlich realistischer. Häufig kommt dabei mit Long-Short Term Memory eine weitere Technik des Deep Learning zum Einsatz, bei der rekurrente Netzwerke die Rückkopplung von Aktivierung erlauben. Dadurch sind sie insbesondere für die Verarbeitung von Zeitreihendaten geeignet.
DeepMind kombinierte Deep Convolutional Neural Networks mit Reinforcement Learning, um Atari-Spiele spielen zu lernen.20 Deep Reinforcement Learning wurde auch angewendet, um Ressourcen in Cloud-Systemen besser zuzuweisen und damit 50% Energie zu sparen.21
In der Datenanalyse nutzt man Deep Learning beispielsweise zur Spam-Erkennung22, im Bereich der vorausschauenden Wartung (Predictive Maintenance)23 oder zur Erkennung des Abwanderungsverhaltens von Kunden in der Churn-Analyse in Kapitel 12.
Mit dem Thema Deep Learning hat seit wenigen Jahren ein neues Zeitalter der künstlichen Intelligenzforschung begonnen. Zahlreiche Anwendungen belegen das hohe Potenzial dieses neuen Ansatzes, das aber vielfach in der Industrie noch nicht genutzt wird. Gerade durch die freie Verfügbarkeit von Deep-Learning-Frameworks und bereits vortrainierter Netze dürfte sich das in den kommenden Jahren aber ändern. Dabei wird der Einsatz nicht auf die Verarbeitung von perzeptuellen Daten wie Videos, Bilder oder Sprache beschränkt bleiben.