2

Я работаю над примером обучения с временным различием (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?

enter image description here

Grid

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}) 
+1

Покажите свой код, покажите нужный результат и покажите неверный вывод, который вы получаете. –

+0

@TomKarzes Спасибо, и я включил свой код и вывод! –

ответ

1

Значение Q представляет собой оценку того, сколько вознаграждения ожидается получить до конца эпизода. Итак, в терминальном состоянии maxQ = 0, потому что после этого вы не получите больше вознаграждений. Таким образом, значение Q в t будет 1, что является правильным для вашей недисконтированной проблемы. Но вы не можете игнорировать gamma в уравнении, добавьте его в формулу, чтобы сделать ее скидкой. Так, например, если gamma = 0.9, значение Q в t будет равно 0,9. При (2,1) и (1,2) это будет 0,81 и так далее.

+0

Спасибо, и я буду экспериментировать с гамма-значением! Спасибо за объяснение, и имеет смысл, что maxQ равно 0 в терминальном состоянии, как вы объяснили. –

Смежные вопросы