Programmieren & Softwareentwicklung

Wenn Du nicht nur Anwender sein willst, sondern auch aktiv programmierst oder mit dem Gedanken spielst, dann warten hier die passenden Fragen und Antworten auf Dich.
22.301 Fragen

Ask Me Anything: Blickwechsel

Du stellst die Fragen, ein außergewöhnlicher Nutzer antwortet! Begegne mit Deinen Fragen anderen Menschen hautnah und persönlich.
Reinforcment Learning (RL) in PyTorch - habe ich einen Denkfehler?

Guten Tag allerseits.

Ich möchte mittels PyTorch und RL ein neuronales Netzwerk (NN) trainieren und ich komme gerade nicht weiter. Das NN soll ein Strategiespiel (Meta-Tic-Tac-Toe) lernen. Das Spiel ist deterministisch und zwei Spieler wechseln sich ab und platzieren auf ein großes Feld X und O. Das NN erhält als Input das Feld (wo ist X, wo ist O, wo ist leer) und soll als Output den besten Zug für X und den besten Zug für O in der gegebenen Situation vorhersagen.

Mein Training soll so aussehen:
1) Das NN schätzt einen Zug, anhand der Spielfeldinformationen
2) Ist der Zug valide, so wird die Belohnung berechnet. Ist der Zug nicht valide, so wird die negative Belohnung (Bestrafung) berechnet.
3) Es wird eine "learn"-Methode des NNs aufgerufen, die folgende drei Parameter hat: [Spielfeldinformationen, geschätzter Zug und Belohnung]. Das NN soll mit diesen Parametern Backpropagation machen und sich verbessern.
4) War der Zug nicht valide, so soll wieder bei Schritt 1 angefangen werden (bis ein valider Zug herauskommt). War der Zug valide, wird dieser in das Spiel eingetragen und man beginnt wieder mit Schritt 1, diesmal aber mit dem aktualisierten Spielfeld (bis das Spiel endet).

So soll das NN sehr häufig gegen sich selbst spielen und seine X-Präzision und O-Präzision verbessern.

Mein Problem ist die learn-Methode.
Online finde ich jede Menge Algorithmen, die viele Spiele spielen und die Spielfeldinformationen, geschätzten Züge und Belohnungen speichern und erst später auswerten. Das will ich ungerne machen, da ich das unintuitiv finde, da man ja bei jedem Zug lernt.
Chat-GPT will mir ständig eine learn-Methode aufdrücken, die die Backpropagation lediglich mit den Parametern "geschätzter Zug" und "Belohnung" machen will, ohne den Spielfeldzustand zu berücksichtigen. Das ergibt für mich keinen Sinn, da man ja Züge anhand des Spielfelds macht.

Eine für mich angepasste learn-Methode finde ich nicht, obwohl ich denke gelesen zu haben, dass mein Lernprinzip auch funktionieren soll.

Ich nutze Adam als optimizer.

Deswegen frage ich mich, ob ich einen Denkfehler habe und ob mein Algorithmus nicht funktionieren kann. Das ist mein erstes RL-Projekt, ich kenne mich also nicht aus.

Falls also jemand einen Denkfehler findet, wäre es nett mich darauf hinzuweisen :)

Wenn jemand eine learn-Methode mit den 3 Parametern kennt, wäre es nett sie mir zu teilen.

Ask Me Anything: Themenspecials

Im gutefrage Themenspecial beantworten Verbände, Organisationen und Personen des öffentlichen Lebens Deine Fragen zu aktuellen Themen.
Wie kann ich bei Unity einem 2D generierten Mesh einen Collider geben?

Ich arbeite in Unity zurzeit an einen kleinen Projekt und bin auf folgendes Problem gestoßen:

Ich generiere dieses Mesh mit Perlin Noises, also quasi eine Berglandschaft. Sie sieht auch gut aus, nur jetzt habe ich das Problem mit den Collider. Und zwar mache ich das aktuell mit einem Polygon Collider, wo ich die Punkte per Code selber erstelle:

private void GenCollider()
{
  GrassMashObject.AddComponent<PolygonCollider2D>();
  GrassMashObject.GetComponent<PolygonCollider2D>().sharedMaterial = GrassPhysics;
  PolygonCollider2D polygonCollider = GrassMashObject.GetComponent<PolygonCollider2D>();

  if (polygonCollider != null)
  {
    Vector2[] points = new Vector2[(WorldSize + 1) * (yHight + 1)];

    for (int i = 0, y = 0; y <= yHight; y++)
    {
      for (int x = 0; x <= WorldSize; x++)
      {
        points[i] = new Vector2(x, y - (WorldSize / 4f));

        if (y == 1)
        {
          float perlin1 = (float)x / PerlinScale;
          float perlin2 = (float)y / PerlinScale;
          float perlin3 = Mathf.PerlinNoise(perlin1, perlin2);
          float perlin4 = Mathf.PerlinNoise(perlin1 * 2, perlin2 * 2);
          float perlin5 = Mathf.PerlinNoise(perlin1 / 2, perlin2 / 2);
          points[i].y = y + ((perlin3 + perlin4 + perlin5) * PerlinHeight);
        }

        i++;
      }
    }

    polygonCollider.points = points;
  }
}

Es funktioniert ganz gut, nur werden manche Punkte falsch zusammengesetzt und deshalb werden sehr unnötige "Linien" zwischen den Punkten generiert. Deshalb kommt es auch manchmal zu massiven Performenceeinbrüchen.

Ich bin für jede Hilfe dankbar! Danke im Voraus!