机器学习:手撕 AlphaGo(二)

news2024/11/16 21:54:49

计算机下围棋的问题描述请见上篇:机器学习:手撕 AlphaGo(一)-CSDN博客

3. MCTS 算法介绍

MCTS(Monte Carlo Tree Search) 算法的中文名称叫做蒙特卡洛树搜 索。第一次接触这个算法时,便惊叹于它精巧的设计。而且这个算法在 AlphaGo 的设计中,有着不可替代的作用。图 3-7 是 MCTS 算法的常见迭代图,分为 selection,expansion,simulation,backpropagation 四个部分,我们这节讲这幅图里的故事。

图 3-7: MCTS 概览

3.1 深度有限的 v(s) 估计

它的思想: 根据小节 2.3.4 介绍的求解 v(s) 的方法,在计算节点 s 的值 v(s) 时,只向下考虑探索固定深度 d 层的节点,如果探索的最深节点 s 不 是叶子节点 (即不能判断出胜负),则通过人工设计的评估函数 o(s) 来估计 节点 s 的值 v(s) 。评估函数 o(s) 的设计很讲究技巧,一般会抽取一个状态 s 的明显特征。但在早期人工设计出来的评估函数 o(s) 和真实的值函数 v(s) 会差距很大。我们知道在小节 2.3.4 介绍的最优的 search 策略是在节点真实 值函数 v(s)  下得到, 如果评估函数 o(s) 和真实函数 v(s)  差距很大,那么在 深度有限的策略下,进行围棋 Tree 的搜索,将不能保证搜索结果的全局最优,结果可能会很差。

在该想法实际执行时,黑子和白子都通过摇色子(均匀分布)的方式选择子节点进行探索,所以输出的子节点完全是随机的。然后每个节点的值函数 v_n(s) 是子节点值函数 v(child(s,a)) 的期望:

与之对比,在精确求解值函数 v(s)  时,按照黑子取极大值,白子取极小值方式,这里取而代之用所有子节点值的期望方式。参考图 3-8 感受下具体的计算方式。

图 3-8: 通过均匀采样估计节点 s 的值 v(s)

这种方式的优点,减少了搜索的深度,降低了计算的节点数,使 Tree search 的思想可以应用到围棋上。但这种近似方法有个严重的不足: 估算的 节点值函数 v_n(s) 与真实的值函数 v(n) 的计算方式不同,值相差很远,或者说二者没有关系,同理参照 v_n(s) 值,在 Tree 上搜索时,得到的节点也 不是最优策略。MCTS 算法在继承它“减少搜索深度”思想的基础上,使估 计的值 \hat{v}(s) 与真实的 v(s) 更接近。接下来我们看看这个算法如何做到的。

3.2 MCTS: Selection

完整的围棋 Tree 很大,被我们计算的节点只有一部分。所以把我们计 算过的节点组成的 Tree, 叫做“已知 Tree”。selection 就是针对“已知 Tree” 上的节点进行搜索,比如当前棋局盘面处于节点 s,而且 s 是“已知 Tree” 的一个节点,那么对于黑子来说下一步的行棋动作可以在 s 的子节点中选 一个值 \hat{v}(child(s, a)) 最大的节点对应的位置。

同理对于白子来说,下一步的行棋动作可以在 s 的子节点中选一个值  \hat{v}(child(s, a))  最小的节点对应的位置:

这是正常的围棋 Tree 的搜索过程,完全利用 (exploration)“已知 Tree”的信息。对于一颗完整的围棋 Tree 这个方法没问题,对于一颗只有完整围棋 Tree 局部的“已知 Tree”来说,为了发现更好的解,还需要引入探索(exploitation) 的能力,即适当的时候,选择一些非 \hat{v}(s) 极大或者极小的节点。ϵ − greedy 可以很好的平衡 search 过程中的利用和探索:

式 3.4 中 \hat{v} 是 MCTS 中估计出来的节点值,用来近似围棋 Tree 中真正的值 v,N(s) 表示节点 s 被搜索到的次数,在一局(多局)对弈中节点 s 可能被搜 索多次,N(child(s, a)) 表示在节点 s 下采取 a 动作对应的子节点被访问的 次数,λ 是一个实数平衡利用和探索之间的权重关系。当一个节点 s 被访问 的次数 N(s) 很多,但它的某个子节点 N(child(s, a)) 访问次数很小,则更 容易选择这个访问次数小的子节点,从而达到探索未走过路径的目的。其实 这里也暗含一个假设:N(s) 越大的节点是好节点,好节点的所有子节点中,访问次数小的子节点可能也是一个好节点,所以要探索。

