前置知识
学习强化学习需要一点点概率论的知识,已经学过。但是可能没有使用就忘记了,我们一起回顾一下。
-
随机变量与观测值
随机变量(Random Variable):一个未知的量,他的值取决于一个随机事件的结果。 通常大写字母表示随机变量:比如此处的 X。
观测值(Observed Variable):随机事件的观测结果,一个具体的值。比如我们抛硬币这个随机事件,我们抛4次,正面记作1,反面记为0,结果如下x1 = 1,X2 = 0,x1 = 1,X2 = 0。通常用小写字母表示。
-
概率密度函数PDF
概率密度函数:随机变量在某个确定的取值点发生的可能性。 举个例子:高斯分布(正态分布)
横轴为随机变量大X的取值,纵轴为概率密度,这条曲线就是高斯分布的概率密度函数P(X),这个图像说明在随机变量X在原点附近的取值概率比较大,在远离原点的位置取值比较小。
离散的概率分布
离散随机变量:
此处有一个离散的随机变量X,X的取值为 1或者3或者7,取1的概率为0.2,取7的概率为0.5,取7的概率为0.3.概率密度函数图像如右上所示。
概率密度函数的性质
我们把随机变量的取值域记作花体X,即
对于连续的概率密度函数,有
表示:对所有可能的取值x的概率做定积分,得到的结果是1
对于离散的概率密度函数,有
表示:对所有可能的取值x的概率做求和,得到的结果是1
概率密度函数的期望
期望的定义:在概率论和统计学中,数学期望(mathematic expectation [4])(或均值,亦简称期望)是试验中每次可能结果的概率乘以其结果的总和,是最基本的数学特征之一。它反映随机变量平均取值的大小。
对于连续的概率密度函数,有
对于离散的概率密度函数,有
随机抽样
这里有一个盒子,红球2个,绿球5个,蓝球3个,从盒子里随便取一个的球,这个过程叫随机抽样。 当抽样的次数足够多,这时候结果就具有了统计意义,我们会发现红球抽到红球的概率趋近 0.2 ,绿球0.5,蓝球概率为0.3。
强化学习相关术语
状态(state):
游戏过程中的某一个时刻,可以简单理解为当前画面帧。
动作(action):
马里奥的动作。
智能体(agent):
智能体,此处的马里奥就是智能体。
策略 ploicy
策略(policy):智能体(agent)根据当前状态(state),做出动作(action),可以简单理解成策略就是智能体的大脑。policy 记为 ,实际上,在强化学习中pai为一个概率密度函数,pai 函数有两个参数,状态s,需要求概率的动a,返回值为动作a的概率 p。 此处值域为 [0,1],为什么? 在强化学习过程中,智能体会根据策略函数求得各动作的概率之后再随机抽样,从而决定具体的动作,强化学习学的是什么呢?其实就是学习到了这个策略函数Π 为什么要随机抽样?而不是直接取概率最大的动作?
状态转移 sate transition
智能体在一个观察到一个状态之后采取一个动作,这时候环境会给出反馈,游戏进入到另外一个状态,这个过程称之为状态转移,状态转移可以是随机的也可能不是随机的,通常我们认为是随机。比如此处马里奥向上跳跃,此处的小怪可能向左移动,也可能向右移动,这就造成了下一个状态的随机性,我们可以把状态转移用p函数来表示,p函数是一个条件概率密度函数 对于当前状态s,给定动作a,状态有s转移到s’的概率
奖励 reword
reword: 游戏中我们定义的给予智能体的奖励,例如马里奥吃到金币我们给1分,赢得游戏我们给10000分,碰到小怪游戏失败我们扣10000分,奖励记作R。
回报 return
return:未来的奖励总和。Ut为回报,RT为T时刻的奖励,Tt+1为下一步的奖励,以此类推。
折扣回报 discounted return
现在给你100元,和明年给你100元,你会怎么选择(现在就赢得游戏,还是过会儿再赢得游戏,现在就吃掉金币,过会儿再吃掉金币)?通常我们会选择现在就拿100元,因为我们认为未来的100元比不上现在的100元,因此我们在强化学习中引入了另外一个概念,折扣回报。
则扣回报(discounted return)等于未来每一步的奖励(reword)与时间则扣率( )的加权求和。
智能体与环境的交互过程
首先智能体观察到游戏状态s1(游戏画面),然后游戏做出动作a,观察游戏新的状态 s2和奖励,然后一直重复,直到游戏结束(通关或者失败),我们用一个序列将这个过程记录下来得到S1、a1、r1、S2、a2、....、ST、aT、rT。
强化学习中的两个随机性来源
动作的随机抽样
我们前面提到过智能体的动作是讲当前环境传入策略密度函数Π中,然后算出每一种动作的概率,然后再随机抽样。这样得到接下来的动作,此处的随机抽样就是其中一个随机性来源。
环境的随机抽样
第二个随机性的来自于环境的状态转移,状态转移函数是一个条件概率密度函数,在指定状态下我们将智能体的动作传入P函数,会得到一个下一个可能状态的概率,然后环境随机抽样得到下一个状态。此处的随机抽样是第二个随机性的来源。
回报中的随机性
首先因为Ut代表未来回报的总和,未来还未发生,因此此处奖励和回报都记作大写。
我们来回顾一下动作的随机性和状态转移的随机性。 对于任意时刻i>=t,回报依赖于时刻i的状态Si和动作Ai。
思考:
1.结合奖励R的定义,则扣回报Ut越大意味着什么?
答案1:
回报越大 => 最短时间内获得最大回报 => 智能体策略越好
思考2:
2.对于任意时刻t,如何让折扣回报Ut最大化?
答案2:
首先Rt是当前状态的奖励,是固定的,因此 Ut最大意味着 最大,Y为时间则扣率是一个定量,Rt+1 为下一状态环境给出的奖励,我们回顾一下下一个状态得出的过程,首先智能体根据策略函数Π( ) 得出每一个动作的概率,然后再随机抽样得出具体的当作a,然后将a传入状态转移函数( )得到未来可能的状态概率,然后环境再随机抽样返回下个状态(说明:当状态确定时,奖励也随即确定)。 由于两个随机抽样的存在,求解最大Ut似乎变得不现实,那么我们有其他方式来衡量策略的好坏吗?
思考3:
我们来再来玩个简单游戏.
蚂蚁可以选择向左走或者向右走,向左走会遇见天敌,生命值减去100,向右走会有食物,生命值加100.
答案3:
我们对第一种策略求期望
E1 = 0.2 * -100 + 0.8* 100 = 60;
我们对第二种策略求期望
E2 = 0.5 *-100 + 0.5* 100 = 0;
E1 > E2 表示第一种 策略优于第二种策略 由此可见,概率密度函数的期望值不受随机抽样的影响,且期望值可以用来衡量策略的好坏。
回报越大 => 最短时间内获得最大回报 => 智能体策略越好
等效于
回报的期望越大 => 最短时间内获得最大回报 => 智能体策略越好
动作价值函数Q(s,a)
动作价值函数:衡量状态S下在采用策略Π的情况下,动作A的好坏程度。
结论:对折扣回报Ut求期望,可以将St和At之后的动作和状态消掉,最终推导出状态价值函数。状态价值函数只与当前状态,当前采取动作,和当前策略有关。
最优动作价值函数 (Optimal action-value function)
最优动作价值函数(Optimal action-value function):衡量状态S下采取动作A能获得的最大回报。
最优动作价值函数的作用:我们可以根据状态给动作打分,分越高表示当前的动作越好。
状态价值函数 (state-value function)
状态价值函数(state-value function):在动作价值函数的基础上对动作求期望。可以将t时刻下的动作积分积掉(或者连加消掉)。得到
状态价值函数的直观意义:可以告诉我们当前局势好不好,我们要赢了还是要输了。
累加还是积分取决于动作否连续,如果是连续动作则积分,如果为离散则为累加。
DQN(Deep Q-Network)
我们再想想超级玛丽的游戏
目标:赢得游戏(≈最大化总奖励。)
问题:如果我们知道Q*(s,a),最好的行动是什么? ·
分析:显然,最佳操作是a*=argmax Q*(s,a)。 Q*是一个指标,表明智能体在处于状态s时选择行动有多好。
挑战:可是现实是我们不知道Q*(s,a)。 ·
解决方案:深度Q网络(DQN) ·使用神经网络Q(s,a;w)来近似Q*(s,a)。 w 是神经网络的权重。
DQN 玩游戏的过程
我们可以将超级玛丽的图片帧作为神经网络的输入,然后通过卷积层,将图片转换成特征向量,然后通过全连接层最后输出每个动作的打分。
如上图所示,这时候我们根据打分得出最佳的动作,然后将动作输入环境(超级玛丽游戏),游戏返回奖励和下一个状态。循环上述步骤,直到游戏结束。
如何优化DQN中的神经网络?
我们之前的DQN神经网络是随机初始化的一个神经网络,他与我们想要的Q价值函数还存在很大的差距,我们如何让DQN神经网络去拟合Q价值函数呢?
答案:时序差分法
时序差分法
设想:你从成都东站开车到洞子口医院,距离1000公里,这时候你使用一个神经网络模型来预测需要1000分钟,但是你实际开过去却只花了860分钟,这时候我们可以将860分钟作为这个神经网络的监督信息,调整神经网络的参数,使其去拟合860。这样经过千百次训练后我们的神经网络就会预测的越来越准。 但是这样做有个弊端:每次都需要跑完全程才能优化一次,因此收敛的速度很慢。 我们有更好的方法吗? 我们可以跑一百米再用模型预测剩下的路程需要的时间。理论上如果模型预测的够准,那么 刚出发时预测的时间 = 100米实际花费时间 + 剩余路程预测时间 等式右边这100米实际花费时间 为真实时间,因此等式右边比左边更趋近于真相。我们可以用等式右边的数据作为监督信息来更新神经网络模型。 这就是 时序差分法,时序差分法可以每走一步就更新一次神经网络参数 因此,时序差分法可以使神经网络训练时更快的收敛。
总结:
DQN算法就是用神经网络来替代Q*(最优动作价值函数-体现指定状态st下,指定动作At所能取得的最大回报Ut)函数,函数的入参st为游戏的画面帧,输出为每个动作的打分,我们选出得分Ut最高的动作作为智能体的动作At+1,将动作输入环境,环境给出奖励Ut+1和下一时刻的环境St+1。我们将下一时刻的最大得分 + 上一步骤环境给出的实际奖励 作为监督信号 来更新神经网络模型,这样循环往复,走一步更新一步,从而不断的训练神经网络模型,使他无线趋近于 Q*。
刚出发时预测的时间 ~= 100米实际花费时间 + 剩余路程预测时间
常用的强化学习算法
1. DDPG(Deep Deterministic Policy Gradient)
基本概念: DDPG是一种针对连续动作空间的策略学习方法,结合了深度神经网络和确定性策略梯度(DPG)算法。它通过使用卷积神经网络来模拟策略函数和Q函数,并利用深度学习的方法来训练这些网络,从而实现了在连续动作空间中的高效学习。 主要特点: 确定性策略:与传统的随机策略不同,DDPG输出的是确定性的动作,这有助于减少策略梯度的方差并提高算法的稳定性。 经验回放:通过将智能体与环境的交互数据存储在经验回放缓冲区中,并在训练时随机采样这些数据,可以避免数据之间的相关性过高,提高样本效率。 双网络结构:DDPG通常使用两个网络结构——一个在线网络(用于与环境交互并生成数据)和一个目标网络(用于计算损失函数并更新网络参数),这有助于稳定训练过程。
2. A2C(Advantage Actor-Critic)
基本概念: A2C是一种结合了Actor-Critic框架和优势函数(Advantage Function)的强化学习算法。它通过引入优势函数来改进传统的Actor-Critic算法,以更好地控制策略梯度的方差并提高算法的稳定性。 主要特点: 优势函数:A2C将策略梯度分解为优势函数和策略函数两部分,其中优势函数表示当前动作相对于其他动作的优势。 同步并行:A2C通常采用同步并行的方式,通过多个工作线程同时运行并收集数据来加速训练过程。 损失函数:A2C的损失函数包括策略损失、价值损失和熵损失三部分,用于同时优化策略网络和价值网络。
3. PPO(Proximal Policy Optimization)
基本概念: PPO是一种在策略梯度算法基础上改进而来的高效稳定策略优化方法。它通过限制策略更新的幅度来避免训练过程中的性能剧烈波动,从而提高了算法的稳定性和样本效率。 主要特点: 剪切技巧:PPO通过引入剪切项来限制新策略和旧策略之间的差异,从而简化了计算过程并保持了类似的性能稳定性。 两种变体:PPO包括PPO-Clip和PPO-Penalty两种变体,分别通过剪切和惩罚项来实现对策略更新的限制。 高效稳定:PPO能够更有效地利用收集到的数据,减少了为获得良好策略而需要的样本数量,并且适用于多种不同的任务和环境。
4. DQN(Deep Q-Network)
基本概念: DQN是一种将深度神经网络与Q-learning算法相结合的强化学习算法。它通过使用深度神经网络来近似Q函数,并利用经验回放和固定目标网络等技术来稳定训练过程。 主要特点: 经验回放:DQN使用经验回放缓冲区来存储智能体与环境的交互数据,并在训练时随机采样这些数据来更新网络参数。 固定目标网络:DQN使用一个固定的目标网络来计算损失函数,这有助于稳定训练过程并避免梯度爆炸或消失的问题。 ε-贪婪策略:DQN在训练过程中采用ε-贪婪策略来平衡探索和利用之间的关系,即以一定的概率选择随机动作来探索环境。
5. TRPO(Trust Region Policy Optimization)
基本概念: TRPO是一种基于策略梯度的强化学习算法,它通过引入信任区域来限制策略更新的幅度,从而确保性能的稳定提升。 主要特点: 信任区域:TRPO通过计算新旧策略之间的KL散度来限制策略更新的幅度,确保新策略不会与旧策略相差过大。 二阶优化:TRPO通常使用二阶优化方法(如共轭梯度法或Fisher信息矩阵)来求解更新步长,以确保算法的稳定性和收敛性。 复杂度高:由于需要计算KL散度和二阶优化方法,TRPO的计算复杂度相对较高,实现起来也比较困难。
综上所述,DDPG、A2C、PPO、DQN和TRPO是强化学习领域中几种重要的算法,它们各自具有不同的特点和应用场景。在实际应用中,可以根据具体问题的需求选择合适的算法进行求解。
强化学习库-stable Baselines3
一、概述
Stable Baselines3是Stable Baselines项目的继任者,它继承了Stable Baselines的优点,并采用了更为现代和标准的编程实践。SB3提供了多种流行的强化学习算法实现,如PPO、A2C、DQN、DDPG和TRPO等,这些算法可以直接用于训练模型,而无需从头开始编写复杂的代码。
二、主要特点
易于使用:SB3封装了强化学习的复杂细节,提供了简洁的API,使得用户可以快速上手并进行实验。 高效稳定:算法实现经过优化和测试,确保了训练过程的稳定性和高效性。
灵活配置:支持多种参数配置和自定义环境,用户可以根据具体任务需求进行调整。
可视化与监控:SB3可以与可视化工具(如SwanLab)集成,方便用户监控训练过程和结果。
三、应用领域
Stable Baselines3被广泛应用于多个领域,包括但不限于: 机器人控制:通过训练模型来控制机器人的动作和行为。 游戏AI:在游戏环境中训练模型,实现智能决策和策略优化。 自动驾驶:在模拟或真实环境中训练自动驾驶系统,提高安全性和效率。 金融交易:利用强化学习算法进行交易策略的优化和风险管理。
Gym
Gym是一个由OpenAI开发的用于开发和比较强化学习算法的工具库。它提供了一套简单、通用的API,以及多种预构建的环境,用以模拟各种任务,如游戏、机器人控制等。
自动玩gym游戏Demo
from stable_baselines3.common.env_util import make_atari_env
from stable_baselines3.common.vec_env import VecFrameStack
from stable_baselines3 import A2C
from datetime import datetime
# There already exists an environment generator
# that will make and wrap atari environments correctly.
# Here we are also multi-worker training (n_envs=4 => 4 environments)
vec_env = make_atari_env("ALE/Boxing-v5", n_envs=9, seed=0)
# Frame-stacking with 4 frames
vec_env = VecFrameStack(vec_env, n_stack=9)
model = A2C.load("./box_boy_a2c", vec_env, verbose=1)
# model = A2C("CnnPolicy", vec_env, verbose=1)
# for j in range(1, 10001): # 注意,range的结束值是不包含的,所以要设置为1000001
# model.learn(total_timesteps=10_000)
# if j % 10 == 0:
# model.save("./box_boy_a2c")
# current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S")
# print("我保存了,保存时间:" + current_time)
obs = vec_env.reset()
while True:
action, _states = model.predict(obs, deterministic=False)
obs, rewards, dones, info = vec_env.step(action)
vec_env.render("human")
第一次训练需要自己创建模型,上面代码很简单,把注释的地方改改就行了。我自己训练了一会儿,给大家截图看看效果。