Skip to content

免模型预测和控制

📅 发表于 2025/08/28
🔄 更新于 2025/08/28
👁️ -- 次访问
📝 0 字
0 分钟
rl-theroy
#免模型
#免模型预测
#免模型控制
#蒙特卡洛
#时序差分
#λ-return算法
#狭义策略迭代
#广义策略迭代
#同策略
#异策略
#Sarsa
#Q学习
#经验平均回报
#增量均值
#蒙特卡洛误差
#动态规划
#自举
#采样
#强化
#单步时序差分
#n步时序差分,TD Error
#e贪心策略
#行为策略
#目标策略
#Q函数估计

免模型

免模型试错探索,环境信息未知,没有概率可言,熊何时出现做什么,一切都未知。

RL可以应用在完全未知随机的环境,像人类一样,通过尝试不同的路来学习,慢慢了解哪个状态动作会更好。

免模型预测

蒙特卡洛方法

思想

蒙特卡洛思想

思想

  • 给定策略π,从状态s开始,智能体和环境交互,采样多条轨迹,计算每条轨迹的真实回报Gt
  • 用轨迹平均回报来估计价值函数
Vπ(s)=Eτπ[rt+1+γrt+2+γ2rt+3+st=s]=Eτπ[Gtst=s]Qπ(s,a)Eτp(τ)[G(τ)τs0=s,τa0=a]1Ni=1NG(τi)

特点

  • 无需模型(状态转移/奖励函数),也无需动态规划那样的自举方法

缺点

  • 只能适用于有终止状态的马尔可夫决策过程

增量更新

主要步骤

经验均值

  • 在每个回合中,若在时间步t状态s被访问,则更新:
    • 状态s的总访问数增加N(s)=N(s)+1
    • 状态s的总回报增加S(s)=S(s)+Gt
  • 通过回报平均,来估计状态s的价值:V(s)=S(s)/N(s)
  • 缺点
    • 依赖每个轨迹的真实回报Gt
    • 需拿到所有的轨迹的回报后,才能求平均

增量均值

  • 做增量计算新估计值 = 旧估计值 +学习率 * (目标值 - 旧估计值)
Vnew(st)=Vold(st)+α(GtVold(st))
  • 蒙特卡洛误差轨迹真实回报 - 期望回报
δ=GtV(st)
  • 优点
    • 每采样一个新轨迹,就可以更新价值函数,做回合级更新
    • 只更新轨迹上的所有状态,和轨迹无关的不用更新
  • 对比,动态规划的自举更新,用上一时刻的V来更新当前时刻的V,贝尔曼期望备份
Vk+1(s)=aAπ(as)(R(s,a)+γsSp(ss,a)Vk(s))

优缺点对比

蒙特卡洛优缺点对比

蒙特卡洛方法

  • 优点
    • 适用于免模型情况,
    • 通过一个经验的回报,就能做更新,且只需更新该轨迹的状态
  • 缺点
    • 需一个回合完成后,才能更新

动态规划方法

  • 缺点
    • 需要更新所有状态,状态数量多时,非常慢

动态规划需更新所有状态来求期望:

蒙特卡洛只更新轨迹线上的状态:

时序差分方法

一步时序差分

时序差分方法

核心思想

  • 一种基于经验的动态规划算法,结合了蒙特卡洛(采样经验)动态规划(自举思想)
  • 给定策略π,可以一步一步在线算出它的价值函数Vπ,不等轨迹技术,就可以更新价值函数

一步时序差分TD(0)

  • 自举一步,用估计的回报,来更新上一时刻的V值
V(st)V(st)+α(rt+1+γV(st+1)V(st))
  • 类比增量式蒙特卡洛
V(st)V(st)+α(Gi,tV(st))

时序差分目标

  • 走某步后得到的实际奖励rt+1
  • 自举方法,用之前的估计来估计V(st+1)
  • 用当前估计的V,而不是Vπ
rt+1+γV(st+1)