选择下一步的落子动作 a^* 常见的有两种策略。一种如式 3.5 在所有子节 点中选择最大 UCT 对应的动作; 另外一种方式如式 3.6 按照 UCT 权重对应 的分布采样一个新动作 a:

图 3-9 是 selection 的两个示例,用于加深理解。

3.3 MCTS: Expansion

“已知 Tree”最开始为空,然后在 MCTS 算法中长成一颗大 Tree, 那么 它是如何进行节点的分裂长成大 Tree 的呢?如果将“已知 Tree”上的所有 节点分类,可以分为 3 类:

  • a 类: 节点 s 在“已知 Tree”中,而且它所有子节点也在“已知 Tree” 中;

  • b 类: 节点 s 在“已知 Tree”中,而且它部分子节点在“已知 Tree”中, 存在一些子节点不在“已知 Tree”中;

  • c 类: 节点 s 在“已知 Tree”中,但它所有子节点都不在“已知 Tree” 中,c 类节点也是“已知 Tree”的叶子节点;

图 3-9: 图 3-7 对应的子图与一个 search 例子

在一棵“已知 Tree”上 search,如果遇到 a 类节点 s,已经不能为“已知 Tree”添加新的节点,只能继续按照公式 3.4 search 下一个动作。如果 search 到 b 类节点,随机选一个未在“已知 Tree”中的子节点作为新的叶子节点。 如果 search 到 c 类节点,与 b 类节点一样,随机选一个子节点加入到“已 知 Tree”中。我们可以确定“已知 Tree”新 Expansion 进来的子节点,均 是“已知 Tree”的叶子节点,而且新节点的选择方式除了随机添加外,也可 以设置其他策略,这里我们就不过多描述了。图 3-10 是 Expansion 的一个示 例, 帮助我们进一步理解。但“已知 Tree”的 b 类和 c 类节点 s 未必是完 整围棋 Tree 的叶子节点,即对弈还没有结束,那么这时该如何操作,才能估计新 Expansion 的叶子节点的值 \hat{v}(s),进而输出下一步棋的位置呢?

图 3-10: 图 3-7 对应的子图与一个 Expansion 例子

3.4 MCTS: Simulation

有的文献将这步也称作 Evaluation(评估)。Simulation 是从 Expansion 的新节点开始走到完整 Tree 的叶子节点 (游戏的终点) 的过程,从而达到快 速评估新节点值的目的,这个过程也叫做仿真。具体过程从 Expansion 的新 节点 s 开始,通过扔一个质地均匀的多面体骰子选择动作 a,从而得到下一 个子节点 child(s,a) ,不断地重复这个过程,直到走到完整 Tree 的叶子节 点,到达游戏的终点,记录游戏结果,完成一次仿真。像这种从 Expansion 的节点到完整 Tree 的叶子节点的仿真路径,需要大量生成。通过对仿真路 径的统计,计算 Expansion 新节点 s 的值 \hat{v}(s),常见的统计 Expansion 节点值的方法是: 计算仿真数据中赢的概率:

仿真数据越多,优点是 Expansion 的新节点估算的值 \hat{v}(s) 和节点的真实值 v(s) 越接近,\hat{v}(s)v(s)  的无偏估计,这由 Monte Carlo 采样定理保证。 这同时也解决章节 3.1 中手工评估函数的设计不足引入的缺点。但仿真数据 做的越多,中间消耗的计算资源、存储资源和时间资源等也越多,所以在 单步选择子节点时,策略越简单越好,比如这里介绍的“扔质地均匀的骰 子”是一种常用的简单策略。所以因为资源受限的问题,估计结果 \hat{v}(s) 不能无限逼近真实值 v(s),估计结果的准确性和计算资源之间需要做一次权衡。图 3-11 是 Simulation 的一个示例, 帮助我们进一步理解。

图 3-11: 图 3-7 对应的子图与一个 Simulation 的例子

3.5 MCTS: BackPropagation

