Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

02.07.2013, 09:14

Neuronale Netze, Auslegung und Training

Hello Community,

wir alle erinnern uns (vielleicht) noch an den ersten sproo-Spiele Contest. Damals hat CBenni mit seinem Planet Wars spiel überraschend den ersten Platz gemacht. Zur Zeit schreibe ich für dieses Spiel eine kleine AI, weil ich unbedingt ein neuronales Netz programmieren wollte und CBenni der Meinung war das der SC2 World Editor dafür nicht die richtige Platform sei (weniger aufgrund der Möglichkeiten als viel mehr auf Grund meiner Programmiererfahrung).

Nun gut, ich habe also eine kleine AI geschrieben die für den Spieler zieht und die seine AI (die tatsächlich die meißte Zeit nichts oder supoptimale Züge macht) besiegt, so meiner nicht ein Handycap von 60% (zeiht ~ alle 2.5 Züge von seiner) auflegt wird. Dabei ist allerdings nicht nur das Neuronale Netz zu kurz gekommen, meine AI wählt auch nicht den optimalen Planeten aus, von dem sie ziehen sollte. Meine Idee ist nun also diese nochmals zu überarbeiten und ihr ein echtes NN zu geben um den Planeten auszuwählen, von dem sie zieht.

Zu diesem Zeitpunkt weiß die AI bereits welcher Planet angegriffen / unterstützt werden soll. Der Punkt an dem ich mir nicht ganz sicher bin ist der, wie genau ich das Netz auslegen soll. Ich werde 20 Output Neuronen brauchen, einen für jeden Planeten und ein einfaches Feed-Foreward-Netz ohne Hidden-Layer sollte dem Zweck dienlich sein. Der Punkt der mir noch nicht so klar ist, ist die Sache mit den Inputneuronen. Jeder Planet hat eine Größe und eine Befölkerung dazu habe ich die Größe und Befölkerung des Planeten auf den ich ziehe, macht 42 Input Neuronen (42 hihihi) die Frage ist ob ich stattdessen meine Planeten nach Größe geordnet betrachten kann und so nurnoch 22 Neuronen brauche, 20 für die nach Planetengröße geordnete Befölkerung, 2 für den Planeten auf den ich ziehe. Der Output wäre dann auch der Größe nach sortiert (da die Planetengröße der einzelnen Planeten am Anfang zufällig generiert wird). Was ich nicht weiß:

Macht die Generalisierung an der Stelle Sinn? Also lohnt es sich zur Wahl des Planeten von dem gezogen werden soll nur auf Relativgrößen zurückzugreifen?
Kann ich eventuell andere oder weitere Vereinfachungen vornehmen um Neuronen / Rechenzeit zu sparen?

und vor allem:

Wie sieht nun ein Trainings-Datensatz sobald ich mich für eine Lernmethode entschieden hab? Der Punkt lernen des Netzs ist der bei dem ich noch garkeine Idee habe. Gibt es irgendwelche Richtlinien um die Warscheinlichkeit zu maximieren, dass mein Netz das lernt und vor allem generalisiert, was ich will das es lernt? Oder ist es einfach nur ein "Ich werf mal ein paar Daten rein, sag ungefähr was raus kommen soll und hoffe das es passt."

Anregungen und Fragen sind gerne gesehen

P.S.: Wäre es möglich den Zeilenabstand bei dem Eingabeformular für Themen (warscheinlich auch bei dem zum Antworten) zu erhöhen? Es ist Typographisch echt unschön gelößt, das die Zeile fast über meinen ganzen 17" screen geht aber selbst nur einen Zeilenabstand von 1.2 hat, da verliert man beim Durchlesen sehr schnell den halt. Ich denke eine Beschränkung der Zeilenbreite oder eine proportionale Änderung des Zeilenabstandes wäre hier durchaus Sinnvoll.

2

02.07.2013, 11:42

Neue Idee: Ich nehme als Eingangsparameter die nach größe geordneten prozentuale Befölkerung meiner planeten, sowie die Befölkerung des Zielplaneten.

Oder ist diese Idee nicht zielfürend?

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

3

02.07.2013, 12:12

Bevölkerung* - von Volk
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

4

02.07.2013, 17:53

Hm, wenn du einen Rechtschreibfehler findest, darfst du ihn behalten oder im Fundbüro abgeben. Wenn du ihn aber für so wichtig hätlst das du ihn mir unbedingt zurückgeben möchtest mach das, aber bitte als PM.
Das Thema soll weiterhin Platz haben, um Sinvolle Vorschläge und Problemlösungen aufzunehmen alles andere wäre Verschwendung von Byte. Viel mehr Platz braucht dieser Kommentar nicht. In jeder Beziehung.
Achja und nochwas: Eine sehr schöne Begrüßung für jemanden der neu im Forum ist ist das hier :)

Fourb

Treue Seele

Beiträge: 122

Beruf: Schüler

  • Private Nachricht senden

