微信小程序报备系统,太原seo快速排名,网站怎么续费,wordpress多说插件1. 本文将强化学习方法#xff08;MC、Sarsa、Q learning#xff09;应用于“S21点的简单纸牌游戏”。 类似于Sutton和Barto的21点游戏示例#xff0c;但请注意#xff0c;纸牌游戏的规则是不同且非标准的。 2. 为方便描述#xff0c;过程使用代码截图#xff0c;文末附链… 1. 本文将强化学习方法MC、Sarsa、Q learning应用于“S21点的简单纸牌游戏”。 类似于Sutton和Barto的21点游戏示例但请注意纸牌游戏的规则是不同且非标准的。 2. 为方便描述过程使用代码截图文末附链接。如果耐心读完的话 一. S21环境实现
游戏的规则我们设置如下
游戏是用无限副牌进行的即用替换牌进行采样从牌组中抽取的每一张牌的值都在1到10之间均匀分布颜色为红色概率0.4或黑色概率0.6。此游戏中没有王牌或图片牌。在游戏开始时玩家和发牌人都抽到一张黑卡双方都可以完全观察每轮玩家可以选择停止拿牌stick或继续拿牌hit如果玩家hit则从牌组中抽取另一张牌如果玩家stick她将不会收到更多的牌黑色牌会增加玩家的牌值红色牌不改牌值等于无效如果玩家的总和超过21或小于1则她将输掉游戏奖励-1如果玩家stick则发牌人开始它的回合。对于大于等于20的总和庄家总是保持stick否则就会继续拿牌hit。如果经销商爆牌则玩家获胜否则总和最大的玩家获胜。获胜奖励1、失败奖励-1或平局奖励0
相比复杂的21点游戏本游戏主要简化如下 1. 可以无视前面已发的牌的牌面不需要根据开始拿到的牌来推断后续发牌的概率。 2. 庄家和玩家分开游戏并非轮流决定拿牌还是弃牌。 3. 牌值从1-10且1的值不会变化。 4. 庄家策略固定总和20时持续拿牌。
根据任务1我们针对上述规则定义相关类如下 图1 基本类型定义 环境类Envi功能如下
主要记录当前玩家和庄家的卡牌游戏是否结束。在玩家每步step之后 返回新的状态、奖励、是否结束标志。当玩家选择stick之后将后续的所有庄家操作纳入环境中计算。任务1要求 图2 基本环境类 游戏的每步操作step逻辑如下其中在玩家决策内更新当前的奖励和状态存储在环境类对象上 图3 step逻辑 玩家的取牌、弃牌实现如下
当玩家取牌时增加一张牌到player_cards中并且更新状态和奖励当玩家弃牌时转为庄家操作取牌直到20以上结束后判定胜负。 图4 取牌逻辑 实现发牌的操作如下图所示在1-10之间选择卡牌并且依照概率赋予颜色。开局必发黑牌。 图 5 发牌逻辑 最后我们根据双方牌值计算是否发生爆牌的情况或者胜负情况。若玩家仍可继续选择则继续游戏更新状态和奖励。 图 6 更新状态和奖励 二. 游戏代理实现
2.1 通用代理玩家类
我们定义通用代理具有选择动作和训练的基本方法。后续通过不同的策略代理进行继承并实现。蒙特卡洛代理、Sarsa代理、Q-learning代理 图 7 通用代理 2.2 蒙特卡洛代理
2.2.1 算法过程
蒙特卡洛方法是一种模型无关Model Free的方法这意味着我们需要通过模拟多次环境交互来估计出策略价值函数。
评估基本步骤如下
生成轨迹 在每一轮蒙特卡洛模拟中从环境的初始状态开始根据当前的策略生成一个完整的轨迹也称为episode。轨迹包括状态、动作和即时奖励的序列直到达到终止状态。计算回报 对于轨迹中的每个状态计算从该状态开始的累积回报。回报是从当前状态开始经过一系列动作和环境反馈后获得的奖励的总和 。在这一环节我们采用First-Visit MC这种方法只考虑在一个episode中首次访问某个状态时计算的回报。如果同一个状态在同一个episode中被多次访问只有第一次访问的回报会被计算在内。这样的话一个状态在一个episode中只有一个相关的回报值。更新价值函数 使用得到的回报更新每个状态的价值函数。具体地对于每个状态将其之前的价值估计更新为其在多次模拟中获得的平均回报。重复模拟 重复执行多次模拟不断累积对状态价值函数的估计。收敛 当状态价值函数的估计不再发生显著变化时认为蒙特卡洛策略评估已经收敛。 即基本过程如下 图 8 蒙特卡洛 First-Visit 过程 基于上述分析我们定义蒙特卡洛代理如下 图 9 蒙特卡洛代理定义 其中属性为折扣因子默认为1贪心策略的参数ε以及计算状态和选择动作的次数N、所有回报总和Gs以及状态价值函数V 2.2.2 动作选择
由于蒙特卡洛需要靠初始策略进行采样我们设置其采样策略为epsilon 贪心的策略。此策略也可以保证玩家在前期尽可能地去探索到达所有的牌值状态。 图 10 动作策略 2.2.3 Q值更新
由上图可知我们采取求累计回报后再平均更新Q值的方法。实现为 图 11 Q值更新 为了提高性能我们优化实现为增量式更新期望。 图 12 增量式更新 2.2.4 训练agent
训练方法设置如下在每个迭代里面存储过往的数据到episode并最后更新状态价值。由于初始的获胜率较低我们在迭代过程中逐步降低epsilon以在初期explore后期exploit。 图 13 训练方法 2.2.5 测试agent
我们定义main方法用于测试并为比较后续不同策略的agent表现。 图 14 main方法 在测试方法test_agent中我们采取模型认为的最优策略进行游戏测试10000局并统计游戏结果计算模型胜率。 图 15 测试方法 执行结果如下我们训练10万次后再测试1万次。并且统计每1万次的结局分布。不难发现结局为“庄家爆牌”的概率随着训练次数的增加而不断增加。 图 16 蒙特卡洛代理测试结果 我们可以看到庄家在小于20点持续拿牌的固定策略会导致庄家爆牌的概率极大但是在不爆牌的情况下庄家牌值大于玩家牌值的概率较大。综合两者在多次测试后可知蒙特卡洛代理的胜率可达66%。
2.2.6 效果分析
为了便于分析我们编写一个三维可视化的工具函数主要绘制三幅图
x、y轴分别表示“庄家初始牌值”“玩家牌值”纵轴z轴表示选择第0个动作Action.STICK的价值。平面的x、y轴分别表示“庄家初始牌值”“玩家牌值”纵轴z轴表示选择第1个动作Action.HIT的价值。平面的x、y轴分别表示“庄家初始牌值”“玩家牌值”纵轴z轴表示选择两个动作的平均价值。
主要代码如下 图 17 可视化比较 呈现效果如下 图 18 三图比较 下面我们逐个分析
Action.Stick操作的q值均为正当牌值逼近21的时候q值可达到0.8附近由于1为胜利的奖励这也预示着此时胜利概率极大。而由于庄家采取的是低于20牌值持续拿牌的激进策略容易爆牌。这意味着选择一个适中的牌值就停止拿牌是一个好的策略。 图 19 Action Stick Action.HIT操作中Q值存在一些负值尤其是玩家牌值接近20时此时拿牌大概率会爆牌故接近失败的惩罚-1。而在初始牌值小于10的时候颜色均为浅绿色此时的agent拿牌会得到一定的奖励。 图 20 Action Hit 平均价值 对比庄家牌轴后可知在本次实验环境下仅依靠庄家的初始牌的信息对玩家决策的意义较小。当玩家牌值约为10时此时价值较高。牌值从17到20风险高Q值较低。 图 21 平均状态价值 最后通过FuncAnimation库函数实现每隔1000次训练记录总计100帧的gif。可以看到随着时间迭代agent采取单个动作的q_value坡度会渐渐变得平缓。而由于HIT与STICK方法在逼近21点牌值后的决策结果会有较大的不同所以导致平均价值即便在后期有锯齿状的表面。相较后续的TD方法收敛十分平缓。 图 22 随时间迭代的q_value变化 2.3 Sarsa代理
2.3.1 算法过程
State-Action-Reward-State-Action这个名称清楚地反应了其学习更新函数依赖的5个值分别是当前状态S1当前状态选中的动作A1获得的奖励RewardS1状态下执行A1后取得的状态S2及S2状态下将会执行的动作A2。
这是一种在线更新Q值的算法算法流程大致如下 图 23 Sarsa算法流程 其中在每个episode中都通过episilon贪心策略选择一个动作并通过G乘以α学习率来更新状态价值Q重复步骤直到收敛。这里的预期回报G是单步TD0即只考虑未来一步收益的。 2.3.2 训练agent
显然Sarsa代理的最佳决策依旧是选择最优的Q值而与蒙特卡洛不同只是更新方法。故这里仅展示Sarsas的核心代码不再赘述相同部分。
如下所示为依据上述算法流程实现的训练代码。需要注意的是当这个状态是最后一个状态时我们需要判断是否为结束并且去除公式中下一个状态的Q值。 图 24 训练代码 我们依据公式
实现如下更新Q值函数 图 25 Q值更新函数 2.3.3 效果分析
依据上述相同方法训练10万次并每隔1万次记录对局结果。结果如下Sarsa的胜率约为0.63比MC方法0.66稍低一点。但是联合MC方法的测试结果可知胜利原因大部分是因为庄家爆牌而引起。 图 26 测试结果 同MC方法进行可视化可以得到动作STICK、HIT以及平均的状态价值图。 图 27 可视化图像 由上图可知
动作STICK和HIT的最优价值分布的牌值区间恰好相反 对于STICK操作而言牌值越小STICK奖励越低。牌值接近21时STICK操作价值越高。对于HIT操作而言牌值越大HIT奖励越低。牌值越小HIT操作价值越高。两者均在牌值约为12的情况下产生较大的价值差异。分析可知当牌值取得12时HIT操作就有可能溢出。从平均结果来看保持牌值在11以下的平均价值大于高牌值的情况。相比于MC方法的可视化图像Sarsa方法的价值平面明显更加平滑。 我们取100帧每帧迭代训练1000次fps5的图像叠加为gif查看价值函数的动态收敛过程除去平均结果外但看动作STICK与HIT都可清晰地观测到其中变化幅度较大。 图 28 动态收敛过程 2.4 Q-learning代理
2.4.1 算法流程
和Sarsa类似q-learning也是单步TD方法但不同的是它是离线学习的通过选择当前状态下价值最大的动作来更新Q值。更新公式中使用了max操作。核心公式如下 算法流程如下图所示 图 29 q-learning算法 2.4.2 Q值更新
依据上述公式我们在Sarsa代理的基础上修改值更新部分。核心的“Q值更新”实现如下 图 30 Q-learning值更新 2.4.3 效果分析
同理我们测试了Q-learning代理对局结果如下其胜率为0.6378与Sarsa代理大致相当。 图31 对局结果 不同动作的价值函数可视化部分如下大致分布也与Sarsa代理相同。可知在两者收敛的情况下Q-learning与Sarsa代理实现的策略与效果都是相当的。 图 32 Q-learning动作价值呈现 观察其收敛过程1000次训练记录一帧共100帧QLearning的迭代过程变化幅度同Sarsa方法比MC方法更加剧烈。 图33 q-learning迭代过程 三. 对比分析
3.1 胜率分析
通过wandb可视化三种代理的胜率情况我们设置每隔1000次训练进行一次测试一共进行100轮。总计10万次训练每次测试通过1000次游戏来获取胜率。结果如下 图 34 胜率对比1 由图可知胜率较快进入收敛情况我们采取Smooth可知MC与TD方法的趋势。其中MC方法越到后面训练10万次后仍有提升胜率的趋势而Q-learning与Sarsa方法反而有胜率降低的趋势。有可能陷入局部最优解。 图 35 胜率对比Smooth 我们缩小训练步长调整为每隔100次记录1点。得到曲线如下可以看到在小规模情况下的三种代理的胜率具有一定的提升但是幅度较少。 图 36 1万次训练的胜率趋势 3.2 均方误差对比
我们将三种代理两两比较Q值的均方差得到三条曲线如下 图 37 均方差对比 红色为sarsa与qlearning的均方差对比初始两者相似随着训练两者均方差有略微提升后期又会降低。而橙色和蓝色的曲线分别为sarsa、qlearning与mc方法的均方差初始差异较大但是后期随着训练增大也渐渐收敛趋于一致。 3.3 总结
本次实验所应用的三种策略Q-learning、Sarsa和蒙特卡洛都是解决强化学习问题的算法它们在学习过程中都通过与环境的交互来优化策略。且都用于值函数估计这三种算法的目标都是学习状态或状态动作对的值函数即Q值或V值。
区别
更新方式不同
Q-learning 使用了离线学习的方式通过选择当前状态下值最大的动作来更新Q值。更新公式中使用了max操作。
Sarsa 使用在线学习的方式通过选择当前状态下的某个动作来更新Q值。更新公式中使用了当前实际选择的动作。
蒙特卡洛 通过整个回合episode的经验来更新值函数它直接使用了整个回合的累积奖励。
探索策略不同
Q-learning和Sarsa 使用ε-greedy策略进行探索以一定概率随机选择动作以概率1-ε选择当前估计值最高的动作。
蒙特卡洛 通过在整个回合内的探索来学习。
适用场景不同
Q-learning 适用于离散状态和动作的问题能够在未知模型的情况下学习最优策略。
Sarsa 同样适用于离散状态和动作的问题但由于使用在线学习更适合实时决策。
蒙特卡洛 适用于离散或连续状态和动作的问题更擅长处理整个回合的经验。 四. 最终代码
https://github.com/YYForReal/ML-DL-RL-Learning/tree/main/RL-Learning/MC_TD_S21