强化学习(Dyna-Q,Dyna2)

基于模型的强化学习(Model Based RL)
Value Based --Policy Based --Model Based

Value Based学习价值来指导策略,Policy Based直接学习策略以收获最大价值,还有将两者融合的AC。但是在学习价值或策略都十分困难的时候(如某千变万化的围棋),学习模型可能更好,即睁开眼睛看世界,尝试理解所处的环境,通过完成对环境的基本理解来指导强化学习。

什么是模型?
博主的个人理解,所谓模型就是能够对于当前给出环境状态的一种反馈,那么如果能够学习到模型在当前状态最有可能做出什么样的反应,那么任务就完成了。

怎么学习到模型?
同样是从经历中学习模型,即需学习对环境的描述与理解。而“经历”不正是所经历过的所有状态,以及采取的行动,那么还是要从状态s和动作a出发,通过先模拟与环境的交互,得到对环境的描述与理解,再在实际环境中进行监督学习,不断训练。

优点:使用类似监督学习的方法来获得模型。通过模型,个体不再局限与如何最大化奖励本身,而是能通过理解采取的动作为什么好或者不好,从而具有了一定的推理能力。
缺点:模型是模拟的结果,会有误差。
在这里插入图片描述
Dyna
由于不可能精确和完美的拟合真正环境,纯基于模型的强化学习效果往往很差。那有没有什么办法可以在一定程度上避免这一点呢?
那就把基于模型 + 不基于模型的强化学习结合起来吧!也就是Dyna算法框架了。

它既在模型中学习,也在交互中学习。即Dyna框架在每个迭代轮中,会先和环境交互,并更新价值函数、策略函数,接着进行n次模型的模拟预测,同样更新价值函数、策略函数。这样同时利用上了和环境交互的经历以及模型的预测。

根据描述,就需要有两个相互独立的模型,一个根据状态s和动作a得到下一个状态s’(策略函数),另一个根据当前状态s和动作a预测环境的奖励r(价值函数)。其中

  • 从 s,a 学习 r 的预测过程是一个回归问题(regression problem)。
  • 从 s,a 学习 s’ 的选择过程是一个密度估计问题(density estimation problem)。

Dyna-Q
先看Dyna算法步骤:
在这里插入图片描述

  • 先初始化状态s和其任意动作a所对应的状态价值Q(s,a)。
  • 初始化尝试要理解得到的模型Model(s,a)。
  • 对于每一轮迭代,先根据当前状态和Q(S,A)用 ϵ-贪婪的方式得到新状态S’和奖励R
  • 然后用Q-Learning更新价值函数Q(S,A)
  • 用R,S’更新模型Model(s,a)
    (与真实环境交互完毕后,进行n次模拟)
  • 每次模拟都随机选择一个之前出现过的状态S, 并在此基础上随机选择一个动作A
  • 基于模型Model(S,A)得到S′ 和R
  • 再使用Q-Learning更新价值函数: Q ( S , A ) = Q ( S , A ) + α [ R + γ m a x a Q ( S ′ , a ) − Q ( S , A ) ] Q(S,A)=Q(S,A)+α[R+γmaxaQ(S′,a)−Q(S,A)] Q(S,A)=Q(S,A)+α[R+γmaxaQ(S,a)Q(S,A)]

思路明确代码就都差不多…
莫大大的代码:

def update():
    for episode in range(40): #开始循环
        s = env.reset()  #得到当前的状态
        while True:
            env.render()
            a = RL.choose_action(str(s)) #根据状态选动作
            s_, r, done = env.step(a) #执行动作得到新状态s'和奖励r,是否为终点
            RL.learn(str(s), a, r, str(s_)) #开始学习

            env_model.store_transition(str(s), a, r, s_) #存入到表中
            for n in range(10):     #交互完开始与模拟模拟交互
                ms, ma = env_model.sample_s_a()  #采样出现过的s,a
                mr, ms_ = env_model.get_r_s_(ms, ma) #得到奖励r和新状态s'
                RL.learn(ms, ma, mr, str(ms_)) #继续学习

            s = s_
            if done:
                break

    # end of game
    print('game over')
    env.destroy()

def learn(self, s, a, r, s_): 
        self.check_state_exist(s_) #检查s‘是否存在,就和Q-Learning过程一样
        q_predict = self.q_table.ix[s, a] #查表得到Q
        if s_ != 'terminal':
            q_target = r + self.gamma * self.q_table.ix[s_, :].max()  #计算得到Q‘
        else:
            q_target = r 
        self.q_table.ix[s, a] += self.lr * (q_target - q_predict)  # 更新Q表

Dyna-2
Dyna-2是将环境交互的经历以及模型的预测进行了分离。即不是像Dyna一样交互完了就拿来模模拟,而是对于Q函数将被分为永久性记忆 Q ( S , A ) Q(S,A) Q(S,A)和瞬时记忆 Q ′ ( S , A ) Q'(S,A) Q(S,A)。其中永久性记忆利用与实际环境的交互经验来更新,瞬时记忆利用与模型的模拟交互来更新。然后两者结合起来共同 对作用起选择。
Q ‾ ( S , A ) = Q ( S , A ) + Q ′ ( S , A ) \overline{Q}(S,A) =Q(S,A) + Q'(S,A) Q(S,A)=Q(S,A)+Q(S,A)
算法流程如下:
在这里插入图片描述

  • 初始化运动模型和Reward函数
  • 清除永久性记忆 θ \theta θ(值函数所对应的参数)
  • 对于每一轮迭代,从s0开始一次探索,然后每个episode都需要清除一次瞬时记忆 θ ‾ \overline{\theta } θ(短期记忆),资格迹 z z z(eligibility trace)
  • 对于每个episode的初始状态,执行一次模拟(即用当前的模型执行模拟来更新值函数,和选择一个动作a)
  • 执行动作a后得到奖励和新状态s’,再利用新状态s’,动作a和r更新模型以完成对模型的拟合
  • 利用新模型再从s’状态开始进行模拟:更新值函数–>选择下一步a’–>计算永久记忆的值函数TD–>更新永久记忆值函数参数和资格迹
  • s=s‘,a=a’
  • 继续循环

即在选择实际的执行动作前,先进行与模拟环境的交互以评价当前动作的价值(将仿真完整的轨迹,这个轨迹是由想象得来的轨迹,用于加速这种free model的学习),然后根据完整的Q值(模拟值+经验值)共同进行选择。

  • Dyna:Sutton R S. Dyna, an integrated architecture for learning, planning, and reacting[J]. Acm Sigart Bulletin, 1991, 2(4):160-163.
  • Dyna-2:Silver D, Sutton R S, Müller M. Sample-based learning and search with permanent and transient memories[C]// International Conference on Machine Learning. ACM, 2008:968-975.

free空间中的迹优化仍然在继续…如轨迹优化去拟合局部的时变线性动态(同策略on和异策略off的iLQG),以引导agent进行高效地探索,当然这个属于引导策略搜索方法(GPS)了。

评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值