Neuranales Netz?



  • Also ich bin dabei meinem minesweeper bot ein neuronals netz zu verpassen.
    Ich schreib erstmal wie ich das verstanden hab:

    1.dem neuronalen net wird ein array(vector) von input werten gegeben.
    das netz sollte soviele input-neuronen haben wie es input werte gibt.

    2.jedes input neuron ist zu jedem neuron des ersten layers verbunden. die dann wiederum zu jedem des zweiten layers usw. bis zum output layer.
    zwei layer+input+output sollten reichen oder?

    3.jede kante hat eine gewichtung(gerichteter graph)

    4.jedes neuron hat einen threshold, den die input-werte multipliziert mit den kantengewichten überschreiten müssen, um vom neuron weiterverarbeitet zu werden.

    5.an die interne verarbeitungsfunktion werden die addierten input-werte vergeben(oder werden die mit den gewichtungen noch multipliziert?)

    6.der rückgabewert der funktion wird weitergegeben.

    7.und zwar an alle neuronen des nächsten layers(?)

    8. am ende bekomme ich nen vektor mit genausoviel werten wie im input vektor

    9. wenn das ergebnis korrekt ist, dann mache ich so weiter (sprich, wenn der bot keine mine trifft)

    10. wenn das ergebnis falsch ist, dann modfiziere ich die kantengewichte(aber wie? per random? also praktisch zufällige mutation?)

    11. wie verarbeite ich den output? suche ich nach dem höchsten wert im output vektor und klicke auf das entsprechde feld? wär irgendwie logisch

    ich wäre total dankbar wenn ihr mir direkt etwas zu den oben genannten punkte sagen könntet, falls ihr nen link habt könnt ihr den natürlich auch posten, ne direkte antwort wär mir aber lieber!

    Danke



  • Wahrscheinlich gibt es für Minesweeper ne einfachere Lösung, aber ich denke mal du willst was mit nem NN machen.

    1-4. ja.
    5. Normal mit den Gewichten Multipliziert.
    6-7. ja
    8. Bei dir wahrscheinlich ja. Normal so viele wie du Muster hast die du erkennen willst.
    9-10. Du gibts dem NN mehrere Eingabebeispiele und welches Ergebnis du für jedes haben willst. Damit kannst du es trainieren z.B. mit nem GA. Besser gehts mit Backpropagation, ist aber auch komplizierter. Den weiterführenden Link http://www.aiplayground.org/backpropagation/ finde ich besser als den Wikiartikel.
    11. ja, wenn du es so trainiert hast.

    Ich kann mir zwar noch nicht wirklich vorstellen, welche Muster man da erkennen kann, aber mit NN ist ja einiges möglich. Vielleicht kannst du auch immer nur einen Ausschnitt und nicht das ganze Feld anschauen.



  • Das problem bei minesweeper ist ja, dass ich jeden punkt auf dem feld nach seinem tuep fuer das neuronale netz klassifizieren muss. jetzt frage ich mich, wie ich die feldtuepen(unaufgedeckt, 1, 2, 3,..., leer, als mine markiert usw) in nummern umwandeln soll, so dass das nn die zusammenhaenge zwischen nebeneinanderliegenden feldern erkennen kann. Ist das ueberhaupt moeglich? kann das NN minesweeper lernen, wenn es nichts weiter als alle felder als input erhaelt? oder muesste es dazu jedes moegliche spielfeld kennen? sprich, kann das nn muster in der eingabe erkennen, auch wenn sich diese jedesmal an verschiedenen positionen befinden?

    und nochmal zu deiner antwort: koenntest du mir das mit dem lernprozess nochmal genau erklaeren? das gewuenschte ergebniss ist ja eigentlich nur das erfolgreiche aufdecken eines feldes, ohne dabei eine mine zu treffen.

    danke!



  • Das gewünschte Ergebnis ist das Feld auf das du klicken willst. Wenn du z.B. einen 5x5 Felder großen Bereich anschaust, dann hast du 25 Eingänge und 25 Ausgänge. Du baust dir dann ein Beispiel mit irgendeinem Eingabe Muster aus Zahlen und beim Ergebins setzt du das Feld auf 1, auf das geklickt werden kann ohne das eine mine getroffen wird, die anderen auf 0. Wie gut das funktioniert, wenn es mehrere Felder gibt auf die man klicken kann, weiß ich nicht.
    Bei der Codierung der Eingabe kannst du experimentieren, wie bei allem anderen. Für NN gibt es keinen allgemein Lösungsweg.



  • Neuronales Netz ist ein allgemeiner Ausdruck. Das, was du da beschreibst, ist die Sonderform eines Netzes, ein sogenanntes feed-forward-netz. Ja, richtig, es gibt so viele eingabeneuronen wie es einabewerte gibt, und es gibt soviele ausgabeneuronen wie es ausgabewerte gibt.

    Ein Neuron arbeitet erstmal immer nur für sich, und kennt seine umgebung nciht (in diesem speziellen netz). Es hat einen Eingabevektor, welcher aus den Ausgaben der vorherigen Schicht besteht. Aus diesem Vektor berechnet es per punktprodukt (eingabevektor*gewichtsvektor) seinen eingabewert. Zu diesem kann dann noch ein bias-wert addiert werden. Diesen eingabewert musst du dann in die aktivierungsfunktion schicken, diese kann zB eine lineare sein wie f(x)=m*x oder auch eine sigmoide wie f(x)=1/(1+e^-x) je nachdem was du willst, musst ausprobieren. Den Wert dieser funktion benutzt du dann als ausgabe dieses einen neurons. Folgende neuronen greifen dann diesen wert ab, um ihn für ihre eingabe zu nutzen. Zum schluss kommt dann ein ausgabevektor aus dem netz raus. Du kannst da zB das feld klicken, welches den höchsten Wert hat.

    Zum problem:
    Ich würde dem Netz ein 3*3 großes eingabemuster und auch ein 1*1 großes ausgabemuster verpassen, da eine größere umgebung nicht wichtig für den punkt in der mitte des 3*3 ist. Dann kannst du mit diesem Fenster über alle punkte des feldes gehen und das netz immer fragen, was mit dem punkt in der mitte gemacht werden soll. (1-> klicken, 0-> nicht klicken).

    Trainieren kannst du das dann so:
    Erstelle ein Reihe von 3*3 feldern in der mindestens in der mitte ein feld frei st, und gib dazu an, was du von dem netz erwartest, was es ausgibt. Dann schickst du das netz durch die Backpropagation-Lernphase und bringst ihm das bei. Dann ist dein Netz trainiert und wird (hoffentlich) funktionieren.

    Wenn du nicht gleich alles selber machen willst, kann ich dir den SNNS empfehlen, der is zwar anfänglich ziemlich kompliziert, aber ich kenne jetzt keinen besseren. Wenn du matlab hast, kannst du auch die NNtoolbox nehmen, die kann dir das training und testen auch abnehmen. Nur, damit du erstmal ein gefühl dafür bekommst, wie dein netz funktioniert und ob es funktioniert usw.

    Gruß, Maxi



  • hi, danke für die ausführlichen antworten!
    Mir wurde in der Uni "fann" oder so (bin mir nicht mehr sicher) empfehlen, ne fertige bibliothek für neurale netze. was mich aber daran noch stört ist, dass sich für minesweeper trainingsbeispiele so schlecht erstellen lassen(von hand? 😞 ). Ich dachte eigentlich, das ich könnte ein netz erstellen, welches beim spielen selbst lernt!

    achja, wie müssen beim lernen denn die kantengewichte modifiziert werden? (wenn das ergebniss vom erhofften ergebniss abweicht)



  • pixartist schrieb:

    hi, danke für die ausführlichen antworten!
    achja, wie müssen beim lernen denn die kantengewichte modifiziert werden? (wenn das ergebniss vom erhofften ergebniss abweicht)

    na dazu gibts die Regel der Backpropagation. Das ist die Lernregel bzw. der Lernalgorithmus.

    Mit FANN kenn ich mich nicht aus, aber is sicher auch möglich. habs mir ma angesehen, aber nur aus sßa und ich brauchte es nich, also kA wie die ist.

    zu den mustern: Wenn du einfach nur minesweeper spielst, wie soll denn dann das netz das lernen? Du kriegst doch nicht mal die Daten von MS-Minesweeper ins netz rein. Aber wenn du dir einen eigenen Minesweeper schreibst, kannst du sicherlihc spielen und daraus dann automatisch die gewünschten felder erstellen lassen. Musst eben nur minesweeper selber schreiben oder eins mit offenem Quellcode nehmen und modifizieren.



  • naja, das sichtbare minesweeper feld lässt sich scannen 😉
    ich hab schon n programm geschrieben, welches minesweeper auf "pro" in unter einer sekunde löst, nur braucht es immer so um die 100 versuche, da es komplexere zusammenhänge (als mehr als die 8 felder, welche um einen punkt liegen) nicht in die berechnung einbezieht.



  • Aso, ja stimmt. Wahrscheinlich müsste dann das neuronale netz-fenster auch größer als 3*3 sein. einfach ausprobieren.



  • [OFFTOPIC] Thread - Titel ! Ähem ! [/OFFTOPIC]
    🙂


Anmelden zum Antworten