WEBVTT

00:00.540 --> 00:05.090
Hallo und willkommen zu dieser Geschichte, fast der letzte Titel dieses Moduls.

00:05.100 --> 00:10.260
Ich werde nur den Hauptcode erklären, der das Ganze ausführt, bevor wir die aufregenden Ergebnisse erhalten

00:10.290 --> 00:11.930
und die Videos ansehen.

00:12.090 --> 00:15.920
Das ist also der Hauptcode und wie Sie sehen können, ist das ziemlich kurz.

00:15.930 --> 00:21.120
Wir beginnen mit dem Import der Bibliotheken und Module sowie der verschiedenen Klassen und Funktionen,

00:21.120 --> 00:24.270
die wir wie Altikriti aus unserer Modelldatei erstellt haben.

00:24.390 --> 00:30.210
Die Zugfunktion aus der Zugdatei und die Testfunktion aus der Testdatei. Natürlich importieren

00:30.270 --> 00:31.930
wir unseren Optimierer.

00:31.950 --> 00:37.350
Dann beginnen wir mit dem ersten Abschnitt, in dem wir alle Parameter in eine Klasse aufnehmen.

00:37.500 --> 00:39.660
Und das ist das vielleicht.

00:39.720 --> 00:44.040
Denken Sie daran, dass dies ein BRAMs-Objekt ist, das wir aus dieser Harams-Klasse erstellt haben.

00:44.040 --> 00:48.900
Jedes Mal, wenn wir einen Parameter wie die Lernrate haben, sind wir nicht ohne.

00:49.200 --> 00:50.870
Lass uns sie schnell durchgehen.

00:50.880 --> 00:54.380
Dieser erste oder hier ist die Lernrate.

00:54.480 --> 00:59.140
Wie Sie sehen, wählen wir ein kleines und Sie bewerten den zweiten Parameter als Parameter.

00:59.160 --> 01:09.810
Wieder nehmen wir es als 0 an. 39 Für einen OneTel-Parameter wird ein Satz von 1 16 Schritten von 20 Schritten und einer maximalen Länge

01:09.900 --> 01:10.850
von 10000 verwendet.

01:10.850 --> 01:17.580
Wir haben darüber gesprochen, dass dies der Parameter ist, den wir einstellen, um sicherzustellen, dass der Agent nicht auf unbestimmte Zeit in einem

01:17.730 --> 01:20.910
Zustand der Umgebung hängen bleibt, sodass das Spiel gestoppt wird.

01:21.060 --> 01:28.800
Wenn die Episodenlänge diese maximale Länge überschreitet, erhalten wir natürlich den Namen unserer

01:28.800 --> 01:29.690
Umgebung.

01:29.790 --> 01:30.890
Aufbrechen ist Null.

01:30.990 --> 01:37.770
Übrigens können Sie auch in anderen Umgebungen spielen, indem Sie hier den Namen der Umgebung

01:37.770 --> 01:38.410
ändern.

01:38.430 --> 01:44.760
Wenn Sie also zu einigen anderen Breakout-Versionen oder sogar zu einigen anderen Atari-Spielen gut spielen möchten, können Sie

01:45.030 --> 01:48.580
diesen Bruch hier einfach durch einige andere Spiele ersetzen.

01:48.750 --> 01:53.730
Aber ich kann Ihnen sagen, dass Breakout-Videos bereits sehr herausfordernd sind.

01:53.730 --> 01:56.030
Alles klar also alle Parameter hier.

01:56.160 --> 01:59.330
Und dann gibt es den Hauptcode für den Hauptlauf.

01:59.550 --> 02:02.850
Und hier sehen wir, was wir in dieser ersten Zeile machen.

02:02.850 --> 02:05.270
Wir setzen einen Thread pro Kern.

02:05.430 --> 02:11.880
In der zweiten Zeile werden dann alle Renderer aufgerufen, indem Sie ein neues

02:12.150 --> 02:18.810
Objekt der Paramjit-Klasse erstellen, das alle diese Parameter hier initialisiert, da diesem BRAMs-Objekt Variablen zugeordnet

02:18.810 --> 02:19.490
sind.

02:19.560 --> 02:20.840
Dann setzen wir den Samen.

02:20.970 --> 02:28.830
Dann erhalten wir unsere Umgebung mithilfe des Create-Baums und funktionieren mit dem Namen unserer Umgebung, der aus dem

02:28.830 --> 02:30.040
Nichts herausbricht.

02:30.040 --> 02:35.410
Sie sehen Zellen, deren Name und daher der Parameter und der Name ziemlich Null ist.

02:35.430 --> 02:37.660
Das wird uns die Umgebung des Ausbruchs bringen.

