A2C continu pour la mise en œuvre de travail pendule-V0, la négation pour la perte et le calcul de l'entropie
-
02-11-2019 - |
Question
très bonne mise en œuvre de l'A2C continu pour pendule-v0
Le code a un extrait pour arrêter l'exécution lorsque la moyenne des 10 ou 20 derniers est supérieure à -20, mais les résultats ressemblent:
episode: 706 score: [-13.13392661]
episode: 707 score: [-12.91221984]
episode: 708 score: [-50.38036647]
episode: 709 score: [-74.58410041]
episode: 710 score: [-138.1596521]
episode: 711 score: [-87.3867222]
episode: 712 score: [-63.28444052]
episode: 713 score: [-0.37368592]
episode: 714 score: [-13.28473712]
episode: 715 score: [-117.78089523]
episode: 716 score: [-25.65207563]
episode: 717 score: [-0.36829411]
episode: 718 score: [-50.81750735]
episode: 719 score: [-0.33565775]
episode: 720 score: [-0.47168285]
episode: 721 score: [-0.35240929]
episode: 722 score: [-0.40577252]
episode: 723 score: [-0.37114168]
episode: 724 score: [-25.73963544]
episode: 725 score: [-37.70957794]
Même avec le reward/10
Ligne, toujours assez bonne. Cependant, je ne comprends pas ces lignes concernant la négation de la perte et pourquoi l'équation de l'entropie semble différente de ce que j'ai vu dans Packt Publishing Deep Renforcement Learning ON PREST PREST PREST ONIA CI-DESSUS:
Le code:
def actor_optimizer(self):
#placeholders for actions and advantages parameters coming in
action = K.placeholder(shape=(None, 1))
advantages = K.placeholder(shape=(None, 1))
# mu = K.placeholder(shape=(None, self.action_size))
# sigma_sq = K.placeholder(shape=(None, self.action_size))
mu, sigma_sq = self.actor.output
#defined a custom loss using PDF formula, K.exp is element-wise exponential
pdf = 1. / K.sqrt(2. * np.pi * sigma_sq) * K.exp(-K.square(action - mu) / (2. * sigma_sq))
#log pdf why?
log_pdf = K.log(pdf + K.epsilon())
#entropy looks different from log(sqrt(2 * pi * e * sigma_sq))
#Sum of the values in a tensor, alongside the specified axis.
entropy = K.sum(0.5 * (K.log(2. * np.pi * sigma_sq) + 1.))
exp_v = log_pdf * advantages
#entropy is made small before added to exp_v
exp_v = K.sum(exp_v + 0.01 * entropy)
#loss is a negation
actor_loss = -exp_v
#use custom loss to perform updates with Adam, ie. get gradients
optimizer = Adam(lr=self.actor_lr)
updates = optimizer.get_updates(self.actor.trainable_weights, [], actor_loss)
#adjust params with custom train function
train = K.function([self.actor.input, action, advantages], [], updates=updates)
#return custom train function
return train
Encore une fois, l'équation d'entropie codée était la suivante: entropy = K.sum(0.5 * (K.log(2. * np.pi * sigma_sq) + 1.))
Ce qui semble différent de ce qui est donné sur la photo du manuel ci-dessus.
Aussi, pourquoi la perte est-elle une négation? actor_loss = -exp_v
?
Est-il annulé parce qu'il est une ascension de gradient plutôt que la descente de gradient de la fonction objectif pour un gradient de politique?
Pas de solution correcte