(一)强化学习基本概念及工具包

(1)通过对强化学习数学原理的学习我们大致了解了强化学习五大元素:agent,state ,action,env,reward,以及一些基本概念(trajectory,state value,action value...)。本篇文章主要记录了强化学习算法在代码实现层面的学习经历。(使用gym包进行模拟游戏环境)

gym包含三个类,但我们只会用到env类来模拟环境,agent类:单智能体,algorithm:算法:

来一个例子吧,step会返回四个值info我们一般是不用的,done表示游戏是否结束:

import gymnasium as gym
env = gym.make('Cliffe-v0')#网格世界
env.action_space= list(range(4))#定义动作空间
env.reset()
new_state,reward,done,info=env.step(env.action_space.sample())#随机执行一个动作
env.render()#把这一帧游戏画面展示

再来简单看一下一个完整的代码,目前仅作了解:

import numpy as np
import gym
import random
def main():
    env = gym.make('Taxi-v3')
    state_size = env.observation_space.n
    action_size = env.action_space.n
    qtable = np.zeros((state_size, action_size))#创建一个q表
    #一些超参数的定义
    learning_rate = 0.9
    discount_rate = 0.8#gamma
    epsilon = 1.0
    decay_rate = 0.005
    num_episodes = 1000#这一千条轨迹用来生成数据
    max_steps = 100
    #开始玩游戏,train一下
    for episode in range(num_episodes):
        state = env.reset()
        done = False
        #每一局游戏最大只能玩一百步
        for s in range(max_steps):
            if random.uniform(0,1)<epsilon:
                action = env.action_space.sample()#增加随机性,有可能会随机选择一个action
            else:
                action = np.argmax(qtable[state,:])#不随机的情况下直接拿对应状态中reward最大的一个action

            #每一步都可以得到新的一些参数:
            new_state, reward, done, _ = env.step(action)#这里不关心info因为不会用
            #qlearning
            qtable[state,action] = qtable[state,action]+learning_rate*(reward + discount_rate * np.max(qtable[new_state,:]))
            state = new_state
            if done==True:
                break
        epsilon = np.exp(-decay_rate*episode)
    #游戏玩完了 ,但前面只是在训练数据,下面我们来测试一下
    state = env.reset()
    rewards = 0
    done = False
    #test一下
    for s in range(max_steps):
        action = np.argmax(qtable[state,:])#策略已经有了,直接选q值最大的action
        new_state, reward, done, _ = env.step(action)
        env.render()
        rewards += reward
        state = new_state
        if done:
            break

    env.close()#全部结束
if __name__ == '__main__':
    main()

(2)直观上来讲强化学习的过程是这样的:智能体(下文统称 agent)初始处于环境(env)的某一特定状态(state),而环境中存在多个可切换的状态选项。agent 通过执行特定动作(action)与环境交互,进而触发状态转移 —— 即从当前状态切换至另一状态。每次状态转移都会伴随即时奖励(reward),该奖励用于直接评判动作的优劣;实际场景中,我们通常以即时奖励(reward)或累积回报(return,某一交互轨迹上所有奖励的总和)为核心依据,制定并优化 agent 的行为策略。

(二)强化学习基本算法:一堆数学公式的轰炸

1.马尔可夫决策过程(所有强化学习算法的基础)

数学模型:

即一个状态会执行一个动作,这个动作会触发状态变化;在新状态下,又会执行新的动作并转换为下一个状态,这一过程持续循环,直到状态St达到目标状态(target state)。

