Tesla AI Day – Die Präsentation (I)

Am 19.08.2021 präsentierten Elon Musk und das Tesla-AI-Team den technischen Fortschritt auf dem Gebiet der künstlichen Intelligenz und beantworteten Fragen aus dem Publikum. Dies hier ist die deutsche Übersetzung des ersten Teils der Präsentation (Minute 47:09 – 1:24:30), in dem Andrej Karpathy und Ashok Elluswamy die Herangehensweise und Entwicklung über die letzten Jahre beschreiben und einen Einblick geben, wie eine Bildverarbeitung mit neuronalen Netzen funktioniert. Viele der im Transkript eingefügten Bilder enthalten Links zu Videosequenzen, die bei der Veranstaltung gezeigt wurden. Zum YouTube Video, Teil 2 und englischen Transkript dieser Veranstaltung gelangen Sie durch Klicken auf die Links.

Elon Musk: (47:09) Hallo zusammen, entschuldigen Sie die Verspätung. Danke fürs Kommen. Und entschuldigen Sie, wir hatten einige technische Schwierigkeiten, wir brauchen wirklich eine KI (Künstliche Intelligenz) dafür. Wir wollen heute zeigen, dass Tesla viel mehr als ein Elektrofahrzeughersteller ist, sondern dass wir tiefgreifende KI-Aktivitäten in der Hardware, auf der Inferenz- und der Trainingsebene erreichen. Und im Grunde (47:38…) denke ich, dass diejenigen wohl führend in der KI sind, die eine KI für die realen Welt bieten. Diejenigen unter Ihnen, die die FSD Beta-KI gesehen haben, können die Geschwindigkeit erfassen, mit der das neuronale Netz von Tesla das Fahren lernt. Und dies ist nur eine Anwendung der KI.

Aber ich denke, es gibt noch mehr Anwendungen, die in Zukunft sinnvoll sein werden. Darüber werden wir später in der Präsentation sprechen. Aber ja, im Grunde möchten wir jeden ermutigen, der daran interessiert ist, reale KI-Probleme auf Hardware- oder Software-Ebene zu lösen, bei Tesla mitzumachen oder es in Erwägung zu ziehen. Also, fangen wir mit Andrej an.

Andrej Karpathy: (48:35) Hallo, zusammen. Herzlich willkommen. Mein Name ist Andrej, und ich leite das Vision-Team hier bei Tesla Autopilot. Und ich freue mich unglaublich, dass ich hier bin, um diesen Abschnitt zu beginnen und Ihnen einen technischen Einblick in den Autopilot-Stack zu geben und Ihnen all die Komponenten unter der Motorhaube zu zeigen, die dafür sorgen, dass das Auto von ganz allein fährt. Wir werden also mit der Bildverarbeitungskomponente beginnen.

Bei der Bildverarbeitungskomponente versuchen wir, ein neuronales Netzwerk zu entwickeln, das die Rohdaten verarbeitet, in unserem Fall die der acht Kameras, die um das Fahrzeug herum positioniert sind und uns die Bilder senden. Diese müssen wir in Echtzeit in einen so genannten Vektorraum umwandeln. Das ist eine dreidimensionale Darstellung von allem, was man zum Fahren benötigt, also die dreidimensionalen Positionen von Fahrspuren, Rändern, Bordsteinen, Verkehrsschildern, Ampeln, Autos und ihrer Positionen, Ausrichtungen, Tiefen, Geschwindigkeiten und so weiter. Hier zeige ich nun ein Video von… – Moment mal. Verzeihung.

(49:47) Hier zeige ich das Video der Rohdaten, die im Stack ankommen, und dann verarbeitet das neuronale Netz diese in den Vektorraum. Und Sie sehen Teile dieses Vektorraums, die im Display des Autos dargestellt werden.

Faszinierend daran finde ich, dass wir praktisch von Grund auf ein synthetisches Tier bauen. Man kann sich das Auto also wie ein Tier vorstellen, das sich fortbewegt, seine Umgebung wahrnimmt und, Sie wissen schon, autonom und intelligent handelt. Und wir bauen alle Komponenten von Grund auf selbst. Wir bauen alle mechanischen Komponenten der Karosserie, das Nervensystem mit allen elektrischen Komponenten und für unsere Zwecke das Gehirn des Autopiloten – und speziell für diesen Abschnitt den synthetischen visuellen Kortex.

Der biologische visuelle Kortex hat eine ziemlich komplizierte Struktur und eine Reihe von Bereichen, die den Informationsfluss im Gehirn organisieren. Im visuellen Kortex treffen die Informationen auf die Netzhaut und wandern über den LGN (Nucleus geniculatus lateralis) bis in den hinteren Teil des visuellen Kortex, wo sie die Bereiche V1, V2, V4, IT und die ventralen und dorsalen Ströme durchlaufen. Und die Informationen sind in einem bestimmten Layout organisiert. Wenn wir also den visuellen Kortex des Autos entwerfen, wollen wir auch die Architektur des neuronalen Netzes entwerfen, die bestimmen, wie die Informationen in dem System fließen.

(51:13) Die Verarbeitung beginnt also am Anfang, wenn Licht auf unsere künstliche Netzhaut trifft. Und wir werden diese Informationen mit neuronalen Netzen verarbeiten. Ich werde diesen Abschnitt nun grob chronologisch gliedern. Ich beginne also mit einigen der neuronalen Netze und wie sie vor etwa vier Jahren aussahen, als ich dem Team beitrat, und wie sie sich im Laufe der Zeit entwickelt haben.

Vor etwa vier Jahren fuhr das Auto auf der Autobahn meist einspurig vorwärts. Es musste also die Spur halten und den Abstand zu dem Auto davor wahren. Zu dieser Zeit erfolgte die gesamte Verarbeitung nur auf Einzelbildebene. Ein einzelnes Bild muss also von einem neuronalen Netz analysiert werden, um kleine Teile des Vektorraums zu erstellen bzw. es zu einem kleinen Stück des Vektorraums zu verarbeiten. Diese Verarbeitung nahm also die folgende Form an.

Wir nehmen eine 1280 mal 960 große Eingabe, und das sind 12-Bit-Ganzzahlen, die mit etwa 36 Hertz einfließen. Jetzt werden wir das mit einem neuronalen Netzwerk verarbeiten. Wir instanziieren also ein Feature Extractor Backbone. In diesem Fall verwenden wir residuale neuronale Netze. Wir haben also einen Stamm und einige von in Reihe geschalteten Restblöcken. Die spezifische Klasse der Resonanz, die wir verwenden, sind RegNets, denn das ist eine sehr… – RegNets bieten einen sehr schönen Designraum für neuronale Netze, denn sie erlauben es, Latenz und Genauigkeit sehr gut abzuwägen.

