Вопрос или проблема
Я пытаюсь обучить 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
увеличивается линейно, что может быть связано со случайным действием.
Мой вопрос:
- Нормально ли не использовать ReplayMemory?
- Правильно ли я рассчитываю
q_values
иdesired_q
? - Почему сеть ничего не изучает?
Я немного разобрался с помощью многочисленных экспериментов, вот некоторые ключевые правила, которые нужно соблюдать при построении модели и обучении:
- Держите положительные и отрицательные образцы в равновесии.
Вы должны позволить Агенту выигрывать, тогда он сможет выучить путь к победе. Вы можете установить низкую сложность изначально или направить его (установив вехи в игре, и если он достигает цели, дайте ему большую награду). Иногда вам нужно уменьшитьbatch size
, чтобы включить больше положительных образцов в пакет. - Не используйте
torch.log(MSE(y_hat, y))
, не знаю почему. - Ограничьте максимальное количество шагов Агенту, случайные действия будут мешать Агенту, повышая сложность игры, вы не хотите, чтобы он играл в игру с высокой сложностью изначально.
- Мой код неправильный:
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) критически важно. В вашем случае сохранить более высокий уровень исследования в начале может помочь. Используйте методы, такие как ε-жадная стратегия, чтобы сохранять баланс между исследованием и использованием.
-
Сбалансированность данных: Убедитесь, что у вас есть количество положительных примеров для обучения. Ваши наблюдения показывают, что среднее расстояние не уменьшается, что говорит о недостатке успешных взаимодействий. Настройка баланса в ваших выборках и использование более низкой сложности игры в начале могут оказать положительное влияние.
Рекомендации для успешного обучения
-
Внедрить ReplayMemory: Это поможет разнообразить выборку, улучшить устойчивость обучения и снизить корреляцию между последовательными состояниями.
-
Оптимизация q-значений: Использовать правильные формулы для передачи q-значений и обучения. Для
next_q
используйте max-значение, чтобы правильно учитывать будущие взаимодействия. -
Адаптация сложности задачи: Начните с легкой сложности и увеличивайте ее, по мере того как агент показы будет усовершенствоваться.
-
Настройки обучения: Периодически пересматривайте настройки гиперпараметров, таких как скорость обучения и размер батча, в зависимости от динамики обучения.
-
Интервал обучающих игр: Установите четкий лимит на количество шагов для каждой игры, чтобы предотвратить дезорганизацию агента.
Работа над этими аспектами поможет улучшить ваше обучение DQN и преодолеть текущие препятствия.