对 Expansion 节点 s 的仿真,也等于间接对中 s 到 root 节点的 path(唯 一的一条节点路径) 上所有节点的仿真,所以在通过仿真的方式获取节点 s 的估计值 \hat{v}(s) 后,对 path 上其他节点也要做相应的值更新, 这就是 BackPropagation(值的回传)。BackPropagation 可以充分有效的利用每次仿真,使节点估计值 \hat{v} 更加近似节点真实值 v(s) 。

图 3-12: 图 3-7 对应的子图与一个 Back-Propagationn 的例子

具体更新过程如图 3-12b 所示,从扩展(Expansion)节点 s 到 root 节点 只有一条 path, 路径上所有节点的仿真总数 +1,即分母 +1。这是一颗游戏 Tree, 有黑白两种节点交替出现在不同层,图中的 Expansion 节点为白色,且仿真时,白色节点赢了,所以对于到 root 节点的 path 中,白色节点的分子 +1,黑色节点分子保持不变。

3.6 MCTS 算法用在围棋上的局限

对比章节 3.1 深度有限的估计方法和 MCTS 算法,我们应该明白 MCTS 算法如何在“减少搜索深度”的基础上,将节点 s 估计值 \hat{v} 变为真实值 v 的 一个无偏估计。那么这个算法是完美的么?不完美。这个算法大量的计算和 时间花费在 Simulation 这一步,对于像围棋这种有时间限制的游戏,会严重 影响 MCTS 的输出效果。所以接下来的问题: 在围棋比赛中,选手思考时间 有限的情况下,如何修改 MCTS 算法,使它可以输出更好的解?DeepMind 团队给出的答案:用比赛前学习的方法来降低比赛中 Simulation 的依赖。

4. AlphaGo 算法介绍

根据章节 3.6 的局限分析,我们来看看 AlphaGo 是如何利用比赛前学习 的方法,使其降低对 Simulation 的依赖。回顾 MCTS 的过程,有两个关键的操作,一个是下一个动作 a 的选择, 另外一个是通过 Simulation 估计当前围棋状态的值。在 AlphaGo 中,通过一个 Policy Network 计算下一个动作 a 的分布,即输入一个节点状态 s,输出 p(a_t |s_t)。使用一个 Value Network 计算一个节点 s 的评估 \hat{v}(s) ,即当前这个盘面胜的概率。Policy Network 与 Value Network 均可以通过历史围棋对弈数据集进行学习。然后再结合 MCTS,从 而诞生打败李世石的 AlphaGo。

4.1 Policy Network 与 Value Network 的故事

在 2015 年左右,CNN,resnet 等可以提取到很好的图片特征,对图片 识别的效果有很大的进步,自然而然,是否可以训练一个网络下围棋呢?如 我们在章节 2.3 介绍,计算机下围棋主要有两个挑战,一个挑战是完整“围棋 Tree”太大,另一个挑战是很难判断一个围棋局面 (节点状态 s) 的好坏。最 初的想法希望直接训练两个神经网络 Policy Network 和 Value Network,输入都是局面状态 s,Policy Network 输出是下一步的落子位置 p(a|s) 和 Value Network 输出是对 s 的评估结果,是一个实数。采用 KGS 专业五段以上棋 手的对弈记录作为数据集,大约有 16 万场带有胜负结果的对弈,约有 3000 万落子步骤 (s_i,a_i) 。

4.1.1 Policy Network 的故事

针对 Policy Network,最开始采用监督学习的思想, 预测下一步的落子位置,用最大似然(likelihood)和 SGD 的方法训练。使用 3000 万的落子数据对 (s_i,a_i) 作为训练数据,损失函数用 negtive log likelihood loss:

分别训练一个大的 12 层 CNN 模型 p_\sigma 和一个小的线性逻辑回归模型 p_\pi, 如图 4-13。 p_\sigma  在实际训练时,手工从围棋盘面 s_i 中抽取 48 种特征,输入 CNN 网路,并且在在 50 块 GPU 上训练了 4 周左右,最终在达到 57% 的 精确度,比当时 state-of-art 44% 好很多。p_\pi 在测试集的精度只有 24% , 但 它的优点是执行速度快,在 2us 内输出一步落子的位置,这个输出速度很快,比如我们要仿真 1 万局对弈,平均每局对弈 100 步,总体仿真时间只 需 2s。相对于大模型 p_\sigma ,小模型 p_\pi 很适合做仿真采样, 而且 p_\pi 策略会比均匀随机采样好很多。