时序差分误差TD error

  • V(st)逼近估计的时序差分目标/真实回报
δ=rt+1+γV(st+1)V(st)
  • 类比增量式蒙特卡洛误差
δ=GtV(st)

n步时序差分方法

n步时序差分

核心思想

  • 往前走n/λ步,再更新;比如往前走2步,得到2步的回报,再使用自举来更新价值。
  • 时序差分目标 Gtn
λ=1TD(0))Gt1=rt+1+γV(st+1)λ=2TD(1)Gt2=rt+1+γrt+2+γ2V(st+2)λ=nTD(n)Gtn=rt+1+γrt+2++γnV(st+n)λ=MCGt=rt+1+γrt+2+γ2rt+2+γTt1rT
  • 增量式学习更新
V(st)=V(st)+α(GtnV(st))=V(st)+α(rt+1+γrt+2++γnV(st+n)V(st))

λ-return算法/TD(λ)/Todo补充

指数移动加权平均

指数移动加权平均
  • vt:到第t天的平均值,θt:第t天的温度值,β=0.9衰减系数
vt=βvt1+(1β)θtv0=0v1=βv0+(1β)θ1v2=βv1+(1β)θ2=β(βv0+(1β)θ1)v1+(1β)θ2v3=βv2+(1β)θ3=β(β(βv0+(1β)θ1)+(1β)θ2)v2+(1β)θ3
  • 指数加权平均:作为原数据的估计值可以抚平短期波动,起到平滑作用
  • 离当前越近权值越大离当前越远权值越小指数递减),也有一定权值
v100=0.1(0.9)0θ100+0.1(0.9)1θ99+0.1(0.9)2θ98+0.1(0.9)3θ97+vk=i=1k(1β)βkiθi=(1β)i=1kβkiθi

红色的数据比蓝色的原数据更加平滑,少了很多噪音,并且刻画了原数据的趋势。

在梯度下降法中的应用

  • 纵轴方向,平均过程中正负摆动相互抵消,平均值接近于零,摆动变小,学习放慢。
  • 横轴方向,因为所有的微分都指向横轴方向,因此平均值仍然较大,向最小值运动更快了。
  • 在抵达最小值的路上减少了摆动,加快了训练速度。

λ-return算法

λ-return算法

问题背景

  • MC:低偏差、高方差;TD:高偏差、低方差。
  • 通过TD来优化,结合2者优点
    • 1步奖励降低方差
    • n步TDn越大,偏差越小

n步TD方法

  • 向前走n步
Gt:t+n=rt+1+γrt+2+γ2rt+3++γn1rt+n+γnV(st+n)

λ-return

  • 平均衰减n-step回报,共有n个估计量,步数从1到n
  • 平衡TD和MC方法平衡方差和偏差
Gtλ=(1λ)[λ0Gt:t+1+λ1Gt:t+2+λ2Gt:t+3+λ3Gt:t+2+]=(1λ)n=1λn1Gt:t+n(1λ)n=1Tt1λn1Gt:t+n+λTt1Gt
  • 分离终止项 λTt1Gt

    • Gt:补偿因时间截断而丢失的未来回报信息。
    • λTt1:保持权重分配的数学一致性,体现时间衰减效应。
  • n步截断 λ-return 公式

    • λ=1:不衰减,退化为MC回报
    • λ=0:完全衰减,退化为TD回报
Gt:Tλ=(1λ)n=1Tt1λn1Gt:t+n+λTt1GtGtλ=(1λ)n=1λn1Gt:t+n

预测方法对比(时序差分vs蒙特卡洛vs动态规划)

概念对比

时序差分 vs 蒙特卡洛 vs 动态规划

时序差分

  • 可以在线学习,每走一步就能更新;在知道结果之前就能学习,更快速灵活
  • 可以从不完整序列学习,可以在连续环境下进行学习
  • 利用了马尔科夫性质
  • 更新时使用了自举(更新时使用了估计),一部分采样,一部分自举。
    • 以采样方式得到不完整序列,估计某状态后可能的奖励,不断采样持续更新价值
  • TD方法在每个时刻都可以更新价值函数,是一种高偏差、低方差的方法

