A2C CONTINUA PER PENDULUM-V0 Implementazione di lavoro, negazione per perdita e calcolo dell'entropia
-
02-11-2019 - |
Domanda
Ottima implementazione di A2C Continuous per Pendulum-V0
Il codice ha un snippet per interrompere l'esecuzione quando la media degli ultimi 10 o 20 è superiore a -20 ma i risultati sembrano:
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]
Anche con il reward/10
Linea, ancora abbastanza bene. Tuttavia, non capisco queste linee per quanto riguarda la negazione della perdita e perché l'equazione entropica sembra diversa da quella che ho visto in Packt che pubblicava il rinforzo profondo apprendimento pratico per foto sotto:
Il codice:
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
Ancora una volta, l'equazione entropica codificata era questa: entropy = K.sum(0.5 * (K.log(2. * np.pi * sigma_sq) + 1.))
che sembra diverso da quello che viene fornito nella foto del libro di testo sopra.
Inoltre, perché la perdita è una negazione? actor_loss = -exp_v
?
È negato perché è una salita a gradiente piuttosto che una discesa gradiente della funzione obiettiva per un gradiente di politica?
Nessuna soluzione corretta