[PYTHON] Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken (③ Stärkung des Lernens in Ihrer eigenen OpenAI Gym-Umgebung).

Einführung

Ich habe versucht, eine Blackjack-Strategie zu entwickeln, während ich Python studiert und das Lernen gestärkt habe. Es gibt eine Strategie, die auf der Wahrscheinlichkeit einer Grundstrategie basiert, aber ich werde versuchen, sie einzuholen.

Ich werde so vorgehen

  1. Blackjack-Implementierung
  2. In OpenAI-Fitnessumgebung registrieren
  3. Lernen Sie die Strategie von Blackjack mit verstärkendem Lernen ← Diesmal hier

Entwicklungsumgebung

Codierungsverstärkungslernen

Dieses Mal werden wir Q-Learning verwenden, einen der grundlegenden Lernalgorithmen für die Verstärkung.

Dateiorganisation

Die Dateistruktur ist wie folgt. Der diesmal erstellte Code zur Stärkung des Lernens lautet "q-learning_blackjack.py". Andere Dateien werden als "In OpenAI-Fitnessumgebung registrieren" erstellt.

├─ q-learning_blackjack.py
└─ myenv
    ├─ __init__.py  --->Rufen Sie BlacJackEnv an
    └─env
       ├─ __init__.py  --->Gibt an, wo sich das BlackJack Env befindet
       ├─ blackjack.py  --->BlackJack-Spiel selbst
       └─ blackjack_env.py  --->OpenAI Fitnessstudio.Erstellen Sie eine BlackJackEnv-Klasse, die Env erbt

Codierung

Agentenklasse

self.Q wird zu einer Tabelle, die die Q-Werte zusammenfasst und im Verlauf des Lernens aktualisiert wird. Dies wird hier als Q-Tabelle bezeichnet. In der Q-Tabelle für ** Status (Spielerpunkte, Dealer-Punkte, Spieler besitzt Ass, Spieler wurde getroffen) **, Spieler ** Stand **, ** Treffer ** , ** Double Down ** , ** Surrender ** Repräsentiert den Wert, wenn die Aktion ausgeführt wird.

ex_Qtable.png

Die Richtlinienmethode wählt Aktionen gemäß der ε-gierigen Methode aus. Wählen Sie zufällig eine Aktion mit der Wahrscheinlichkeit "Epsilon" aus und wählen Sie eine Aktion gemäß der Q-Tabelle mit der Wahrscheinlichkeit "1-Epsilon" aus.

Agentenklasse


class Agent():
    def __init__(self, epsilon):
        self.Q = {}
        self.epsilon = epsilon
        self.reward_log = []

    def policy(self, state, actions):
        if np.random.random() < self.epsilon:
            return np.random.randint(len(actions))
        else:
            if state in self.Q and sum(self.Q[state]) != 0:
                return np.argmax(self.Q[state])
            else:
                return np.random.randint(len(actions))

    def init_log(self):
        self.reward_log = []

    def log(self, reward):
        self.reward_log.append(reward)

    def show_reward_log(self, interval=100, episode=-1):
        if episode > 0:
            rewards = self.reward_log[-interval:]
            mean = np.round(np.mean(rewards), 3)
            std = np.round(np.std(rewards), 3)
            print("At Episode {} average reward is {} (+/-{}).".format(episode, mean, std))
        else:
            indices = list(range(0, len(self.reward_log), interval))
            means = []
            stds = []
            for i in indices:
                rewards = self.reward_log[i:(i + interval)]
                means.append(np.mean(rewards))
                stds.append(np.std(rewards))
            means = np.array(means)
            stds = np.array(stds)
            plt.figure()
            plt.title("Reward History")
            plt.xlabel("episode")
            plt.ylabel("reward")
            plt.grid()
            plt.fill_between(indices, means - stds, means + stds, alpha=0.2, color="g")
            plt.plot(indices, means, "o-", color="g", label="Rewards for each {} episode".format(interval))
            plt.legend(loc="best")
            plt.savefig("Reward_History.png ")
            plt.show()

QLearningAgent-Klasse

Es erbt die oben erstellte Agentenklasse. Die Lernmethode ist die Hauptlernmethode. Eine Episode entspricht einem Blackjack-Spiel. Wählen Sie mit "a = self.policy (s, action)" eine Aktion entsprechend dem Status aus und mit "n_state, belohnung, erledigt, info = env.step (a)" den Status als Ergebnis der tatsächlichen Ausführung dieser Aktion. Beobachten Sie die Belohnung. Die Schrittfunktion ist wie in "In OpenAI-Fitnessraumumgebung registrieren" implementiert.

Die folgenden drei Codezeilen sind die Q-Learning-Formel

Q(s_t, a_t)\leftarrow(1-\alpha)Q(s_t, a_t)+\alpha(r_{t+1}+\gamma \max_{a_{t+1}}Q(s_{t+1}, a_{t+1}))