蒙特卡洛

  • 不能在线学习,必须游戏结束时才能更新
  • 只能从完整序列进行学习,只能在有终止的情况下进行学习
  • 没有假设环境具有马尔科夫性质
  • 没有使用自举
  • 高方差 (预测值的变化范围、离散程度)
  • MC方法需要用整个episode的经验去估计价值函数,是一种低偏差、高方差的方法。

动态规划

  • 有模型预测方法
  • 使用了自举

自举采样对比

时序差分对比蒙特卡罗

动态规划备份:直接计算期望

V(st)Eπ[rt+1+γV(st+1)]

蒙特卡洛备份:采样一条支路计算,更新这条路径上的所有状态

V(st)V(st)+α(Gi,tV(st))

时序差分备份:采样+自举,从当前状态开始走几步,关注局部步骤

时序差分:需要广度,就变成动态规划;需要深度,就变成蒙特卡洛。

偏差和方差

偏差

  • 预测值和真实值之间的差距

方差

  • 预测值的变化范围、离散程度

免模型控制

免模型控制是指不需要知道环境模型,进行寻找最优策略输出最有价值。Q学习和SARSA都是基于时序差分的算法。

广义策略迭代

狭义策略迭代

狭义策略迭代算法

定义

  • 有模型控制,通过策略评估策略改进,不断迭代直到值函数收敛。

  • 通过环境信息奖励函数状态转移概率),来计算价值函数

Vπk+1(s)=aAπ(as)(R(s,a)+γsSp(ss,a)Vπk(s))Qπk+1(s,a)=R(s,a)+γsSp(ss,a)Vπk(s)

缺点

  • 依赖奖励函数和状态转移概率,免模型时,无法估计

广义策略迭代

广义策略迭代算法

定义

  • 免模型控制,引入蒙特卡洛时序差分,进行策略迭代
  • 策略评估:用蒙特卡洛探索采样多个轨迹,平均轨迹价值,来估计Q函数
Qπ(s,a)Eτp(τ)[G(τ)τs0=s,τa0=a]1Ni=1NG(τi)
  • 策略改进:直接选择最大的Q函数
π(s)=argmaxaQ(s,a)

探索策略

探索的意义
  • 一直基于某种思路工作,可能会比较好,但也可能会走偏,换一种思路也许就会豁然开朗
  • 守旧不一定是坏事,不能过度好奇心
贪心策略

ϵ贪心策略

  • 为了保证足够的探索,ϵ概率随机选择一个动作
  • ϵ按时间步递减,如0.1 -> 0.01
    • 开始时不确定哪个动作较好,花较多时间进行探索
    • 后期逐渐稳定,减少探索,降低ϵ