Diese RegNets geben uns eine Reihe von Merkmalen mit unterschiedlichen Auflösungen in verschiedenen Maßstäben aus. So haben wir insbesondere ganz unten in dieser Merkmalshierarchie sehr hoch aufgelöste Informationen mit einer sehr niedrigen Kanalzahl, und ganz oben haben wir eine niedrige räumliche Auflösung, aber eine hohe Kanalzahl. Ganz unten haben wir also eine Menge Neuronen, die wirklich die Details des Bildes unter die Lupe nehmen. Und oben haben wir Neuronen, die den größten Teil des Bildes sehen können und einen großen Teil des Kontextes… einen großen Teil des Szenenkontextes haben.

(52:54) Wir verarbeiten dies dann gerne mit Feature Pyramid Networks (FPN). In unserem Fall verwenden wir gerne BiFPNs (Bi-directional Feature Pyramid Networks), die auf mehreren Ebenen effektiv miteinander kommunizieren und viele Informationen austauschen. Wenn Sie zum Beispiel ein Neuron ganz unten im Netz sind und einen kleinen Fleck betrachten und nicht sicher sind, ob es sich um ein Auto handelt oder nicht, ist es auf jeden Fall hilfreich, von den oberen Ebenen zu erfahren: „Hey, du befindest dich gerade im Fluchtpunkt dieser Autobahn“. Und das hilft einem zu erkennen, dass es sich wahrscheinlich um ein Auto handelt.

(53:19) Nach einem BiFPN und einer ebenenübergreifenden Merkmalsfusion gehen wir dann zu aufgabenspezifischen Köpfen über. Wenn Sie zum Beispiel eine Objekterkennung durchführen, haben wir einen einstufigen yolo-ähnlichen Objektdetektor, bei dem ein Raster initialisiert wird und ein binäres Bit pro Position angibt, ob sich dort ein Auto befindet oder nicht. Und wenn ja, gibt es zusätzlich noch eine Reihe anderer Attribute, die von Interesse sein könnten: der x-y-Breiten-Höhen-Versatz oder andere Attribute, z. B. welche Art von Auto es ist usw. Dies ist für die Erkennung an sich.

Wir haben sehr schnell herausgefunden, dass wir nicht nur Autos erkennen wollen, sondern eine Vielzahl von Aufgaben erfüllen müssen. So wollen wir zum Beispiel Ampeln erkennen und detektieren, Fahrspuren vorhersagen und so weiter. Wir haben also sehr schnell eine Art von architektonischem Layout umgesetzt, bei dem es ein gemeinsames Backbone gibt, das sich dann in eine Reihe von Köpfen verzweigt. Wir nennen dies daher „Hydra Nets“. Und dies sind die Köpfe der Hydra.

(54:10) Dieses Architekturlayout hat eine Reihe von Vorteilen. Erstens können wir aufgrund der gemeinsamen Nutzung von Funktionen die Forward-Pass-Inferenz im Fahrzeug zur Testzeit amortisieren. Das ist also sehr effizient, denn wenn wir für jede einzelne Aufgabe einen Backbone bräuchten, gäbe es eine Menge Backbones im Auto. Zweitens werden dadurch alle Aufgaben entkoppelt, so dass wir jede einzelne Aufgabe isoliert bearbeiten können. So können wir z. B. an einem der Datensätze arbeiten oder die Architektur des Kopfes ändern, ohne dass sich dies auf andere Aufgaben auswirkt. Wir müssen also nicht alle anderen Aufgaben neu validieren, was teuer sein kann.

Und drittens: Da es hier einen Engpass bei den Features gibt, werden diese Features häufig auf der Festplatte zwischengespeichert, und bei den Feinabstimmungs-Workflows nehmen wir die Feinabstimmung nur anhand der zwischengespeicherten Features vor und stimmen nur die Köpfe ab. Bei unseren Trainingsworkflows führen wir also meistens einen End-to-End-Trainingslauf durch, bei dem wir alles gemeinsam trainieren, dann die Features auf der Ebene der Multiskalen-Features zwischenspeichern und dann eine Zeit lang eine Feinabstimmung vornehmen, und dann wieder End-to-End Training und so weiter.

(55:16) Hier sehen Sie also die Art von Vorhersagen, die wir vor einigen Jahren mit einem dieser Hydra-Netze erhalten haben. Wir verarbeiten wieder einzelne Bilder. Hier ist es.

Wir verarbeiten nur einzelne Bilder und machen eine große Anzahl von Vorhersagen über diese Bilder. Hier sehen Sie zum Beispiel Vorhersagen über die Stoppschilder, die Haltelinien, die Linien, die Ecken, die Autos, die Ampeln, die Bordsteine, ob das Auto geparkt ist oder nicht, alle statischen Objekte wie Mülleimer, Kegel und so weiter. Und alles hier kommt aus dem Netz – hier in diesem Fall aus dem Hydra-Net. Das war alles schön und gut, aber als wir auf FSD hinarbeiteten, stellten wir schnell fest, dass das nicht genug ist. Als wir mit der Arbeit an Smart Summon begannen, war das zum ersten Mal nicht mehr genug.

Hier zeige ich einige der Vorhersagen nur für die Aufgabe der Bordsteinerkennung. Und ich zeige sie jetzt für jede einzelne Kamera. Wir möchten uns also durch den Parkplatz schlängeln, um die Person zu finden, die das Auto herbeiruft. Das Problem ist nun, dass man nicht einfach direkt auf die Vorhersagen des Bildraums fahren kann. Man muss sie tatsächlich rauswerfen und eine Art Vektorraum um sich herum bilden. Wir haben also versucht, dies mit C++ zu tun, und das entwickelt, was wir damals „Occupancy Tracker“ nannten.

Hier sehen wir also, dass die Bordsteinerkennungen aus den Bildern über Kameraszenen, Kameragrenzen und über die Zeit hinweg zusammengefügt werden. Bei diesem Aufbau gab es zwei große Probleme. Erstens haben wir sehr schnell festgestellt, dass die Einstellung des Occupancy Trackers und aller seiner Hyperparameter extrem kompliziert ist. Man will das nicht explizit von Hand in C++ machen. Man möchte dies innerhalb eines neuronalen Netzes tun und es Ende zu Ende trainieren. Zweitens haben wir sehr schnell festgestellt, dass der Bildraum nicht der richtige Ausgaberaum ist. Man will keine Vorhersagen im Bildraum machen, sondern direkt im Vektorraum. Hier ist eine Möglichkeit, das Problem zu veranschaulichen.