图 4-13: 监督训练 policy network

但监督学习的 Policy Network 并不完美,这会严重影响模型的围棋能力,模型两个明显的不足:

  • 训练数据量小,虽然有 3000 万个数据对 (s_i,a_i) ,但只有 16 万场的对弈数据,这不足以训练一个大的神经网络;

  • 围棋对弈是一个序列决策过程 \tau = (s_0, a_0, r_0, s_1, ...), p_\sigma 和 p_\pi 不能提取序列决策的前后特征信息;

为了解决数据少的问题,用第一个监督学习的 p_\sigma 进行自对弈,可以产生大量新的对弈棋局,从而解决数据不足的问题。强化学习学习中的 policy gradient(策略梯度) 可以很好的学习序列决策的任务。用监督学习得到的 CNN 模型 p_\sigma 作为初始化参数,采用 policy gradient 的方法,在大量的数 据上训练,于是便产生了强化学习版的 Policy Network p_\rhop_\rho 的损失函数如下:

其中 z 是一场对弈结果;\tau 是一场对弈数据,\rho 是网络待学习参数。关于 policy gradient 更详细的介绍,大家可以查看其他同学的博客,这里我们先 理解 AlphaGo 的设计思路。强化学习训练的 p_\rho 与监督学习得到的 p_\sigma 对弈时,有 80% 概率获胜,大约达到业余三段的水平。

4.1.2 Value Network 的故事

Value Network 是为了评估一个围棋上状态 s 的好坏,即输出黑子 (或者白子) 胜的概率。为了学习到更准确的 Value Network,采用强化学习训练的 p_\rho 进行自对弈,大约自对弈了 3000 万场,从每场对弈中随机抽取一 个状态 s 作为输入,对弈结果 z 为 label,采用 12 层的 CNN 作为模型的 主体结构,损失函数为 MSE:

50 个 GPU 训练 1 周,得到有史以来第一个准确的围棋状态评估函数 v_\theta (s) , 这在当时是不能想象的。但盘面评估函数 Value Network 怎么用呢?

图 4-14: 从监督的 Policy Network p_ \pi 和 p_\sigma 到 RL 版 Policy Network, 然后 再到 Value Network v(\theta )  的过程

到这里 Policy Network 与 Value Network 的故事讲完了,如图 4-14。但即使 RL 得到的 Policy Network p_\rho  也只是业余 3 段的水平,还不足以打败专业选手。那么再此基础上 DeepMind 做了哪些操作,使 AlphaGo 的效果得到巨大的提升,从而击败人类呢?答案是在 Policy Network 与 Value Network 基础上,再结合 MCTS 的方法,便达到击败人类的水平。那么 Policy Network 与 Value Network 具体与 MCTS 怎么结合呢?带着么个问题,我们继续看下面的故事。

4.2 AlphaGo 中的 MCTS 的故事

如我们在章节 3 介绍,MCTS 算法会把大量的时间花费在 Simulation 上,从而在思考时间有限的围棋对弈中影响算法的输出效果。为了在有限的时 间内提升围棋的思考效果,我们需要提升 Monte Carlo 采样的效果,达到在有限的时间内使估计的节点值更准确,而且还要降低搜索的宽度,更合理的 “探索利用权衡”的设计等,如图 4-15。我们看看在 Policy Network 和 Value Network 的帮助下,如何解决 MCTS 思考时间有限的问题。

图 4-15: AlphaGo = MCTS + Policy Network + Value Network

Selection: 与原 MCST 相比,修改了动作选择式 3.4 和式 3.5 的计算方法, 具体选择下棋动作 a_t 的方式:

公式 4.4 和公式 4.5 参数含义如下:

  • (s_t ,a) 表示在 s_t 状态下执行 a 动作得到下一个时刻的状态,即 s_t 的子节点 s_{t+1} 的状态;

  • Q(s_t ,a) 是节点 s_t 的子节点 s_{t+1}  的 MCTS 估计值,多轮 MC simulation 的结果的加权平均值;

  • P(s_t ,a)  是节点 s_t 的子节点 s_{t+1}  被选择的概率,由监督学习得到的 Policy Network pσ 输出;

  • N(s_t ,a)  是节点  s_t 的子节点 s_{t+1}  在 search 中被选择的次数,初始值 为 0;

