免模型
免模型试错探索,环境信息未知,没有概率可言,熊何时出现做什么,一切都未知。
RL可以应用在完全未知随机的环境,像人类一样,通过尝试不同的路来学习,慢慢了解哪个状态动作会更好。

免模型预测
蒙特卡洛方法
思想
思想
- 给定策略
,从状态s开始,智能体和环境交互,采样多条轨迹,计算每条轨迹的真实回报 用轨迹平均回报来估计价值函数
特点
- 无需模型(状态转移/奖励函数),也无需动态规划那样的自举方法
缺点
- 只能适用于有终止状态的马尔可夫决策过程
增量更新
经验均值
- 在每个回合中,若在时间步t状态s被访问,则更新:
- 状态s的总访问数增加:
- 状态s的总回报增加:
- 状态s的总访问数增加:
- 通过回报平均,来估计状态s的价值:
- 缺点:
- 依赖每个轨迹的真实回报
- 需拿到所有的轨迹的回报后,才能求平均
- 依赖每个轨迹的真实回报
增量均值
- 做增量计算:
新估计值
=旧估计值
+学习率 *(目标值 - 旧估计值)
,
- 蒙特卡洛误差:
轨迹真实回报
-期望回报
- 优点
- 每采样一个新轨迹,就可以更新价值函数,做回合级更新
- 只更新轨迹上的所有状态,和轨迹无关的不用更新
- 对比,动态规划的自举更新,用上一时刻的V来更新当前时刻的V,贝尔曼期望备份
优缺点对比
蒙特卡洛方法
- 优点
- 适用于免模型情况,
- 通过一个经验的回报,就能做更新,且只需更新该轨迹的状态
- 缺点
- 需一个回合完成后,才能更新
动态规划方法
- 缺点
- 需要更新所有状态,状态数量多时,非常慢
动态规划需更新所有状态来求期望:

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

时序差分方法
一步时序差分
核心思想
- 一种基于经验的动态规划算法,结合了
蒙特卡洛(采样经验)
和动态规划(自举思想)
。 - 给定策略
,可以一步一步在线算出它的价值函数 ,不等轨迹技术,就可以更新价值函数
一步时序差分TD(0)
- 自举一步,用估计的回报,来更新上一时刻的V值
- 类比增量式蒙特卡洛
时序差分目标
- 走某步后得到的实际奖励
- 自举方法,用之前的估计来估计
- 用当前估计的V,而不是
时序差分误差TD error
- 用
来 逼近估计的时序差分目标
/真实回报
- 类比增量式蒙特卡洛误差
n步时序差分方法
核心思想
- 往前走n/
步,再更新;比如往前走2步,得到2步的回报,再使用自举来更新价值。 - 时序差分目标
- 增量式学习更新

λ-return算法/TD(λ)/Todo补充
指数移动加权平均
:到第t天的平均值, :第t天的温度值, 是 衰减系数
- 指数加权平均:作为原数据的估计值,可以抚平短期波动,起到
平滑作用
- 离当前越近,
权值越大
;离当前越远,权值越小
(指数递减),也有一定权值
红色的数据比蓝色的原数据更加平滑,少了很多噪音,并且刻画了原数据的趋势。

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

λ-return算法
问题背景
- MC:低偏差、高方差;TD:高偏差、低方差。
- 通过TD来优化,结合2者优点
- 1步奖励,
降低方差
- n步TD,
n越大,偏差越小
- 1步奖励,
n步TD方法
- 向前走n步
λ-return
平均衰减n-step回报
,共有n个估计量,步数从1到n- 平衡TD和MC方法,平衡方差和偏差
分离终止项
:补偿因时间截断而丢失的未来回报信息。 :保持权重分配的数学一致性,体现时间衰减效应。
n步截断 λ-return 公式
:不衰减,退化为 MC回报
。:完全衰减,退化为 TD回报
。


预测方法对比(时序差分vs蒙特卡洛vs动态规划)
概念对比
时序差分
- 可以在线学习,每走一步就能更新;在知道结果之前就能学习,更快速灵活
- 可以从不完整序列学习,可以在连续环境下进行学习
- 利用了马尔科夫性质
- 更新时使用了自举(更新时使用了估计),一部分采样,一部分自举。
- 以采样方式得到不完整序列,估计某状态后可能的奖励,不断采样持续更新价值
- TD方法在每个时刻都可以更新价值函数,是一种
高偏差、低方差
的方法
蒙特卡洛
- 不能在线学习,必须游戏结束时才能更新
- 只能从完整序列进行学习,只能在有终止的情况下进行学习
- 没有假设环境具有马尔科夫性质
- 没有使用自举
- 高方差 (预测值的变化范围、离散程度)
- MC方法需要用整个episode的经验去估计价值函数,是一种
低偏差、高方差
的方法。
动态规划
- 有模型预测方法
- 使用了自举
自举采样对比
时序差分对比蒙特卡罗

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

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

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

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

偏差
- 预测值和真实值之间的差距
方差
- 预测值的变化范围、离散程度

