You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
ML-For-Beginners/translations/el/8-Reinforcement/2-Gym
localizeflow[bot] c0001cd955
[el,th,sv] chore(i18n): sync translations
1 month ago
..
solution chore(i18n): sync translations with latest source changes (chunk 1/1, 300 changes) 7 months ago
README.md [el,th,sv] chore(i18n): sync translations 1 month ago
assignment.md chore(i18n): sync translations with latest source changes (chunk 1/1, 300 changes) 7 months ago
notebook.ipynb 🌐 Update translations via Co-op Translator 12 months ago

README.md

Καροτσάκι με πόλο (CartPole Skating)

Το πρόβλημα που έχουμε λύσει στο προηγούμενο μάθημα μπορεί να φαίνεται ως ένα πρόβλημα παιχνιδιού, που δεν εφαρμόζεται πραγματικά σε σενάρια της καθημερινής ζωής. Αυτό δεν ισχύει, διότι πολλά πραγματικά προβλήματα μοιράζονται αυτό το σενάριο - όπως το να παίζεις Σκάκι ή Go. Είναι παρόμοια, επειδή έχουμε επίσης ένα ταμπλό με δεδομένους κανόνες και μια διακριτή κατάσταση.

Προ-μάθημα κουίζ

Εισαγωγή

Σε αυτό το μάθημα θα εφαρμόσουμε τις ίδιες αρχές του Q-Learning σε ένα πρόβλημα με συνεχή κατάσταση, δηλαδή μια κατάσταση που δίνεται από έναν ή περισσότερους πραγματικούς αριθμούς. Θα ασχοληθούμε με το ακόλουθο πρόβλημα:

Πρόβλημα: Αν ο Πέτρος θέλει να ξεφύγει από τον λύκο, πρέπει να μπορεί να κινείται πιο γρήγορα. Θα δούμε πώς ο Πέτρος μπορεί να μάθει να πατινάρει, συγκεκριμένα, να διατηρεί την ισορροπία, χρησιμοποιώντας το Q-Learning.

Η μεγάλη απόδραση!

Ο Πέτρος και οι φίλοι του γίνονται δημιουργικοί για να ξεφύγουν από τον λύκο! Εικόνα από την Jen Looper

Θα χρησιμοποιήσουμε μια απλοποιημένη εκδοχή της ισορροπίας γνωστή ως πρόβλημα CartPole. Στον κόσμο του cartpole, έχουμε ένα οριζόντιο ολισθητήρα που μπορεί να κινηθεί αριστερά ή δεξιά, και στόχος είναι να κρατήσουμε μια κατακόρυφη ράβδο στην κορυφή του ολισθητήρα.

a cartpole

Προαπαιτούμενα

Σε αυτό το μάθημα, θα χρησιμοποιήσουμε μια βιβλιοθήκη που ονομάζεται OpenAI Gym για να προσομοιώσουμε διάφορα περιβάλλοντα. Μπορείτε να εκτελέσετε τον κώδικα του μαθήματος τοπικά (π.χ. από το Visual Studio Code), οπότε η προσομοίωση θα ανοίξει σε νέο παράθυρο. Όταν τρέχετε τον κώδικα διαδικτυακά, ίσως χρειαστεί να κάνετε κάποιες τροποποιήσεις στον κώδικα, όπως περιγράφεται εδώ.

OpenAI Gym

Στο προηγούμενο μάθημα, οι κανόνες του παιχνιδιού και η κατάσταση δόθηκαν από την κλάση Board που ορίσαμε εμείς. Εδώ θα χρησιμοποιήσουμε ένα ειδικό περιβάλλον προσομοίωσης, που θα προσομοιώνει τη φυσική πίσω από την ισορροπία της ράβδου. Ένα από τα πιο δημοφιλή περιβάλλοντα προσομοίωσης για εκπαίδευση αλγορίθμων ενίσχυσης μάθησης είναι ένα Gym, που συντηρείται από το OpenAI. Χρησιμοποιώντας αυτό το gym μπορούμε να δημιουργήσουμε διάφορα περιβάλλοντα από μια προσομοίωση cartpole μέχρι παιχνίδια Atari.

Σημείωση: Μπορείτε να δείτε άλλα περιβάλλοντα διαθέσιμα από το OpenAI Gym εδώ.

Πρώτα, ας εγκαταστήσουμε το gym και να εισάγουμε τις απαραίτητες βιβλιοθήκες (code block 1):