(57:01) Hier zeige ich in der ersten Zeile die Vorhersagen unserer Bordsteine und Linien in Rot und Blau. Und sie sehen im Bild großartig aus. Aber wenn man sie in den Vektorraum überträgt, sieht es wirklich schrecklich aus. Wir werden nicht in der Lage sein, damit zu fahren. Sie sehen also, dass alle Vorhersagen im Vektorraum ziemlich schlecht sind. Der Grund dafür ist, dass man eine extrem genaue Tiefe pro Pixel benötigt, um diese Projektion durchführen zu können. Sie können sich also vorstellen, wie hoch die Messlatte ist, um diese Tiefe in diesen winzigen einzelnen Pixeln des Bildes so genau vorherzusagen. Und wenn es einen verdeckten Bereich gibt, in dem man Vorhersagen machen möchte, ist das nicht möglich, weil es sich in diesem Fall nicht um ein Bildraum-Konzept handelt.

Ein weiteres Problem besteht übrigens auch bei der Objekterkennung. Wenn man nur Vorhersagen pro Kamera macht, dann gibt es manchmal Fälle wie diesen, wo ein einzelnes Fahrzeug in Fragmenten auf fünf der acht Kameras erscheint. Wenn Sie also einzelne Vorhersagen machen, sieht keine einzelne Kamera das ganze Auto, und so werden Sie natürlich nicht in der Lage sein, dieses Auto sehr gut vorherzusagen. Und es wird unglaublich schwierig sein, diese Messungen zu fusionieren.

Also versuchen wir stattdessen, alle Bilder zu nehmen und sie gleichzeitig in ein einziges neuronales Netz einzuspeisen und direkt im Vektorraum auszugeben. Das ist sehr leicht gesagt, aber viel schwieriger zu erreichen. Aber grob gesagt, wollen wir ein neuronales Netz so anlegen, dass wir jedes einzelne Bild mit einem Backbone verarbeiten. Und dann wollen wir sie irgendwie verschmelzen. Und wir wollen die Merkmale aus dem Bildraum direkt in eine Art Vektorraum darstellen und dann in die Dekodierung des Kopfes gehen.

(58:42) Dabei gibt es zwei Probleme. Problem Nummer eins: Wie erstellt man eigentlich die Komponenten des neuronalen Netzes, die diese Transformation durchführen? Und man muss sie differenzierbar machen, so dass ein durchgängiges Training möglich ist. Und zweitens: Wenn Sie mit Ihrem neuronalen Netz Vorhersagen für den Vektorraum treffen wollen, benötigen Sie vektorraumbasierte Datensätze. Es reicht also nicht aus, einfach nur Bilder zu beschriften – man braucht vektorraumbasierte Beschriftungen. Auf Problem Nummer zwei werden wir später in diesem Vortrag noch genauer eingehen. Im Moment möchte ich mich auf die Architektur neuronaler Netze konzentrieren, also werde ich mich mit Problem Nummer eins befassen.

Hier liegt also das grobe Problem, richtig? Wir versuchen, die Vorhersage aus der Vogelperspektive und nicht aus dem Bildraum zu machen. Konzentrieren wir uns also zum Beispiel auf das einzelne gelbe Pixel im Ausgabebereich. Und dieses Pixel versucht zu entscheiden, ob es Teil eines Bordsteins ist oder nicht. Woher soll nun die Unterstützung für diese Art der Vorhersage im Bildraum kommen? Nun, wir wissen ungefähr, wie die Kameras positioniert sind, und wir kennen ihre Erfahrungen und Besonderheiten. Wir können diesen Punkt also grob auf die Kamerabilder projizieren. Und der Beweis dafür, ob es sich um einen Bordstein handelt oder nicht, könnte von irgendwo hier in den Bildern kommen.

Das Problem besteht darin, dass man diese Projektion nur schwer korrekt hinbekommt, da sie von der Straßenoberfläche abhängt, die sowohl ansteigend als auch abfallend sein kann. Oder es könnten auch andere datenabhängige Probleme auftreten. Zum Beispiel könnte es eine Verdeckung durch ein Auto geben. Wenn also ein Auto diesen Blickwinkel, diesen Teil des Bildes verdeckt, dann sollten Sie vielleicht auf einen anderen Teil des Bildes achten – nicht auf den Teil, auf den es projiziert. Da dies also datenabhängig ist, ist es wirklich schwierig, eine feste Transformation für diese Komponente zu haben.

Um dieses Problem zu lösen, verwenden wir einen Transformator, um diesen Raum darzustellen. Und dieser Transformator verwendet Multi-Head Self-Attention und Blöcke davon. In diesem Fall können wir sogar mit einem einzigen Block auskommen, der einen Großteil dieser Arbeit erledigt. Im Grunde genommen initialisiert man ein Raster in der Größe des gewünschten Ausgaberaums und betitelt es mit Positionskodierungen, mit Sinus- und Kosinuskurven im Ausgaberaum, die dann mit einem MLP in einen Satz von Abfragevektoren kodiert werden. Und dann geben alle Bilder und ihre Merkmale auch ihre eigenen Schlüssel und Werte ab. Die Abfrageschlüssel und -werte fließen dann in die Multi-Head Self-Attention ein.

Das heißt, jedes einzelne Bild überträgt in seinem Schlüssel, was es ist, wovon es ein Teil ist, also „Hey, ich bin Teil einer Säule, die sich ungefähr an dieser Stelle befindet, und ich sehe diese Art von Dingen.“ Das steht im Schlüssel. Und dann ist jede Abfrage etwas in der Art von „Hey, ich bin ein Pixel im Ausgaberaum an dieser Position und ich suche nach Merkmalen dieses Typs.“ Dann interagieren die Schlüssel und die Abfragen multiplikativ, und die Werte werden entsprechend gebündelt.

(1:01:13) Dies stellt also den Raum dar, und wir haben festgestellt, dass dies für diese Transformation sehr effektiv ist. Also, wenn man die ganze Technik richtig macht – das ist wiederum sehr leicht gesagt, schwer zu machen – man macht die ganze Technik richtig… – Es gibt eigentlich noch ein Problem vorher.