对于一个特定的节点 s_t 和动作 a,P(s_t ,a)  的值是固定不变。所以刚开始时 N(s_t ,a)  比较小,对于 P(s_t ,a)  比较大的子节点,u(s_t ,a)  的值相对较大,从 而达到探索 p_\sigma 输出的高概率动作的目的。随着 search 轮数的增多,子节点 (s_t ,a) 被选中的次数 N(s_t ,a)  变大,相应 u(s_t ,a)  变小,会更依赖 Q(s_t ,a)  的值选择下一个动作,从而降低“探索”倾向,达到倾向“利用”的目的。 所以修改后的公式也有权衡“探索”和“利用”的功能。

Expansion: 在 MCTS 原算法中,如果 search 到叶子节点或者子节点 不全在“已知 Tree”的节点时,一定会 expansion 一个新叶子节点出来。在 AlphaGo 中,search 到叶子节点时也会 expansion 新的节点,但在遇到子节点不全在“已知 Tree”的节点时,可能会 expansion 新叶子节点,也可能不 expansion 新的叶子节点。这由于 p_\sigma 计算所有的动作 a 的落子概率, 从而不论节点 s_t 的子节点是否在“已知 Tree”中,均可以计算出公式 4.5 的 u(s_t ,a)  ,不在“已知 Tree”的子节点 child(s_t , a_{out}) 的 Q = 0;在“已知 Tree” 中子节点 child(s_t , a_{in})  的 Q(s_t , a_{in}) 值为节点记录值,且 u(s_t , a_{in})  随着被 选中的次数增多而减小, 所以存在可能:

这时便会扩展一个新的节点。另外一种 expansion 策略,若“已知 Tree”中 节点 s, 被选中的次数大于阈值 T, 且节点 s 还存在子节点 child(s, a_{out}) 不 在“已知 Tree”中,则 expansion 落子概率最大的子节点。这两种扩展策略 都可以达到减小搜索宽度的目的。

Simulation: 在原 MCTS 中,这步只有仿真。但在 AlphaGo 中,则使 用 p_\pi 和 v_\theta (s)  达到仿真与盘面评估结合的目的:

公式 4.7 参数含义如下:

  • s_L 表示 expansion 新添加的叶子节点;

  • v_\theta (s_L) 是 Value Network 对节点 s_L 的评估结果;

  • z_L 是仿真数据得到的结果,采用 Policy Network 小模型 pπ 进行仿真;

  • \lambda 是权衡 v_\theta (s_L) 与 z_L 的超参数;

  • V(s_L)  表示每次仿真得到的叶子节点的值;

相对于原 MCTS 的 Simulation,主要有两点改动: 第一点引入了围棋盘面 评估函数 v_\theta,而且这个评估函数效果很好;第二点在仿真时,用 p_\pi 替代均 匀分布, p_\pi 由人类数据训练得到,与真实落子分布更接近,所以效果上要比均匀分布好,而且单步输出只有 2us, 适合作为仿真用。这些改动给计算 机围棋带来了显著的提升。

BackPropagation:AlphaGo 的 BackPropagation 与原 MCTS 的 BackPropagation 很像,更新每个节点的  Q(s_t , a) :

公式 4.8 和公式 4.9 的参数含义如下:

  • i 表示第 i 次 MCTS,每次包含 selection, expansion, simulation, backpropagation 四步;

  • I(s, a, i) 为示性函数,如果在“已知 Tree”第 i 次搜索时,访问节点 child(s_t , a),函数值为 1,否则函数值为 0;

  • N(s_t , a)  为在进行了 n 次 MCTS 时,“已知 Tree”中节点 child(s_t , a) 被访问的次数;

  • Q(s_t , a) 是经过 backpropagation 后,节点的值;

由公式 4.9 可以知道,每次仿真结束,会利用计算到的 V(s_L) 更新第 i 搜索 路径上的所有节点的 Q 值。而且整个过程可以在集群中并行,在比赛时可 以加快“已知 Tree”的生成,减少搜索时间。

最后借助图 4-16 我们再来欣赏下,被 DeepMind 修改后的 MCTS 的全 过程。读到这里,我们应该了解这副图片中发生的故事细节了。

图 4-16: AlphaGo 的 MCTS 全过程

4.3 AlphaGo 中 RL 的思想

