Политика сети для игры 2048

Я пытаюсь реализовать сетевой агент политики для игры 2048 в соответствии с Учебное пособие по RL. Я знаю, что алгоритму нужно будет сыграть несколько партий, запомнить введенные данные и предпринятые действия, нормализовать и усреднить конечные результаты. Однако я застрял на конструкции функции потерь. Как правильно поощрять действия, которые приводят к лучшим итоговым баллам, и препятствовать действиям, которые приводят к худшим баллам?

При использовании softmax на выходном слое я придумал что-то вроде этого:

loss = sum((action - net_output) * reward)

где действие в одном горячем формате. Однако эта потеря, кажется, не имеет большого значения, сеть не учится. Мой полный код (без игровой среды) в PyTorch находится здесь.




Ответы (1)


Для сети политик в вашем коде, я думаю, вам нужно что-то вроде этого:

loss = -(log(action_probability) * reward)

Где action_probability - это выход вашей сети для действия, выполненного в этом временном шаге.

Например, если ваша сеть выдала 10% -ный шанс совершить это действие, но она предоставила награду 10, ваш убыток будет: -(log(0.1) * 10), что равно 10.

Но если ваша сеть уже сочла это хорошим ходом и выдала 90% -ную вероятность совершения этого действия, у вас будет -log(0.9) * 10), что примерно равно 0,45, что меньше повлияет на сеть.

Стоит отметить, что функция PyTorch log численно нестабильна, и вам может быть лучше использовать logsoftmax на последнем уровне вашей сети.

person Omegastick    schedule 24.05.2018