成濑心美下马 All In! 我学会了用强化学习打德州扑克
发布日期:2024-09-27 13:34 点击次数:119原标题:All In! 我学会了用强化学习打德州扑克成濑心美下马
选自willtipton
机器之心编译
参与:Jane W、蒋念念源
最近,强化学习(RL)的得手(如 AlphaGo)取得了大家的高度情态,但其基本念念路相等浮浅。底下咱们在一双一无尽注德州扑克游戏上进行强化学习。为了尽可能明晰地展示,咱们将从零早先开导一个措置决策,而不需要预设的机器学习框架(如 Tensorflow)。让咱们用 Python3 Jupyter notebook 早先吧!
问题确立
强化学习
特征:的输入(下文使用 Q^默示 Q hat)
对于 Q^ 的线性模子
模拟扑克游戏
学习:更新 Q^
整合
驱逐
解释模子
可视化战术
结语
问题确立章程教唆:该游戏是一个 2 东谈主无尽注的德扑游戏,其中:
1. 游戏早先,两名选手均有 S 筹码和惟恐披发的 2 张底牌。
2. BB(大盲注)玩家下 1.0 个盲注,SB(小盲注)玩家下 0.5 个盲注。
3. 小盲注玩家不错全押(all-in)或弃牌(fold)。
4. 若是小盲注玩家全押,那么大盲注玩家不错跟注(call)或弃牌。
咱们不错将章程可视化为下图所示的决策树。游戏早先于 E,这时 SB 不错全押或弃牌。若是他弃牌,咱们转机到情景 A,游戏驱逐。若是他全押,咱们转机到情景 D,BB 必须在跟注和弃牌之间作出决定。若是一个玩家弃牌,另一个玩家就会得到盲注,若是两个玩家全押,则披发 5 张全球牌,况且金额按照扑克的平常章程进行分派。
这个游戏有知名的的措置决策(-charts),也有其它的门径,如造谣对局(https://www.youtube.com/watch?v=MVMfDswjJE0)和径直优化(-fold-with-tensorflow.html)。这里,咱们将使用强化学习估算措置决策。
这里有种不重叠的 2 张手牌组合数。因此,咱们不错给扫数牌排序,并从 0 到 1325 编号。只须前后编号一致,具体的规则就不紧迫了。以下函数隐含地界说了这么一个排序,并创建了从牌的编号到考虑决策信息的映射:牌的排序(牌面规则/rank)和同花性(牌面花色/suitedness)。
请珍摄,输出元组中的第一个元素(代码中的 r2)遥远排序靠前,若是有的话。举例,手牌编号 57 恰好是 6♦2♣,咱们有:
当玩家全押时,他们平均赢得的底池(「期许利益」)笔据游戏章程决定。文献 pf_eqs.dat(_eqs.dat)包含一个 numpy 矩阵 pfeqs(-1.10.0/reference/generated/numpy.savetxt.html),其中 pfeqs [i,j] 指当敌手持有手牌 j 时持有手牌 i 的期许利益。
天然,有时候两东谈主肇始手牌有一张牌是相通的,在这种情况下,它们的期许弗成同期策动,这时取得他们的期许利益也分歧适。文献 pf_confl.dat(_confl.dat)包含另一个 1326×1326 矩阵,其中每个元素为 0 或 1。A 0 默示两位玩家的肇始手牌不一样,a 1 默示肇始手牌一样。
举例,由于手牌 56 是 6♦2♣,57 是 6♥2♣,58 是 6♣2♠,于是咱们有:
为什么驱逐不正好是 0.5 呢?
强化学习底下过问 RL 教程。RL 问题有三个紧迫构成部分:情景(state)、动作(action)、奖励(reward)。它们合在一齐如下:
1. 咱们处于某「情景」(即咱们不雅察到的天下的情景)。
2. 咱们使用这个信息来接纳某「动作」。
3. 咱们会得到某种「奖励」。
4. 重叠以上流程。
一遍又一随地重叠以上流程:不雅察情景、接纳行径、赢得奖励、不雅察新的情景、接纳另一个行径、赢得另一个奖励等。RL 问题只是找出怎样取舍行径的决策以赢得尽可能多的奖励。事实证实这是一个额外普遍的框架。咱们不错通过这种方式琢磨许多问题,措置这些问题也有好多不同的门径。一般来说,措置决策触及惟恐游走(wandering around),在不同情景取舍多样步履,记取哪些组合能够赢得什么奖励,然后尝试垄断这些信息在明天作念出更好的取舍。
RL 怎样用于德扑游戏呢?在职何决策点上,玩家知谈他的 2 张底牌和他的位置,这即是情景。然后他不错接纳行径:要么弃牌,要么 GII。(GII 对于 SB 意味着全押(shove),对于 BB 意味着跟注)。然后得到奖励——这是玩家赢得的钱数,在临了的手牌中咱们将使用玩家的总筹码大小。举例,若是早先筹码大小为 S=10,SB 全押 BB 弃牌,则玩家的奖励分别为 11 和 9。
咱们领悟过模拟手牌组合来找到游戏的战术。咱们会同期处理两个玩家的惟恐手牌,让他们作念出对于怎样玩的决策,然后不雅察他们每次驱逐时最终得到若干钱。咱们将使用该信息来学习(预计)Q 函数 Q(S,A)。Q 的参数为情景 S 和动作 A,输出值为在该情景下接纳该动作时得到的最终奖励值。一朝咱们有 Q(或它的某种预计),战术取舍就很容易了:咱们不错评估每个战术,看哪一个更好。
是以,咱们这里的使命是预计 Q,咱们将使用 Q^(发音为「Q hat」)来指代这个预计。早先化时,咱们将惟恐猜度一些 Q^。然后,咱们将模拟一些手牌,两名玩家笔据 Q^ 作念出决定。每次手牌之后,咱们将和解预计值 Q^,以反应玩家在特定情景下接纳特定动作后赢得的本体值。最终,咱们应该得到一个很好的 Q^ 预计,这即是深信玩家战术所需的扫数内容。
这里需要珍摄极少——咱们要确保在扫数情景接纳扫数动作,每个情景-动作组合至少尝试一次,这么才能很好地预计出最终每个可能的值。是以,咱们会让玩家在一小段时辰ε内惟恐地接纳行径,使用他们(现时预计的)最恋战术。当先,咱们应该积极探索取舍的可能性,经常地惟恐取舍。跟着时辰的推移,咱们将更多地垄断咱们赢得的学问。也即是说成濑心美下马,ε将跟着时辰的推移而减弱。有好多门径不错作念到这极少,如:
Q 被称为「动作价值函数(action-value function)」,因为它给出了接纳任何特定动作(从任何情景)的值。它在大多量 RL 门径中有紧迫的作用。Q^ 怎样默示?怎样评估?是否在每次手牌之后更新?
特征:Q^ 的输入
当先,Q^ 的输入:情景和动作。将这个信息传递给 Q 函数,当作位置(比如,SB 为 1,BB 为 0),手牌编码(0 到 1325),动作(比如,GII 为 1,弃牌为 0)。不外,咱们将会看到,若是咱们作念更多的使命,会得到更好的驱逐。在这里,咱们用 7 个数字的向量描摹情景和动作:
由函数 phi 复返的向量φ将是 Q 函数的输入,被称为特征向量,各元素齐是特征(φ发音为「fee」)。咱们将看到,咱们取舍的特征不错在驱逐的质地上产生很大的不同。在取舍特征(称为「特征工程」)中,咱们垄断了相关问题的考虑领域学问。它和科学一样艺术化。在这里,咱们将判断哪些为考虑信息(在这种情况下)的学问用以下几种方式编码。让咱们来望望。
为便捷起见,第一个元素遥远为 1。琢磨接下来的四个元素。这些代表玩家的手牌。咱们一经从手牌编码调度为 rank1、rank2 和 isSuited。这三个变量期间上给出与手牌编码相通的信息(忽略特定的组合),但是该模子将更好地垄断这种花样的信息。除了原始排序,咱们还包含了 (|rank1-rank2|)^0.25。咱们正值知谈 connectedness 是德扑的紧迫属性,正如其名。此外,若是扫数特征齐量纲一致,该模子的学习遵守会更好。在这里,扫数的特征大致介于 0 和 1 之间,咱们通过将 rank 除以 numRanks 得到。
临了,若是 not isGII(即若是动作是弃牌),咱们本体上将这些数字确立为 0。咱们知谈,当玩家弃牌时,特定的持有手牌对驱逐莫得任何影响(忽略小概率的卡牌移除遵守),是以咱们在这种情况下删除无关的信息。
咫尺琢磨临了两个元素。第一个径直编码玩家的位置,但第二个同期取决于 isSB 和 isGII。为什么会这么?稍后咱们会流露这个「交叉项」的必要性。
对于 Q^ 的线性模子
咱们将学习一个线性函数用于预计的 Q^ 函数。这意味着咱们将信得过学习一个参数向量,世俗称为θ,它的长度(7)与特征向量相通。然后,咱们将针对特定的φ来预计 Q^ :
这里,下标 i 指代向量的特定元素,并将参数列表写为 (φ;θ),其默示 Q^ 的值取决于φ和θ,但是咱们不错认为是φ的函数,θ为固定值。代码很浮浅:
天然这个函数普遍使用,但是这个算法莫得什么稀疏之处,以使它成为这个问题的最好取舍。这只是其中一种门径:将某些学习参数与某些特征相聚拢以赢得输出,况且总计由咱们界说一个θ向量,使它产生咱们想要的输出。可是,正确取舍θ将为咱们很好的预计在有特定的手牌时接纳特定行径的价值。
模拟扑克游戏
咱们接下来要「玩」手牌了。咱们将在接下来的几个部分中进行,不外咫尺咱们先构建三个紧迫的见识。这些见识与 RL 问题的三个紧迫构成部分考虑:情景、动作和奖励。当先,情景——每次手牌,咱们将以惟恐发牌的方式早先化每个玩家的情景。
第二点,接纳动作。每个玩家将使用现时的模子(由 theta 给出)和已知的手牌和身份(为 SB)来取舍动作。在以下函数中,咱们预计 GII 和弃牌/FOLD(qGII 和 qFOLD)的值。然后取舍当下的最优项(1-ε),不然惟恐取舍动作。复返所接纳的动作,以及相应的价值预计和特征向量,这两项咱们之后会用到。
第三点,一朝咱们知谈每个玩家当下的手牌和动作,咱们就模拟剩下的手牌来得到玩家的奖励。若是任何一个玩家弃牌,咱们不错立即复返正确的奖励值。不然,咱们参考玩家的情景和奖励期许(equity),在正确的时辰段惟恐取舍一个赢家。
在玩家全押的情况下,咱们用小手段躲避了模拟。与通过使用 5 张全球牌本体模拟游戏并评估玩家的手牌来稽查谁赢不同,咱们咫尺笔据事前策动的概率惟恐取舍一个赢家。这在数学上是等价的(琐碎的证实忽略);这只是一个更便捷和更有策动遵守的门径。
最紧迫的是,咱们的学习流程莫得垄断这些 equity 或相关游戏章程的信息。正如咱们立时将要看到的那样,即使是总计模拟,学习流程也莫得什么不同,以致 智能体(agent)还会与外部黑盒的扑克游戏系统进行交互从而可能遵守不同章程!那么,学习流程究竟怎样进行?
学习:更新 Q^
一次手牌驱逐之后,咱们需要更新 theta。对于每个玩家,咱们已知其情景和接纳的动作。咱们还有动作对应的预计价值以及从游戏中赢得的本体奖励。从某种意旨上说,本体赢得的奖励是「正确解」,若是动作的预计价值与此不同,则咱们的模子有误。咱们需要更新 theta 以使 Q^(φ;θ) 更接近正确的谜底。
令 φ' 为一个玩家场所的特定情景,R 是她赢得的本体奖励。令 L=(R-Q^(φ;θ))^2。L 被称为吃亏函数。L 越小,R 越接近 Q^(φ;θ),若是 L 为 0,则 Q^ 恰好等于 R。换句话说,咱们想要微和解 θ,使 L 更小。(珍摄,有许多可能的吃亏函数,使得跟着 Q^ 越来越接近 R,L 越来越小。这里的吃亏函数只是一个常见的取舍)。
是以「更新 Q」是指改造θ使 L 更小。有不啻一种门径不错作念到这极少,一种浮浅的门径为惟恐梯度着落(stochastic gradient descent)。简而言之,其更新 θ 的章程是:
咱们需要取舍「超参数」α(称为学习率),它能落拓每次更新的幅度。若是α太小,学习速率很慢,但是若是它太大,则学习流程可能无法拘谨。将 L 代入到这个更新章程,并进行几行微积分策动,咱们得到
临了一瞥提供了更新参数的准则,咱们将依此编写代码。珍摄这里的 θ 和 φ 齐是长度为 7 的向量。这里更新参数的准则分别适用于每个元素。
整合临了,该整合扫数内容了。重叠以下要领:
1. 惟恐发给每个玩家手牌。
2. 令玩家各自取舍一个动作。
3. 得到驱逐。
4. 使用不雅测到的(情景,动作,驱逐)元组更新模子。
底下的函数 mc 达成了这种蒙特卡罗算法,并复返学习模子的参数 theta。
稀疏珍摄,上节推导出的参数更新章程在代码中得到了达成。
驱逐解释模子
本例中,固定 S=10。
咱们得到了数字,但是它们成心旨吗?本体上有几种门径不错匡助咱们判断,并通过它们得到一些模子的解释。
当先,咱们琢磨某些具体的情况。当 SB 弃牌(FOLD)时,它的预计值是若干?很容易得到,因为在这种情况下 φ 比较浮浅。本体上,除了第 1 个(固定为 1)和第 6 个(对应于 isSB)除外,扫数元素齐为 0:phi = [1,0,0,0,0,1,0]。是以,咱们的线性模子的 Q^ 仅相等于加总 theta 的第 1 个和第 6 个元素:
咫尺咱们知谈,笔据游戏的章程,SB 取舍弃牌的价值是 9.5。是以,额外酷,模子与实在情况额外接近!这是一个很好的逻辑判断,并用例子证实了怎样预计咱们模子可能的罪责值大小。
另一种情况:BB 弃牌。只须 phi 的第 1 个元素曲直零的,咱们发现一个预计值
天然不明晰正确的谜底应该是什么,除了知谈它深信应该在 9(若是 SB 老是 GII)和 10.5(若是 SB 老是弃牌)之间。事实上,这个数字更接近 9 而不是 10.5,这与 SB 更倾向于 GII 而不是相一致。
有一个更一般的门径来念念考每个 θ 输入。每个元素 θ_i 齐会酿成 Q^ 的增多,因为对应的特征 φ_i 会增多 1。举例,当有相宜的手牌同期实施 GII 战术时,θ 的第 5 个元素会增多 1。因此,有适持牌的预计奖励值是 0.22571655——一个小的正向奖励。看上去是合理的。
θ 的第 2 个元素(对应于玩家名次较高的手牌)是 6.16764962。这对应于特征:若是 isGII 则为 rank2/numRanks,不然为 0,道理为玩家名次较高东谈主牌时的 GII 战术。这里 rank2 除以 numRanks,是以特征每增多 1 约等于 2 和 ace 之间的差。以一个额外的 6 BB 加上 1 个 ace 而不是 2 来取得得手似乎是合理的。(但是,为什么你会以为有第二张更高的手牌显然是负的?)
查抄与第 6 个特征相对应的 θ 的元素(若是 isSB 则为 1,不然为 0),若是扫数其它特征十分,则在 SB 中的附加值显然为-0.15230302。咱们大要不错把这解释为位置上的错误:由于不得失当先接纳行径的小处分。
可是,其它一切并不一定相通。若是 SB 实施 GII 战术,则临了一个特征也非零。是以,-0.15230302 为 SB 实施弃牌时的附加值。当实施 GII 时,咱们转头临了一个特征的孝敬,发现奖励为-0.15230302 + 0.14547532 = -0.0068277。显然,当 SB 接纳更激进的战术时,位置错误就变少了!
咱们在这里看到,在本问题规模内,取舍成心旨的特征不错匡助咱们灵验地解释驱逐。道理的是,有一个被称为 SAGE 的老章程来玩德扑游戏。这个章程在锦标赛现场容易被记取。原则是为你的手构建「才气指数」,它按照顺子(rank)、同花(suitedness)和春联(pair)进行章程构建,然后用它来决定是否 GII。它们的特征组合与咱们的特征组合比较怎样?它们的驱逐怎样样?
临了,为什么咱们取舍 isSB 和 isGII 来决定临了一个特征,而不单是是 isGII?念念考如下。(BB,FOLD)的预计值只是 θ 的第 1 个元素,是以这个第 1 个元素需要能够松驰变化,以赢得正确的(BB,FOLD)值。那么,第 6 个元素是在 SB 中的额外孝敬,它需要能够松驰变化以赢得正确的(SB,FOLD)。
一朝咱们从弃牌调度到 GII,元素 2-5 变为非零情景,并笔据玩家和解为特定值,但这些决策通常适用于 SB 和 BB。该模子需要为 SB 全押提供一些不同于 BB 全押的决策。
假定咱们的最终特征为:若是 isGII 则为 1,不然为 0。这不取决于玩家,是以 SB 和 BB 的预计值之间的惟一各异将在于 isSB 项。这个数字必须琢磨在实施弃牌时 SB 和 BB 之间的各异,以及在实施 GII 时 SB 和 BB 之间的各异。模子必须在这两个各异之间挑选一个数字,最终可能会导致一些差的折中。相悖,咱们需要:若是 isGII 和 isSB 则为 1,不然为 0。这么,该模子不错划分 SB GII 与 BB GII 的增量值。
珍摄,该模子仍然无法拿获好多幽微的细节。举例,由于模子总计内置的函数花样,咱们看到的 GII 的预计值的各异在两个特定手牌组合下,如 A2 和 K2,对于 SB 和 BB 是总计相通的。非论θ的值怎样,咱们的模子齐不可能经营。
这么的模子有很高的偏差值(bias)。它是不生动的,况且有一个坚决的内置「不雅点」来决定驱逐将是什么花样。这即是为什么特征工程如斯紧迫。若是咱们莫得尝试为算法提供经心假想的特征,那么它大要就莫得才气表征一个很好的措置决策。
不错为模子添加更多的特征,如其它交叉项,以赢得偏差较低的模子,但这可能会带来弊端。这会很快失去可解释性,也可能会遭受更多的期间问题,比如过拟合。(天然,在多量使用中这并不是宽敞问题,准确性比可解释性更紧迫,而且有宗旨处理过拟合)。
可视化战术
要找到齐全的战术,咱们将评估该模子,以了解在每个玩家的 1326 种手牌组合中,GII 或弃牌哪个更好:
看上去,对于 SB,大致 55%的手牌取舍全押,而对于 BB,大致 49%的时辰取舍跟注:
临了,咱们不错生成一些 SVG 来在 Jupyter 环境中绘画 GII 范围:
偷拍视频咱们怎样取舍呢?这里有咱们期许的好多定性的特征:大的手牌很好、有春联很好、同花好于不同花、SB 比 BB 嘱咐松等。可是,界限线(borderline)手牌的嘱咐有时候会与在信得过的均衡战术中不同。
结语
这篇先容性的应用 RL 期间的著作给咱们提供了一些合理的战术来进行德扑游戏。该学习流程不依赖于任何结构或游戏章程。而是纯正地通过让智能体我方进行游戏、不雅察驱逐,并笔据此来作念出更好的决定。另一方面,紧迫特征工程需要一些领域专科学问才能学习一个好的模子。
临了,先容一些配景。许多相宜的问题齐不错发达为 RL 问题,也有许多不同的门径来措置它们。这里的措置决策可能具有以下特征:无模子(model-free)、基于价值的(value-based)、蒙特卡罗(Monte Carlo)、在战术(on policy)、无折现型(undiscounted),并使用线性函数贴近器(linear function approximator)。
无模子:agent 通过接纳行径和不雅察奖励来学习。它不需要任何干于怎样产生这些奖励的先验学问(举例对于诸如范围、权柄、以致游戏章程),也莫得试图急促地学习这些东西。在扑克游戏中,事实上咱们很了解某些手牌和动作能导致何种特定奖励(咱们不错垄断这极少),但是在许多其它情形中并不是这么。
基于价值的:咱们专注于找出每个情景下每个动作的价值,然后深信本体的战术,这或多或少是过后想法。还有基于战术的门径(如造谣游戏),其重心是径直学习在每个情景接纳的动作。
蒙特卡罗:咱们对扫数这个词手牌组合(情节)进行抽样,并笔据咱们在手牌后赢得的价值进行学习。「时序差分(temporal difference)」门径不错在手牌驱逐之前对扫数中间情景的预期值进行预计,况且不错更灵验地垄断这些值来学习。琢磨到每个玩家在驱逐之前只可在德扑游戏中进行单一动作,天然这对咱们来说并不紧迫,但它不错在更多的情景的问题上产生很大的影响。
在战术:咱们预计玩家战术的价值。本体上这并不浮浅。因为玩家有时候会接纳惟恐(非最优)的动作,是以咱们预计的价值不是最优战术的值,这不是咱们信得过想要的。即使在探索非最优取舍的同期,更为复杂的「离战术(off policy)」门径也不错了解本体的最优战术。
无折现型:大多量 RL 问题从始至终包含好多(可能无尽多)情景。天然,在这种情况下,agent 但愿最大化扫数明天奖励的总数,而不是最大化即刻奖励。在这种情况下,假定相对于将来的某个时辰赢得奖励,agent 对于当下赢得奖励的偏好较小。德扑游戏的一局手牌时辰老是很短,是以咱们不需要追想。
线性函数贴近器:本例中学习的是一个线性函数,它将(情景-动作)对的表征映射到数值。其它替代门径包括浮浅的表(它将每个情景的每个动作的预计数值单独存储),以及许多其它类型的函数贴近器。稀疏地成濑心美下马,这种门径在神经汇荟萃额外得手。在某种进程上,这是因为它们不需要好多特征工程来赢得好的驱逐。神经会聚世俗不错学习一组好的特征,以及学习到怎样使用它们!但本文暂不探讨这个话题。