Also noch eine Sache. Sie müssen bei einigen Details vorsichtig sein, wenn Sie versuchen, dies zum Laufen zu bringen. Alle unsere Autos sind auf eine etwas andere Art und Weise leicht schief. Wenn Sie also diese Transformation vom Bildraum in den Ausgaberaum vornehmen, müssen Sie wirklich wissen, wie Ihre Kamera kalibriert ist. Und das muss man irgendwie in das neuronale Netz einspeisen. Man könnte also einfach die Kamerakalibrierungen aller Bilder zusammenfassen und sie irgendwie in das MLP einspeisen. Aber wir haben herausgefunden, dass es viel besser geht, wenn wir alle Bilder mit einem speziellen Entzerrungsschritt in eine synthetische virtuelle Kamera transformieren. So würde das aussehen.

(1:02:07) Wir fügen eine neue Ebene direkt über der Bildentzerrungsebene ein. Das ist eine Funktion der Kamerakalibrierung, die alle Bilder in eine virtuelle gemeinsame Kamera übersetzt. Wenn Sie also zum Beispiel eine Menge von Wiederholungsbildern, die nach hinten gerichtet sind, mitteln, würden Sie… – also, wenn Sie dies nicht täten, würden Sie eine Art Unschärfe erhalten. Aber nach dem Entzerrungsschritt wird der Rückspiegel richtig scharf. Wenn man dies also tut, verbessert sich die Leistung um einiges.

Hier sind einige der Ergebnisse. Auf der linken Seite sehen wir, was wir vorher hatten, und auf der rechten Seite sehen wir jetzt deutlich verbesserte Vorhersagen, die direkt aus dem neuronalen Netz kommen. Dies ist ein Multikameranetz, das direkt im Vektorraum Vorhersagen macht. Und Sie können sehen, dass es im Grunde wie Tag und Nacht ist – man kann tatsächlich darauf fahren. Und das hat einige Zeit und einiges an Ingenieursarbeit gekostet, eine unglaubliche Arbeit des KI-Teams, um dies tatsächlich zum Laufen zu bringen, im Auto einzusetzen und effizient zu machen.

(1:03:01) Dadurch wurde auch die Objekterkennung erheblich verbessert. Hier in diesem Video zeige ich zum Beispiel die Vorhersagen für eine einzelne Kamera in orange und die Vorhersagen für mehrere Kameras in blau. Und im Grunde genommen kann man diese Autos nicht vorhersagen, wenn man nur einen winzigen Ausschnitt eines Autos sieht. Ihre Erkennungen und ihre Positionen werden also nicht sehr gut sein. Bei einem Netzwerk mit mehreren Kameras besteht dieses Problem jedoch nicht. Hier ist ein weiteres Video aus einer eher nominellen Situation. Wir sehen, dass die Autos in diesem engen Raum die Kameragrenzen überqueren und eine Menge Schrott in die Vorhersagen einfließt. Im Grunde genommen macht der ganze Aufbau keinen Sinn, insbesondere, wenn es um so große Fahrzeuge wie dieses hier geht. Und wir können sehen, dass die Multi-Kamera-Netzwerke deutlich weniger Probleme mit dieser Art von Vorhersagen haben.

(1:03:40) Okay, an diesem Punkt haben wir also Multi-Kamera-Netzwerke, die direkt im Vektorraum Vorhersagen machen. Aber wir arbeiten immer noch zu jedem einzelnen Zeitpunkt völlig unabhängig. Wir haben also sehr schnell herausgefunden, dass es eine große Anzahl von Vorhersagen gibt, die wir machen wollen und die eigentlich den Videokontext benötigen, und wir müssen irgendwie herausfinden, wie wir diesen in das neuronale Netz einspeisen können. Ist dieses Auto nun geparkt oder nicht? Ist es in Bewegung? Wie schnell ist es unterwegs? Ist es noch da, auch wenn es vorübergehend verdeckt ist? Oder, wenn ich zum Beispiel versuche, die Straßengeometrie vor mir vorherzusagen, ist es sehr hilfreich, sich an die Schilder oder die Straßenmarkierungen von vor 50 Metern zu erinnern.

Wir haben also versucht, Videomodule in unsere neuronale Netzwerkarchitektur einzufügen. Und das ist eine der Lösungen, auf die wir uns geeinigt haben. Wir haben also die Multiskalen-Features, wie wir sie vorher hatten. Jetzt fügen wir ein Feature-Cue-Modul ein, das einige dieser Merkmale im Laufe der Zeit zwischenspeichert, und dann ein Videomodul, das diese Informationen vorübergehend fusioniert. Und dann geht es weiter mit den Köpfen, die die Dekodierung vornehmen. Ich werde nun diese beiden Blöcke einzeln durchgehen. Beachten Sie zudem, dass wir hier auch die Kinematik einspeisen. Das sind im Grunde die Geschwindigkeit und die Beschleunigung, die uns Aufschluss darüber geben, wie sich das Auto bewegt. Wir werden also nicht nur verfolgen, was wir von allen Kameras sehen, sondern auch, wie sich das Auto bewegt hat.

(1:04:54) Hier ist also die Feature-Warteschlange und das grobe Layout davon. Im Grunde genommen verknüpfen wir diese Features über die Zeit, die Kinematik, wie sich das Auto bewegt hat, und die Positionskodierungen. Das alles wird verknüpft, kodiert und in einer Feature-Warteschlange gespeichert. Und das wird dann vom Videomodul verarbeitet. Auch hier gibt es wieder ein paar Details zu beachten. Insbesondere in Bezug auf die Pop- und Push-Mechanismen, wann gepusht wird …- vor allem, wann gepusht wird.

Hier ist also ein Cartoon-Diagramm, das einige der Herausforderungen verdeutlicht. Die Ego-Autos kommen von unten und fahren bis zu dieser Kreuzung hier. Und dann fängt der Verkehr an, vor uns zu kreuzen. Er wird vorübergehend einige der vorausfahrenden Autos verdecken. Und dann werden wir eine Weile an dieser Kreuzung festsitzen und warten, bis wir an der Reihe sind. Das ist etwas, das immer wieder passiert und diese Cartoon-Darstellung zeigt einiger der Herausforderungen auf. Erstens, in Bezug auf die Feature-Warteschlange, und wenn wir in eine Warteschlange pushen wollen, möchten wir natürlich eine Art zeitbasierte Warteschlange haben, in der wir die Features zum Beispiel alle 27 Millisekunden in die Warteschlange stellen.

