Политика сети для игры 2048 - PullRequest
0 голосов
/ 04 мая 2018

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

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

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

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

1 Ответ

0 голосов
/ 24 мая 2018

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

loss = -(log(action_probability) * reward)

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

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

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

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

...