Здравствуйте!
Пытаюсь реализовать торгового бота, используя алгоритм Rainforce. Агент может вернуть отрицательную награду за действие (торговля в убыток). Как модифицировать алгоритм Rainforce, чтобы он это учитывал?
Я пробовал добавлять к награде (r) фиксированное положительное число, но даже в этом случае агент не обучается.
def _calculateDiscountedReturns(self, rewards):
print("Min",min([r for r in rewards if r < 0]))
# получаем сумму наград
discountedReturns = []
for t in range(len(rewards)):
G = 0.0
for k, r in enumerate(rewards[t:]):
G += (self.gamma ** k) * (r+100)
discountedReturns.append(G)
return discountedReturns
def train(self, states, actions, rewards):
# print(states, actions, rewards)
discountedReturns = self._calculateDiscountedReturns(rewards)
# обучаем нейронную сеть
for state, action, G in zip(states, actions, discountedReturns):
# вероятности
probs = self.PN(state)
# категориальное распределение
dist = torch.distributions.Categorical(probs=probs)
# возвращает логарифм от вероятности переданного действия
log_prob = dist.log_prob(action)
# # функция потерь
loss = - log_prob * G
# обновляем веса модели
self.optimizer.zero_grad()
loss.backward()
self.optimizer.step()