@ Edit:
Я пытаюсь создать агента для игры в тетрис, используя сверточный nnet, который принимает состояние доски + текущую фигуру в качестве входных данных.Из того, что я прочитал, глубокое обучение Q не очень хорошо в этом, что я только что подтвердил.
@ end Edit
Предположим, что агент изучает политику, чтобы играть в игругде каждый шаг игры может быть представлен как
s, a, r, s ', выполнено
, представляющее
состояние, действие, награда, следующее состояние, игра окончена
В алгоритме Deep Q-learning агент находится в состоянии s и предпринимает некоторые действия a (следуя политике epsilon-greedy ), наблюдает за вознаграждением r и переходит в следующее состояние s '.
Агент действует следующим образом:
# returns an action index
get_action(state, epsilon)
if random() < epsilon
return random_action_index
else
return argmax(nnet.predict(state))
Параметры обновляются путем жадного наблюдения максимального значения Q в состоянии s' ,таким образом, у нас есть
# action taken was 'a' in state 's' leading to 's_'
prediction = nnet.predict(s)
if done
target = reward
else
target = reward + gamma * max(nnet.predict(s_))
prediction[a] = target
[предсказание, цель] является подачей в некоторый nnet для обновления веса.Таким образом, этот nnet получает состояние s в качестве входных данных и выводит вектор значений q с размерностью n_actions .Это все для меня ясно.
Теперь предположим, что мои действия на уровне состояния настолько шумны, что этот подход просто не будет работать.Таким образом, вместо вывода вектора измерения n_actions мой вывод nnet представляет собой одно значение, представляющее «качество состояния» (насколько желательно это состояние).
Теперь мой агент действуетвот так:
# returns an action based on how good the next state is
get_action(state, epsilon):
actions = []
for each action possible in state:
game.deepcopy().apply(action)
val = nnet.predict(game.get_state())
action.value = val
actions.append(action)
if random() < epsilon
return randomChoice(actions)
else
return action with_max_value from actions
И мой [прогноз, цель] таков:
# action taken was 'a' in state 's' leading to 's_'
prediction = nnet.predict(s)
if done
target = reward
else
target = reward + gamma * nnet.predict(s_)
У меня есть несколько вопросов относительно этого второго алгоритма:
а) Имеет ли смысл иногда действовать не жадно?
Интуитивно нет, потому что если я приземлился в плохом состоянии, это, вероятно, было из-за плохого случайного действия, а не потому, что предыдущее состояние было 'плохой'.Обновление Q-Learning исправит плохое действие, но этот второй алгоритм неверно отрегулирует предыдущее состояние.
b) Что это за алгоритм?Где оно подходит для обучения в области подкрепления?
в) В случае тетриса состояние почти никогда не повторяется, так что я могу сделать в этом случае?Не в этом ли причина глубокого q-обучения?
Это может показаться странным, но алгоритм действительно работает.Я могу предоставить дополнительные детали, если это необходимо, спасибо!