现在我们了解了 AlphaGo 的全部的设计脉络,知道了 AlphaGo = MCTS + Policy Network + Value Network 的具体含义。但可能心中会 有一些问题没消除:大家都说 AlphaGo 使用了 RL(强化学习) 我们撕 AlphaGo 的技术细节,似乎没有感觉到它使用了强化学习,那么 AlphaGo 在 哪些地方使用了 RL?又是如何使用的 RL 知识。这里说下我的浅显认知, 若有不对的地方请帮助指出来。

RL 建立在 MDP 模型上,MDP 有五元组 < S,P,A,r,γ >, 而且还有 policy  \pi = p(a|s)  和策略 \pi 对应的值函数,值函数包括状态值函数 V^\pi (s) 和动作值函数 Q^\pi (s, a) ,在 MDP 五元组信息完全已知情况下,希望求出最 优策略 {\pi} ^{*} 和最优值函数  {Q}^{*} (s, a)  or V^* (s),这是 model- base(基于模型) 的求解。若 MDP 五元组中转移概率 P 未知或者奖励函数 r 未知, 不能 使用 Bellman 方程求解,则认为解决这样的 MDP 问题是 model-free(免模型)。可以将围棋问题建模为 MDP,而且又因为转移概率 P 未知,所以需 要 model-free 的方法求解。在 AlphaGo 中,求解 Policy Network p_\rho 使用 了 RL 中策略梯度定理,即公式 4.2;AlphaGo 中的值函数 v_\theta (s) 也和 RL 值函数一样: 表示从当前状态到终点状态的收益,所以求解方法中,可以使用 Monte Carlo 采样和时间差分等算法,这也是 RL 中的知识。自对弈应该对 应 RL 中的 Monte Carlo 采样。

4.4 AlphaGo 不完美的地方

基于 2015 年深度学习的发展,AlphaGo 有很多不太完美的地方。比较 明显的问题:AlphaGo 与 MCTS 结合后,Simulation 时,还需要小策略网络 p_\pi 进行仿真,没有完全消除深度上的搜索;提取围棋特征时,还有很多的手工特征,这点也很不完美。在 AlphaGo 面世后,后续相继出来了 resnet,BN 等深度学习的技术,这些新技术可以为深度学习带来很大的进步。于是这些不足和新技术,一起为 AlphGoZero 的诞生埋下伏笔。

5. 结语

AlphaGo 的故事只是一个开始,后续诞生的 AlphaGo Zero,AlphaZero,MuZero 使技术一步步深度,并且让故事更加精彩。因为时间问题,针对 AlphaGo 后续的模型不能展开叙述,期望在下一个假期,将后续 3 个模型也补充进来。在探索过程中,难免存在理解狭义或者误解的地方,还请大家帮助指出。 今年(2023)中秋和国庆连在一起,一共有八天假期,用了七天的假期探索 AlphaGo 系列,并在此期间完成这篇博客。用这篇博客,作为今年这 个国庆假期的一个纪念。感谢家人在假期对我的支持,使我对整个技术脉络可以充分的探索和学习。

6. 参考文献

[1] Roger Grosse: CSC 311: Introduction to Machine Learning, https://www.cs.toronto.edu/~rgrosse/courses/csc311_ f20/slides/lec12.pdf   

[2] DavidSilver: AlphaGo-tutorial-slides_ compressed, https://www.davidsilver.uk/wp-content/uploads/2020/03/AlphaGo-tutorial-slides_ compressed.pdf 

[3] Mastering the game of Go with deep neural networks and tree search, https://storage.googleapis.com/deepmind-media/alphago/AlphaGoNaturePaper.pdf 

[4] Mingsheng Long: Deep Learning http://ise.thss.tsinghua.edu.cn/ mlong/ 

[5] Browne, Cameron B. and Powley, Edward and Whitehouse, Daniel and Lucas, Simon M. and Cowling, Peter I. and Rohlfshagen, Philipp and Tavener, Stephen and Perez, Diego and Samothrakis, Spyridon and Colton, Simon: A Survey of Monte Carlo Tree Search Methods https://www.researchgate.net/publication/235985858_A_Survey_of_Monte_Carlo_Tree_Search_Methods 

[6] Bryce Wiedenbeck:CS 63: Artificial Intelligence https://www.cs.swarthmore.edu/b̃ryce/cs63/s16/slides/2-15_MCTS.pdf 