Wenn also ein Auto vorübergehend verdeckt wird, hat das neuronale Netz jetzt die Möglichkeit, den Speicher in der Zeit zu betrachten und zu referenzieren und die Assoziation zu lernen: „Hey, auch wenn dieses Ding jetzt verdeckt aussieht, gibt es eine Aufzeichnung davon in meinen früheren Merkmalen, und ich kann dies nutzen, um immer noch eine Erkennung durchzuführen.“ Das ist also das Offensichtlichste, aber wir haben auch herausgefunden, dass etwas weiteres in unserem Fall notwendig ist. Nehmen wir zum Beispiel an, dass man versucht, Vorhersagen über die Straßenoberfläche und die Straßengeometrie zu machen, und man versucht vorherzusagen, dass man sich auf einer Abbiegespur befindet und die Spur nebenan geradeaus führt. (1:06:26) Dann ist es wirklich notwendig, die Fahrbahnmarkierungen und die Schilder zu kennen, und manchmal liegen sie schon lange zurück.

Wenn man also nur eine zeitbasierte Warteschlange hat, kann es sein, dass man die Merkmale vergisst, während man an der roten Ampel wartet. Zusätzlich zu einer zeitbasierten Warteschlange haben wir also auch eine raumbasierte Warteschlange. Wir pushen also jedes Mal, wenn das Auto eine bestimmte Strecke zurückgelegt hat. Einige dieser Details können tatsächlich ziemlich wichtig sein, und so haben wir in diesem Fall eine zeitbasierte und eine raumbasierte Warteschlange, um unsere Funktionen zwischenzuspeichern. Und das setzt sich im Videomodul fort.

Für das Videomodul haben wir uns eine Reihe von Möglichkeiten angeschaut, wie man diese Informationen zeitlich fusionieren kann. Wir haben uns dreidimensionale Faltungen, Transformatoren und axiale Transformatoren angeschaut und versucht, sie effizienter zu machen. Rekurrente neuronale Netze gibt es in einer Vielzahl von Ausprägungen. Aber die Variante, die uns besonders gut gefällt und auf die ich etwas näher eingehen möchte, ist ein räumliches rekurrentes neuronales Netz als Videomodul.

Aufgrund der Struktur des Problems – wir fahren auf zweidimensionalen Oberflächen – können wir den verborgenen Zustand in einem zweidimensionalen Gitter organisieren. Und während das Auto herumfährt, aktualisieren wir nur die Teile, die sich in der Nähe des Autos befinden und wo das Auto Sicht hat. Während das Auto also herumfährt, verwenden wir die Kinematik, um die Position des Autos in das Gitter der verborgenen Merkmale zu integrieren, und wir aktualisieren das RNN nur an den Punkten, die sich in unserer Nähe befinden, sozusagen.

(1:07:45) Hier ist also ein Beispiel dafür, wie das aussieht. Hier zeige ich Ihnen das Auto, das herumfährt, und wir sehen uns den verborgenen Zustand dieses RNN an, und dies sind verschiedene Kanäle im verborgenen Zustand. Sie können also sehen, dass – nach der Optimierung und dem Training dieses neuronalen Netzes – einige der Kanäle verschiedene Aspekte der Straße verfolgen, wie zum Beispiel die Straßenmitte, die Ränder, die Linien, die Straßenoberfläche und so weiter.

Hier ist ein weiteres cooles Video dazu, in dem der Mittelwert der ersten 10 Kanäle im verborgenen Zustand für verschiedene Überquerungen von verschiedenen Kreuzungen betrachtet wird. Und alles, was Sie sehen sollen, ist, dass es eine tolle Aktivität gibt, da das rekurrente neuronale Netzwerk verfolgt, was zu einem bestimmten Zeitpunkt passiert. Sie können sich vorstellen, dass wir dem neuronalen Netz jetzt die Macht gegeben haben, diesen Speicher selektiv zu lesen und zu beschreiben. Wenn sich zum Beispiel ein Auto direkt neben uns befindet und einige Teile der Straße verdeckt, kann das Netzwerk diese Stellen nicht beschreiben. Aber wenn das Auto wegfährt und wir eine wirklich gute Sicht haben, dann kann das rekurrente neuronale Netz sagen: „Okay, wir haben eine sehr klare Sicht, wir wollen auf jeden Fall Informationen darüber schreiben, was sich in diesem Teil des Raums befindet.”

(1:08:53) Hier sind ein paar Vorhersagen, die zeigen, wie das aussieht. Wir machen also Vorhersagen über die Straßenbegrenzungen in rot, die Kreuzungsbereiche in blau, die Straßenmitten, und so weiter. Wir zeigen hier nur ein paar der Vorhersagen, um die Visualisierung übersichtlich zu halten. Und ja, dies geschieht durch das räumliche RNN. Und hier wird nur ein einziger Clip, eine einzige Durchquerung gezeigt. Sie können sich vorstellen, dass es auch mehrere Durchfahrten geben könnte, und im Grunde genommen könnten mehrere Autos und mehrere Clips zusammenarbeiten, um diese Karte zu erstellen – im Grunde genommen eine HD-Karte, nur dass sie sich nicht im Raum der expliziten Elemente befindet. Sie befindet sich im Raum der Merkmale eines rekurrenten neuronalen Netzes, was ziemlich cool ist. Sowas habe ich vorher noch nicht gesehen.

(1:09:35) Die Bildverarbeitungsnetzwerke haben auch unsere Objekterkennung erheblich verbessert. In diesem Beispiel möchte ich Ihnen einen Fall zeigen, in dem zwei Autos dort drüben stehen, und ein Auto wird vorbeifahren und sie kurz verdecken. Sehen Sie sich also an, was mit dem Einzelbild in der Videovorhersage passiert, wenn die Autos vor uns vorbeifahren. Ja, das macht also eine Menge Sinn. Also, ein kurzer Durchlauf durch das, was passiert.

Wenn beide Autos im Blickfeld sind, sind die Vorhersagen ungefähr gleich. Und Sie sehen mehrere orangefarbene Kästchen, weil sie von verschiedenen Kameras stammen. Wenn sie verdeckt sind, lassen die Einzelbildnetzwerke die Erkennung fallen, aber das Videomodul merkt sie sich, und wir können die Autos beibehalten. Wenn sie nur teilweise verdeckt sind, ist das Einzelbildnetzwerk gezwungen, seine beste Vermutung darüber anzustellen, was es sieht, und eine Vorhersage zu treffen. Und es macht eine wirklich schlechte Vorhersage. Aber das Videomodul weiß, dass nur ein Teil davon… Sie wissen schon, es hat die Informationen und weiß, dass dieser Teil im Moment nicht sehr gut sichtbar ist, und berücksichtigt das nicht wirklich.