import sys
!{sys.executable} -m pip install gym 

import gym
import matplotlib.pyplot as plt
import numpy as np
import random

Άσκηση - αρχικοποίηση περιβάλλοντος cartpole

Για να δουλέψουμε με το πρόβλημα ισορροπίας cartpole, πρέπει να αρχικοποιήσουμε το αντίστοιχο περιβάλλον. Κάθε περιβάλλον σχετίζεται με ένα:

  • Χώρο παρατήρησης που ορίζει τη δομή των πληροφοριών που λαμβάνουμε από το περιβάλλον. Για το πρόβλημα cartpole λαμβάνουμε τη θέση της ράβδου, την ταχύτητα και μερικές άλλες τιμές.

  • Χώρο δράσης που ορίζει τις πιθανές ενέργειες. Στην περίπτωσή μας ο χώρος δράσης είναι διακριτός και περιλαμβάνει δύο ενέργειες - αριστερά και δεξιά. (code block 2)

  1. Για να αρχικοποιήσετε, πληκτρολογήστε τον ακόλουθο κώδικα:

    env = gym.make("CartPole-v1")
    print(env.action_space)
    print(env.observation_space)
    print(env.action_space.sample())
    

Για να δείτε πώς λειτουργεί το περιβάλλον, ας τρέξουμε μια σύντομη προσομοίωση για 100 βήματα. Σε κάθε βήμα, παρέχουμε μία από τις ενέργειες που πρέπει να λάβουμε - σε αυτήν την προσομοίωση επιλέγουμε τυχαία μια ενέργεια από το action_space.

  1. Εκτελέστε τον κώδικα παρακάτω και δείτε το αποτέλεσμα.

    Θυμηθείτε ότι προτιμάται να εκτελείτε αυτόν τον κώδικα σε τοπική εγκατάσταση Python! (code block 3)

    env.reset()
    
    for i in range(100):
       env.render()
       env.step(env.action_space.sample())
    env.close()
    

    Θα πρέπει να βλέπετε κάτι σαν αυτήν την εικόνα:

    cartpole που δεν ισορροπεί

  2. Κατά τη διάρκεια της προσομοίωσης, πρέπει να λαμβάνουμε παρατηρήσεις για να αποφασίσουμε πώς να ενεργήσουμε. Στην πραγματικότητα, η συνάρτηση step επιστρέφει τις τρέχουσες παρατηρήσεις, μια συνάρτηση ανταμοιβής, και τη σημαία done που υποδηλώνει αν έχει νόημα να συνεχιστεί η προσομοίωση ή όχι: (code block 4)

    env.reset()
    
    done = False
    while not done:
       env.render()
       obs, rew, done, info = env.step(env.action_space.sample())
       print(f"{obs} -> {rew}")
    env.close()
    

    Στο output του notebook θα δείτε κάτι παρόμοιο με το παρακάτω:

    [ 0.03403272 -0.24301182  0.02669811  0.2895829 ] -> 1.0
    [ 0.02917248 -0.04828055  0.03248977  0.00543839] -> 1.0
    [ 0.02820687  0.14636075  0.03259854 -0.27681916] -> 1.0
    [ 0.03113408  0.34100283  0.02706215 -0.55904489] -> 1.0
    [ 0.03795414  0.53573468  0.01588125 -0.84308041] -> 1.0
    ...
    [ 0.17299878  0.15868546 -0.20754175 -0.55975453] -> 1.0
    [ 0.17617249  0.35602306 -0.21873684 -0.90998894] -> 1.0
    

    Το διάνυσμα παρατήρησης που επιστρέφεται σε κάθε βήμα της προσομοίωσης περιέχει τις ακόλουθες τιμές:

    • Θέση του καροτσιού
    • Ταχύτητα του καροτσιού
    • Γωνία της ράβδου
    • Ρυθμός περιστροφής της ράβδου
  3. Πάρτε την ελάχιστη και μέγιστη τιμή αυτών των αριθμών: (code block 5)

    print(env.observation_space.low)
    print(env.observation_space.high)
    

    Μπορείτε επίσης να παρατηρήσετε ότι η τιμή της ανταμοιβής σε κάθε βήμα της προσομοίωσης είναι πάντα 1. Αυτό συμβαίνει γιατί ο στόχος μας είναι να επιβιώσουμε όσο περισσότερο γίνεται, δηλαδή να κρατήσουμε τη ράβδο σε σχετικά κάθετη θέση για τη μεγαλύτερη δυνατή διάρκεια.

    Στην πραγματικότητα, η προσομοίωση CartPole θεωρείται λυμένη αν καταφέρουμε να πάρουμε μέση ανταμοιβή 195 πάνω από 100 συνεχόμενες δοκιμές.

