强化学习 学习记录(3)

Dynamic Programming

动态规划:指的是给MDP一个完美环境模型来获取最优策略的一系列算法,其实也就是上一章中提到的利用最优bellman方程来获取最优策略。
为了得到最优bellman方程,首先就得计算对于任意策略的state-value function。在动态规划中这种操作也被称为policy evaluation,利用bellman方程就能得到,也就是下式。
v π ( s ) = ∑ a π ( a ∣ s ) ∑ s ′ , r p ( s ′ , r ∣ s , a ) ( r + δ v π ( s ′ ) ) v_\pi(s)=\sum_a\pi(a|s)\sum_{s',r}p(s',r|s,a)(r+\delta v_\pi(s')) vπ(s)=aπ(as)s,rp(s,rs,a)(r+δvπ(s))
如果环境模型是完全已知的,那这个方程就变为一个可计算的线性方程,设置初始状态为任意值,进行迭代。
v k + 1 ( s ) = ∑ a π ( a ∣ s ) ∑ s ′ , r p ( s ′ , r ∣ s , a ) ( r + δ v k ( s ′ ) ) v_{k+1}(s)=\sum_a\pi(a|s)\sum_{s',r}p(s',r|s,a)(r+\delta v_k(s')) vk+1(s)=aπ(as)s,rp(s,rs,a)(r+δvk(s))
当k趋向于无穷时,式子收敛, v k = v π v_{k}=v_\pi vk=vπ,上面这个式子被称为 iterative policy evaluation。
注意状态的更新是发生在所有状态都被计算完一遍之后才发生。

单单这样讲挺难理解的,来看这个例子就懂了
在这里插入图片描述
这个表格中带有数字的是普通状态,灰色的是最终状态,普通状态可以执行的行动是任意方向移动(上下左右),当行动会移出表格时,行动变为呆在原地不动,任意方向的行动都是等概率的,且获得奖励都为-1。初始各状态都设置为0,最终状态保持不变始终为0,discount始终为1。那么利用上面的更新式就可以得到policy evaluation。
在这里插入图片描述

import numpy as np

class ITV():
    def __init__(self):
        self.grid = np.zeros([4,4])
        self.reward = -1
    def action(self,direction,grid_state):
        #### direction 0 up 1right 2 down 3 left 
        if direction == 0:
           if grid_state[0] > 0:
            grid_state[0] -= 1
        elif direction ==1 :
             if grid_state[1] <3:
                grid_state[1] += 1
        elif direction ==2 :
             if grid_state[0] <3:
                 grid_state[0] +=1
        elif direction ==3 :
            if grid_state[1] > 0:
                grid_state[1] -= 1

        return grid_state
    def policy(self,new_state,old_state):
        if abs(new_state[0]-old_state[0])+abs(new_state[1]-old_state[1]) <= 1:
            p = 0.25
        else:
            p = 0 
        return p
    def update(self):
        grid_old = self.grid.copy()
        for i in range(self.grid.shape[0]):
            for j in range(self.grid.shape[1]):
             #print(f"grid({i},{j})={self.grid[i][j]}")
                if [i,j] !=[0,0] and [i,j] != [3,3]:
                 value = 0
                 for k in range(4):
                    new_state = self.action(grid_state=[i,j],direction=k)
                    policy = self.policy(new_state,[i,j])
                    value +=  policy*(self.reward+grid_old[new_state[0]][new_state[1]])
                 self.grid[i][j] = value
        print(self.grid)
        


if __name__ =="__main__":
    a = ITV()
    for i in range(100):
     a.update()

配合代码就很好理解这个迭代过程了,我们也可以看到当policy evaluation确定下来后,贪婪行动策略也就被确定下来了,就是沿着state-value 最大的方向走。

Policy improvement

那么如何通过policy evaluation来找到更加好的policy?在某一state下可以选择与原策略不同的行动之后的action仍保持原来的policy,也就是说仅对于 π ′ ( s ) = a ≠ π ( s ) \pi'(s)=a \neq\pi(s) π(s)=a=π(s),对于除了s以外的状态式子两边等号成立。计算value并与原来的value比较。
q π ( s , π ′ ( s ) ) > = v π ( s ) q_\pi(s,{\pi'}(s))>=v_\pi(s) qπ(s,π(s))>=vπ(s)
如果式子成立则说明 π ′ \pi' π优于或相等于 π \pi π也就有
v π ′ ( s ) > = v π ( s ) v_{\pi'}(s)>=v_\pi(s) vπ(s)>=vπ(s)
这个理论被称为policy improvement theorem。

在原策略上对于value function进行greedy action的策略改善叫做policy improvement。

Policy iteration

原策略 π \pi π 在进行policy improvement后可得到 π ′ \pi' π ,在对 π ′ \pi' π 进行policy evaluation 得到 v π ′ ( s ) v_{\pi'}(s) vπ(s),在对其进行policy improvement 得到 π ′ ′ \pi'' π′′ ,由于有限MDP只有有限数量的确定策略所以通过有限次迭代 就能收敛到最优策略。这种迭代寻找最优策略的方法叫做policy iteration

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值