贝尔曼公式

强化学习的直觉

强化学习的思想借鉴了心理学、神经科学领域,即希望智能体(agent)像人一样,通过不断与外界进行交互,作用于环境,并得到环境的反馈,根据奖励和惩罚来调整自己的策略,不断修炼,希望最终学到的策略得到的奖励能够最大化。

一般来说,一个科研思路都是从直觉开始的,但是怎么把直觉抽象出来,进行精确的数学表达,从而可以量化自己的直觉是很重要的。

经过之前科学家们的不断探索,总结出了一条适用于实现强化学习这个想法的数学框架,即马尔科夫决策过程(MDP)

马尔科夫决策过程(MDP)形式化强化学习的直觉

如何形式化强化学习这种思路的直觉呢?强化学习的目的是让智能体不断与环境进行交互,根据环境的反馈来调整自己的策略,马尔科夫决策过程是这样形式化上面这个过程的:

  • 状态 S S S, 定义智能体当前所处的环境的状态
  • 动作 A A A,定义智能体可能作用于环境的动作
  • 奖励 R R R,定义智能体从环境中得到的反馈,如果是惩罚,奖励可以设置为负数
  • 环境模型:状态转移概率 p ( s ′ ∣ s , a ) p(s'|s,a) p(ss,a),智能体在状态 s s s下对环境执行动作 a a a,环境模型接收到动作 a a a后变为状态 s ′ s' s的概率。奖励概率 p ( r ∣ s , a ) p(r|s,a) p(rs,a),智能体在状态 s s s下对环境执行动作 a a a,环境模型接收到动作 a a a后返回奖励为 r r r的概率。
  • 马尔科夫性:智能体做出的决策只与当前状态有关,而与历史状态无关。 p ( s t + 1 ∣ a t + 1 , s t , . . . , a 0 ) = p ( s t + 1 ∣ a t + 1 , s t ) p(s_{t+1}|a_{t+1},s_t,...,a_0) = p(s_{t+1}|a_{t+1},s_t) p(st+1at+1,st,...,a0)=p(st+1at+1,st),马尔科夫性质可以加大简化问题求解的复杂度,极大地提高了学习的效率和效果。

贝尔曼公式可以衡量策略的好坏(策略评估)

强化学习的目的是求解最优策略,那么衡量最优策略的指标是什么呢?
就是奖励。智能体想要学习到最优的策略以得到最大的奖励。
假设现在智能体已经有了一个策略,从状态 s 1 s_1 s1出发,一直经过状态 s 2 s_2 s2, s 3 s_3 s3, . . . ... ..., s n s_n sn,每次到达一个状态会获得一个奖励,即获得 r 1 r_1 r1, r 2 r_2 r2, . . . ... ..., r n r_n rn,我们想要最大化奖励,即 r 1 + r 2 + . . . + r n r_1+r_2+...+r_n r1+r2+...+rn要最大,一般我们会引入一个折扣因子 γ \gamma γ(0-1之间),最大化奖励的公式变成: r 1 + γ r 2 + γ 2 r 3 . . . + γ n − 1 r n r_1+\gamma r_2+\gamma^2 r_3...+\gamma^{n-1} r_n r1+γr2+γ2r3...+γn1rn,引入 γ \gamma γ有两个好处,第一个是这个级数会变得收敛,第二个是它可以平衡即时奖励和未来奖励的比重。
那给定一个策略,从任意状态出发一直执行策略到结束,都会得到这样一个求和的奖励链,那么这个奖励链的值越大,就说明当前状态越有价值,这样一个奖励链叫做return(回报),状态价值的定义就是从该状态出发一直到结束的回报的期望。
定义一个状态的回报为 G t G_t Gt,则在这里插入图片描述
定义状态价值 v π ( s ) v_\pi(s) vπ(s)在这里插入图片描述
在这里插入图片描述
写成矩阵-向量的形式:
在这里插入图片描述
通过迭代求解即可求得所有的 v π v_\pi vπ

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
好的,下面是一个简单的贝尔曼公式值迭代算法的 Python 实现,供您参考: ```python import numpy as np # 定义状态空间大小和动作空间大小 STATE_SPACE_SIZE = 10 ACTION_SPACE_SIZE = 2 # 定义奖励函数和状态转移函数 def reward_func(state, action): if state == STATE_SPACE_SIZE - 1 and action == 1: return 1 else: return 0 def transition_func(state, action): if action == 0: return max(0, state - 1) else: return min(STATE_SPACE_SIZE - 1, state + 1) # 定义贝尔曼公式值迭代函数 def value_iteration(theta=0.0001, discount_factor=0.9): # 初始化值函数 V = np.zeros(STATE_SPACE_SIZE) # 迭代直到收敛 while True: delta = 0 # 对于每个状态,计算其最优动作的值函数 for s in range(STATE_SPACE_SIZE): v = V[s] max_v = -float('inf') # 对于每个动作,计算其价值 for a in range(ACTION_SPACE_SIZE): # 计算动作后的新状态和奖励 next_s = transition_func(s, a) r = reward_func(s, a) # 使用贝尔曼公式更新价值 max_v = max(max_v, r + discount_factor * V[next_s]) # 更新当前状态的价值 V[s] = max_v delta = max(delta, abs(v - V[s])) # 如果值函数的变化小于阈值,认为已经收敛,退出迭代 if delta < theta: break return V # 测试 if __name__ == '__main__': V = value_iteration() print("最优状态价值:", V) ``` 这个例子中,我们定义了一个简单的状态空间和动作空间,以及一个简单的奖励函数和状态转移函数。然后,我们使用贝尔曼公式值迭代算法来计算每个状态的最优价值函数。最后,我们输出最优状态价值。你可以根据自己的具体需求进行修改和扩展。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Colin_Jing

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值