Διακριτοποίηση της κατάστασης

Στο Q-Learning, πρέπει να φτιάξουμε έναν Πίνακα Q που ορίζει τι να κάνουμε σε κάθε κατάσταση. Για να το κάνουμε αυτό, η κατάσταση πρέπει να είναι διακριτή, πιο συγκεκριμένα, να περιέχει πεπερασμένο αριθμό διακριτών τιμών. Έτσι, πρέπει κάπως να διακριτοποιήσουμε τις παρατηρήσεις μας, χαρτογραφώντας τις σε έναν πεπερασμένο αριθμό καταστάσεων.

Υπάρχουν μερικοί τρόποι για να το κάνουμε αυτό:

  • Διαίρεση σε διαμερίσματα. Αν ξέρουμε το διάστημα μιας συγκεκριμένης τιμής, μπορούμε να διαιρέσουμε αυτό το διάστημα σε αριθμό διαμερισμάτων, και στη συνέχεια να αντικαταστήσουμε την τιμή με τον αριθμό του διαμερίσματος στο οποίο ανήκει. Αυτό μπορεί να γίνει χρησιμοποιώντας τη μέθοδο digitize της numpy. Σε αυτήν την περίπτωση, θα γνωρίζουμε ακριβώς το μέγεθος της κατάστασης, γιατί θα εξαρτάται από τον αριθμό των διαμερισμάτων που επιλέγουμε για τη διακριτοποίηση.

Μπορούμε να χρησιμοποιήσουμε γραμμική παρεμβολή για να φέρουμε τις τιμές σε ένα πεπερασμένο διάστημα (π.χ., από -20 έως 20), και στη συνέχεια να μετατρέψουμε τους αριθμούς σε ακέραιους στρογγυλοποιώντας τους. Αυτό μας δίνει λίγο λιγότερο έλεγχο στο μέγεθος της κατάστασης, ειδικά αν δεν ξέρουμε τα ακριβή εύρη των εισερχόμενων τιμών. Για παράδειγμα, στην περίπτωσή μας 2 από τις 4 τιμές δεν έχουν ανώτατο/κατώτατο όριο, που μπορεί να οδηγήσει σε άπειρο αριθμό καταστάσεων.

Στο παράδειγμά μας, θα επιλέξουμε τη δεύτερη προσέγγιση. Όπως θα παρατηρήσετε αργότερα, παρά τα μη ορισμένα άνω/κάτω όρια, αυτές οι τιμές σπάνια παίρνουν τιμές εκτός ορισμένων πεπερασμένων διαστημάτων, έτσι οι καταστάσεις με ακραίες τιμές θα είναι πολύ σπάνιες.

  1. Να η συνάρτηση που παίρνει την παρατήρηση από το μοντέλο μας και επιστρέφει μια πεντάδα 4 ακεραίων τιμών: (code block 6)

    def discretize(x):
        return tuple((x/np.array([0.25, 0.25, 0.01, 0.1])).astype(np.int))
    
  2. Ας εξερευνήσουμε επίσης μια άλλη μέθοδο διακριτοποίησης χρησιμοποιώντας διαμερίσματα: (code block 7)

    def create_bins(i,num):
        return np.arange(num+1)*(i[1]-i[0])/num+i[0]
    
    print("Sample bins for interval (-5,5) with 10 bins\n",create_bins((-5,5),10))
    
    ints = [(-5,5),(-2,2),(-0.5,0.5),(-2,2)] # διαστήματα τιμών για κάθε παράμετρο
    nbins = [20,20,10,10] # αριθμός κάδων για κάθε παράμετρο
    bins = [create_bins(ints[i],nbins[i]) for i in range(4)]
    
    def discretize_bins(x):
        return tuple(np.digitize(x[i],bins[i]) for i in range(4))
    
  3. Ας τρέξουμε τώρα μια σύντομη προσομοίωση και να παρατηρήσουμε αυτές τις διακριτές τιμές του περιβάλλοντος. Μπορείτε να δοκιμάσετε τόσο τη discretize όσο και τη discretize_bins και να δείτε αν υπάρχει διαφορά.

    Η discretize_bins επιστρέφει τον αριθμό του διαμερίσματος, που είναι μηδενικής βάσης. Έτσι για τιμές της εισόδου γύρω από το 0 επιστρέφει τον αριθμό από το μέσο του διαστήματος (10). Στη discretize, δεν μας ενδιέφερε το εύρος των τιμών εξόδου, επιτρέποντας αρνητικές τιμές, έτσι οι τιμές της κατάστασης δεν μετατοπίζονται και το 0 αντιστοιχεί στο 0. (code block 8)

    env.reset()
    
    done = False
    while not done:
       #env.render()
       obs, rew, done, info = env.step(env.action_space.sample())
       #εκτύπωσε(discretize_bins(obs))
       print(discretize(obs))
    env.close()
    

    Αποσχολιάστε τη γραμμή που ξεκινά με env.render αν θέλετε να δείτε πώς εκτελείται το περιβάλλον. Διαφορετικά, μπορείτε να το εκτελέσετε στο παρασκήνιο, που είναι πιο γρήγορο. Θα χρησιμοποιήσουμε αυτήν την "αόρατη" εκτέλεση κατά τη διαδικασία Q-Learning.