02:37.890 --> 02:42.870
Übrigens ist dies nicht die übliche Art, eine Umgebung zu schaffen, aber Sie wissen, wie Sie den

02:42.870 --> 02:45.540
gesamten Prozess verbessern und die Leistung verbessern können.

02:45.690 --> 02:52.470
Nun, wir verwenden dies, um tatsächlich eine optimierte Umgebung zu erstellen, und dies tun wir. Das Universum ist ein Paket,

02:52.630 --> 02:57.730
in dem alle Pakete enthalten sind, die Sie in einer offenen Engine installiert haben.

02:57.870 --> 03:01.490
Dank Universe erhalten wir eine optimierte Umgebung.

03:01.590 --> 03:03.320
Darum geht es hier.

03:04.050 --> 03:09.240
Dann erhalten wir unser gemeinsames Modell, indem wir ein Objekt der aktiven Kritikerklasse erstellen.

03:09.240 --> 03:14.430
Daher ist es wichtig zu verstehen, dass dieses gemeinsame Modell das von den verschiedenen Agenten gemeinsam genutzte Modell

03:14.430 --> 03:15.030
ist.

03:15.180 --> 03:17.880
Wir haben also unterschiedliche Fäden in verschiedenen Bahnen.

03:18.210 --> 03:25.410
Apropos Bedrohungen in der nächsten Zeile, in denen das Modell gemeinsam genutzt wird, um Speicher zu teilen, speichern wir das Modell

03:25.500 --> 03:31.260
im gemeinsam genutzten Speicher des Computers, sodass alle Threads darauf zugreifen können, auch wenn sie sich in

03:31.260 --> 03:32.960
einem anderen Verlauf befinden.

03:33.000 --> 03:34.510
Also machen wir das hier.

03:34.530 --> 03:42.410
Um dies zu ermöglichen, wird unser Optimierer mit den Parametern unseres gemeinsamen Modells und mit einer Lernrate

03:42.410 --> 03:45.780
von einem oder einem Punkt verknüpft.

03:45.930 --> 03:51.030
Es ist auch wichtig zu verstehen, dass der Optimierer auch gemeinsam genutzt wird, da er auf

03:51.030 --> 03:57.720
das gemeinsam genutzte Modell einwirkt und sagt, dass die nächste Zeile, die den gemeinsam genutzten Speicher optimiert, den Optimierer im gemeinsam

03:57.780 --> 04:02.530
genutzten Speicher speichert, sodass alle Agenten Zugriff darauf haben, um zu optimieren das Model.

04:02.910 --> 04:10.260
Anschließend initialisieren wir unsere Prozesse, sodass der Testprozess das gemeinsam genutzte Modell nicht aktualisiert, sondern lediglich verwendet, um es

04:10.260 --> 04:14.710
in einem Teil auszuprobieren, die Partitur auszudrucken und die Videos aufzuzeichnen.

04:14.820 --> 04:17.920
Genau das wird also mit Target gleich Test gemacht.

04:17.940 --> 04:24.330
Das ist der Testprozess, und dieser Prozess ist hier von der Folter dieser Multi-Vorverarbeitung ausgeschlossen.

04:24.450 --> 04:31.600
Also hier und was es tut ist, dass es grundsätzlich eine Funktion in einem unabhängigen Thread ausführt.

04:31.860 --> 04:38.050
Wenn wir also einen Neustart durchführen, beginnen wir einen neuen Prozess, der zu dieser Zeit das erste Jahr war.

04:38.370 --> 04:45.030
Und mit diesem Prozess zum Hinzufügen von P fügen wir den Prozess in die Liste der Prozesse ein.

04:45.270 --> 04:52.170
In dieser Schleife führen wir schließlich eine Schleife aus, um alle anderen Prozesse auszuführen, die durch Aktualisierung des

04:52.380 --> 04:54.320
gemeinsam genutzten Modells trainiert werden.

04:54.780 --> 04:58.030
Und genau das passiert in den letzten Codezeilen hier.

04:58.380 --> 05:03.870
Wenn Sie also nicht näher darauf eingehen wollen, ist es wichtig zu verstehen, dass dies die

05:03.870 --> 05:09.420
Prozesse optimal abläuft. Daher sollten wir alle gut darin sein, diesen Code auszuführen und ein trainiertes

05:09.420 --> 05:12.670
Modell zu haben und eventuell zu beobachten die Ergebnisse.

05:12.840 --> 05:14.150
Ich kann es also kaum erwarten.

05:14.160 --> 05:16.110
Das wird ziemlich aufregend.

05:16.110 --> 05:19.240
Ich werde jetzt versuchen, Leute zu finden, damit wir alle gemeinsam zuschauen können.

05:19.350 --> 05:21.440
Und so bis zum nächsten Mal I.