[7] jefft: Introduction to Monte Carlo Tree Search https://jeffbradberry.com/posts/2015/09/intro-to-monte-carlo-tree-search/ 

7. 团队介绍

「三翼鸟数字化技术平台-智慧设计团队」依托实体建模技术与人工智能技术打造面向家电的智能设计平台,为海尔特色的成套家电和智慧场景提供可视可触的虚拟现实体验。智慧设计团队提供全链路设计,涵盖概念化设计、深化设计、智能仿真、快速报价、模拟施工、快速出图、交易交付、设备检修等关键环节,为全屋家电设计提供一站式解决方案。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1368601.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

使用echarts制作柱状图、折线图,并且下方带表格

实现效果: 调试地址: https://echarts.apache.org/examples/zh/editor.html?cline-simple 源码: option { title: { left: center, top: 0, text: 2022-05月 制造产量 达成情况(单位: 吨) (图1)\n\n集团目标产量: 106,675吨 集团实际产量: 2,636吨, text…

NVIDIA官网如何下载所有历史版本的驱动,包括上古化石版本?

NVIDIA官网如何下载所有历史版本的驱动&#xff0c;包括上古化石版本&#xff1f; 1.软件环境⚙️2.问题描述&#x1f50d;3.解决方法&#x1f421;4.结果预览&#x1f914; 1.软件环境⚙️ Windows10 教育版64位 GeForce GTX 1060 (Notebooks) Chrome 120.0.6099.199&#xff…

Linux限制用户可用硬盘空间

为了防止某个用户占用大量资源导致其他用户无法正常使用&#xff0c;一般会对单个用户可占用资源进行限制。就磁盘限额&#xff0c;XFS文件系统原生支持目录级别的限制。ext文件系统不支持目录限制&#xff0c;曲线方式是限制用户的总占用空间。 本文介绍使用quota程序限制用户…

【银行测试】金融项目测试注意点汇总,一篇带你不再背锅

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 1、数据保护 在测…

vue3 +TS 安装使用router路由模块