Η δομή του Πίνακα Q

Στο προηγούμενο μάθημα, η κατάσταση ήταν ένα απλό ζεύγος αριθμών από 0 έως 8, και έτσι ήταν βολικό να αναπαραστήσουμε τον Πίνακα Q με έναν numpy tensor σχήματος 8x8x2. Αν χρησιμοποιήσουμε διακριτοποίηση με διαμερίσματα, το μέγεθος του διανύσματος κατάστασης είναι επίσης γνωστό, οπότε μπορούμε να χρησιμοποιήσουμε την ίδια προσέγγιση και να αναπαραστήσουμε την κατάσταση με έναν πίνακα σχήματος 20x20x10x10x2 (εδώ το 2 είναι η διάσταση του χώρου δράσης, και οι πρώτες διαστάσεις αντιστοιχούν στον αριθμό των διαμερισμάτων που επιλέξαμε για κάθε παράμετρο στον χώρο παρατήρησης).

Ωστόσο, κάποιες φορές οι ακριβείς διαστάσεις του χώρου παρατήρησης δεν είναι γνωστές. Στην περίπτωση της συνάρτησης discretize, ποτέ δεν μπορούμε να είμαστε σίγουροι ότι η κατάσταση παραμένει εντός συγκεκριμένων ορίων, γιατί κάποιες από τις αρχικές τιμές δεν είναι περιορισμένες. Έτσι, θα χρησιμοποιήσουμε μια ελαφρώς διαφορετική προσέγγιση και θα αναπαραστήσουμε τον Πίνακα Q ως λεξικό.

  1. Χρησιμοποιήστε το ζεύγος (state,action) ως κλειδί του λεξικού, και η τιμή θα αντιστοιχεί στην τιμή της αντίστοιχης εγγραφής στον Πίνακα Q. (code block 9)

    Q = {}
    actions = (0,1)
    
    def qvalues(state):
        return [Q.get((state,a),0) for a in actions]
    

    Εδώ ορίζουμε επίσης μια συνάρτηση qvalues(), που επιστρέφει μια λίστα με τις τιμές του Πίνακα Q για μια δοσμένη κατάσταση, που αντιστοιχεί σε όλες τις δυνατές ενέργειες. Αν η εγγραφή δεν υπάρχει στον Πίνακα Q, θα επιστρέψουμε 0 ως προεπιλογή.

Ας ξεκινήσουμε Q-Learning