Entspricht. $ \ Gamma $ (gamma) ist der Parameter dafür, wie viel der zukünftige Wert mit dem Abzinsungssatz abgezinst wird, $ \ alpha $ ( learning_rate) ist die Lernrate und wie schnell der Q-Wert aktualisiert wird. Es ist ein zu steuernder Parameter.

Q-Lernformel


gain = reward + gamma * max(self.Q[n_state])
estimated = self.Q[s][a]
self.Q[s][a] += learning_rate * (gain - estimated)

QLearningAgent-Klasse


class QLearningAgent(Agent):
    def __init__(self, epsilon=0.1):
        super().__init__(epsilon)

    def learn(self, env, episode_count=1000, gamma=0.9,
              learning_rate=0.1, render=False, report_interval=5000):
        self.init_log()
        actions = list(range(env.action_space.n))
        self.Q = defaultdict(lambda: [0] * len(actions))
        for e in range(episode_count):
            s = env.reset()
            done = False
            reward_history = []
            while not done:
                if render:
                    env.render()
                a = self.policy(s, actions)
                n_state, reward, done, info = env.step(a)

                reward_history.append(reward)
                gain = reward + gamma * max(self.Q[n_state])
                estimated = self.Q[s][a]
                self.Q[s][a] += learning_rate * (gain - estimated)
                s = n_state
            else:
                self.log(sum(reward_history))

            if e != 0 and e % report_interval == 0:
                self.show_reward_log(episode=e, interval=50)
        env.close()

Zugfunktion

Laden Sie Ihre eigene Blackjack-Umgebung mit "env = gym.make (" BlackJack-v0 ")".

Informationen zur Erstellungsmethode finden Sie unter Blackjack-Implementierung und In OpenAI-Fitnessumgebung registrieren. Bitte.

Ich habe eine save_Q-Methode zum Speichern der Q-Wertetabelle und eine show_reward_log-Methode zum Anzeigen des Belohnungsprotokollverlaufs erstellt.

Zugfunktion und Ausführungsteil


def train():
    agent = QLearningAgent()
    env = gym.make('BlackJack-v0')
    agent.learn(env, episode_count=50000, report_interval=1000)
    agent.save_Q()
    agent.show_reward_log(interval=500)

if __name__ == "__main__":
    train()

Lernergebnis

Die Lernergebnisse sind wie folgt. Die horizontale Achse ist die Episode und die vertikale Achse ist die Belohnung. Die grüne Linie ist die durchschnittliche Belohnung für 500 Folgen, und die grüne Füllung ist die Standardabweichung für die Belohnung für 500 Folgen. Es ist seit der Folge von 20000 fast flach. Und ich bin traurig, dass die durchschnittliche Belohnung selbst zum Zeitpunkt des Lernens von 50.000 Folgen unter 0 liegt. .. ..

Reward_History_epi50000.png

Vergleich mit der Grundstrategie

Vergleichen Sie die gelernte Q-Tabelle mit der Grundstrategie. Extrahieren Sie die Aktion, die den Q-Wert für jeden Status der Q-Tabelle maximiert, und erstellen Sie eine Strategietabelle für jede harte und weiche Hand auf dieselbe Weise wie für die Basisstrategie.

Die linke Spalte ist die in Q-Learning erlernte Strategie und die rechte Spalte ist die Grundstrategie. Die obere Reihe ist eine harte Hand (wenn A nicht in der Hand enthalten ist) und die untere Reihe ist eine weiche Hand (wenn A in der Hand enthalten ist). Die Zeilen jeder Tabelle stehen für Spielerpunkte und die Spalten für Händlerpunkte. Die Alphabete in der Tabelle stellen die Aktionen dar, die der Spieler ausführen sollte.

Die Split-Funktion ist bei diesem selbst erstellten Blackjack nicht implementiert. Daher werden Aktionen auch dann zugewiesen, wenn der Spieler mit der harten Hand 4 Punkte (2, 2) und der Spieler mit der weichen Hand 12 Punkte (A, A) hat.

strategy_table.png

Wenn man die erlernten Ergebnisse mit der Grundstrategie vergleicht, ist die Tendenz von Treffer, wenn der Punkt des Spielers niedrig ist, und Bleiben, wenn der Punkt des Spielers hoch ist, gleich. Ich möchte, dass Sie zumindest diesen Bereich lernen. Wenn Sie sich jedoch die Details ansehen, trifft der Soft-Hand-Spieler in der Regel 19 Punkte. Selbst wenn Sie es treffen, wird es keine Büste sein, aber wenn Sie still bleiben, ist es ein starker Schachzug. Hier konnte ich nicht gut lernen. Warum. .. .. Außerdem gibt es weniger Double Down und mehr Surrender. Wir können sehen, dass die Tendenz besteht, Risiken einzugehen und Verluste zu minimieren.

Ich habe es tatsächlich gespielt

