首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >体验重放记忆

体验重放记忆
EN

Code Review用户
提问于 2018-11-21 21:03:23
回答 1查看 84关注 0票数 1

我才刚开始学习朱莉娅。这里是一个在强化学习算法中使用的经验回放记忆的实现。它非常简单,本质上是一个具有以下要求的环形缓冲区:

  • 用于存储一维数字数组,通常为Float32或Float64。所有存储的数组大小相同。
  • 具有最大容量,之后新条目覆盖旧条目。
  • 具有用于检索给定数目的条目的示例函数。
代码语言:javascript
复制
import Base.length

struct Memory{T <: Real}
   max_size::UInt32
   experiences::Vector{Vector{T}}
end

Memory{T}(max_size) where {T <: Real} = Memory{T}(max_size, Vector{Vector{T}}())

length(memory::Memory) = length(memory.experiences)

function remember!(memory::Memory, experience)
   size = length(memory)
   if size == memory.max_size
      memory.experiences[1 + size % memory.max_size] = experience
   else
      push!(memory.experiences, experience)
   end
end

function sample(memory::Memory{T}, count::Integer) where {T <: Real}
   size = length(memory)
   @assert count <= size
   return [memory.experiences[1 + rand(UInt32) % size] for i in 1:count]
end
EN

回答 1

Code Review用户

发布于 2018-12-09 15:39:29

  • CircularBuffer中有一个DataStructures类型,它所做的几乎是一样的。看看它的代码,找出一些灵感。或者重用它,如果它符合您的需要,并且您可以毫不犹豫地添加该依赖项。
  • 关于前面的问题,我特别建议实现公共接口,可能还包括iterateremember!在语义上是有意义的,但是push!是这个功能的标准名称。您可以根据remember!实现push!并同时导出两者,或者只需使用push!并在文档中提及。
  • 没有必要对类型这么具体。我只使用struct {T} max_size::UInt32体验::Vector{T} end --通过这种方式进行泛化不会丢失任何东西,因为您从不使用有关内容的信息。但是谁知道呢,也许你以后会想换到不同的类型去体验,比如。StaticVectors。
  • 我怀疑使用UInt32是否比使用它更容易节省。Int几乎是所有这类东西的标准:长度、索引、偏移等等。
  • 根据用例的大小,最好将experiences预先分配为Vector{T}(undef, max_size),只使用索引(并跟踪实际长度),而不是在DataStructures实现之前使用push!。如果不是,调用sizehint!(experiences, max_size)可能是好的,如果您期望总是耗尽全部容量。
  • 我建议不提供sample,而是推荐钩入rand,从而免费获得更多的方法。在最简单的情况下,这只是定义Random.rand(rng::Random.AbstractRNG,s::Random.SamplerTrivial{Memory {T} }),其中{T}= rand( RNG,s[].experiences),它提供了所有的变体:rand(m)rand(m, N) (对应于您的sample)、rand(rng, m)等等。如果您想要编写可重复的实验,特别是提供RNG的表单是相关的。默认情况下,rand!方法似乎不起作用,但如果需要,可以轻松地添加它们。(如果切换到预分配+索引解决方案,则需要确保只从@view experiences[1:length]中取样。)请注意,您可以使用a直接从数组rand(a)中取样。
票数 1
EN
页面原文内容由Code Review提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://codereview.stackexchange.com/questions/208190

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档