Τώρα είμαστε έτοιμοι να διδάξουμε στον Πέτρο πώς να κρατά ισορροπία!

  1. Πρώτα, ας ορίσουμε μερικούς υπερπαραμέτρους: (code block 10)

    # υπερπαράμετροι
    alpha = 0.3
    gamma = 0.9
    epsilon = 0.90
    

    Εδώ, το alpha είναι ο ρυθμός μάθησης που ορίζει σε ποιο βαθμό πρέπει να προσαρμόζουμε τις τρέχουσες τιμές του Πίνακα Q σε κάθε βήμα. Στο προηγούμενο μάθημα ξεκινήσαμε με 1 και μετά μειώσαμε το alpha σε μικρότερες τιμές κατά την εκπαίδευση. Σε αυτό το παράδειγμα θα το κρατήσουμε σταθερό για απλότητα, και μπορείτε να πειραματιστείτε με την προσαρμογή των τιμών του alpha αργότερα.

    Το gamma είναι ο παράγοντας έκπτωσης που δείχνει σε ποιο βαθμό πρέπει να προτεραιοποιούμε την μελλοντική ανταμοιβή έναντι της τρέχουσας.

    Το epsilon είναι ο παράγοντας εξερεύνησης/εκμετάλλευσης που καθορίζει αν προτιμάμε την εξερεύνηση ή την εκμετάλλευση. Στον αλγόριθμό μας, σε epsilon ποσοστό των περιπτώσεων θα επιλέγουμε την επόμενη ενέργεια σύμφωνα με τις τιμές του Πίνακα Q, και στις υπόλοιπες θα εκτελούμε τυχαία ενέργεια. Αυτό θα μας επιτρέψει να εξερευνήσουμε μέρη του χώρου αναζήτησης που δεν έχουμε δει ποτέ πριν.

    Στον τομέα της ισορροπίας - η επιλογή τυχαίας ενέργειας (εξερεύνηση) λειτουργεί ως τυχαίο χτύπημα προς λάθος κατεύθυνση, και η ράβδος θα πρέπει να μάθει πώς να ανακτήσει την ισορροπία από αυτά τα "λάθη".

Βελτίωση του αλγορίθμου

Μπορούμε επίσης να κάνουμε δύο βελτιώσεις στον αλγόριθμο μας από το προηγούμενο μάθημα:

  • Υπολογισμός μέσης σωρευτικής ανταμοιβής, πάνω σε έναν αριθμό προσομοιώσεων. Θα εκτυπώνουμε την πρόοδο κάθε 5000 επαναλήψεις, και θα παίρνουμε το μέσο όρο της σωρευτικής ανταμοιβής μας σε αυτήν την περίοδο. Αυτό σημαίνει ότι αν πάρουμε πάνω από 195 πόντους - μπορούμε να θεωρήσουμε το πρόβλημα λυμένο, με ακόμα καλύτερη ποιότητα από αυτή που απαιτείται.

  • Υπολογισμός μέγιστου μέσου σωρευτικού αποτελέσματος, Qmax, και θα αποθηκεύσουμε τον Πίνακα Q που αντιστοιχεί σε αυτό το αποτέλεσμα. Όταν τρέχετε την εκπαίδευση, θα παρατηρήσετε ότι μερικές φορές το μέσο σωρευτικό αποτέλεσμα αρχίζει να πέφτει, και θέλουμε να κρατήσουμε τις τιμές του Πίνακα Q που αντιστοιχούν στο καλύτερο μοντέλο που παρατηρήθηκε κατά την εκπαίδευση.

  1. Συλλέξτε όλα τα σωρευτικά βραβεία σε κάθε προσομοίωση στον πίνακα rewards για περαιτέρω σχεδιασμό διαγραμμάτων. (code block 11)

    def probs(v,eps=1e-4):
        v = v-v.min()+eps
        v = v/v.sum()
        return v
    
    Qmax = 0
    cum_rewards = []
    rewards = []
    for epoch in range(100000):
        obs = env.reset()
        done = False
        cum_reward=0
        # == εκτέλεση της προσομοίωσης ==
        while not done:
            s = discretize(obs)
            if random.random()<epsilon:
                # εκμετάλλευση - επιλογή της ενέργειας σύμφωνα με τις πιθανότητες του πίνακα Q
                v = probs(np.array(qvalues(s)))
                a = random.choices(actions,weights=v)[0]
            else:
                # εξερεύνηση - τυχαία επιλογή της ενέργειας
                a = np.random.randint(env.action_space.n)
    
            obs, rew, done, info = env.step(a)
            cum_reward+=rew
            ns = discretize(obs)
            Q[(s,a)] = (1 - alpha) * Q.get((s,a),0) + alpha * (rew + gamma * max(qvalues(ns)))
        cum_rewards.append(cum_reward)
        rewards.append(cum_reward)
        # == Περιοδική εκτύπωση αποτελεσμάτων και υπολογισμός μέσου όρου επιβράβευσης ==
        if epoch%5000==0:
            print(f"{epoch}: {np.average(cum_rewards)}, alpha={alpha}, epsilon={epsilon}")
            if np.average(cum_rewards) > Qmax:
                Qmax = np.average(cum_rewards)
                Qbest = Q
            cum_rewards=[]
    

