Как использовать DeepQLearning в Julia для очень больших состояний? - PullRequest
1 голос
/ 28 мая 2020

Я хотел бы использовать пакет DeepQLearning.jl из https://github.com/JuliaPOMDP/DeepQLearning.jl. Для этого мы должны сделать что-то похожее на

using DeepQLearning
using POMDPs
using Flux
using POMDPModels
using POMDPSimulators
using POMDPPolicies

# load MDP model from POMDPModels or define your own!
mdp = SimpleGridWorld();

# Define the Q network (see Flux.jl documentation)
# the gridworld state is represented by a 2 dimensional vector.
model = Chain(Dense(2, 32), Dense(32, length(actions(mdp))))

exploration = EpsGreedyPolicy(mdp, LinearDecaySchedule(start=1.0, stop=0.01, steps=10000/2))

solver = DeepQLearningSolver(qnetwork = model, max_steps=10000, 
                             exploration_policy = exploration,
                             learning_rate=0.005,log_freq=500,
                             recurrence=false,double_q=true, dueling=true, prioritized_replay=true)
policy = solve(solver, mdp)

sim = RolloutSimulator(max_steps=30)
r_tot = simulate(sim, mdp, policy)
println("Total discounted reward for 1 simulation: $r_tot")

В строке mdp = SimpleGridWorld() мы создаем MDP. Когда я пытался создать MDP, у меня была проблема с очень большим пространством состояний. Состояние в моем MDP - это вектор в {1,2,...,m}^n для некоторых m и n. Итак, при определении функции POMDPs.states(mdp::myMDP) я понял, что должен перебрать все состояния, которые очень большие, то есть m^n.

Я неправильно использую пакет? Или мы должны перебирать состояния, даже если их экспоненциально много? Если второе, то в чем смысл использования Deep Q Learning? Я подумал, что Deep Q Learning может помочь, когда пространство действий и состояний очень велико.

1 Ответ

1 голос
/ 28 мая 2020

DeepQLearning не требует перечисления пространства состояний и может обрабатывать проблемы с непрерывным пространством. DeepQLearning.jl использует только порождающий интерфейс POMDPs.jl . Таким образом, вам не нужно реализовывать функцию states, а только gen и initialstate (см. Ссылку о том, как реализовать генеративный интерфейс).

Однако из-за характера дискретного действия из DQN вам также понадобится POMDPs.actions(mdp::YourMDP), который должен возвращать итератор по пространству действий.

Внеся эти изменения в вашу реализацию, вы сможете использовать решатель.

Нейронная сеть в DQN принимает в качестве входных данных векторное представление состояния. Если ваше состояние - это размерный вектор m, вход нейронной сети будет иметь размер m. Выходной размер сети будет равен количеству действий в вашей модели.

В случае примера мира сетки входной размер модели Flux равен 2 (позиции x, y), а размер вывода length(actions(mdp))=4.

...