{"id":23871,"date":"2023-03-10T07:33:11","date_gmt":"2023-03-10T06:33:11","guid":{"rendered":"https:\/\/www.herr-rau.de\/wordpress\/?p=23871"},"modified":"2023-05-04T07:16:31","modified_gmt":"2023-05-04T05:16:31","slug":"ki-reinforcement-learning-4-autofahren","status":"publish","type":"post","link":"https:\/\/www.herr-rau.de\/wordpress\/2023\/03\/ki-reinforcement-learning-4-autofahren.htm","title":{"rendered":"KI: Reinforcement Learning 4 (Autofahren)"},"content":{"rendered":"<div style='text-align:right;'><small>(<a href='https:\/\/www.herr-rau.de\/wordpress\/2023\/03\/ki-reinforcement-learning-4-autofahren.htm#comments'>5 Kommentare.<\/a>)<\/small> <\/div>\n<p>(<a href=\"https:\/\/www.herr-rau.de\/wordpress\/2023\/03\/ki-reinforcement-learning-3.htm\">Fortsetzung von hier.<\/a>)<\/p>\n\n\n\n<h3 class=\"wp-block-heading\">Beispiel 7: Autorennspiel<\/h3>\n\n\n\n<p>Hier soll die KI lernen, ein Auto eine Strecke entlang zu fahren:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"488\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke-700x488.png\" alt=\"\" class=\"wp-image-24206\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke-700x488.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke-300x209.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke-150x105.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke.png 722w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p>Ich habe die Bedingungen sehr weit reduziert:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li> Die befahrbare Strecke ist die Fl\u00e4che innerhalb des gr\u00fcnen Bereichs; letzterer ist der Rasen und kann nicht befahren werden. Wenn man den Rasen bef\u00e4hrt, f\u00e4ngt man wieder an der Startlinie an.<\/li>\n\n\n\n<li>Das Auto kann vorw\u00e4rts fahren oder sich nach links drehen und fahren oder nach rechts drehen und fahren. Es gibt keine Beschleunigung.<\/li>\n\n\n\n<li>Es gibt auch keine anderen Fahrzeuge; das k\u00f6nnte man alles einbauen, wenn die ganz simple Version funktioniert. <\/li>\n\n\n\n<li>Das Auto startet an der Startlinie; Ziel ist, die Startlinie wieder zu erreichen, und zwar nach einer vollen Runde.<\/li>\n<\/ul>\n\n\n\n<p>Das KI-System ist genau das gleiche wie bisher. Wieder gibt es zwei Fragen, und nur die m\u00fcssen programmiert werden, neben Programmierarbeit, bei der es eher um Darstellung und Testen geht. Die Fragen sind: (1) Was w\u00e4hle ich als Zustand und (2) welches Verhalten soll wie belohnt werden?<\/p>\n\n\n\n<p>Zu (1): Am Anfang wollte ich den Zustand so einfach wie m\u00f6glich halten. Die Position besteht einfach aus der x- und y-Koordinate des Autos und dem Drehwinkel. Das hat auch Nachteile, dazu sp\u00e4ter mehr in einem Ausblick.<\/p>\n\n\n\n<p>Zu (2): Die Belohnung ist schwieriger. Ich habe dazu die befahrbare Strecke in farblich markierte Abschnitte unterteilt. Die k\u00f6nnte man vor dem menschlichen Auge verbergen, aber ich lasse sie mal sichtbar. Ein Gewinn ist es f\u00fcr die KI immer, einen neuen, helleren Abschnitt aus einem dunkleren heraus zu erreichen; eine Niederlage, zu einem dunkleren zu wechseln. (Sonderregeln f\u00fcrs Rundenende, weil da die Farben ja wieder von vorne losgehen.) Ins Gr\u00fcn zu geraten bringt auch Punktabzug. Sich im selben Abschnitt zu bewegen wird f\u00fcr den Anfang weder belohnt noch bestraft, es geht also nicht um Geschwindigkeit.<\/p>\n\n\n\n<p>Dann funktioniert das schon ganz gut. Die erste Runde dauert sehr lange, weil am Anfang auch alle m\u00f6glichen Varianten ausprobiert werden. Es gab 269 Respawns:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"466\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke_runde1-700x466.png\" alt=\"\" class=\"wp-image-24208\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke_runde1-700x466.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke_runde1-300x200.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke_runde1-150x100.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke_runde1.png 752w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p>Nach der ersten erfolgreichen Runde geht es sehr viel schneller, und nach einigen solchen Runden ist die KI trainiert. Die folgende Strecke \u00e4ndert sich dann auch nicht mehr und wird bei jeder Runde wiederholt:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"468\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke_runde100-700x468.png\" alt=\"\" class=\"wp-image-24209\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke_runde100-700x468.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke_runde100-300x201.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke_runde100-150x100.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke_runde100.png 751w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Die Explorationsrate im Einsatz<\/h4>\n\n\n\n<p>Dass die einmal f\u00fcr optimal befundene Strecke immer wiederholt wird, ist vielleicht gar nicht so sinnvoll. Manchmal landet das System n\u00e4mlich in einer Sackgasse und wiederholt immer die gleiche Strecke, auch wenn sie nicht ins Ziel, sondern stets ins gleiche Gr\u00fcn f\u00fchrt. Ob das ein Bug ist oder unvermeidbar, das wei\u00df ich nicht. Aber wenn man die Explorationsrate auch nur auf 0,01 setzt, gibt es bei jeder Entscheidung eine 1%-Chance, nicht automatisch die beste Entscheidung zu treffen. (Zugegeben, mit 1\/3 nimmt man die dann zur Zeit immer noch.) Damit kommt man aus eventuellen Sackgassen und findet auch sonst interessante Alternativen. Und wenn die KI fertig trainiert ist, kann man die Explorationsrate wieder auf 0 setzen.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Das Bisherige als Video<\/h4>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"508\" style=\"aspect-ratio: 758 \/ 508;\" width=\"758\" controls src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_training.mp4\"><\/video><\/figure>\n\n\n\n<h4 class=\"wp-block-heading\">Andere Strecken<\/h4>\n\n\n\n<p>Das alles funktioniert auch mit einer anderen Strecke:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"468\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke2-700x468.png\" alt=\"\" class=\"wp-image-24212\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke2-700x468.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke2-300x201.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke2-150x100.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke2.png 751w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p>Wenn man die Position des Autos und dessen Drehwinkel als Zustand nimmt, kommt man rasch zu einer L\u00f6sung. Allerdings l\u00e4sst die sich nicht von einer Strecke zur anderen \u00fcbertragen: Jede Strecke wird f\u00fcr sich gelernt, und mit unbekannten Strecken f\u00e4ngt man immer wieder ganz von vorne an. Das ist f\u00fcr die Praxis nicht sinnvoll. Also probieren wir etwas anderes.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Eine andere Zustandsberechnung<\/h4>\n\n\n\n<p>Ich habe das Auto mit einer variablen Anzahl von Sensoren ausger\u00fcstet, die die Entfernung zum Gr\u00fcn messen, jeweils nach vorne und links und rechts oder hinten und so weiter. Der Zustand des Autos ist jetzt nicht mehr von der absoluten Position abh\u00e4ngig, sondern von der relativen Distanz zum Stra\u00dfenrand.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"281\" height=\"199\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_sensor.png\" alt=\"\" class=\"wp-image-24221\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_sensor.png 281w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_sensor-150x106.png 150w\" sizes=\"auto, (max-width: 281px) 100vw, 281px\" \/><\/figure>\n\n\n\n<p>Bei 3 Sensoren und einer Reichweite von 25 sind das noch verkraftbare 15625 potentielle Zust\u00e4nde, bei 5 Sensoren knapp 10 Millionen. Praktisch komme ich bei der blauen Strecke aber nur auf 55000, auf der roten auf 200000. Und das funktioniert dann auch tats\u00e4chlich einigerma\u00dfen; hier als animiertes gif:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"758\" height=\"508\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_sensor_strecke1.gif\" alt=\"\" class=\"wp-image-24253\"\/><\/figure>\n\n\n\n<div class=\"wp-block-group has-background has-global-padding is-layout-constrained wp-block-group-is-layout-constrained\" style=\"background-color:#8dd2fc9c\">\n<p>Zur Wiederholung noch einmal ein \u00dcberblick dar\u00fcber, wie das funktioniert:<\/p>\n\n\n\n<ol class=\"wp-block-list\">\n<li>Den aktuellen Zustand ermitteln und in der Q-Tabelle nachschauen, welcher Zug f\u00fcr diesen Zustand am besten bewertet ist, und diesen ausf\u00fchren (oder eben explorativ einen zuf\u00e4lligen). Zum Beispiel Zustand 10:12:15:3:7: -&gt; Zug 1<\/li>\n\n\n\n<li>Das Spiel ist jetzt in einem wahrscheinlich anderen Zustand, f\u00fcr den es vielleicht eine Belohnung gibt. Zum Beispiel neuer Zustand 8:11:15:8:12:, neue Zone erreicht, +10 Belohnung. Oder halt auch keine.<\/li>\n\n\n\n<li>So oder so diese Belohnung verrechnen: plus den (diskontierten) Wert des bestm\u00f6glichen Zugs im neuen Zustand und minus den Wert des alten Zugs (der Zug war ja 1) im vorherigen Zustand (der war ja 10:12:15:3:7:). Der Wert hat uns vorher noch nicht interessiert, nur dass es der beste Zug war.<\/li>\n\n\n\n<li>Das Ergebnis mit der Lernrate modifizieren, zum Beispiel * 0,75<\/li>\n\n\n\n<li>Den Wert des gemachten Zugs (immer noch 1) im alten Zustand (immer noch 10:12:15:3:7:) um das Ergebnis erh\u00f6hen.<\/li>\n\n\n\n<li>Von vorne anfangen, jetzt halt im Zustand 8:11:15:8:12:<\/li>\n<\/ol>\n\n\n\n<p>Man bewertet also in Zustand A immer die Wahl des Zuges in Zustand B, der einen in diesen Zustand A gebracht hat, und zwar abh\u00e4ngig von den M\u00f6glichkeiten in B. <\/p>\n<\/div>\n\n\n\n<p><br>Das Lernen brauchte deutlich l\u00e4nger als mit dem naiven System, aber dennoch: dass das so einfach funktioniert, wunderte mich ein bisschen. Ich hatte doch vorher schon geglaubt, ein grunds\u00e4tzliches Problem ausgemacht zu haben:<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img loading=\"lazy\" decoding=\"async\" width=\"700\" height=\"487\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_richtungen-700x487.png\" alt=\"\" class=\"wp-image-24216\" srcset=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_richtungen-700x487.png 700w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_richtungen-300x209.png 300w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_richtungen-150x104.png 150w, https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_richtungen.png 722w\" sizes=\"auto, (max-width: 700px) 100vw, 700px\" \/><\/figure>\n\n\n\n<p>Beide Autos sind im gleichen Zustand: 10 Schritte links vom Stra\u00dfenrand, 15 Schritte nach vorne sind frei, 13 Schritte nach links. Dennoch wird das obere Auto oben bei Geradeausfahren belohnt, weil es in die richtige Richtung f\u00e4hrt, und das untere Auto wird bestraft, weil es in die falsche Richtung f\u00e4hrt. Wie kann da sinnvolles Verhalten entstehen? Anscheinend taucht die Situation nicht oft auf.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Die Nagelprobe<\/h4>\n\n\n\n<p>Man kann die KI mit den Sensor-Autos nat\u00fcrlich auch auf Kurs 2 trainieren:<\/p>\n\n\n\n<figure class=\"wp-block-image size-full\"><img loading=\"lazy\" decoding=\"async\" width=\"758\" height=\"508\" src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_sensor_strecke2.gif\" alt=\"\" class=\"wp-image-24254\"\/><\/figure>\n\n\n\n<p>Kann nun eine KI, die auf dem komplexeren Kurs 2 erfolgreich trainiert wurde, auch auf dem fremden Kurs 1 einigerma\u00dfen bestehen, ohne neu daf\u00fcr trainiert werden zu m\u00fcssen? Sind die Erkenntnisse \u00fcbertragbar? Wenn sich genug Zust\u00e4nde wiederholen und auch tats\u00e4chlich die gleichen erfolgreichen Z\u00fcge bedeuten, dann hat die KI zumindest schon ein bisschen brauchbares Wissen.<\/p>\n\n\n\n<p>Aktueller Stand: Nein, funktioniert nicht wirklich. Hilft es etwas, Anzahl und Reichweite der Sensoren zu verringern? Oder brauche ich eine andere Idee, wie ich Fortschritt im Kurs markieren k\u00f6nnte; schlie\u00dflich sind die Farbzonen unterschiedlich. Ich kann nat\u00fcrlich zuerst den einen, dann den anderen Kurs trainieren; dann kann dieselbe KI beide Kurse fahren. Aber das \u00e4ndert ja nichts am eigentlichen Problem.<\/p>\n\n\n\n<h4 class=\"wp-block-heading\">Das grunds\u00e4tzliche Problem<\/h4>\n\n\n\n<p>Die KI kann lernen, in einer bestimmten Situation (etwa: vorne 15 Platz, links 10, rechts 4) ein bestimmtes Verhalten zu zeigen. Und wenn danach die exakt gleiche Situation noch einmal eintritt, und sei es in einem anderen Teil der Strecke, wird sie dieses Verhalten wieder zeigen. Gut! Wir m\u00f6chten aber eigentlich, dass das nicht nur bei einer <em>exakt<\/em> gleichen Situation geschieht, sondern bereits bei einer \u00e4hnlichen. Man will ja, dass die KI <em>jede<\/em> Linkskurve meistert und nicht nur eine Sammlung ganz konkreter ge\u00fcbter Linkskurven. Aber &#8222;\u00e4hnlich&#8220; kennt unsere Q-Tabelle nicht, da wird jeder Zustand f\u00fcr sich betrachtet. Das Konzept &#8222;\u00e4hnlich&#8220; kann allerdings ein Neuronales Netz entdecken. Und das w\u00e4re der n\u00e4chste Schritt&#8230; dann k\u00f6nnte der Input auch wesentlich mehr Information enthalten, etwa auch andere Autos, denen man ausweichen m\u00fcsste. Vielleicht komme ich noch dazu, aber f\u00fcrs Erste ist die kleine Serie hier beendet.<\/p>\n\n\n\n<p>(Und ja, wenn ich mich richtig auskennte, w\u00fcrde ich die passenden Werkzeuge nutzen, etwa alles gleich in Unity machen. So programmiere ich von Grund auf mit BlueJ und Greenfoot, den Schul-Entwicklungsumgebungen. Hilft aber auch beim Lernen.)<\/p>\n\n\n\n<p><strong>Links:<\/strong><\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li><a href=\"https:\/\/www.youtube.com\/watch?v=Tnu4O_xEmVk\">https:\/\/www.youtube.com\/watch?v=Tnu4O_xEmVk<\/a><br>Eine KI hat gelernt, MarioKart zu fahren, mit einem Neuronalen Netz<\/li>\n\n\n\n<li><a href=\"https:\/\/towardsdatascience.com\/deep-q-learning-tutorial-mindqn-2a4c855abffc\">https:\/\/towardsdatascience.com\/deep-q-learning-tutorial-mindqn-2a4c855abffc<\/a><br>Ein Q-Learning-Tutorial.<\/li>\n<\/ul>\n\n\n\n<img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/vg08.met.vgwort.de\/na\/40883f673f7b40679c59c238b3317d7f\" alt=\"\" width=\"1\" height=\"1\">\n\n\n\n<p><em>Nachtrag: Nat\u00fcrlich habe ich doch die Finger nicht vom Neuronalen Netz lassen k\u00f6nnen. Das war eine Fummelarbeit! Die richtige Kombination von Aktivierungsfunktion, Startbelegung, Lernrate und Bewertung zu finden war etwas m\u00fchsam. Aber dann funktioniert das, nicht immer so gut wie in dem Video unten, aber doch halbwegs. Trainiert wurde auf dem roten Kurs, aber das Auto schafft dann auch den blauen! Der Trick war, das Auto doch als Unterklasse zu SmoothMover zu machen statt als Actor, das ist so eine Greenfoot-Sache, wie genau die Koordinaten berechnet und gerundet werden. Viel muss das Netz nicht k\u00f6nnen, denke ich: &#8222;Wenn der Mittelsensor mindestens n lang ist, fahr geradeaus, au\u00dfer wenn&#8230;&#8220; und so.<\/em> <\/p>\n\n\n\n<figure class=\"wp-block-video\"><video height=\"508\" style=\"aspect-ratio: 758 \/ 508;\" width=\"758\" controls src=\"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_neuronales_netz_streckenwechsel.mp4\"><\/video><\/figure>\n\n\n\n<p>Dabei reichen 3 Sensoren am Auto und ein Netz mit 5 Knoten im Hidden Layer. (Zuverl\u00e4ssiger aber mit ein paar mehr.) Das m\u00fcssten noch wenig genug sein, um sich die Knoten zeigen zu lassen und herauszufinden, was welcher entscheidet. <\/p>\n","protected":false},"excerpt":{"rendered":"<p>(5 Kommentare.) (Fortsetzung von hier.) Beispiel 7: Autorennspiel Hier soll die KI lernen, ein Auto eine Strecke entlang zu fahren: Ich habe die Bedingungen sehr weit reduziert: Das KI-System ist genau das gleiche wie bisher. Wieder gibt es zwei Fragen, und nur die m\u00fcssen programmiert werden, neben Programmierarbeit, bei der es eher um Darstellung und [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":24212,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_memberships_contains_paid_content":false,"footnotes":""},"categories":[25],"tags":[227,254],"class_list":["post-23871","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-informatik","tag-informatik","tag-ki"],"jetpack_featured_media_url":"https:\/\/www.herr-rau.de\/wordpress\/archiv\/ki_auto_strecke2.png","jetpack_sharing_enabled":true,"jetpack_likes_enabled":true,"_links":{"self":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/23871","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/comments?post=23871"}],"version-history":[{"count":3,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/23871\/revisions"}],"predecessor-version":[{"id":41139,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/posts\/23871\/revisions\/41139"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media\/24212"}],"wp:attachment":[{"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/media?parent=23871"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/categories?post=23871"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.herr-rau.de\/wordpress\/wp-json\/wp\/v2\/tags?post=23871"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}