Τι μπορεί να παρατηρήσετε από αυτά τα αποτελέσματα:

  • Κοντά στο στόχο μας. Είμαστε πολύ κοντά στο να πετύχουμε τον στόχο των 195 σωρευτικών βραβείων πάνω από 100+ συνεχόμενες εκτελέσεις της προσομοίωσης, ή ίσως να τον έχουμε ήδη πετύχει! Ακόμα κι αν πάρουμε μικρότερους αριθμούς, δεν έχουμε ακόμη σιγουριά επειδή παίρνουμε μέσο όρο πάνω από 5000 εκτελέσεις, και μόνο 100 εκτελέσεις απαιτούνται στο επίσημο κριτήριο.

  • Η ανταμοιβή αρχίζει να πέφτει. Μερικές φορές η ανταμοιβή αρχίζει να πέφτει, που σημαίνει ότι μπορούμε να "καταστρέψουμε" ήδη μάθεις τιμές στον Πίνακα Q με αυτές που κάνουν την κατάσταση χειρότερη.

Αυτή η παρατήρηση είναι πιο εμφανής αν σχεδιάσουμε την πρόοδο της εκπαίδευσης.

Σχεδιασμός προόδου εκπαίδευσης

Κατά τη διάρκεια της εκπαίδευσης, έχουμε συλλέξει την τιμή της σωρευτικής ανταμοιβής σε κάθε επανάληψη στο διάνυσμα rewards. Να πώς φαίνεται όταν το σχεδιάζουμε σε σχέση με τον αριθμό της επανάληψης:

plt.plot(rewards)

ακατέργαστη πρόοδος

Από αυτό το γράφημα δεν μπορούμε να πούμε πολλά, γιατί λόγω της φύσης της στοχαστικής διαδικασίας εκπαίδευσης το μήκος των συνεδριών εκπαίδευσης διαφέρει πολύ. Για να κατανοήσουμε καλύτερα αυτό το γράφημα, μπορούμε να υπολογίσουμε τον τρέχοντα μέσο όρο σε μια σειρά πειραμάτων, ας πούμε 100. Αυτό μπορεί να γίνει εύκολα χρησιμοποιώντας το np.convolve: (code block 12)

def running_average(x,window):
    return np.convolve(x,np.ones(window)/window,mode='valid')

plt.plot(running_average(rewards,100))

πρόοδος εκπαίδευσης

Μεταβλητές υπερπαράμετροι

Για να γίνει η μάθηση πιο σταθερή, έχει νόημα να προσαρμόσουμε κάποιες από τις υπερπαραμέτρους μας κατά τη διάρκεια της εκπαίδευσης. Συγκεκριμένα:

  • Για τον ρυθμό μάθησης, alpha, μπορεί να ξεκινήσουμε με τιμές κοντά στο 1, και μετά να μειώνουμε σταδιακά την παράμετρο. Με το χρόνο, θα παίρνουμε καλές τιμές πιθανότητας στον Πίνακα Q, και έτσι πρέπει να τις προσαρμόζουμε ελαφρώς και όχι να τις αντικαθιστούμε εντελώς με νέες τιμές.

  • Αύξηση του epsilon. Μπορεί να θέλουμε να αυξήσουμε το epsilon αργά, έτσι ώστε να εξερευνούμε λιγότερο και να εκμεταλλευόμαστε περισσότερο. Πιθανώς έχει νόημα να ξεκινήσουμε με μικρότερη τιμή του epsilon, και να φτάσουμε σχεδόν στο 1.

Εργασία 1: Πειραματιστείτε με τις τιμές των υπερπαραμέτρων και δείτε αν μπορείτε να πετύχετε υψηλότερη σωρευτική ανταμοιβή. Μπορείτε να φτάσετε πάνω από 195;

Εργασία 2: Για να λύσετε επίσημα το πρόβλημα, πρέπει να πετύχετε μέση ανταμοιβή 195 κατά τη διάρκεια 100 συνεχόμενων εκτελέσεων. Μετρήστε αυτό κατά τη διάρκεια της εκπαίδευσης και βεβαιωθείτε ότι έχετε επίσημα λύσει το πρόβλημα!

Βλέποντας το αποτέλεσμα σε δράση

