Reinforcement Learning学习笔记(2)

  最近在学习关于强化学习的相关知识,因此在此总结自己的心得体会。但由于小弟学识浅薄,内容难免存在错误,还望各路大神批评指正。

1、模型相关的强化学习

  模型相关的强化学习是强化学习的一个分支,它需要我们完全知道问题背后的马尔科夫决策过程。
  本节仍以机器人寻找三角形的例子进行相关概念的理解,如下图所示。
机器人寻找三角形
  在该问题中,图中的不同位置为不同的状态,因此状态集合为 S={1,2,...,8} ,机器人在每个状态可采取的动作是向东南西北四个方向走,因此动作集合 A={n,e,s,w} 。状态转移的规则为:机器人碰到墙壁会停在原来的位置;奖励的设置,由于找到三角形则奖励1,找到圆形则损失1,其他均不奖励不惩罚。因此有 R2,s=1 R3,s=1 R4,s=1 ,其余情况有 R,=0
  模型相关的强化学习的学习算法主要有:策略迭代(Policy Iteration)和价值迭代(Value Iteration),下面分别介绍这两个算法。

2、策略迭代

  策略迭代的思想如下:先随机初始化一个策略 π0 ,计算这个策略下每个状态的价值 v0 ;根据这些状态价值得到新的策略 π1 ,然后计算在新策略下每个状态的价值 v1 ,…,如下迭代直至状态价值收敛;其中在特定策略下计算每个状态的价值称为策略评估(Policy Evaluation);根据状态价值得到新的策略称为策略改进 (Policy Improvement)

2.1、策略评估
  策略评估主要是基于贝尔曼等式,如下式所示:
  

v(s)=aAπ(s,a)Rs,a+γsSTss,av(s)

可以发现,状态的价值 v(s) 与其后续状态 s 的状态价值 v(s) 有关,而由于状态 s 与状态s 可以作为相互的后续状态,因此该过程应该是不断迭代而计算得到的。

2.2、策略改进
  根据状态价值得到新策略,被称为策略改进。对于一个状态 s ,让策略选择一个动作a,使得当前状态的价值 Rs,a+γsSTss,av(s) 最大,即有:

πt+1(s,a)=1,a=argmaxaRs,a+γsSTss,av(s)0,aargmaxaRs,a+γsSTss,av(s)

由于在前面有定理已经证明是存在最优策略的,而该策略改进方法又可以保证 svπt+1(s)vπt(s) ,因此策略改进可以获得最优策略。

2.3、策略迭代代码

# -*- coding:utf-8 -*-

from Mdp import Mdp

class Policy_Iteration:

    # 初始化
    def __init__(self, mdp):
        # 保存状态价值
        self.v = [0.0 for state in xrange(len(mdp.state)+1)]
        # 策略保存
        self.pi = dict()
        for state in mdp.state:
            if state in mdp.terminalstate:
                continue
            self.pi[state] = mdp.action[0] # 随机初始化策略

    def __policy_evaluate(self, mdp):
        max_iteration_num = 1000
        for i in xrange(max_iteration_num):
            delta = 0.0

            for state in mdp.state:
                if state in mdp.terminalstate:
                    continue
                action = self.pi[state]
                is_terminal, next_state, reward = mdp.transform(state, action)
                value = reward + mdp.gamma * self.v[next_state]
                delta += abs(value - self.v[state])
                self.v[state] = value

            if delta < 1e-6:
                break


    def __policy_imporve(self, mdp):
        for state in mdp.state:
            if state in mdp.terminalstate:
                continue

            a = mdp.action[0]
            is_terminal, next_state, reward = mdp.transform(state, a)
            value = reward + mdp.gamma * self.v[next_state]
            for action in mdp.action:
                is_terminal, next_state, reward = mdp.transform(state, action)
                if value < reward + mdp.gamma * self.v[next_state]:
                    value = reward + mdp.gamma * self.v[next_state]
                    a = action

            self.pi[state] = a


    # 策略迭代方法
    def policy_iteration(self, mdp):
        max_iteration_num = 100
        for i in xrange(max_iteration_num):
            self.__policy_evaluate(mdp)
            self.__policy_imporve(mdp)

if "__main__" == __name__:
    mdp = Mdp()
    policy_value = Policy_Iteration(mdp)
    policy_value.policy_iteration(mdp)
    print "value:"
    for state in xrange(1, 6):
        print "state:%d value:%f"%(state, policy_value.v[state])

    print "policy:"
    for state in xrange(1, 6):
        print "state:%d policy:%s"%(state, policy_value.pi[state])

策略迭代交替执行策略评估和策略改进直到收敛,从而得到最优策略了。下图是策略迭代在机器人找三角形问题中找到的最优解。
最优策略下状态价值
最优策略可视化

3、价值迭代

  策略迭代需要反复执行策略评估和策略改进,其中策略改进部分其实就是根据贪婪原则选择最优的动作,问题主要在于策略评估需要反复迭代直至状态价值收敛。价值迭代则将策略评估和策略改进结合在同一个函数下,同时进行策略评估和策略改进。

3.1、价值迭代代码

# -*- coding:utf-8 -*-

from Mdp import Mdp

class Value_Iteration:

    def __init__(self, mdp):
        # 保存状态价值
        self.v = [0.0 for state in xrange(len(mdp.state) + 1)]
        # 保存策略
        self.pi = dict()
        for state in mdp.state:
            if state in mdp.terminalstate:
                continue
            self.pi[state] = mdp.action[0]  # 策略初始化

    def value_iteration(self, mdp):
        max_iteration_num = 1000
        for i in xrange(max_iteration_num):
            delta = 0.0

            for state in mdp.state:
                if state in mdp.terminalstate:
                    continue

                a = mdp.action[0]
                is_terminal, next_state, reward = mdp.transform(state, a)
                value = reward + mdp.gamma * self.v[next_state]
                for action in mdp.action:
                    is_terminal, next_state, reward = mdp.transform(state, action)
                    if value < reward + mdp.gamma * self.v[next_state]:
                        value = reward + mdp.gamma * self.v[next_state]
                        a = action

                delta += abs(value - self.v[state])
                self.v[state] = value
                self.pi[state] = a

            if delta < 1e-6:
                break

if "__main__" == __name__:
    mdp = Mdp()
    policy_value = Value_Iteration(mdp)
    policy_value.value_iteration(mdp)
    print "value:"
    for state in xrange(1, 6):
        print "state:%d value:%f" % (state, policy_value.v[state])

    print "policy:"
    for state in xrange(1, 6):
        print "state:%d policy:%s" % (state, policy_value.pi[state])

在机器人寻找三角形的例子中的价值迭代代码执行结果如下图所示,证明价值迭代的结果与策略迭代的结果一致。
最优策略下状态价值
最优策略可视化

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值