5

02.07.2013, 18:07

Wow du bist ja noch muffiger drauf als ich.

Mal davon abgesehen:
Wenn du unbedingt ein neuronales Netzwerk programmieren willst, dann such dir doch ein leichteres Beispiel. Die Vernetzung von Planeten durch Neuronen scheint mir eher untypisch.
Beispielsweise könntest du einen kleinen virtuellen Roboter bauen mit Schmerzsensoren, Entfernungssensoren, Beschleunigungssensoren u.ä. und ihn über eine Map voll mit Gegenständen fahren lassen. Mit der Zeit soll er halt lernen, dass er eine andere Richtung einschlagen soll, wenn seine Entfernungssensoren Alarm schlagen, er aber keinen Schmerz fühlen will.

Kein Plan, wieso du es dir als Einsteiger gleich so schwer machen musst.


Edit:
Sehe gerade, dass du das für ein Spiel schreiben willst. Such dir andere Methoden. Bei mehr Planeten wirst du verrückt, wenn die Input-/Outputanzahl statisch ist. Da bleibt das Spiel nicht flexibel genug.
42 / Pi = 13,37

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

6

02.07.2013, 18:43

(...) alles andere wäre Verschwendung von Byte (...)
Hättest Du es einfach hingenommen und gelassen, wäre wesentlich weniger Offtopic daraus entstanden.

Ich bin übrigens bestimmt nicht der Einzige, der keinen blassen Schimmer davon hat, WAS Du überhaupt machen willst (und zu faul ist nach dem Spiel von CBenni zu googeln und sich den Kontext selbst zu erarbeiten). Etwas mehr Hintergrund wäre wohl hilfreich.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

7

02.07.2013, 19:15

Ja ich bin muffig drauf, weil es für mich eine Unsitte ist, wenn man jemanden begrüßt, indem man ihm auf seine Fehler aufmerksam macht. Und vor allem die Art wie. Wenn du draußen auf der Wiese Fußball spielst und der neu zugezogene Nachbar fragt ob er mitspielen kann und verhaspelt sich dabei sagst du ja auch nicht: "Alder lern ma deutsch" und gehst weiterspielen und lässt ihn stehen. Eher sagst du: "hey klar, Willkommen bei uns in der Straße." oder sowas und weißt ihn dann evtl auf seinen Fehler hin. Aber vielleicht ist das auch nur meine Meinung und die Gesellschaft kennt Manieren nicht mehr. Wie dem auch sei.

Naja das Spiel selbst ist nur eine Fallstudie und es besteht konstant aus 20 Planeten die allerdings in ihrer größe variabel sind (wird beim Start zufällig generiert). Die Idee mit dem NN ist natürlich denkbar ineffizient keine Frage. Es geht aber einfach darum ein NN zu implementieren und es sich mal anzuschauen, sich mit der Materie auseinander zu setzen. Über Sinn und Unsinn lässt sich hier freilich streiten. Das Projekt wird in jedem Fall durchgeführt.
Das Beispiel selbst ist schon denkbar einfach gewählt. Es läuft auf eine 42x20 Matrix mit veränderlichen Gewichten raus. Wobei man diese in Bereiche unterteilen kann für die man Eigenschaften postulieren kann. Heißt, der Teil unter der Hauptdiagonalen wird warscheinlich einen hemmenden Einfluss auf die Neuronen ausüben, wenn korrekt eingelernt, ect.
Meine Frage dazu war nun ob ich mir Rechenzeit spaaren kann indem ich 20 Inputneuronen raus nehme die Informationen über die Planetengröße haben und stattdessen meine Bevölkerung auf jedem Planeten nach Planetengröße sortiert als Inputvektor bereitstelle und so die Information über meine (relative) Planetengröße implizit ins Netz übergebe. Oder ob dadurch ein schwerer Fehler entsteht. Und ob es andere Vereinfachungen gibt die ich bisher nicht gesehen habe.

Deine Idee mit dem Wagen wäre auch ein interessantes Projekt, gerade was Regelung und so weiter betrifft. Allerdings müsste ich dazu erst den ganzen Code für die Simulation, Sensoren etc. schreiben, bei Planet Wars kann ich direkt an der AI arbeiten was für mich wesentlich interessanter ist als einen Simulator zu schreiben. Was du mit Lernen und "Schmerzsensoren" beschreibst (was genau das ist musst du mir nochmal genau erklären) klingt für mich nach der Phase des Einlernen des Netzes soweit bin ich noch nicht ganz (aber fast, das Netz steht schon ich muss nurnoch den Outputvektor interpretieren). Netztechnisch macht es (abgesehen von der Größe) keinen Unterschied wobei ich auch 2 Beschleunigungssensoren und 20 Entfernungssensoren und 20 Schmerzsensoren nehmen könnte und mein Netz analog aussähe (vlt mit weniger Outputneuronen).

