Aufbau der Netze
Generelle Überlegungen zum Aufbau der Netze
Für die Realisierung unseres Pokerbots haben wir uns entschieden vier verschiedene Neuronale Netze zu konstruieren, da sich ein Pokerspiel (wie in Punkt 2 beschrieben) aus vier verschiedenen Spielphasen zusammensetzt. Dabei ist es sehr wichtig in nachfolgenden Spielphasen (Netzen) alle Informationen zu verarbeiten, die in vorangegangenen Spielphasen und Netzen bereits ermittelt oder gesammelt wurden. Beim Entwurf der Netze ist es sehr wichtig zu wissen, dass Poker ein Spiel von unvollständigen Informationen ist, die über die verschieden Spielphasen gesammelt werden, so dass in der ersten Spielphase (Preflop) die wenigsten Informationen vorliegen, in der letzten Spielphase (Postriver) die meisten.
Als Konsequenz ergaben sich die folgenden Netze mit ihren charakteristischen Werten:
|
Eingabe-Neuronen |
Ausgabe-Neuronen |
Hiddenschichten |
Hidden-Neuronen |
Verbindungen |
PreFlop.mbr |
14 |
6 |
1 |
18 |
179 |
PostFlop.mbr |
36 |
7 |
1 |
34 |
514 |
PostTurn.mbr |
55 |
7 |
1 |
44 |
882 |
PostRiver.mbr |
74 |
7 |
1 |
53 |
1342 |
Struktur der Netze
Allen Netzen ist ein charakteristischer Aufbau gemeinsam: sie bilden sensorische Felder aus bestimmten Gruppen von Eingabeinformationen. Solche Felder setzen verschiedene Funktionen (in unserem Fall Informationen) in einen gemeinsamen Zusammenhang. Wichtig zu beachten ist, dass ein einzelnes Feld nicht alleine für die Funktion des Netzes zuständig ist, sondern dass die Gesamtfunktionalität des Netzes erst durch das korrekte Zusammenspiel mehrerer solcher Gruppen möglich wird.
Eingabeinformationen
Betrachten wir also im Folgenden die Eingabeinformationen der vier Netze und ihre semantischen Gruppen, die sie bilden. Bitte beachten sie, dass jedes Folgenetz auch die Eingabeinformationen des oder der vorangegangenen Netze verarbeitet. Diese sind aus Gründen der Übersichtlichkeit hier nicht nochmals aufgeführt.
PreFlop
Position |
Chipstände |
Spielentscheidungen des Gegners |
eigene Karten |
Position |
OwnStake_PreFlop
OpponentStake_PreFlop
Potsize_PreFlop |
Opponent_Fold_PreFlop
Opponent_Check_PreFlop
Opponent_Call_PreFlop
Opponent_Raise_PreFlop
Opponent_ReRaise_PreFlop
Opponent_All-In_PreFlop |
HoleCard1_Value
HoleCard2_Value
HoleCard1_Suite
HoleCard2_Suite |
PostFlop:
Chipstände |
Spielentscheidungen des Gegners |
Gemeinschaftskarten |
eigene Spielentscheidungen |
OwnStake_PostFlop
OpponentStake_PostFlop
Potsize_PostFlop |
Opponent_Fold_PostFlop
Opponent_Check_PostFlop
Opponent_Bet_PostFlop
Opponent_Call_PostFlop
Opponent_Raise_PostFlop
Opponent_ReRaise_PostFlop
Opponent_All-In_PostFlop |
CommCard1_Value
CommCard2_Value
CommCard3_Value
CommCard1_Suite
CommCard2_Suite
CommCard3_Suite |
Own_Fold_PreFlop
Own_Check_PreFlop
Own_Call_PreFlop
Own_Raise_PreFlop
Own_ReRaise_PreFlop
Own_All-In_PreFlop |
PostTurn
Chipstände |
Spielentscheidungen des Gegners |
Gemeinschaftskarten |
eigene Spielentscheidungen |
OwnStake_PostTurn
OpponentStake_PostTurn
Potsize_PostTurn |
Opponent_Fold_PostTurn
Opponent_Check_PostTurn
Opponent_Bet_PostTurn
Opponent_Call_PostTurn
Opponent_Raise_PostTurn
Opponent_ReRaise_PostTurn
Opponent_All-In_PostTurn |
CommCard4_Value
CommCard4_Suite |
Own_Fold_PostFlop
Own_Check_PostFlop
Own_Bet_PostFlop
Own_Call_PostFlop
Own_Raise_PostFlop
Own_ReRaise_PostFlop
Own_All-In_PostFlop |
PostRiver
Chipstände |
Spielentscheidungen des Gegners |
Gemeinschaftskarten |
eigene Spielentscheidungen |
OwnStake_PostRiver
OpponentStake_PostRiver
Potsize_PostRiver |
Opponent_Fold_PostRiver
Opponent_Check_PostRiver
Opponent_Bet_PostRiver
Opponent_Call_PostRiver
Opponent_Raise_PostRiver
Opponent_ReRaise_PostRiver
Opponent_All-In_PostRiver |
CommCard5_Value
CommCard5_Suite |
Own_Fold_PostTurn
Own_Check_PostTurn
Own_Bet_PostTurn
Own_Call_PostTurn
Own_Raise_PostTurn
Own_ReRaise_PostTurn
Own_All-In_PostTurn |
Ausgabeinformationen
Aus den genannten Eingabeinformationen sollten durch das Netz folgende Ausgabeinformationen gewonnen werden:
PreFlop |
PostFlop |
PostTurn |
PostRiver |
Fold_PreFlop
Check_PreFlop
Call_PreFlop
Raise_PreFlop
ReRaise_PreFlop
All-In_PreFlop |
Fold_PostFlop
Check_PostFlop
Bet_PostFlop
Call_PostFlop
Raise_PostFlop
ReRaise_PostFlop
All-In_PostFlop |
Fold_PostTurn
Check_PostTurn
Bet_PostTurn
Call_PostTurn
Raise_PostTurn
ReRaise_PostTurn
All-In_PostTurn |
Fold_PostRiver
Check_PostRiver
Bet_PostRiver
Call_PostRiver
Raise_PostRiver
ReRaise_PostRiver
All-In_PostRiver |
Hidden-Schichten und Neuronen
Um eine geeignete Anzahl an Hidden-Neuronen für das jeweilige Netz zu ermitteln, wurde (unter der Strukturvorgabe der Nutzung von sensorischen Feldern) folgende Faustregel verwendet:
(„Anzahl der Neuronen in einer Informationsgruppe“ + „Anzahl der Ausgabeneuronen des Netzes“) / 2
Als Beispiel soll hier das PreFlop Netz dienen, da es von der Menge an verarbeiteten Informationen das kleinste aller Netze ist und damit am überschaubarsten ist:

Wie in der Abbildung zu sehen, gibt es vor dem Austeilen des Flops vier Informationsgruppen (siehe Tabelle 4.2.1.1). In der zweiten Gruppe von links werden die Informationen eingelesen, die sich mit den Chipständen befassen: die Stakegröße des Gegners, die eigene Stakegröße und die Größe des Gewinnpots. Insgesamt besitzt das Netz sechs Ausgabeneuronen, so dass die Summe aus der Gruppe der Eingabeneuronen und den Ausgabeneuronen neun ergibt. Teilt man diese Anzahl durch zwei erhält man die Kennzahl für die Anzahl der Neuronen für die Hiddenschicht (für eben diese Gruppe). Anschließend wurden alle Neuronen der Eingabeschicht mit allen der Hiddenschicht (für diese Gruppe) verbunden. Die Hidden-Neuronen einer Gruppe wurden ihrerseits wiederum mit allen Ausgabeneuronen in Beziehung gesetzt.
Wertebereiche der Ein- und Ausgabeinformationen (Normalisiserung)
Die folgende Übersicht zeigt die Wertebereiche auf, nach denen die Netze ihre Eingabedaten erwarten und ihre Ausgabeinformationen ausgeben. Dabei wird nicht auf alle Neuronen einzeln eingegangen, sondern sie werden zu logischen Gruppen zusammengefasst.
|
Min |
Max |
Bedeutung |
Chipstände |
1 |
10000 |
die Stake oder Potgrößen gemessen in der Anzahl der Big Blinds |
Spielaktionen |
0 |
1 |
0: Aktion wurde nicht ausgeführt
1: Aktion wurde ausgeführt |
Kartenwerte |
2 |
14 |
2: Karte mit dem Wert 2
3: Karte mit dem Wert 3
...
11: Bube
12: Dame
13: König
14: Ass |
Kartensymbole |
1 |
4 |
1: Kreuz (Club)
2: Karo (Diamond)
3: Herz (Heart)
4: Pik (Spade) |
Sitzposition |
1 |
2 |
1: BigBlind
2: Small Blind (Button) |
Die Normalisierung der Werte auf einen Wertebereich zwischen 0 und 1 wird von Membrain selbständig durchgeführt.
Die nebenstehende Abbildung zeigt ein Beispiel für den Wert der eigenen Stakegröße vor dem Flop. Aufgerechnet in BigBlinds liegt dieser zwischen 1 und 1000 und wird von Membrain selbstständig normalisiert.
Aktivierungsfunktionen
Eingabeneuronen

Alle Eingabeneuronen besitzen die Identitätsfunktion als Aktivierungsfunktion. Sie reicht aus, da die Werte in den Neuronen zunächst auf einen Wertebereich zwischen 0 und 1 normalisiert werden, bevor eben genau diese normalisierte Information an die Hidden-Schicht weiter gegeben wird.
Hidden- und Ausgabe-Neuronen
Alle Hidden- und Ausgabe-Neuronen besitzen als Aktivierungsfunktion die Logistische Funktion. Sie ist neben dem Tan Hyp die am häufigsten genutzte Aktivierungsfunktion. Tests mit verschiedenen Aktivierungsfunktionen zeigten, dass die Logistische die besten Resultate für die Ausgabe in unserem Beleg liefert.
Der gekennzeichnete Parameter stellt die Steilheit der Kurve ein. Je höher der Parameter desto steiler wird die Kurve. Ist der Parameter recht klein, führt dies zu einer größeren Varianz in den Ergebnissen des Netzes. Ist der Parameter dagegen steiler eingestellt, sind die Ergebnisse schärfer und für unsere Zwecke besser geeignet.
|