Wir konnten auch erhebliche Verbesserungen bei der Einschätzung der Tiefe und natürlich vor allem der Geschwindigkeit feststellen. Hier zeige ich einen Clip von unserem „remove the radar push“, bei dem wir die Radartiefe und -geschwindigkeit in grün sehen. Wir haben versucht, mit Videonetzwerken allein das Signal zu erreichen oder natürlich sogar zu übertreffen. Und was Sie hier sehen, ist… in Orange sehen wir eine Einzelbildleistung, und in Blau sehen wir wieder Videomodule. Sie sehen also, dass die Qualität der Tiefe viel höher ist. Und für die Geschwindigkeit, das orangefarbene Signal – man kann natürlich keine Geschwindigkeit aus einem Einzelbildnetzwerk erhalten. Das Videomodul befindet sich aber im Grunde direkt über dem Radarsignal. Und wir haben festgestellt, dass dies für uns sehr gut funktioniert.

(1:11:20) Hier wird also alles zusammengefügt. So sieht unsere Architektur heute ungefähr aus. Wir haben also Rohbilder, die unten eingespeist werden, sie durchlaufen eine Entzerrungsschicht, um die Kamerakalibrierung zu korrigieren und alles in eine gemeinsame virtuelle Kamera zu übertragen. Wir leiten sie durch RegNets residualen Netzwerke, um sie in eine Reihe von Merkmalen in verschiedenen Maßstäben zu verarbeiten. Wir fusionieren die Multiskaleninformationen mit BiFPN. Das Ganze durchläuft ein Transformatormodul, um es in den Vektorraum und den Ausgaberaum abzubilden. Dies wird in eine Feature-Warteschlange in Zeit oder Raum eingespeist, die von einem Videomodul wie dem räumlichen RNN verarbeitet wird und dann in die Verzweigungsstruktur des Hydra-Netzes mit Stämmen und Köpfen für alle verschiedenen Aufgaben übergeht. Das ist also die Architektur, wie sie heute ungefähr aussieht. Und auf der rechten Seite sehen Sie einige der Vorhersagen zur Visualisierung sowohl in einem Top-Down-Vektorraum als auch in Bildern.

(1:12:10) Diese Architektur hat sich von einem sehr einfachen, bildbasierten Einzelnetzwerk vor drei oder vier Jahren zu einem komplexen System entwickelt und entwickelt sich weiter. Sie ist definitiv ziemlich beeindruckend, und es gibt immer noch Möglichkeiten für Verbesserungen, an denen das Team aktiv arbeitet. Sie werden zum Beispiel feststellen, dass unsere Fusion von Zeit und Raum in Bezug auf neuronale Netze ziemlich spät erfolgt. Vielleicht können wir Raum und Zeit früher fusionieren und zum Beispiel Kostenvolumina oder optische, flussähnliche Netze weiter unten erstellen.

Bei unseren Ausgaben handelt es sich zum Beispiel um dichte Raster, und es ist ziemlich teuer, einige dieser dichten Raster im Auto nachzubearbeiten. Und natürlich haben wir sehr strenge Anforderungen an die Latenzzeit, so dass dies nicht ideal ist. Wir suchen derzeit nach allen erdenklichen Möglichkeiten, um die dürftige Struktur der Straße vorherzusagen, vielleicht Punkt für Punkt oder auf andere Weise, die keine teure Nachbearbeitung erfordert. Aber im Grunde erreicht man so einen sehr schönen Vektorraum. Und ich glaube, Ashok wird jetzt darüber sprechen, wie wir die Planung und Steuerung darauf aufbauen können.

Ashok Elluswamy: (1:13:11) Vielen Dank, Andrej. Hallo, zusammen. Mein Name ist Ashok, ich leite die ‚Planning & Controls Auto Labeling & Simulation‘ Teams. Wie Andrej schon sagte, nehmen die Bildverarbeitungsnetzwerke dichtgepackte Videodaten auf und komprimieren sie dann in einen 3D-Vektorraum. Die Aufgabe des Planers besteht nun darin, diesen Vektorraum zu nutzen und das Auto zum Ziel zu bringen und dabei die Sicherheit, den Komfort und die Effizienz des Fahrzeugs zu maximieren.

(1:13:34) Auch im Jahr 2019 war unser Planer ein ziemlich fähiger Fahrer. Er war in der Lage, auf den Fahrspuren zu bleiben, bei Bedarf die Spur zu wechseln und von der Autobahn abzufahren. Aber das Fahren in der Stadt ist viel komplizierter. Das heißt, es gibt Baustellenspuren, die Fahrzeuge fahren viel unbestimmter, dann muss das Auto auf alle (…1:13:53) und kreuzenden Fahrzeuge und Fußgänger reagieren, die komische Sachen machen.

(1:14:00) Was ist das Hauptproblem bei der Planung? Erstens ist der Aktionsraum sehr nicht-konvex. Und zweitens ist er hochkomplex. Was ich mit nicht-konvex meine, ist, dass es mehrere mögliche Lösungen geben kann, die unabhängig voneinander gut sein können. Aber eine global konsistente Lösung zu finden, ist ziemlich schwierig. Es kann also lokale Minima geben, in denen die Planung stecken bleibt. Und zweitens wird die Planung hochkomplex, weil das Auto für die nächsten 10 bis 15 Sekunden planen und eine Position, Geschwindigkeit und Beschleunigung oder das (…1:14:34) erzeugen muss. Das sind eine Menge Parameter, die in Echtzeit erzeugt werden müssen.

(1:14:39) Diskrete Suchmethoden sind wirklich großartig bei der Lösung nicht-konvexer Probleme, weil sie diskret sind und nicht in lokalen Minima stecken bleiben, während kontinuierliche Funktionsoptimierung leicht in lokalen Minima stecken bleiben kann und Lösungen produziert, die nicht großartig sind. Andererseits ist die diskrete Suche bei hochkomplexen Problemen schlecht, weil sie keine abgestuften Informationen verwendet, so dass man buchstäblich jeden Punkt exportieren muss, um zu wissen, wie gut er ist. Die kontinuierliche Optimierung hingegen verwendet gradientenbasierte Methoden, um sehr schnell zu einer guten Lösung zu gelangen.