一.安装 1.下载安装依赖 npm install vue-routernextnpm install types/vue-router2.router目录创建 在src 目录下 创建 /src/router文件夹 包含两个文件 route.ts import { RouteRecordRaw } from vue-routerconst routes: Array<RouteRecordRaw> [{path: /,name:…

Pytorch种torch.cat与torch.stack的区别

torch.cat 和 torch.stack 是 PyTorch 中用于拼接张量的两个不同的函数&#xff0c;它们的主要区别在于拼接的方式和创建的维度。 torch.cat&#xff1a; 拼接方式&#xff1a; torch.cat 是按照给定的维度&#xff08;dim 参数&#xff09;将多个张量沿着该维度拼接。在拼接的…

快手在线查权重源码,附带查询接口

源码介绍 新增了用户访问 IP 和时间的统计功能。要使用此功能&#xff0c;只需将“bygoukai.sql”数据库导入源码中&#xff0c;然后修改“config.php”文件中的数据库用户名、密码和数据库名即可。如果需要修改水印&#xff0c;可以在第40行进行更改。要修改查询限制&#xf…

Qt连接数据库(内含完整安装包)

遇到问题必须多思考 这里是最全的Qt连接数据库步骤 qt下载地址 链接&#xff1a;https://pan.baidu.com/s/1wdnTfyL9MQlNOCrSmIOxrQ?pwddgqi 提取码&#xff1a;dgqi --来自百度网盘超级会员V1的分享 数据库百度网盘地址 链接&#xff1a;https://pan.baidu.com/s/1orCczey…

C#VS2022 打包成安装包

步骤参考&#xff1a;VisualStudio&#xff08;2022&#xff09;- 打包项目文件为.exe安装包_vs2022打包exe-CSDNja 步骤参考上方链接&#xff0c;不过在Application Folder文件夹中加的是\项目名称\bin\Debug\下的全部文件&#xff0c;其他地方一样。 最终生成的安装包在Deb…

蓝桥杯省赛无忧 竞赛常用库函数 课件5 排序

01 sort简介 02 sort的用法 sort(起始地址&#xff0c;结束地址的下一位,比较函数);默认用小于号#include<bits/stdc.h> using namespace std; int main(){int a[1000];int n;//读取数组大小cin>>n;//读取元素for(int i1;i<n;i)cin>>a[i];//对数组进行排…

记录一次接近24万条数据导入Mysql的过程

由于开发项目的需求&#xff0c;之前有部分数据要写入阿里云的表格存储&#xff0c;过了一年多时间&#xff0c;表A的数据量接近24万条&#xff0c;现在需要将表A的数据转到Mysql中。 利用官方工具导出数据后&#xff0c;发现文件里面有238999条数据&#xff0c;文件大小是460…

C++之​虚函数

虚函数是C中的一个重要概念&#xff0c;它主要用于实现多态。在基类中声明一个虚函数&#xff0c;派生类可以重写这个函数&#xff0c;从而实现不同的功能。当基类指针或引用指向派生类对象时&#xff0c;调用虚函数会根据实际对象类型来调用相应的派生类中的函数实现&#xff…

DVWA-Hight-DOM型XSS漏洞

首先打开hight模块的DVWA,并来到DOM型XSS漏洞处 首先试探 这里普通的js代码被过滤 再利用img试探 同样被过滤 这里后端代码不太可能将所有可能利用黑名单的形式全部写入过滤代码中&#xff0c;所以这里后端的过滤代码大概率是白名单&#xff0c;也就是除了这个下拉列表中的名单…

Excel5:自动化周报的制作

自动化周报的数据引用来源于8月成交数据-纯数值表格&#xff0c;因为8月成交数据表格中部分单元格中有vlookup函数&#xff0c;且存在跨表连接。 对于跨表连接的解释和说明&#xff1f; 首先打开我们之前做好的成交数据。打开后我们可以看到这上面出现了一个安全警告&#xff0…

“感恩同行 年度回馈” 中国善网开展“优秀公益伙伴”征集活动

2024年1月5日-1月15日&#xff0c;中国善网正式开展为期10天的2023年度“优秀公益伙伴”征集活动&#xff0c;此征集活动主要面向中国善网所有的注册会员单位。光阴荏苒&#xff0c;时光流逝&#xff0c;回首中国善网现已成立七年之久&#xff0c;截止目前为止&#xff0c;中国…

【ROS】小车机器视觉巡线行驶

摄像头 USB摄像头是最普遍的摄像头&#xff0c;如笔记本内置的摄像头&#xff0c;在ROS中使用这类设备很简单&#xff0c;可以直接使用usb_cam功能包驱动&#xff0c;USB摄像头输出的是二维图像数据。 usb_cam是针对V4L协议USB摄像头的ROS驱动包&#xff0c;核心节点是usb_cam…

web端播放rtsp视频流(摄像头监控视频)教程

文章目录 前言一、ffmpeg是什么&#xff1f;二、ffmpeg安装1.下载2.安装 三、node搭建websocket服务四、web客户端播放视频 前言 像海康大华一些摄像头或者直播源 为rtsp视频流&#xff0c;想在web上播放必须进行协议转换。已知一些方案例如rtsp转rtmp需要flash&#xff0c;现…

杨中科 ASP.NET Core 中的依赖注入的使用

ASP.NET CORE中服务注入的地方 1、在ASP.NET Core项目中一般不需要自己创建ServiceCollection、IServiceProvider。在Program.cs的builder.Build()之前向builderServices中注入 2、在Controller中可以通过构造方法注入服 务。 3、演示 新建一个calculator类 注入 新建TestC…

伦茨Lenze驱动器维修EVS9324-ES D-31855

Lenze伦茨驱动器常见故障修理&#xff1a; 伦茨伺服驱动器维修&#xff0c;主电路上电检修注意事项&#xff1a;逆变模块与驱动电路在故障上有关联性。当逆变模块炸裂损坏后&#xff0c;驱动电路势必受到冲击而损坏&#xff1b;逆变模块损坏也可能正是因驱动电路的故障而造成的…

使用Android Compose实现网格列表滑到底部的提示信息展示

文章目录 概述1 效果对比1.1 使用添加Item的办法&#xff1a;1.2 使用自定义的方法 2. 效果实现2.1 列表为空时的提示页面实现2.2 添加Item的方式代码实现2.3 使用自定义的方式实现 3. UI工具类 概述 目前大多数的APP都会使用列表的方式来呈现内容&#xff0c;例如淘宝&#x…