免模型控制
免模型控制是指不需要知道环境模型,进行寻找最优策略输出最有价值。Q学习和SARSA都是基于时序差分的算法。
广义策略迭代
狭义策略迭代
定义
有模型控制,通过
策略评估
和策略改进
,不断迭代直到值函数收敛。通过环境信息(
奖励函数
、状态转移概率
),来计算价值函数
缺点
- 依赖奖励函数和状态转移概率,免模型时,无法估计

广义策略迭代
定义
- 免模型控制,引入
蒙特卡洛
和时序差分
,进行策略迭代 策略评估
:用蒙特卡洛探索采样多个轨迹,平均轨迹价值,来估计Q函数
策略改进
:直接选择最大的Q函数

探索策略
- 一直基于某种思路工作,可能会比较好,但也可能会走偏,换一种思路也许就会豁然开朗
- 守旧不一定是坏事,不能过度好奇心
- 为了保证足够的探索,以
概率随机选择一个动作 按时间步递减,如0.1 -> 0.01 - 开始时不确定哪个动作较好,花较多时间进行探索
- 后期逐渐稳定,减少探索,降低
定义
- 对
, 被选中的概率和 有关 - T为温度系数
- T很大,等概率选择;T很小,Q值更大的动作容易选中;T趋于0,只选择最优动作。
同策略异策略
行为策略 vs 目标策略
行为/探索/采样策略
探索环境的策略
,采集很多轨迹经验,给行为策略进行学习- 像前线的战士
- 如:
策略评估
,探索环境,采样估计Q函数
目标/学习/改进策略
通过经验稿子进行学习的策略
,不用和环境进行交互- 像后方的军师
- 如:
策略改进
,更新策略


同策略 vs 异策略
同策略/On-Policy
- 定义
- 行为/采样/探索策略 和 学习/改进/目标策略
相同
。 - 使用同一策略来搜集样本,通过样本学习并更新原策略。
- 行为/采样/探索策略 和 学习/改进/目标策略
- 优点
- 稳定,可以保证学习到的策略收敛到最优策略
- 较好解决连续动作空间问题
- 缺点
- 样本利用效率低:
仅能用来更新当前策略
,不能更新其他策略
- 样本利用效率低:
异策略/Off-Policy
- 定义
- 行为/采样/探索策略
和 学习/改进/目标策略 不同
。 - 使用行为策略探索到的
经验轨迹
,来优化目标策略。如从经验回放
或历史数据
中学习。 可是随机策略,但采取** 贪心使其不至于完全随机**,是基于Q表格逐渐改进的。
- 行为/采样/探索策略
- 优点
- 学习效率高:旧策略的采样经验可
多次利用
,节省资源 - 利用通过行为策略探索来学到最佳策略
行为策略
可采用贪心算法,更加大胆,有可能探索到最佳策略 目标策略
仍使用普通贪心算法,根据行为策略经验来采用最佳策略
- 可以学习其他智能体的动作
- 学习效率高:旧策略的采样经验可
- 缺点
- 需分布比较接近,避免偏差,避免训练不稳定
SARSA:同策略TD
Sarsa 核心思想
核心思想
- 用时序差分方法来估计Q函数,更新Q表格后就可更新策略
- 用
下一步
值, 来更新当前步
值,不断强化每一个Q值
主要流程
随机初始化
,不断迭代直到 收敛,进行以下迭代 确定初始状态
,依策略选择动作 ,重复以下流程,直到 为终止态 环境交互采样
执行动作
,得奖励 、新状态 - 在新状态
, 依策略选择动作
策略评估 / Q函数估计
策略改进 / 更新策略
状态动作前进
:



n步Sarsa
单步时序差分
- 自举1步,用
下一步
值, 来更新当前步
值
n步时序差分
- 自举n步,一次性考虑
步回报
- n步回报
- 为n步回报
增加资格衰减参数
- n步Sarsa(
)的更新策略
Q学习:异策略TD
核心思想
核心思想
同Sarsa一样,利用TD方法来估计Q函数,更新Q表格后可更新策略。
但
学习策略
和行为策略
不一样,是一种异策略算法
学习策略
- 估计Q函数时,
采取下一时刻Q值最大的动作
, 不来自行为策略
,并非下一步真正执行的动作
- 估计Q函数时,
TD目标值
:, 自举1步,更新Q函数
算法流程
初始化策略
,执行以下迭代,直到所有 收敛 初始化
,执行以下迭代,直到 为终止态 环境交互采样/探索策略
- 依策略选择动作
- 执行动作
,得即时奖励 、新状态
- 依策略选择动作
Q函数估计/学习策略
与sarsa不同,不使用探索策略
采样的
、下一步真正执行的
动作而是直接选择
最大Q值对应的动作
用来估计Q。 , 不来自探索策略
,并非下一步真正执行的动作
仅状态前进
策略更新,输出策略

伪代码
训练流程代码:多个回合
- agent采样动作:
agent.sample_action(state)
- 环境交互:
env.step(action)
- 样本放入经验池:
agent.meomory.push(xxx)
- agent更新策略:
agent.update(xxx)
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
,
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
- 同策略算法
- 自己的策略采样轨迹,并用
来更新
Q-Learning
- 异策略算法
- 不需要知道下一步实际执行哪个动作,更新Q时默认选择Q值最大的动作
- 不用知道下一步实际
,就能更新 - Q学习不担心受探索的影响,比Sarsa更大胆