Θα ήταν ενδιαφέρον να δούμε πώς συμπεριφέρεται το εκπαιδευμένο μοντέλο. Ας τρέξουμε την προσομοίωση και να ακολουθήσουμε την ίδια στρατηγική επιλογής δράσης όπως κατά την εκπαίδευση, δειγματοληπτώντας σύμφωνα με την κατανομή πιθανοτήτων στον Πίνακα Q: (μπλοκ κώδικα 13)

obs = env.reset()
done = False
while not done:
   s = discretize(obs)
   env.render()
   v = probs(np.array(qvalues(s)))
   a = random.choices(actions,weights=v)[0]
   obs,_,done,_ = env.step(a)
env.close()

Θα πρέπει να δείτε κάτι σαν αυτό:

ένα ισορροπημένο cartpole


🚀Πρόκληση

Εργασία 3: Εδώ χρησιμοποιούσαμε την τελική έκδοση του Πίνακα Q, η οποία ίσως να μην είναι η καλύτερη. Θυμηθείτε ότι έχουμε αποθηκεύσει τον Πίνακα Q με την καλύτερη απόδοση στη μεταβλητή Qbest! Δοκιμάστε το ίδιο παράδειγμα με τον καλύτερο Πίνακα Q αντιγράφοντας το Qbest στο Q και δείτε αν παρατηρείτε τη διαφορά.

Εργασία 4: Εδώ δεν επιλέγαμε πάντα την καλύτερη δράση σε κάθε βήμα, αλλά αντίθετα δειγματοληπτούσαμε με την αντίστοιχη κατανομή πιθανοτήτων. Θα ήταν πιο λογικό να επιλέγουμε πάντα την καλύτερη δράση, με την υψηλότερη τιμή στον Πίνακα Q; Αυτό μπορεί να γίνει χρησιμοποιώντας τη συνάρτηση np.argmax για να βρούμε τον αριθμό της δράσης που αντιστοιχεί στην υψηλότερη τιμή του Πίνακα Q. Υλοποιήστε αυτή τη στρατηγική και δείτε αν βελτιώνει την ισορροπία.

Μετά τη διάλεξη quiz

Ανάθεση

Εκπαιδεύστε ένα Mountain Car

Συμπέρασμα

Έχουμε πλέον μάθει πώς να εκπαιδεύουμε πράκτορες να επιτυγχάνουν καλά αποτελέσματα απλά παρέχοντάς τους μια συνάρτηση ανταμοιβής που ορίζει την επιθυμητή κατάσταση του παιχνιδιού, και δίνοντάς τους τη δυνατότητα να εξερευνήσουν έξυπνα τον χώρο αναζήτησης. Έχουμε εφαρμόσει με επιτυχία τον αλγόριθμο Q-Learning σε περιπτώσεις διακριτών και συνεχών περιβαλλόντων, αλλά με διακριτές δράσεις.

Είναι σημαντικό επίσης να μελετήσουμε καταστάσεις όπου η δράση είναι επίσης συνεχής, και όταν ο χώρος παρατήρησης είναι πολύ πιο περίπλοκος, όπως η εικόνα από την οθόνη του παιχνιδιού Atari. Σε αυτά τα προβλήματα συχνά χρειάζεται να χρησιμοποιήσουμε πιο ισχυρές τεχνικές μηχανικής μάθησης, όπως τα νευρωνικά δίκτυα, για να πετύχουμε καλά αποτελέσματα. Αυτά τα πιο προχωρημένα θέματα είναι το αντικείμενο του επερχόμενου πιο προχωρημένου μαθήματος AI μας.


Αποποίηση ευθυνών: Αυτό το έγγραφο έχει μεταφραστεί χρησιμοποιώντας την υπηρεσία μετάφρασης με τεχνητή νοημοσύνη Co-op Translator. Ενώ επιδιώκουμε την ακρίβεια, παρακαλούμε να έχετε υπόψη ότι οι αυτοματοποιημένες μεταφράσεις ενδέχεται να περιέχουν λάθη ή ανακρίβειες. Το πρωτότυπο έγγραφο στη μητρική του γλώσσα πρέπει να θεωρείται η αυθεντική πηγή. Για κρίσιμες πληροφορίες, συνιστάται επαγγελματική ανθρώπινη μετάφραση. Δεν φέρουμε ευθύνη για τυχόν παρεξηγήσεις ή λανθασμένες ερμηνείες που προκύπτουν από τη χρήση αυτής της μετάφρασης.