我们需要知道一些东西:在这个循环链中,存在两类核心转换

  1. 策略转换:聚焦 “状态到动作” 的映射(S→A),策略相对更具确定性;

  2. 环境的状态转换:聚焦 “状态 + 动作到新状态” 的映射(S,A→S'),本质是环境的随机响应,随机性更强。

其中,策略(本质是条件概率相关的映射规则)分为两种:

  1. 概率型策略 Π(a|s):给定状态s时,选择动作a的概率分布,是S×A的映射关系 —— 每个动作都有对应的发生概率,并非唯一确定。

  2. 确定性策略 Π(s)=a:给定状态s时,直接输出唯一对应的动作a,是S→A的确定映射 —— 无需概率分配,动作由状态直接决定。

而环境对 “状态s+ 动作a” 的响应,就是状态转换,其数学表达为 P(s'|s,a):在当前状态s和执行动作a均确定的前提下,转移到新状态s'的概率。

这里需遵循马尔可夫性:下一时刻的状态转换仅与当前时刻的状态s相关,与当前时刻之前的历史状态无关。后续的所有求解都会以这样一种性质来简化考虑。

那么知道了上面这些东西有什么用呢,我们来看一下:在强化学习中,奖励(reward)是核心元素之一,整个学习过程的目标是最大化累积奖励。若直接以各时刻奖励的总和表示累积奖励,即:∑t=0∞r**t则该式可能因状态循环导致奖励无限累积,从而不具备可计算性(无法收敛)。结合前文的核心概念,可通过两点改进解决这一问题:

  1. 引入折扣系数解决收敛问题在每时刻的奖励 r**t 前乘以折扣系数 γ**t(其中 γ∈[0,1) ),将累积奖励修正为:∑t=0∞γtr**t随着时间步 t 增大,γ**t 逐渐趋近于 0,后期奖励的权重被不断削弱,确保累积奖励能够收敛。

  2. 利用马尔可夫性简化计算由于未来状态仅依赖当前状态(马尔可夫性),无需从初始时刻开始计算累积奖励,只需关注 “从当前时刻状态 s**t 出发的未来累积奖励”,即:∑k=0∞γkr**t+k这一简化大幅降低了计算复杂度,且完全符合状态转换的特性。

这样的改进既保证了累积奖励的可计算性,又充分利用了马尔可夫决策过程的结构特性。

2.策略迭代

但这样修正后的累积奖励,仍存在一个关键问题:实际场景中,我们无法预知未来每一步的状态转换与奖励(状态转换由环境概率P(s'|s,a)决定,动作选择由策略Π(a|s)决定,均存在不确定性)。

因此,最合理的方式是引入期望(用概率加权平均),通过期望估计 “当前状态 / 状态 - 动作对” 对应的长期累积奖励 —— 这种基于期望的累积奖励,就是值函数**(Value Function)。

值函数主要分为两类,它们都是最初版本的改进,都是对回报的估计,我们希望越大越好:

1. 状态价值函数 (V^Π(s))
  • 定义:在当前状态 s 下,遵循策略 (Π) 所能获得的期望累积奖励

  • 数学表达:

  • 解释:在当前state下策略Π下会有概率产生多种action,而每一个action我们都可以求得

    当前及后续的累积回报,再将每一个action得到的回报加权平均,就是当前s下遵循Π策略得到的期望累积奖励

2. 动作价值函数 (q^Π(s,a))
  • 定义:在当前状态 s 下,执行动作 a 后再遵循策略 (Π),所能获得的期望累积奖励

  • 数学表达:我们同样把qΠ(S)写成贝尔曼公式的形式

  • 解释:我们看到这个式子,它好像与VΠ(S)产生了某种联系,我们会先得到V再求出q。

    这个函数是对s^进行了加权平均,意思是在当前s下采取了a动作会得到一个到达s^的概率,

    用v(s^)得到的是下一个状态的价值,再加上当前状态的immediate reward就可以求到当前状态下做这个动作的价值,在qΠ(s,a)里面将v(s^)作为了计算后续回报的一种手段。

    这两类值函数并不需要我们推导,我们只需要理解公式在干什么就好

而这样一个模型就是策略迭代。

3.价值迭代

先让V(s)迭代到最优,不要让三个一起来迭代浪费时间和资源。因为前面我们铺垫了这么多,所有这里理解起来十分简单。

4.泛化迭代 = 价值迭代+策略迭代,先让值函数接近最优,再用值函数进行策略改进

其实三种迭代方法本质目标完全一致 都是通过持续迭代,找到每个状态(或状态 - 动作对)下 “能带来最大动作价值” 的最优动作,最终让整个轨迹的累积回报(期望)达到最大。

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