Я работаю над примером обучения с временным различием (https://www.youtube.com/watch?v=XrxgdpduWOU), и у меня возникают некоторые проблемы со следующим уравнением в моей реализации python, поскольку я, кажется, получаю двойное вознаграждение и Q.Двойной подсчет во временном разностном обучении
Если я закодировал сетку ниже как 2d-массив, мое текущее местоположение (2, 2), а цель (2, 3), если максимальная награда равна 1. Пусть Q (t) - среднее значение моего текущего , то r (t + 1) равно 1, и я предполагаю, что max Q (t + 1) также равно 1, что приводит к тому, что мой Q (t) становится близким к 2 (предполагая гамма 1). Правильно ли это, или я должен предположить, что Q (n), где n - конечная точка, равна 0?
Edited включить код - я изменил функцию get_max_q возвращает 0, если она является конечной точкой и значения теперь все ниже 1 (который я предполагаю, что более правильно, так как награда всего лишь 1), но не уверен, что это правильный подход (ранее я установил его, чтобы вернуть 1, когда это была конечная точка).
#not sure if this is correct
def get_max_q(q, pos):
#end point
#not sure if I should set this to 0 or 1
if pos == (MAX_ROWS - 1, MAX_COLS - 1):
return 0
return max([q[pos, am] for am in available_moves(pos)])
def learn(q, old_pos, action, reward):
new_pos = get_new_pos(old_pos, action)
max_q_next_move = get_max_q(q, new_pos)
q[(old_pos, action)] = q[old_pos, action] + alpha * (reward + max_q_next_move - q[old_pos, action]) -0.04
def move(q, curr_pos):
moves = available_moves(curr_pos)
if random.random() < epsilon:
action = random.choice(moves)
else:
index = np.argmax([q[m] for m in moves])
action = moves[index]
new_pos = get_new_pos(curr_pos, action)
#end point
if new_pos == (MAX_ROWS - 1, MAX_COLS - 1):
reward = 1
else:
reward = 0
learn(q, curr_pos, action, reward)
return get_new_pos(curr_pos, action)
=======================
OUTPUT
Average value (after I set Q(end point) to 0)
defaultdict(float,
{((0, 0), 'DOWN'): 0.5999999999999996,
((0, 0), 'RIGHT'): 0.5999999999999996,
...
((2, 2), 'UP'): 0.7599999999999998})
Average value (after I set Q(end point) to 1)
defaultdict(float,
{((0, 0), 'DOWN'): 1.5999999999999996,
((0, 0), 'RIGHT'): 1.5999999999999996,
....
((2, 2), 'LEFT'): 1.7599999999999998,
((2, 2), 'RIGHT'): 1.92,
((2, 2), 'UP'): 1.7599999999999998})
Покажите свой код, покажите нужный результат и покажите неверный вывод, который вы получаете. –
@TomKarzes Спасибо, и я включил свой код и вывод! –