潮科技行业入门指南 | 深度学习理论与实战:提高篇(17)—— 强化学习简介(三)
玩家的状态有多少种呢?首先是自己的当前得分,因为如果当前不超过11点,那么必然可以要牌而不爆掉,因此状态是12-21共10种可能。而另外的信息就是庄家亮牌 ace-10 共十种(花牌和10 没区别)。还有一点就是Ace,如果玩家有一个Ace而且可以把它算作 11而不爆,那么这个 Ace就叫可用(Usable)的 Ace。如果 Ace 算作 11 就爆了,那么它只能算 11,也就是不能再(根据不同情况)变化了,也就不“可用”了。如果Ace可以算11,那么我们一定把它算成11,因为如果算成1,那么分就一定小于等于11(否则就爆了),那么我们一定会继续要牌,这个状态是不需要决策的,直接变成一个新的状态。 关于“可用”的Ace算11可能有些难以理解,我们通过一个例子来说明。假设现在玩家手里的牌是2+3+Ace,这个Ace是“可用”的,我们现在的状态是16点并且有一个“可用”的Ace。如果我们把Ace当成1,那么也可以增加一个状态,2+3+Ace,但是这个状态我们一定会hit。所以我们不需要任务这种状态存在。因此这个MDP一共有 10102=200个状态。 为什么这个问题很难用动态规划来解决呢?因为动态规划需要知道 (′,|,) ,比如现在的牌是 3+8+2,如果我们采取 hit (要牌),我们也许还能计算变成 3+8+2+4 的概率,但是 reward 是多少呢?此外如果我们 stick,那么我们的状态会取决于庄家的行为并且最终进入终止状态,这个是很难计算的(因为我们不知道没有亮的牌是多少)。而使用蒙特卡罗方法就很简单,我们不需要知道这些概率,只需要根据某个策略来采取行为就可以了,而环境动力学我们只需要随机模拟就可以了。 蒙特卡罗预测代码示例 完整代码在这里。 Blackjack环境 首先我们来简单的阅读一些Blackjack环境代码。代码在 envs/blackjack.py 里。要点都在注释里了,请读者仔细阅读注释。 玩家的牌存在 self.player 里,而庄家的牌存在 self.dealer 里,状态是 3 元组。3 元组的第一个是 spaces.Discrete(32),Discrete(32) 的范围是 0-31。游戏中没有 0 的牌,1-31 表示玩家的牌的和,注意如果玩家到了 21 点肯定不会再要牌,因此即使爆了最大和也最多是 20+11=31,其实根据我们的分析 12 以下也没必要有,不过有也没关系。3 元组的第二个是spaces.Discrete(10),1-10 表示庄家亮牌的点数。3 元组的第三个元素用 0 和 1 表示是否有可用的 Ace。 蒙特卡罗预测代码 代码如下,非常直观,请读者对照前面的伪代码阅读代码和注释。 最后我们测试简单的策略——不到 20 就要牌,否则就停止的策略,看看它在不同状态下的价值函数: 如果我们运行 jupyter notebook 的代码,可以得到下图的结果。可以看到经过 500k 次迭代后价值函数非常平滑,而10k次迭代还是不平滑的,也就是误差比较大。我们发现(验证)这个策略并不好:从图中可以看出,只有一上来我们 (agent) 的点数大于 20 点才会赢,事实上如果我们知道庄家的策略,我们一上来到了 18 点就可以停止要牌了,但是我们很激进的要超过 19 才停止,这显然很容易爆掉。所以这个策略基本就是输的。 图:10k 迭代没有 Ace 图:10k 迭代有 Ace 图:500k 迭代没有 Ace 图:500k 迭代有 Ace 前面介绍的是使用蒙特卡罗方法来求解一个策略的状态价值函数,而行为状态函数也是类似的算法,只不过采样后累加的 key 是 s-a 而不是 s 而已。这里就不赘述了。 蒙特卡罗控制 和之前的策略迭代类似,我们可以用蒙特卡罗预测替代基于动态规划的策略评估,然后不断提升策略。这里我们计算的是行为价值函数q(s,a)而不是状态v(s)。 0→0→1→1→2→...→→ 这里使用的策略提升是贪婪的方法: 为什么这个方法可以提升策略呢?我们仍然可以使用前面的策略提升定理来证明: 这个算法有两个假设:蒙特卡罗迭代的次数是无穷的(才能逼近真实的价值函数);Exploring Start。前者我们可以忽略,因为迭代足够多次数一般就够了,而且我们之前也讨论过价值迭代,我们不需要精确的估计策略的价值就可以使用价值提升了。这里的关键问题是 Exploring Start,初始状态 0 因为游戏是随机初始化的,因此所有可能的初始状态我们都可能遍历到,而且随着采样趋于无穷,每种可能初始状态的采样都是趋于无穷。与 0 对应的 0 可能有很多,但是有可能我们的策略会只选择其中一部分,那么有可能我们搜索的空间是不完整的。一种办法就是Exploring Start,就是强制随机的选择所有可能的(0S 和(0) ),但这样有问题——我们的策略探索过 (0,0) 之后发现它不好,正常的话,它碰到0S0后就避免 0 了,但是我们强迫它随机(平均)的探索 (0,0) 和 (0,1) ,其实是浪费的。这个问题我们留到后面来解决,我们首先假设是 Exploring Start 的,看看蒙特卡罗预测的伪代码。 图:蒙特卡罗控制算法伪代码 通过上面的算法,我们就可以得到最优的策略如下图所示。 图:使用 Exploring Start 的蒙特卡罗控制求解结果 这里学到的策略大致是:如果有可用的 Ace,那么一直要牌直到 18 点,这显然是有道理的,因为我们知道庄家是要到 17 点为止。如果没有 Ace,如果庄家亮出来的牌很小,那么我们到 11 或者 12 点就停止要牌了。为什么这是最优的?作者也不清楚,知道的读者可以留言告诉我。 这一节我们不会实现 Exploring Start 的算法,原因前面我们讲过了,这个算法并不高效和通用,我们之后的内容会介绍没有 Explroing Start 的算法并用它们来解决 21 点游戏。 多臂老虎机和 UCB (编辑:温州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |