填坑——强化学习——使用智能体来玩游戏
参考文献
flappy-bird-gymnasium环境
Gymnasim官网
github上的代码
动手强化学习
动手强化学习代码
tensorflow实现的强化学习
tensorflow+gym实现的flyappybird
问答网站
开篇
(广义的讲)强化学习是机器通过与环境交互来实现目标的一种计算方法。机器和环境的一轮交互是指,机器在环境的一个状态下做一个动作决策,把这个动作作用到环境当中,这个环境发生相应的改变并且将相应的奖励反馈和下一轮状态传回机器。这种交互是迭代进行的,机器的目标是最大化在多轮交互过程中获得的累积奖励的期望。强化学习用智能体(agent)这个概念来表示做决策的机器。相比于有监督学习中的“模型”,强化学习中的“智能体”强调机器不但可以感知周围的环境信息,还可以通过做决策来直接改变这个环境,而不只是给出一些预测信号。
在每一轮交互中,智能体感知到环境目前所处的状态,经过自身的计算给出本轮的动作,将其作用到环境中;环境得到智能体的动作后,产生相应的即时奖励信号并发生相应的状态转移。智能体则在下一轮交互中感知到新的环境状态,依次类推。
在这个过程中,智能体有3种控制要素、即感知、决策和奖励
感知:智能体在某种程度上感知环境的状态,从而知道自己所处的现状。
决策: 智能体根据感知的现状计算出达到目标需要采取的动作的过程叫做决策。比如,针对当前棋盘决定下一颗落子的位置。
奖励: 环境根据状态和智能体采取的动作,产生一个标量信号作为奖励反馈。这个标量信号衡量智能体的好坏。(类似于在深度学习中的损失函数,)
强化学习中模型和环境交互,对于模型的目的来讲,就是从环境中取得最大的奖励值,主要在于策略的更新方法。
参数更新方法:价值更新、梯度更新。输出的值,连续的值,离散的值。
强化学习的构成元素:
- 智能体(Agent): 人工智能操作的游戏角色,它就是这个游戏的主要玩家。
- 环境(Environment) : 提供游玩的条件,agent做出的任何选择都会得到游戏环境的反馈。
- 状态(State): 游戏汉奸内所有元素所处的状态,基于环境来进行反馈。
- 行动(action): agent做出的行为来随着状态变化而变化。
- 奖励(Reward): agent的目标在于获取更高的奖励,根据环境的反馈,如果反馈是负向的也可以被描述为惩罚。
- 目标(Goal): 在合理设置奖励后,目标应该被表示为最大化奖励之和。
整个强化学习的过程,是为了学到好的策略(Policy),本质上就是学习在某个状态下应该采取什么样的行动。
目前已经有的算法;
游戏选择 FlappyBird
flappy bird》是一款由来自越南的独立游戏开发者Dong Nguyen所开发的作品,游戏于2013年5月24日上线,并在2014年2月突然暴红。2014年2月,《Flappy Bird》被开发者本人从苹果及谷歌应用商店(Google Play)撤下。2014年8月份正式回归App Store,正式加入Flappy迷们期待已久的多人对战模式。游戏中玩家必须控制一只小鸟,跨越由各种不同长度水管所组成的障碍。
环境配置
- 使用miniconda 配置环境,命令
conda create -n rl_python python=3.10
,配置环境,如果配置错误使用conda remove rl_python --all
来删除环境,使用conda activate rl_python
来启动环境。 - 配置游戏环境,使用
pip install flappy-bird-gymnasium
安装游戏 - 安装tersorflow深度学习框架官网连接
- 安装pytorch-GPU环境 官网链接 通过 nvcc –version 来查看CUDA版本。安装10.2版本的pytorch
pip install torch==1.12.1+cu102 torchvision==0.13.1+cu102 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu102
python 的3.10不兼容,换11.8的pytorch版本pip install torch==2.2.1 torchvision==0.17.1 torchaudio==2.2.1 --index-url https://download.pytorch.org/whl/cu118
ppo算法
PPO(Proximal Policy Optimization)近端策略优化算法,是一种基于策略(policy-based)的强化学习算法,是一种off-policy算法。由OpenAI于2017年提出,主要用于解决强化学习中的策略优化问题。它是Trust Region Policy Optimization(TRPO)的简化版本,旨在保持TRPO的优点,同时降低其计算复杂性。
核心原理:PPO的核心在于限制策略更新的步长,确保新策略不会偏离旧策略太远。这通过引入一个剪辑的目标函数来实现,该函数可以最小化策略更新过程中的风险。PPO算法通过这种方式平衡了探索与利用,提高了算法的稳定性和效率。PPO算法的核心在于更新策略梯度,主流方法有两种,分别是KL散度做penalty,另一种是Clip剪裁,它们的主要作用都是限制策略梯度更新的幅度,从而推导出不同的神经网络参数更新方式
代码解析工程
下面这份代码实现了使用ppo算法训练模型来玩Flappy Bird游戏。
get_args()函数用于解析命令行参数,包括学习率、折扣因子、迭代次数等。
PolicyNet类定义了策略网络,用于输出动作的概率分布。
ValueNet类定义了值函数网络,用于评估状态的价值。
compute_advantage()函数计算优势值,用于策略更新。
train()函数是训练的主要逻辑,包括初始化网络和优化器,采样游戏轨迹,计算优势值,更新策略网络和值函数网络等过程。
在训练过程中,使用TensorBoard记录训练过程中的奖励和其他指标。
在每轮训练结束后,保存表现最好的模型。
if name == “main“:部分用于执行整个训练过程。
1 |
|
问题是上面代码使用了自定义的Flappy Bird来实现游戏环境,没有使用flappy-bird-gymnasium环境来创建游戏环境,具有一定的参考意义。注: 代码暂时不能移植到Flappy Bird,上我需要解析上面的代码的逻辑。
移植工程。
第一步,明白怎么调用flappy_Bird环境
1 |
|
在github上,作者表明 在论文中有更详细的参考:论文链接
- 状态空间:
在”FlappyBird-v0”环境中,提供了代表游戏屏幕的观测数据,这些数据为游戏状态提供了简单的数值信息。
FlappyBird-v0
存在两种观测选项:
选项一
激光雷达传感器的180个读数(论文:使用变压器模型和激光雷达传感器进行运动识别玩Flappy Bird)
选项二
最后一个管道的水平位置
最后一个顶部管道的垂直位置
最后一个底部管道的垂直位置
下一个管道的水平位置
下一个顶部管道的垂直位置
下一个底部管道的垂直位置
下下一个管道的水平位置
下下一个顶部管道的垂直位置
下下一个底部管道的垂直位置
玩家的垂直位置
玩家的垂直速度
玩家的旋转
动作空间:
0 - 什么都不做
1 - 拍打翅膀奖励:
+0.1 - 每帧保持存活状态
+1.0 - 成功通过一根管道
-1.0 - 死亡
−0.5 - 触摸屏幕顶部
第二步,使用一个简单的游戏来实践dqn
上代码:实践了打砖块的游戏,游戏输入为(4,80,80)图片架构,
rl_utils代码
1 |
|
dqn_breakout 文件包括dqn网络的构建,模型的训练介绍的链接,
1 |
|
第三步解析上面实现的弹球游戏
打砖块的游戏的输入为(4, 84, 84),动作有4个有四个动作( 0 , 1 , 2 , 3 ),奖励为分数。对于Flappy Bird for Gymnasium环境中游戏action 为(180,)The LIDAR sensor 180 readings, action space 为 0 do nothing, 1 为 flap 奖励为0.1 - every frame it stays alive,1.0 - successfully passing a pipe,1.0 - dying, 0.5 - touch the top of the screen 输入有点少。
第四步,使用DQN网络
笔记: 函数的方法(DQN)和基于策略的方法(REINFORCE),其中基于值函数的方法只学习一个价值函数,而基于策略的方法只学习一个策略函数。那么,一个很自然的问题是,有没有什么方法既学习价值函数,又学习策略函数呢?答案就是 Actor-Critic。在 REINFORCE 算法中,目标函数的梯度中有一项轨迹回报,用于指导策略的更新。Actor 的更新采用策略梯度的原则,之前路走偏了使用了价值策略来更新参数,不容易收敛。
model
1 |
|
agent
1 |
|
rl_utils 文件,用于测试代码
1 |
|
训练代码,使用Ac—Critic算法来进行梯度更新
1 |
|
结果不怎么样,一直维持到0.8 左右。agent一直没有行动。某种程度上是数据输入太少了,论文中的结果怎么好我看不懂,真的服了。更换算法,
第五步ppo算法.
代码 详细代码我放在了github上github链接
配置文件,rl_utils
1 |
|
训练代码,ppo
1 |
|
测试代码,test
1 |
|
补充知识
价值方法: Sarsa、Qlearning、DQN
策略方法: Reinfore、Actor-Critic、A2C、TRPO、PPO、DDPC
on-policy(在策略) 的算法: Sarsa、Reinforce、Actor-Critic、A2C、TRPO、PPO
非on-policy算法:Qlearning,DQN,Double DQN
两者区别在于: on-policy是在线训练的,采样做预测做动作的思路。非on-policy离线训练。对于on-policy算法,采样先预测然后计算概率来采取动作。(on-policy是激进的,非on-policy是保守的。)
挖坑
怎么使用tensorboar来进行可视化过程。
TensorBoard是一个可视化工具,它可以用来展示网络图、张量的指标变化、张量的分布情况等。特别是在训练网络的时候,我们可以设置不同的参数(比如:权重W、偏置B、卷积层数、全连接层数等),使用TensorBoader可以很直观的帮我们进行参数的选择。它通过运行一个本地服务器,来监听6006端口。在浏览器发出请求时,分析训练时记录的数据,绘制训练过程中的图像。