J'aimerais écrire un article pour digérer l'apprentissage automatique à ma manière. Nous prévoyons de faire une série, en partant des bases, et en faisant progressivement face à l'évolution du contenu. La théorie derrière cela ⇨ Code. Les questions sont les bienvenues.
Contrairement à ce que l'on appelle l'apprentissage supervisé, l'apprentissage intensif est une méthode d'approche dans laquelle une «réponse» n'est pas donnée à un ensemble de données prédéfini et la solution optimale est recherchée. Par exemple, supposons qu'il y ait deux stands de blackjack devant vous (ici, le taux de gain changera en fonction du croupier). Bien sûr, si vous continuez à jouer avec le taux de gain le plus élevé, vous pouvez maximiser vos profits. Cependant, au début, on ne sait pas combien d'argent chaque plateforme va rapporter, on va donc "apprendre" ce qui est mieux en répétant le nombre de fois. C'est l'idée de base d'un apprentissage amélioré.
Ici, deux facteurs «antagonisants» importants, appelés dillemme Explore-Exploit, sont
Exploit (~Greedy) Le pouvoir de maximiser les profits Explore (~Epsilon) La capacité de «rechercher» des profits plus importants au détriment de la maximisation des profits (les plus récents)
Est. Ensuite, jetons un œil à l'un des modèles concrets, l'algorithme Epsilon-Greedy.
Epsilon-Greedy Algorithm Pour le dire simplement, c'est une tactique qui dit: "Fondamentalement, celui avec le rendement le plus élevé est choisi (Gourmand), mais parfois (avec une probabilité aussi petite qu'Epsilon) l'ambiance est changée et le choix est aléatoire." Dans le cas du blackjack ci-dessus, supposons que vous jouiez au blackjack un total de N fois et que vous gagniez d'abord le croupier masculin (M). Ensuite, le retour, c'est-à-dire le taux de victoire (MW) contre M est de 1, tandis que le taux de victoire (WW) contre la croupière (W) est inconnu, donc si le taux de victoire (WW) est de 0, la prochaine table à jouer sera à nouveau M. À propos, dans ce deuxième jeu, le taux de gain est MW> WW, que vous gagniez ou perdiez. De cette façon, si vous jouez simplement avec celui avec le taux de gain le plus élevé à ce moment-là, c'est-à-dire avec M (Complete Greedy), vous ne jouerez qu'avec un croupier, et vous continuerez à jouer pour toujours sans connaître le taux de gain contre W. Par conséquent, ce qui a été mis en évidence était le lieu où la probabilité d'Epsilon dans la seconde moitié (généralement 5 à 10%) a été choisie au hasard parmi toutes les options. En faisant cela, si vous obtenez un N suffisamment grand, il n'y aura pas de revendeurs dont le taux de gain ne sera pas mis à jour, et vous pourrez estimer tous les taux de gain.
Maintenant, ce qui est important ici, c'est Epsilon, la "probabilité de jouer au hasard". Si c'est une valeur élevée, 50%, cela signifie que vous jouerez correctement avec la moitié de la probabilité, vous jouerez donc à peu près le même nombre que deux croupiers, et vous connaîtrez le taux de victoire contre deux personnes à un stade précoce. Dans le même temps, la stratégie de Greedy est relativement affaiblie, ce qui se traduit par un rendement total moindre. Et si je prends l'Epsilon trop petit cette fois? La réponse est, au contraire, que vous choisissez un croupier avec un taux de gain élevé dès le début (pas toujours un match), et vous ne jouez qu'avec ce croupier. En d'autres termes, l'équilibre est important (tout comme la vie). Au fait, ma vie est petite Epsilon (à part).
Implémentons ces choses ensuite.
Écrit en python3.x. Tout d'abord, remplacez l'argument à utiliser après la bibliothèque.
Bandit_Epsilon_simulation.py
import numpy as np
import matplotlib.pyplot as plt
Num_try = 1000
Eps =0.05
Bandit_prob = [0.1,0.45,0.75]
Ici, le nombre contenu dans Bandit_prob est le "taux de gain réel" pour chaque croupier, mais le but de cet algorithme est de l'obtenir en apprenant (d'où les informations que le joueur ne connaît pas à l'origine). Remarque).
Ensuite, implémentez l'algorithme de base.
Bandit_Epsilon_simulation.py
class Bandit():
def __init__(self,p): # p:winning rate- pretend not to know what these are
self.p = p
self.p_estimate = 0
self.N = 0
def pull(self): # return a 1 with p
return np.random.random() < self.p # random takes [0,1] randomly
def update(self, x):
self.N +=1
self.p_estimate = (1/self.N)*(x + self.p_estimate*(self.N-1))
# Using the formula below
# <p>_n*N = p_n(=x) + <p>_(n-1)*(N-1)
def experiment():
bandits = [Bandit(p) for p in Bandit_prob] # we don't know what are in Bandit_prob
rewards = np.zeros(Num_try)
num_explored = 0
num_exploited = 0
num_opt = 0
opt_j = np.argmax([b.p for b in bandits]) # # in bandit_prob
for i in range(Num_try):
# follow epsilon-greedy algorythm
if np.random.random() < Eps:# explore
num_explored += 1
# j is index
j = np.random.choice(list(range(len(bandits))))
else: # greed
num_exploited += 1
j = np.argmax([k.p_estimate for k in bandits])
if j == opt_j:
num_opt += 1
x = bandits[j].pull() #the chosen one can get reward or not?
rewards[i] = x
bandits[j].update(x)
return bandits, rewards, num_explored, num_exploited, opt_j
Le résultat du match (win: 1, Lose: 0) est renvoyé par la méthode pull du premier Bandit. Selon le résultat, le taux de gain contre chaque croupier est mis à jour en se mettant à jour à chaque fois. Il convient de noter que le taux de gain ici est calculé et obtenu en jouant contre le joueur, et est différent de ce que le croupier a à l'origine (apprendre à s'en rapprocher).
Maintenant, traçons cela sous plusieurs Epsilon. L'axe horizontal est le nombre de parties, l'axe vertical est le taux de gain et la ligne horizontale noire est le taux de gain maximum de 75%.
Cette intrigue regorge de nombreuses informations. La vitesse au plateau, sa hauteur, pourquoi il n'atteint pas 75%, la prochaine fois, procédons en regardant autour de nous.
―― L'apprentissage intensifié est un modèle qui corrige la distribution de probabilité des choix basés sur des rendements moyens (récompenses) sans réponse.
References Udemy - Intelligence artificielle: apprentissage par renforcement en Python
Recommended Posts