πϵ(s)={π(s)=argmaxaQπ(s,a),依概率 1ϵ(利用, 守旧派)a,依概率 ϵ(探索, 好奇心)
玻尔兹曼探索策略

定义

  • Q(s,a)a 被选中的概率和eQ(s,a)/T有关
  • T为温度系数
    • T很大,等概率选择;T很小,Q值更大的动作容易选中;T趋于0,只选择最优动作。
π(as)=eQ(s,a)/TaAeQ(s,a)/T

同策略异策略

行为策略 vs 目标策略

目标策略和行为策略

行为/探索/采样策略

  • 探索环境的策略采集很多轨迹经验,给行为策略进行学习
  • 前线的战士
  • 如:策略评估,探索环境,采样估计Q函数

目标/学习/改进策略

  • 通过经验稿子进行学习的策略不用和环境进行交互
  • 后方的军师
  • 如:策略改进,更新策略

同策略 vs 异策略

同策略 vs 异策略

同策略/On-Policy

  • 定义
    • 行为/采样/探索策略学习/改进/目标策略 相同
    • 使用同一策略来搜集样本,通过样本学习并更新原策略
  • 优点
    • 稳定,可以保证学习到的策略收敛到最优策略
    • 较好解决连续动作空间问题
  • 缺点
    • 样本利用效率低仅能用来更新当前策略,不能更新其他策略

异策略/Off-Policy

  • 定义
    • 行为/采样/探索策略μ学习/改进/目标策略π 不同
    • 使用行为策略探索到的经验轨迹,来优化目标策略。如从经验回放历史数据学习
    • μ可是随机策略,但采取**ϵ贪心使其不至于完全随机**,是基于Q表格逐渐改进的。
  • 优点
    • 学习效率高:旧策略的采样经验可多次利用,节省资源
    • 利用通过行为策略探索来学到最佳策略
      • 行为策略可采用 ϵ贪心算法,更加大胆,有可能探索到最佳策略
      • 目标策略仍使用普通贪心算法,根据行为策略经验来采用最佳策略
    • 可以学习其他智能体的动作
  • 缺点
    • 需分布比较接近,避免偏差,避免训练不稳定

SARSA:同策略TD

Sarsa 核心思想

Sarsa 核心思想

核心思想

  • 时序差分方法估计Q函数,更新Q表格后就可更新策略
  • 下一步Q(st+1,at+1)值,来更新当前步Q(st,at)值,不断强化每一个Q值
Qπ(st,at)Qπ(st,at)+α(rt+1+γQπ(st+1,at+1)TDQπ(st,at))Q(s,a)Q(s,a)+α(r+γQ(s,a)Q(s,a))
Sarsa 算法流程

主要流程

  • 随机初始化π(s),不断迭代直到Q(s,a)收敛,进行以下迭代

  • 确定初始状态s依策略选择动作a=πϵ(s),重复以下流程,直到s为终止态

    • 环境交互采样 s,a,r,s,a

      • 执行动作a,得奖励r新状态s
      • 在新状态s依策略选择动作a=πϵ(s)
    • 策略评估 / Q函数估计

      • Q(s,a)=Q(s,a)+α(r+γQ(s,a)Q(s,a))
    • 策略改进 / 更新策略 π

      • π(s)=argmaxaQ(s,a)
    • 状态动作前进ss,aa

n步Sarsa

n步时序差分

单步时序差分

  • 自举1步,用下一步Q(st+1,at+1)值,来更新当前步Q(st,at)Q(st,at)Q(st,at)+α(rt+1+γQ(st+1,at+1)TDQ(st,at))

n步时序差分

  • 自举n步一次性考虑n步回报
λ=1SarsaQt1=rt+1+γQ(st+1,at+1)λ=2Sarsa(1)Qt2=rt+1+γrt+2+γ2Q(st+2,at+2)λ=nSarsa(n)Qtn=rt+1+γrt+2++γnQ(st+n,at+n)λ=MCQt=rt+1+γrt+2+γ2rt+2+γTt1rT
  • n步回报Qtn
Qtn=rt+1+γrt+2++γnQ(st+n,at+n)
  • 为n步回报Qtn增加资格衰减参数λ
Qtλ=(1λ)n=1λn1Qtn
  • n步Sarsa(λ)的更新策略
Q(s,a)Q(st,at)+α(QtλQ(s,a))

Q学习:异策略TD

核心思想

Q学习 核心思想

核心思想

  • 同Sarsa一样,利用TD方法来估计Q函数,更新Q表格后可更新策略。

  • 学习策略行为策略不一样,是一种异策略算法

  • 学习策略

    • 估计Q函数时,采取下一时刻Q值最大的动作 a=maxaQ(st+1,a)
    • aat+1a 不来自行为策略并非下一步真正执行的动作at+1
  • TD目标值rt+1+γmaxaQ(st+1,a), 自举1步,更新Q函数

Q(st,at)=Q(st,at)+α(rt+1+γmaxaQ(st+1,a)TDQ(st,at))

算法流程

Q学习 算法流程
  • 初始化策略π,执行以下迭代,直到所有Q(s,a)收敛

  • 初始化s,执行以下迭代,直到s为终止态

    • 环境交互采样/探索策略

      • 依策略选择动作 a=πϵ(s)
      • 执行动作a,得即时奖励r新状态s
    • Q函数估计/学习策略

      • 与sarsa不同,不使用探索策略采样的下一步真正执行的 动作at+1

      • 而是直接选择 最大Q值对应的动作 a=maxaQ(s,a) 用来估计Q。

        • aat+1a 不来自探索策略并非下一步真正执行的动作
        Q(s,a)=Q(s,a)+α(r+γmaxaQ(s,a)Q(s,a))
    • 仅状态前进 ss

  • 策略更新,输出策略π

π(s)=argmaxaAQ(s,a)

伪代码

训练流程代码:多个回合

  • agent采样动作agent.sample_action(state)
  • 环境交互env.step(action)
  • 样本放入经验池agent.meomory.push(xxx)
  • agent更新策略agent.update(xxx)
python
for i_ep in range(train_eps): # 遍历每个回合
    # 重置环境,获取初始状态
    state = env.reset()  # 重置环境,即开始新的回合
    while True: # 对于比较复杂的游戏可以设置每回合最大的步长,例如while ep_step<100,即最大步长为100。
        # 智能体根据策略采样动作
        action = agent.sample_action(state)  # 根据算法采样一个动作
        # 与环境进行一次交互,得到下一个状态和奖励
        next_state, reward, terminated, _ = env.step(action)  # 智能体将样本记录到经验池中
        agent.memory.push(state, action, reward, next_state, terminated) 
        # 智能体更新策略
        agent.update(state, action, reward, next_state, terminated)  
        # 更新状态
        state = next_state  
        # 如果终止则本回合结束
        if terminated:
            break

Agent类

  • 采样动作:ϵ贪心法,指数衰减
  • 预测动作:直接根据Q_table选择最大值即可
  • 策略更新:更新Q_table
python
class Agent:
    def __init__():
    		self.Q_table  = defaultdict(lambda: np.zeros(n_actions))

    def sample_action(self, state):
        ''' 采样动作,训练时用
        '''
        self.sample_count += 1
        # epsilon是会递减的,这里选择指数递减
        self.epsilon = self.epsilon_end + (self.epsilon_start - self.epsilon_end) * math.exp(- self.sample_count / self.epsilon_decay) 
        # e-greedy 策略
        if np.random.uniform(0, 1) > self.epsilon:
            action = np.argmax(self.Q_table[str(state)]) # 选择Q(s,a)最大对应的动作
        else:
            action = np.random.choice(self.n_actions) # 随机选择动作
        return action
    
    def predict_action(self,state):
        ''' 预测或选择动作,测试时用
        '''
        action = np.argmax(self.Q_table[str(state)])
        return action
    
    def update(self, state, action, reward, next_state, terminated):
      	''' 更新Q_table即可
      	'''
        Q_predict = self.Q_table[str(state)][action] 
        if terminated: # 终止状态
            Q_target = reward  
        else:
            # TD目标计算,reward + 直接Q max值,而非给定下一时刻真正执行的动作的Q值
            Q_target = reward + self.gamma * np.max(self.Q_table[str(next_state)]) 
        self.Q_table[str(state)][action] += self.lr * (Q_target - Q_predict)
        return

Sarsa vs Q-Learning

Sarsa vs Q-Learning

Sarsa

  • 同策略算法
  • 自己的策略采样轨迹,并用Qπ(st+1,at+1)来更新Qπ(st,at)

Q-Learning

  • 异策略算法
  • 不需要知道下一步实际执行哪个动作,更新Q时默认选择Q值最大的动作
  • 不用知道下一步实际at+1,就能更新Q(st,at)
  • Q学习不担心受探索的影响,比Sarsa更大胆
总访客数:   ·   总访问量:
PLM's Blog @ 2016 - 2025