Ich habe versucht, 100 Spiele x 1000 Mal zu spielen, basierend auf der erlernten Q-Tabelle und der Grundstrategie. Wir setzen 100 $ auf jedes Spiel und berechnen die durchschnittliche Anzahl der Chips, die 1000 Mal für 100 Spiele verdient wurden. Die folgende Abbildung zeigt das Histogramm der durchschnittlichen Erfassungschips.

Reward_Histogram_Basic_Q.png

Je verteilter auf der rechten Seite der Abbildung, desto besser die Ergebnisse, aber die Grundstrategie liefert bessere Ergebnisse. Übrigens betrug der Durchschnittswert basierend auf der Q-Tabelle \ $ -8,2 und der Durchschnittswert basierend auf der Grundstrategie \ $ -3,2. Natürlich war der Fall mit einem hoch durchschnittlich verdienten Chip eine Grundstrategie, aber der Fall mit einem niedrig durchschnittlich verdienten Chip war auch eine Grundstrategie. Die Grundstrategie ist weiter verbreitet. Die Verteilung der Q-Tabelle ist enger, wahrscheinlich weil es weniger Double Downs und mehr Surrenders gibt.

abschließend

In drei Schritten habe ich meine eigene Blackjack-Umgebung erstellt und versucht, die Strategie zu stärken und zu lernen. Infolgedessen erhielt ich keine Ergebnisse, die über die Grundstrategie hinausgingen, aber ich konnte mein Verständnis für das Lernen und Programmieren von Verstärkung vertiefen. Es gibt noch Raum für Verbesserungen beim Lernen. Da ich meine eigene Umgebung erstellt habe, kann ich auch die erwarteten Werte der Karten beobachten, die aus den verbleibenden Decks kommen. Es ist ein bisschen schlampig, aber ich würde gerne experimentieren. (Natürlich kann es nicht in Casinos verwendet werden ...)

Websites / Bücher, auf die ich mich bezog

Recommended Posts

Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken (③ Stärkung des Lernens in Ihrer eigenen OpenAI Gym-Umgebung).
Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken (② Registrieren Sie die Umgebung im Fitnessstudio).
Versuchen Sie, eine Blackjack-Strategie zu entwickeln, indem Sie das Lernen stärken ((1) Implementierung von Blackjack)
Versuchen Sie, Ihr eigenes AWS-SDK mit bash zu erstellen
Versuchen Sie, ein Python-Modul in C-Sprache zu erstellen
Anfänger des maschinellen Lernens versuchen, einen Entscheidungsbaum zu erstellen
Ich habe versucht, mit Open AI Gym eine verbesserte Lernumgebung für Othello zu schaffen
Verstärkungslernen in kürzester Zeit mit Keras mit OpenAI Gym
Versuchen Sie Q-Lernen in einem Kampf im Drakue-Stil [Einführung in die Stärkung des Lernens]
Einführung in Deep Learning (2) - Versuchen Sie Ihre eigene nichtlineare Regression mit Chainer-
[Lernen stärken] Wie zeichnet man OpenAI Gym auf Google Corab (Version 2020.6)?
[Python] Versuchen Sie, selbst ein Sortierprogramm zu erstellen. (Selektive Sortierung, Sortierung einfügen, Blasensortierung)
[Stärkung des Lernens] DQN mit Ihrer eigenen Bibliothek
Machen wir einen Jupyter-Kernel
Machen Sie Ihren eigenen PC für tiefes Lernen
Stärkung des Lernens 11 Probieren Sie OpenAI Acrobot mit ChainerRL aus.
Von nichts unter Ubuntu 18.04 bis zum Einrichten einer Deep Learning-Umgebung auf Tensor
Versuchen Sie, durch maschinelles Lernen basierend auf Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (5)
Versuchen Sie, durch maschinelles Lernen anhand von Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (3).
Versuchen Sie, durch maschinelles Lernen basierend auf Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (1)
Versuchen Sie, durch maschinelles Lernen anhand von Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (4)
Versuchen Sie, durch maschinelles Lernen basierend auf Wetterdaten eine "wetterkartenähnliche Front" zu zeichnen (2)
[Maschinelles Lernen] Erstellen Sie ein Modell für maschinelles Lernen, indem Sie Transferlernen mit Ihrem eigenen Datensatz durchführen
Berechnen wir das statistische Problem mit Python
Verstärkungslernen 10 Versuchen Sie es mit einem trainierten neuronalen Netz.
Versuchen Sie, den Strombedarf durch maschinelles Lernen vorherzusagen
Versuchen Sie, in Python einen "Entschlüsselungs" -Code zu erstellen
Versuchen Sie, mit Python eine Diedergruppe zu bilden
Verwenden Sie eine kostenlose GPU in Ihrer Lieblingsumgebung
Machen wir einen Sprung in die Fertigungsindustrie, indem wir zusätzlich zu Python das Web nutzen
Verwendung von Docker zum Containerisieren Ihrer Anwendung und Verwenden von Docker Compose zum Ausführen Ihrer Anwendung in einer Entwicklungsumgebung