• [PyTorch][chapter 62][强化学习-基本概念]


    前言:

       目录: 

    1.    强化学习概念
    2.    马尔科夫决策
    3.    Bellman 方程
    4.     格子世界例子


    一 强化学习

           强化学习 必须在尝试之后,才能发现哪些行为会导致奖励的最大化。
    当前的行为可能不仅仅会影响即时奖赏,还有影响下一步奖赏和所有奖赏

    强化学习五要素如下:

     1.2 强化学习流程

          

             1: 产生轨迹(trajectory)

             2: 策略评估(policy-evaluate)

             3: 策略提升(policy-improve)

         这里重点讲一下 产生轨迹:

          当前处于某个state 下面,

          按照策略选择 action =A_t= \pi(s_t)

         根据新的state 给出 reward:R_{t+1}=f(s_{t+1})

      最后产生了轨迹链


    二 马尔科夫决策

      2.1 马尔科夫决策要求:

        1: 能够检测到理想的状态
        2: 可以多次尝试
        3: 系统的下个状态只与当前信息有关,与更早的状态无关。
    决策过程中还可和当前采取的动作有关.

     

    2.2  马尔科夫决策五要素

         S:  状态集合 states
         A:  动作集合 actions
         P: 状态转移概率 P_{S_t \to s_{t+1}}^a
         R: 奖励函数(reward function) ,agent 采取某个动作后的及时奖励
         r:  折扣系数意味当下的reward 比未来反馈更重要

              \sum_{t=0}^{\infty }r^t R(s_t)

             r \in (0,1]

    2.3   主要流程

           1: Agent 处于状态s_0

           2: 按照策略 选择动作 a_0

           3:执行该动作后,有一定的概率转移到新的状态 p_{s_0\rightarrow s_1}^a

    2.4  价值函数

           V(s)=E_{\pi}(\sum_{t=1}^{T} r_t|S_0=s)

           当前时刻处于状态s,未来获得期望的累积奖赏

            分为两种: state 价值函数  state-action 价值函数

            最优价值函数:

                       不同策略下, 累积奖赏最大的  v_{*}=max_{\pi}v_{\pi}(x)

      2.5 策略 policy

           当前状态s 下,按照策略,要采用的动作

            action=\pi(s)


    三  Bellman 方程

      

       4.1  状态值函数为:

               V_{T}^{\pi}(x)=E_{\pi}[\frac{1}{T}\sum_{t=1}^Tr_t|x_0=x]: T 步累积奖赏

               V_{\gamma}^{T}(x)=E_{\pi}[\frac{1}{T}\sum_{t=0}^T \gamma^tr_{t+1}|x_0=x] :\gamma 折扣累积奖赏,\gamma \in (0,1]

       4.2 Bellman 方程

             V_{T}^{\pi}(x)==\sum_{a \in A}\pi (x,a) \sum_{x^{'} \in X} P_{x\rightarrow x^{'}}^a(\frac{1}{T} R_{x \rightarrow x^{'}}^a+\frac{T-1}{T}V_{T-1}^{\pi}(x^{'}))

             证明:

                    V_{T}^{\pi}(x)=E_{\pi}[\frac{1}{T}\sum_{t=1}^T r_t|x_0=x]   

                                =E_{\pi}[\frac{1}{T}r_1+\frac{T-1}{T}\frac{1}{T-1}\sum_{t=2}^T r_t|x_0=x]

                               =\sum_{a \in A} \pi(x,a) \sum _{x^{'} \in X}P_{x\rightarrow x^{'}}^a (\frac{1}{T}R_{x\rightarrow x^{'}}^{a}+\frac{T-1}{T}E_{\pi}[\frac{1}{T-1}\sum_{t=1}^{T-1}r_t|x_0=x^{'}])

                              =\sum_{a \in A}\pi (x,a) \sum_{x^{'} \in X} P_{x\rightarrow x^{'}}^a(\frac{1}{T} R_{x \rightarrow x^{'}}^a+\frac{T-1}{T}V_{T-1}^{\pi}(x^{'}))     

             r折扣奖赏bellman 方程

                   V_{\gamma}^{\pi}(x)=\sum_{a \in A}\sum_{x^{'} \in X} P_{x\rightarrow x^{'}}^a(R_{x\rightarrow x^{'}}^a+\gamma V_{r}^{\pi}(x'))


    四  格子世界例子

         在某个格子,执行上下左右步骤,其中步骤最短的

    为最优路径

    5.1:gridword.py

       

    1. import numpy as np
    2. #手动输入格子的大小
    3. WORLD_SIZE = 4
    4. START_POS = [0,0]
    5. END_POS = [WORLD_SIZE-1, WORLD_SIZE-1]
    6. prob = 1.0
    7. #折扣因子
    8. DISCOUNT = 0.9
    9. # 动作集={上,下,左,右}
    10. ACTIONS = [np.array([0, -1]), #left
    11. np.array([-1, 0]), # up
    12. np.array([0, 1]), # right
    13. np.array([1, 0])] # down
    14. class GridwordEnv():
    15. def action_name(self, action):
    16. if action ==0:
    17. name = "左"
    18. elif action ==1:
    19. name = "上"
    20. elif action ==2:
    21. name = "右"
    22. else:
    23. name = "上"
    24. return name
    25. def __init__(self):
    26. self.nA = 4 #action:上下左右
    27. self.nS = 16 #state: 16个状态
    28. self.S = []
    29. for i in range(WORLD_SIZE):
    30. for j in range(WORLD_SIZE):
    31. state =[i,j]
    32. self.S.append(state)
    33. def step(self, s, a):
    34. action = ACTIONS[a]
    35. state = self.S[s]
    36. done = False
    37. reward = 0.0
    38. next_state = (np.array(state) + action).tolist()
    39. if (next_state == START_POS) or (state == START_POS):
    40. next_state = START_POS
    41. done = True
    42. elif (next_state == END_POS) or (state == START_POS):
    43. next_state = END_POS
    44. done = True
    45. else:
    46. x, y = next_state
    47. # 判断是否出界
    48. if x < 0 or x >= WORLD_SIZE or y < 0 or y >= WORLD_SIZE:
    49. reward = -1.0
    50. next_state = state
    51. else:
    52. reward = -1.0
    53. return prob, next_state, reward,done

    5.2 main.py 

    1. # -*- coding: utf-8 -*-
    2. """
    3. Created on Mon Nov 13 09:39:37 2023
    4. @author: chengxf2
    5. """
    6. import numpy as np
    7. def init_state(WORLD_SIZE):
    8. S =[]
    9. for i in range(WORLD_SIZE):
    10. for j in range(WORLD_SIZE):
    11. state =[i,j]
    12. S.append(state)
    13. print(S)
    14. # -*- coding: utf-8 -*-
    15. """
    16. Created on Fri Nov 10 16:48:16 2023
    17. @author: chengxf2
    18. """
    19. import numpy as np
    20. import sys
    21. from gym.envs.toy_text import discrete #环境
    22. from enum import Enum
    23. from gridworld import GridwordEnv
    24. class Agent():
    25. def __init__(self,env):
    26. self.discount_factor = 1.0 #折扣率
    27. self.theta = 1e-3 #最大偏差
    28. self.S = []
    29. self.env = env
    30. #当前处于的位置,V 累积奖赏
    31. def one_step_lookahead(self,s, v):
    32. R = np.zeros((env.nA)) #不同action的累积奖赏
    33. for action in range(env.nA):
    34. prob, next_state,reward, done = env.step(s, action) #只有一个
    35. next_state_index = self.env.S.index(next_state)
    36. #print("\n state",s ,"\t action ",action, "\t new_state ", next_state,"\t next_state_index ", next_state_index,"\t r: ",reward)
    37. r= prob*(reward + self.discount_factor*v[next_state_index])
    38. R[action] +=r
    39. #print("\n state ",s, "\t",R)
    40. return R
    41. def value_iteration(self, env, theta= 1e-3, discount_factor =1.0):
    42. v = np.zeros((env.nS)) #不同状态下面的累积奖赏,16个状态
    43. iterNum = 0
    44. while True:
    45. delta = 0.0
    46. for s in range(env.nS):
    47. R = self.one_step_lookahead(s,v)#在4个方向上面得到的累积奖赏
    48. best_action_value = np.max(R)
    49. #print("\n state ",s, "\t R ",R, "\t best_action_value ",best_action_value)
    50. bias = max(delta, np.abs(best_action_value-v[s]))
    51. v[s] =best_action_value
    52. #if (s+1)%4 == 0:
    53. #print("\n -----s ------------",s)
    54. iterNum +=1
    55. if bias<theta:
    56. break
    57. print("\n 迭代次数 ",iterNum)
    58. return v
    59. def learn(self):
    60. policy = np.zeros((env.nS,env.nA))
    61. v = self.value_iteration(self.env, self.theta, self.discount_factor)
    62. for s in range(env.nS):
    63. R = self.one_step_lookahead(s,v)
    64. best_action= np.argmax(R)
    65. #print(s,best_action_value )
    66. policy[s,best_action] = 1.0
    67. return policy,v
    68. if __name__ == "__main__":
    69. env = GridwordEnv()
    70. agent =Agent(env)
    71. policy ,v = agent.learn()
    72. for s in range(env.nS):
    73. action = np.argmax(policy[s])
    74. act_name = env.action_name(action)
    75. print("\n state ",s, "\t action ",act_name, "\t 累积奖赏 ",v[s])

    参考:

    【强化学习玩游戏】1小时竟然就学会了强化学习dqn算法原理及实战(人工智能自动驾驶/深度强化学习/强化学习算法/强化学习入门/多智能体强化学习)_哔哩哔哩_bilibili

    2-强化学习基本概念_哔哩哔哩_bilibili

    3-马尔科夫决策过程_哔哩哔哩_bilibili

    4-Bellman方程_哔哩哔哩_bilibili

    5-值迭代求解_哔哩哔哩_bilibili

  • 相关阅读:
    Docker实战之Redis主从集群搭建实战
    如何将原生微信小程序页面改成原生VUE框架的H5页面
    一款IM即时通讯聊天系统源码,包含app和后台源码
    设置Oracle环境变量
    SpringBoot 框架 2022-8-1
    窗口函数OVER(PARTITION BY)详细用法——语法+函数+开窗范围ROWS和RANGE
    android 后台运行service实现和后台的持续交互
    卡数据兼容性要求-consumer设备架构
    tensorflow中的slim函数集合
    礼物道具投票系统源码 可以无限多开 吸粉神器 附带完整的搭建教程
  • 原文地址:https://blog.csdn.net/chengxf2/article/details/134332675