(1:15:10) Unsere Lösung für das zentrale Problem besteht darin, es hierarchisch zu untergliedern. Zunächst wird eine grobe Suchmethode angewandt, um die Nicht-Konvexität zu verringern und einen konvexen Korridor zu finden. Dann werden kontinuierliche Optimierungstechniken angewandt, um den endgültigen reibungslosen Spurverlauf zu erstellen. Sehen wir uns ein Beispiel dafür an, wie die Suche funktioniert.

Hier versuchen wir also, einen Fahrspurwechsel durchzuführen. In diesem Fall muss das Auto zwei hintereinander liegende Spurwechsel durchführen, um dann links abzubiegen. Dazu sucht das Auto nach verschiedenen Manövern. Beim ersten Manöver sucht es also nach einem Spurwechsel in der Nähe, aber das Auto bremst ziemlich hart, so dass es unangenehm ist. Beim nächsten Manöver ist der Spurwechsel etwas verspätet, also beschleunigt es, fährt über das andere Auto hinaus, fährt vor die anderen Autos und vollzieht schließlich den Spurwechsel. Aber jetzt riskiert es, das Linksabbiegen zu verpassen. Wir führen Tausende solcher Suchvorgänge in einer sehr kurzen Zeitspanne durch. Da es sich um physikalische Modelle handelt, sind diese Funktionen sehr leicht zu simulieren. Am Ende haben wir eine Reihe von Kandidaten, und wir wählen schließlich einen aus, der die optimalen Bedingungen in Bezug auf Sicherheit, Komfort und einfaches Abbiegen erfüllt.

(1:16:23) Jetzt hat das Auto diesen Weg gewählt und Sie können sehen, dass der Spurverlauf des Autos ziemlich genau dem entspricht, was wir geplant hatten. Die cyanfarbene Kurve auf der rechten Seite ist die tatsächliche Geschwindigkeit des Fahrzeugs. Und die weiße Linie darunter war der Plan. Wir konnten hier für 10 Sekunden planen und im Nachhinein sehen, dass wir damit übereinstimmen. Dies ist also ein gut ausgearbeiteter Plan. Wenn man mit anderen Verkehrsteilnehmern zusammenfährt, ist es wichtig, dass man nicht nur für sich selbst plant. Stattdessen müssen wir für alle gemeinsam planen und den Verkehrsfluss der gesamten Szene optimieren. Zu diesem Zweck lassen wir den Autopilot-Planer buchstäblich auf jedem einzelnen relevanten Objekt in der Szene laufen. Hier ist ein Beispiel dafür, warum das notwendig ist.

(1:17:09) Dies ist ein Autokorridor. Ich lasse Sie das Video kurz ansehen. Ja, das war der Autopilot, der einen Autokorridor um geparkte Autos, Pylonen und Masten herumfuhr. Hier ist eine 3D-Ansicht desselben Vorgangs. Das entgegenkommende Auto kommt jetzt, und der Autopilot verlangsamt ein wenig, stellt dann aber fest, dass wir ihm nicht ausweichen können, weil wir keinen Platz auf unserer Seite haben. Aber das andere Auto kann uns stattdessen ausweichen. Anstatt also einfach blind zu bremsen, (…1:17:44) überlegt der Autopilot, dass dieses Auto eine so geringe Geschwindigkeit hat, dass es anhalten kann und uns ausweichen sollte, weil wir ihm nicht ausweichen können, und fährt selbstbewusst weiter.

(1:17:55) Ein zweites Auto kommt jetzt entgegen. Dieses Fahrzeug hat eine höhere Geschwindigkeit. Und wie ich bereits sagte, lassen wir den Autopilot-Trainer für das andere Objekt laufen. In diesem Fall führen wir also den Planer für das andere Auto aus. Der Plan ist, dass dieses Objekt nun um die geparkten Autos herum fährt und dann, nachdem es die geparkten Autos passiert hat, wieder auf die rechte Straßenseite wechselt. Da wir nicht wissen, was der Fahrer denkt, haben wir mehrere mögliche Funktionen für dieses Auto. Hier ist eine Möglichkeit rot und die andere grün dargestellt. Die grüne ist eine Funktion, bei dem das andere Auto uns ausweicht. Da aber die Geschwindigkeit und die Beschleunigung dieses Autos ziemlich hoch sind, glauben wir nicht, dass diese Person uns ausweichen wird, sondern dass sie tatsächlich um dieses geparkte Auto herumfahren will. Der Autopilot entscheidet also: „Okay, hier ist Platz, diese Person wird auf jeden Fall kommen, also fahre ich rechts ran.”

(1:18:38) Während der Autopilot also anhält, stellen wir fest, dass dieses Auto aufgrund seiner Giergeschwindigkeit und Beschleunigung beschlossen hat, uns auszuweichen, und der Autopilot ändert sofort seine Meinung und fährt weiter. Aus diesem Grund müssen wir für alle planen, denn sonst wüssten wir nicht, dass diese Person um die anderen geparkten Autos herumfahren und zu dieser Stelle zurückkehren wird. Wenn man das nicht tun würde, wäre der Autopilot zu zaghaft, und es wäre kein gutes selbstfahrendes Auto. Wir haben also gesehen, wie die Suche und Planung nach anderen Personen eine konvexe Optimierung bildet.

Schließlich führen wir eine kontinuierliche Optimierung durch, um den endgültigen Spurverlauf zu ermitteln, den der Planer nehmen muss. Das Graue hier ist der konvexe Korridor. Und wir initialisieren ein Profil in Richtung eines Beschleunigungsparameters über die Bogenlänge des Plans. Sie können sehen, dass die (…1:19:24) Position kontinuierlich feine Änderungen vornimmt, um alle Kosten zu reduzieren.

Einige der Kosten sind zum Beispiel die Entfernung von Hindernissen, die Durchquerungszeit und der Komfort. Was den Komfort angeht, können Sie sehen, dass die letzten Beschleunigungsdiagramme auf der rechten Seite eine schöne Trapezform haben… – das kommt als erstes… ja, hier auf der rechten Seite, das grüne Diagramm – das ist eine schöne Trapezform. Und wenn Sie unseren menschlichen Spurverlauf aufzeichnen, sieht sie ungefähr so aus. Der seitliche Ruck wird ebenfalls minimiert. Zusammenfassend lässt sich also sagen, dass wir sowohl uns als auch alle anderen Personen in der Szene berücksichtigen. Wir richten einen konvexen Korridor ein und optimieren dann für einen glatten Spurverlauf. Das alles zusammengenommen kann einige wirklich nette Dinge hervorbringen, wie oben gezeigt.

