神经网络逼近器在强化学习中的应用



我正在尝试使用强化学习创建一个同时的多代理环境。jl
我已经成功地表示了该环境,它与每个代理的RandomPolicy一起工作。

但我的状态空间很大(实际上是一个14元组,每个值都在某个范围内(。所以我不能使用表格近似器来估计Q或V值。这就是为什么我决定使用神经网络近似器。但文献中对其讨论不多,也没有使用神经网络逼近器的例子。我很难弄清楚如何使用这样的近似器。如果有人能解释如何进行,或者参考任何例子,都会很有帮助。

此外,我从文档中发现,使用神经网络近似器需要我们使用CircularArray SARTT对象。但定义这条轨迹需要一个名为"能力"的关键词。我不知道它是什么意思,文档和GitHub中也没有讨论过它。

我试着写使用神经网络逼近器的代码,但我得到了错误。

# Create a flux based DNN for q - value estimation
STATE_SIZE = length(myenv.channels) # 14
ACTION_SIZE = length(values)        # 2
model = Chain(
Dense(STATE_SIZE, 24, tanh),
Dense(24, 48, tanh),
Dense(48, ACTION_SIZE)
) |> gpu
η = 1f-2 # Learning rate
η_decay = 1f-3
opt = Flux.Optimiser(ADAM(η), InvDecay(η_decay))
policies = MultiAgentManager(
(
Agent(
policy = NamedPolicy(
p => VBasedPolicy(;
learner = BasicDQNLearner(;
approximator = NeuralNetworkApproximator(;
model = model,
optimizer = opt
)
)
)
),
trajectory = CircularArraySARTTrajectory(;
capacity = 14,
state=Array{Float64, 1},
action=Int,
terminal = Bool
)
)
for p in players(myenv)
)...
)

错误/StackTrace

MethodError: no method matching iterate(::Type{Array{Float64,1}})
Closest candidates are:
iterate(::Plots.NaNSegmentsIterator) at 
C:Usersvchou.juliapackagesPlotslzHOtsrcutils.jl:124
iterate(::Plots.NaNSegmentsIterator, ::Int64) at 
C:Usersvchou.juliapackagesPlotslzHOtsrcutils.jl:124
iterate(::LibGit2.GitBranchIter) at 
C:buildbotworkerpackage_win64buildusrsharejuliastdlibv1.5LibGit2srcreference.jl:343
...
Stacktrace:
[1] first(::Type{T} where T) at .abstractarray.jl:341
[2] (::ReinforcementLearningCore.var"#53#54"{Int64})(::Type{T} where T) at C:Usersvchou.juliapackagesReinforcementLearningCoreNWrFYsrcpoliciesagentstrajectoriestrajectory.jl:46
[3] map(::ReinforcementLearningCore.var"#53#54"{Int64}, ::Tuple{DataType,DataType}) at .tuple.jl:158
[4] map(::Function, ::NamedTuple{(:state, :action),Tuple{DataType,DataType}}) at .namedtuple.jl:187
[5] CircularArrayTrajectory(; capacity::Int64, kwargs::Base.Iterators.Pairs{Symbol,DataType,Tuple{Symbol,Symbol},NamedTuple{(:state, :action),Tuple{DataType,DataType}}}) at C:Usersvchou.juliapackagesReinforcementLearningCoreNWrFYsrcpoliciesagentstrajectoriestrajectory.jl:45
[6] Trajectory{var"#s57"} where var"#s57"<:(NamedTuple{(:state, :action, :reward, :terminal),var"#s16"} where var"#s16"<:(Tuple{var"#s15",var"#s14",var"#s12",var"#s84"} where var"#s84"<:CircularArrayBuffers.CircularArrayBuffer where var"#s12" <:CircularArrayBuffers.CircularArrayBuffer where var"#s14"<:CircularArrayBuffers.CircularArrayBuffer where var"#s15"<:CircularArrayBuffers.CircularArrayBuffer))(; capacity::Int64, state::Type{T} where T, action::Type{T} where T, reward::Pair{DataType,Tuple{}}, terminal::Type{T} where T) at C:Usersvchou.juliapackagesReinforcementLearningCoreNWrFYsrcpoliciesagentstrajectoriestrajectory.jl:76
[7] (::var"#24#25")(::String) at .none:0
[8] iterate(::Base.Generator{Array{String,1},var"#24#25"}) at .generator.jl:47
[9] top-level scope at In[18]:15
[10] include_string(::Function, ::Module, ::String, ::String) at .loading.jl:1091

这里的capacity表示体验回放缓冲区的最大长度。在应用DQN相关算法时,我们通常使用循环缓冲区来存储每一步的转换。

您在上面发布的错误意味着您在定义CircularArraySARTTrajectory时忘记了定义状态的大小。

-              state=Array{Float64, 1},
+              state=Array{Float64, 1} => (STATE_SIZE,),

你可以在这里找到一些用法示例。我建议您在该包中创建一个问题,因为CircularArraySARTTrajectory的文档字符串肯定应该包含在文档中。

最新更新