强化学习入门(三)

前置知识

      学习强化学习需要一点点概率论的知识,已经学过。但是可能没有使用就忘记了,我们一起回顾一下。

  • 随机变量与观测值

        随机变量(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")

第一次训练需要自己创建模型,上面代码很简单,把注释的地方改改就行了。我自己训练了一会儿,给大家截图看看效果。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值