(1:20:02) Aber an anderen Orten, wie dort, wo ich aufgewachsen bin, sieht das Autofahren ein bisschen anders aus. Es ist sehr viel unstrukturierter, Autos und Fußgänger schneiden sich gegenseitig, kürzen die Ecken ab, hupen. Es ist wirklich chaotisch. Wir könnten nun versuchen, diese Methoden zu skalieren, aber es wird sehr schwierig sein, dies in Echtzeit effizient zu lösen. Wir wollen stattdessen lernbasierte Methoden zur effizienten Lösung verwenden. Und ich möchte zeigen, warum das so ist. Wir werden also von diesem komplizierten Problem zu einem viel einfacheren übergehen, das aber dennoch den Kern des Problems veranschaulicht.

(1:20:35) Dies hier ist ein Parkplatz. Das Ego-Auto ist blau und muss in der grünen Parklücke parken. Es muss also um die Bordsteine, die geparkten Autos und die orangefarbenen Pylonen herumfahren. Dies ist eine einfache Ausgangsbasis. Es handelt sich um einen A*-Standardalgorithmus, der eine gitterbasierte Suche verwendet. Und die Heuristik hier ist ein Abstand – der euklidische Abstand zum Ziel. Sie sehen also, dass der Algorithmus direkt auf das Ziel zusteuert, aber sehr schnell in ein lokales Minimum gerät und von dort aus einen anderen Weg sucht, um die parkenden Autos zu umfahren. Schließlich kommt er voran und erreicht das Ziel, benötigt dafür aber 400.000 Knotenpunkte.

(1:21:14) Offensichtlich ist dies eine schreckliche Heuristik. Wir wollen es besser machen. Wenn man also eine Navigationsroute hinzufügt und das Auto der Navigationsroute folgen lässt, während es sich in der Nähe des Ziels befindet, passiert Folgendes. Die Navigationsroute hilft zwar sofort, aber wenn man auf Begegnungen, Pylonen oder andere Hindernisse stößt, macht es im Grunde das Gleiche wie vorher. Es setzt zurück und sucht dann einen ganz neuen Weg. Und die Unterstützungssuche hat keine Ahnung, dass diese Hindernisse existieren, sie muss buchstäblich dorthin fahren, prüfen, ob es eine Kollision gibt, und wenn es eine gibt, wieder zurückfahren. Die Navigationsheuristik hat geholfen, aber trotzdem wurden 22.000 Knotenpunkte benötigt.

(1:21:51) Wir können immer mehr dieser Heuristiken entwerfen, um die Suche schneller und schneller zu machen. Aber es ist wirklich mühsam und schwierig, eine global optimale Heuristik zu entwickeln. Selbst wenn man eine Abstandsfunktion von den Kegeln hätte, die die Suche leitet, wäre diese nur für einen einzigen Kegel wirksam. Was wir aber brauchen, ist eine globale Wertfunktion. Deshalb werden wir stattdessen neuronale Netze verwenden, um diese Heuristik zu erstellen. Die visuellen Netze erzeugen einen Vektorraum, in dem sich die Autos bewegen. Das sieht im Grunde wie ein Atari-Spiel aus, und es ist eine Multiplayer-Version. Wir können also Techniken wie MuZero, AlphaZero usw. verwenden, die zur Lösung von Go genutzt wurden, und andere Atari-Spiele, um das gleiche Problem zu lösen.

Wir arbeiten also an neuronalen Netzen, die Zustands- und Aktionsverteilungen erzeugen, die dann in den Monte-Carlo-Suchbaum mit verschiedenen Kostenfunktionen eingesetzt werden können. Bei einigen der Kostenfunktionen kann es sich um explizite Kostenfunktionen wie Kollisionen, Komfort, Durchfahrtszeit usw. handeln. Es kann sich aber auch um Interventionen aus dem tatsächlichen manuellen Fahrgeschehen handeln. Wir trainieren ein solches Netz für dieses einfache Parkproblem. Hier also wieder das gleiche Problem. Schauen wir uns an, wie die Monte-Carlo-Baumsuche (MCTS) uns untersucht hat.

(1:23:01) Hier merkt man, dass der Planer im Grunde genommen in der Lage ist, auf einen Schlag Fortschritte in Richtung des Ziels zu machen. Dabei ist zu beachten, dass hier nicht einmal eine Navigationsheuristik verwendet wird. Der Planer ist in der Lage, direkt auf das Ziel zuzugehen, wenn er die Szene sieht. Alle anderen Optionen, die Sie sehen, sind mögliche Optionen. Es wird keine davon verwendet. Er verwendet nur die Option, die ihn direkt zum Ziel führt. Der Grund dafür ist, dass das neuronale Netz in der Lage ist, den globalen Kontext der Szene zu erfassen und dann eine Wertfunktion zu erzeugen, die es effektiv zu den globalen Minima führt, anstatt in lokale Minima hineingezogen zu werden. Dazu sind nur 288 Knotenpunkte erforderlich und damit vielfach weniger als bei der A*-Heuristik mit dem euklidischen Abstand.

(1:23:41) So wird also die endgültige Architektur aussehen. Das Bildverarbeitungssystem wird die dichten Videodaten in einen Vektorraum herunterbrechen. Sie werden sowohl von einem expliziten Planer als auch von einem neuronalen Netzwerkplaner verarbeitet. Darüber hinaus kann der Netzwerkplaner auch Zwischenfunktionen des Netzwerks verwenden. Zusammen ergibt dies eine Spurverlaufverteilung, die sowohl mit expliziten Kostenfunktionen als auch mit menschlichen Eingriffen und anderen Begrenzungsdaten von Ende zu Ende optimiert werden kann. Diese geht dann in eine explizite Planungsfunktion ein, die das tut, was am einfachsten ist, und die endgültigen Lenk- und Beschleunigungsbefehle für das Auto erzeugt. Somit müssen wir nun erklären, wie wir diese Netze trainieren. Für das Training dieser Netze brauchen wir große Datensätze. Andrej spricht jetzt kurz über das manuelle Labeling (Beschriftung). (1:24:30)

Kommentar verfassen

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden /  Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden /  Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden /  Ändern )

Verbinde mit %s