Da das Spiel selbst extra für dieses Board geschrieben wurde dachte ich es sei bekannt und bin nicht näher darauf eingegangen. Ihr kennt CBenni wahrscheinlich als CBenni::O. Scheinbar existiert der Link nicht mehr, welcher zu den Spielen führt. Der Link zu dem Wettbewerb gibts hier:https://www.spieleprogrammierer.de/32-pr…und-abstimmung/
Ich werde CBenni mal fragen ob ich seine Dropbox hier verlinken darf, dann kann ich auch einen Link zum Spiel incl. Source code posten.

8

02.07.2013, 19:36

So, ich habe grade mal mit CBenni gesprochen, er war über die Erstreaktion unseres Moderators wenig überrascht was mich echt wundert. Seis drum. Hier ist der Link zu dem Spiel:

CBenni's Minispiel

der Sorce Code steht im Quellcode der HTML Seite. Viel Spaß beim spielen.

Fourb

Treue Seele

Beiträge: 122

Beruf: Schüler

  • Private Nachricht senden

9

02.07.2013, 19:43

Ernsthaft. Achte auf Orthografie. Das ist schon wichtig, wenn du für Voll genommen werden willst.

Die Schmerzsensoren sind so gemeint, dass der Roboter irgendwie mitbekommt, dass er etwas falsch macht und dadurch erst ein Prozess des Lernens eintreten kann. Stimmt.. Ich hab bisschen vorweg gegriffen und bin direkt in neuronale Systeme eingestiegen, die selbstständig lernen. Aber im Endeffekt ist das der nächste Schritt, da ein neuronales Netzwerk ohne Lernfähigkeit ziemlich lahm ist. ^^


Irgendwie hab ich das Gefühl, dass du jetzt die Schmerzsensoren in dein Projekt einbauen willst. Wir haben da wohl aneinander vorbei geredet.


42 / Pi = 13,37

10

02.07.2013, 20:17

Ernsthaft. Achte auf Orthografie. Das ist schon wichtig, wenn du für Voll genommen werden willst.

:)

Die Schmerzsensoren sind so gemeint, dass der Roboter irgendwie mitbekommt, dass er etwas falsch macht und dadurch erst ein Prozess des Lernens eintreten kann. Stimmt.. Ich hab bisschen vorweg gegriffen und bin direkt in neuronale Systeme eingestiegen, die selbstständig lernen. Aber im Endeffekt ist das der nächste Schritt, da ein neuronales Netzwerk ohne Lernfähigkeit ziemlich lahm ist. ^^


Ich wollte nur sicher gehen, das wir hier vom selben reden. Es gibt verschiedene Ansätze wie das Netz etwas lernen soll. Du sprichst hier von einer Art bestärktes lernen, bei dem am Ende des Durchlaufs durch das Netz, nach der Entscheidung eine Rückmeldung kommt (Schmerz / kein Schmerz) und danach Anpassungen an den Gewichten vorgenommen werden, je nach dem ob die Entscheidung gut oder schlecht war. Es findet also eine Bewertung der Entscheidung statt. Das ist eine Art ein Netz einzulernen.
Eine andere, welche ich beschreiten wollte, ist die des Überwachten Lernens. Hierbei hat man einen bekannten Eingang (an Daten) und weiß was raus kommen soll (einen bekannten Output). Nun jagt man seinen Input durch das Netz und bestimmt die Abweichung zum desired Output. Anhand des daraus resultierenden Fehlers kann man dann Anpassungen an den Gewichten vornehmen. Die Behauptung ist nun, das wenn meine Trainingsdaten umfangreich genug sind, das mein Netz diese verallgemeinert und anschließend auch auf komplett unbekannte Eingangsdaten richtig reagiert. Es sind zwei verschiedene Ansätze, allerdings funktioniert meiner auch bei mehrschichtigen Netzen (Backpropagation).
Es beantwortet aber immernoch nicht meine Frage zum Netzaufbau. Vielleicht magst du dazu Stellung nehmen, Diskussion bringt einen weiter ;)

Irgendwie hab ich das Gefühl, dass du jetzt die Schmerzsensoren in dein Projekt einbauen willst. Wir haben da wohl aneinander vorbei geredet.


Nein haben wir nicht und "Schmerzsensoren" haben in meinem Netz nichts zu suchen, welches mit supervised learing lernt. Obwohl man hier durchaus verschiedene Lernalgorithmen vergleichen könnte die Möglichkeit ist da.

Nimms mir nicht Böse, aber woher kannst du die Gewissheit nehmen, das ich ein Anfänger bin? Es kommt etwas hochnäsig wenn du Dinge sagst wie "Ich hab bisschen vorweg gegriffen ..." ohne sicher zu sein, das dein Gegenüber tatsächlich keine Ahnung davon hat. Ich komme mir da etwas verarscht vor, wenn du etwas "vorwegnimmst" was ich schon weiß :thumbsup:

Werbeanzeige