DQN не учится ничему – Обучение с подкреплением

Вопрос или проблема

Я пытаюсь обучить DQN играть в игру 8puzzle.

Я реализовал пакетные игровые доски, поэтому не использую ReplayMemory.

Вот процесс обучения:

finished_counts = torch.tensor(0, device=device)
pbar = tqdm(range(int(1e4)))
for e in pbar:
    q_values = net(board) # board: Tensor с формой [10000, 3, 3]

    # выбираем действие случайно или по q_values
    if np.random.rand() < 0.5:
        actions = torch.randint(0, 4, (board.size(0),)).to(device)
    else:
        actions = torch.argmax(q_values, dim=1)

    # награда: -100 за столкновение с стеной, 10 за победу, 0 за иное
    reward, next_board = move(board, actions)

    next_q = net(next_board).detach()
    next_q[reward == 10] = 0 # игнорируем next_q, если уже выиграли

    desired_q = q_values.clone().detach()
    distance = manhattan(next_board)
    desired_q[:, actions] = (reward - distance) + next_q[:, actions] * q_decay # q_decay = 0.9

    # установка метрик
    pbar.set_postfix({
        'avg distance': f'{torch.mean(distance):.2f}',
        'finished': str(finished_counts.cpu().item()),
    })

    # вычисляем loss и обратное распространение
    # HuberLoss в качестве критерия
    optimizer.zero_grad()
    loss = criterion(q_values, desired_q)
    loss.backward()
    optimizer.step() # Adam(lr=1e-4)

    board = next_board

    finished = distance == 0
    board = board[~finished]
    finished_counts += finished.sum()

Что я наблюдал, так это то, что avg distance остается около 12.67, а finished_counts увеличивается линейно, что может быть связано со случайным действием.

Мой вопрос:

  1. Нормально ли не использовать ReplayMemory?
  2. Правильно ли я рассчитываю q_values и desired_q?
  3. Почему сеть ничего не изучает?

Я немного разобрался с помощью многочисленных экспериментов, вот некоторые ключевые правила, которые нужно соблюдать при построении модели и обучении:

  1. Держите положительные и отрицательные образцы в равновесии.
    Вы должны позволить Агенту выигрывать, тогда он сможет выучить путь к победе. Вы можете установить низкую сложность изначально или направить его (установив вехи в игре, и если он достигает цели, дайте ему большую награду). Иногда вам нужно уменьшить batch size, чтобы включить больше положительных образцов в пакет.
  2. Не используйте torch.log(MSE(y_hat, y)), не знаю почему.
  3. Ограничьте максимальное количество шагов Агенту, случайные действия будут мешать Агенту, повышая сложность игры, вы не хотите, чтобы он играл в игру с высокой сложностью изначально.
  4. Мой код неправильный:
    next_q = net(next_board).detach()
    next_q = next_q.max(1)[0] # примечание: используйте максимальное значение next_q
    next_q[reward == GAME_WIN_REWARD] = 0 # игнорируйте next_q, если уже выиграли
    
    q_values = q_values.gather(1, actions.unsqueeze(1)).squeeze(1)
    distance = manhattan(next_board)
    desired_q = (reward - distance ** 2) + next_q * q_decay # Я усиливаю влияние расстояния
    

Вот как я обучаю:
темп обучения: 0.00005 (постоянный)
MAX_STEP: 10 * DIFFICULTY
BATCH_SIZE = 100

DIFFICULTY EXPLORE RATE EPISODE заметка
5 0.8 2e4 сначала низкая сложность
5 0.7 1e4
5 0.6 1e4
5 0.5 1e4
5 0.4 1e4
5 0.2 1e4
5 0 1e4 усиление памяти
6 0.3 1e4
6 0.1 1e4
6 0 1e4 усиление памяти
6 0.1 4e4 Я заметил, что Агент показывает плохие результаты при сложности 6
6 0 1e4
7 0.3 1e4
7 0.1 1e4
7 0 1e4

Ответ или решение

DQN не обучается: решения и рекомендации

Ваша проблема с обучением DQN (Дипришн): низкая производительность и отсутствие эффекта от обучения — довольно распространенные сценарии в области обучения с подкреплением. Рассмотрим все упомянутые вами аспекты и ответим на ваши вопросы.

1. Использование ReplayMemory

ReplayMemory (память для повторного воспроизведения) является важным компонентом обучения в DQN, поскольку она позволяет использовать прошлые взаимодействия агента с окружающей средой, чтобы сгладить корреляцию между последовательными опытами. Таким образом, отсутствие ReplayMemory может привести к тому, что агент не будет получать сбалансированное обновление, в результате чего он может не развивать оптимальную стратегию.

Рекомендуется внедрить ReplayMemory, чтобы улучшить обучение агента. Это позволит ему извлекать данные из предыдущих опытов и снизить влияние несогласованных выборок.

2. Корректность расчета q_values и desired_q

На первый взгляд, ваш метод вычисления q_values и desired_q вызывает несколько вопросов:

  • Убедитесь, что вы используете максимальные q-значения для следующего состояния. Вам нужно выбрать next_q = next_q.max(1)[0], как вы заметили в своих экспериментах. Это важно для корректного обновления значений q, когда агент получает информацию о будущем состоянии.

  • Обратите внимание на то, как вы обновляете desired_q. Формула desired_q должна правильно отражать значение вознаграждения и будущих q-значений. В вашем случае:

    desired_q[:, actions] = (reward - distance) + next_q * q_decay

    Следует удалить отрицание расстояния, поскольку вы хотите поощрять агента за достижение цели, и используйте положительное значение расстояния или его квадрат, если это оправдано.

3. Почему сеть не обучается?

Причины отсутствия обучения могут быть многогранными. Вот некоторые из ключевых проблем:

  • Первоначальная сложность: Если сложности задач слишком высоки для агента на начальных этапах, агент рискует запутаться в трудных состояниях и не сможет эффективно обучаться. Начните с более легких уровней сложности и постепенно увеличивайте их.

  • Параметры исследования и обучение: Соотношение между исследованием (exploration) и освоением (exploitation) критически важно. В вашем случае сохранить более высокий уровень исследования в начале может помочь. Используйте методы, такие как ε-жадная стратегия, чтобы сохранять баланс между исследованием и использованием.

  • Сбалансированность данных: Убедитесь, что у вас есть количество положительных примеров для обучения. Ваши наблюдения показывают, что среднее расстояние не уменьшается, что говорит о недостатке успешных взаимодействий. Настройка баланса в ваших выборках и использование более низкой сложности игры в начале могут оказать положительное влияние.

Рекомендации для успешного обучения

  1. Внедрить ReplayMemory: Это поможет разнообразить выборку, улучшить устойчивость обучения и снизить корреляцию между последовательными состояниями.

  2. Оптимизация q-значений: Использовать правильные формулы для передачи q-значений и обучения. Для next_q используйте max-значение, чтобы правильно учитывать будущие взаимодействия.

  3. Адаптация сложности задачи: Начните с легкой сложности и увеличивайте ее, по мере того как агент показы будет усовершенствоваться.

  4. Настройки обучения: Периодически пересматривайте настройки гиперпараметров, таких как скорость обучения и размер батча, в зависимости от динамики обучения.

  5. Интервал обучающих игр: Установите четкий лимит на количество шагов для каждой игры, чтобы предотвратить дезорганизацию агента.

Работа над этими аспектами поможет улучшить ваше обучение DQN и преодолеть текущие препятствия.

Оцените материал
Добавить комментарий

Капча загружается...