当前位置: 首页 > news >正文

Alphago Zero的原理及实现:Mastering the game of Go without human knowledge

近年来强化学习算法广泛应用于游戏对抗上,通用的强化学习模型一般包含了Actor模型和Critic模型,其中Actor模型根据状态生成下一步动作,而Critic模型估计状态的价值,这两个模型通过相互迭代训练(该过程称为Generalized Policy Iteration GPI过程),最终将收敛到某个近优的点。

但对于围棋游戏来说,早些年很多人作为通过计算机来战胜人类顶尖棋手是不可能的,因为围棋总共下法大概在$9.593*10^{104}\sim2.08*10^{170}$范围,比可观测宇宙的原子数目都要大很多,如此巨大的状态空间和动作空间,通过传统的强化学习方法来进行探索几乎是不可能的。

早期Alphago所采用方法是先通过监督学习专家决策序列,然后再通过强化学习策略来优化。而Alphago Zero是Alphago的升级版,它完全依赖自我对弈的强化学习,无需人类专家的动作监督。

Alphago Zero通过采用MCTS策略,从大量的动作空间中搜索当前最优的动作序列,然后让模型根据这些最优动作序列进行训练,不需要先监督学习专家决策,就能通过自我学习达成最优的效果。

Alphago Zero的训练主要分为了self-play、训练网络和网络评估三个阶段:

1. self-play阶段

在self-play阶段,采用了一种高效样本探索策略MCTS(Monte Carlo Tree Search),其从庞大的动作空间中寻找出当前最优的动作序列,并将其作为后续强化模型训练的优质样本。通过这种方式,MCTS能够在大规模、复杂的环境中做出明智且有效的决策,并帮忙逐步优化强化模型的学习。

在每轮self-play过程中,都会通过MCTS策略采样生成一系列的游戏轮数,每轮游戏都是指游戏结束(直接出现获胜者)或者游戏步数达到设定最大值(以当前游戏得分判定获胜者)。

每轮游戏都包含围棋双方在整轮过程全部(状态State、动作Action、价值Value)元组,其都是根据MCTS策略进行决策和计算的。每轮游戏在开始前,会构建一个搜索树,然后依次根据当前状态决策动作,具体决策动作方式:

在每轮self-play过程中,通过MCTS策略进行采样,生成一系列的游戏轮次。每轮游戏以两种方式结束:一是游戏直接出现获胜者,二是游戏步数达到设定的最大值,此时根据当前游戏得分判定获胜者。

每轮游戏都会记录下围棋双方的完整过程,包括每步中状态State、动作Action和价值Value等信息,这些数据都是基于MCTS策略进行决策和计算的。

  1. 状态State:这是围棋的当前局面,包括棋盘上的黑白棋子布局、提子情况等。

  2. 动作Action:这是围棋的下一步行动(如落子在棋盘的某个位置)。

  3. 价值Value:当前状态下的获胜概率

每轮游戏在开始之前会构建一个搜索树,然后根据当前状态依次决策动作。具体决策动作的方式如下:

  • 动作选择概率$p(a_t^i|s_t)$计算,其中Z是归一化因子,$\tau$是温度控制的超参数,可以随着本轮动作进行,会越趋向于选择概率最大的动作。

\left\{\begin{matrix} \frac{1}{Z}U(s_t,a_t^i)^{\frac{1}{\tau^t}} & \text{if } {\tau}^t > 0.1 \\ 1.0 & \text{if } {\tau}^t \leq 0.1 \text{ and } a_t^i=argmax_{a_t^i} U(s_t,a_t^i) \\ 0.0 & \text{if } {\tau}^t \leq 0.1 \text{ and } a_t^i \neq argmax_{a_t^i} U(s_t,a_t^i) \end{matrix}\right.

  • U(s_t,a_t^i)=\frac{1}{Z_N}N(s_t, a_t^i)
  • $N(s_t, a_t^i)$的计算逻辑:
  • 如果$s_t$已经在搜索树中,即该轮游戏已经探索。
    • 选择最优的动作,此时为$(s_t, a_t^i)$的一次访问$a_t^i|s_t=argmax_{a^j} Q(s_t, a_t^j) + c_{puct} P(s_t, a_t^j)\frac{\sqrt{\textbf{N}(s_t)+1}}{N(s_t, a_t^j) + 1}$
    • $c_{puct}$是一个平衡先验后验动作概率的超参数。
    • $W(s_t, a_t^i)+=\pm v_{\phi}(s_{t+\tau})$表示当前状态-动作的价值估计累计值,$\tau$表示从$(s_t, a_t^i)$继续探索直到遇到一个未探索的结点,$\pm$表示当未探索结点为对手状态时取负号,否则为正号。

    • $N(s_t,a_t^j)$表示当前状态-动作在本轮游戏的访问次数,每轮访问后$+1$

    • $\textbf{N}(s_t)=\sum N(s_t,a_t^j)$表示当前状态的本轮游戏的访问次数

    • $Q(s_t, a_t^i)=\frac{W(s_t, a_t^i)}{N(s_t, a_t^i)}$

    • $P(s_t, a_t^j)=\frac{1}{Z_p}p_\theta(s_t,a_t^j)$表示归一化的模型先验预估动作概率

  • 如果$s_t$不在搜索树中,即未被探索。

    • 通过模型求解$v_{\phi}(s_{t+\tau})$$p_\theta(s_t,a_t^j)$,并返回。

  • 上述过程也可以用select、expand、Backup、play四个阶段来表示:

    • Select:表示选择最优的动作$a_t^i|s_t$
    • Expand:表示在选择最优动作后,一直继续探索直到一个未探索的结点,通过模型预估其先验动作概率$p_\theta(s_{t+\tau},a_{t+\tau}^j)$及状态价值$v_\phi(s_{t+\tau})$,如果是中途遇到已探索的结点,通过Select选择最优的动作。
    • Backup:表示在探索直到一个未探索的结点后,沿路径更新树上各状态结点的$W(s_{t...\tau}, a_{t...\tau}^i)$$N(s_{t...\tau}, a_{t...\tau}^i)$
    • Play:该轮游戏采样并确定动作,进入下一状态。

2. 训练网络阶段

经过每轮self-play后,会生成一系列的游戏轮数,每轮游戏都会保存正反双方在每步的状态$s_t$、动作概率$\bold{p}(a_t|s_t)$、价值$v(s_t)$,作为此轮网络训练阶段的数据,其中:

$v(s_t)=w*\frac{\min(5, T)}{5}+e*(1-\frac{\min(5, T)}{5})$

  • $w$表示当前状态$s_t$所属棋方最终是否胜出,其值为$-1,0,+1$,分别表示负平胜。

  • $e$表示根据该轮游戏在过程中的双方的得分数归一化的值。

  • $T$表示该轮游戏总共的走子数,该项主要是为了平衡初始开局的噪声。

最终loss包含了三个部分:动作分类交叉熵损失、价值预估的MSE损失、参数正则项

$Loss(\theta,\phi)=-\bold{p}^T(s_t,a_t)\log(\bold{p}_{\theta}(s_t,a_t))+(v(s_t)-v_{\phi}(s_t))^2+c\|\theta,\phi\|^2$

3. 网络评估阶段

该阶段主要判断上述经过新一轮训练后的新模型是否是最优,如果是最优的替换最优模型进入下一轮的self-play阶段。

评估最优的方式同self-play阶段是类似的,每一步动作都是还需要通过MCTS策略来进行决策。只不过正反双方分别基于基线模型和更新模型来进行比较。

4. 特征组织形式

  • 状态$s_t$的维度为$19\times19\times17$,其中$19\times19$表示围棋棋盘的二维结构,并在第3维叠加黑白双方在过去8步的位置信息,另外为了区分当前走子是黑子还是白子,增加了一维来标识。

  • 动作$a_t$的维度为$19\times19+1$,表示在$19\times19$棋盘中下子的位置以及不走子的动作。在实际决策动作时,会直接将不合法的动作概率置为0。

5. 模型结构

  • 输入卷积层:

  • 残差模块层

  • policy层

  • value层

相关文章:

Alphago Zero的原理及实现:Mastering the game of Go without human knowledge

近年来强化学习算法广泛应用于游戏对抗上,通用的强化学习模型一般包含了Actor模型和Critic模型,其中Actor模型根据状态生成下一步动作,而Critic模型估计状态的价值,这两个模型通过相互迭代训练(该过程称为Generalized …...

STM32 堆栈空间分布

参考 运行时访问__initial_sp和__heap_base 无RTOS时的情况 在以上配置的情况下,生成工程。在工程的startup.s文件中,由如下代码: Stack_Size EQU 0x400AREA STACK, NOINIT, READWRITE, ALIGN3 __Stack_top ; 自己添加 Stack_Mem…...

小程序制作(超详解!!!)第十五节 自动随机变化的三色旗

1.例题描述 设计一个小程序&#xff0c;开始时界面上显示一个三色旗和一个按钮&#xff0c;当点击按钮时&#xff0c;三色旗的颜色会发生随机变化&#xff0c;即使不点击按钮&#xff0c;三色旗的颜色也会每隔一定时间自动发生变化。 2.index.wxml <view class"box&…...

MySQL_主从复制_环境搭建

MySQL主从复制配置 CentOS 7 配置 阿里云 yum 源 sudo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-Base.repo.backup sudo wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo sudo yum clean all sudo yum makeca…...

Linux 设置静态IP(Ubuntu 20.04/18.04)

以Ubuntu20.04示例 第一步&#xff1a;查看当前网络信息 ifconfig 本机网卡名为&#xff1a;ens32&#xff0c;IP地址为&#xff1a;192.168.15.133&#xff0c;子网掩码为&#xff1a;255.255.255.0 第二步&#xff1a;查看当前网关信息 route -n 网关地址为&#xff1a;1…...

计网----累积应答,TCP的流量控制--滑动窗口,粘包问题,心跳机制,Nagle算法,拥塞控制,TCP协议总结,UDP和TCP对比,中介者模式

计网----累积应答&#xff0c;TCP的流量控制–滑动窗口&#xff0c;粘包问题&#xff0c;心跳机制&#xff0c;Nagle算法&#xff0c;拥塞控制&#xff0c;TCP协议总结&#xff0c;UDP和TCP对比&#xff0c;中介者模式 一.累积应答 1.什么是累计应答 每次发一些包&#xff0…...

OpenCV 直方图和归一化

直方图可以反映图片的整体统计信息, 使用函数 CalcHist() 实现. 但CalcHist() 统计出的数量信息和图像大小相关, 如果要剔除图像大小因素, 需要做归一化处理, 归一化处理后的信息, 反映出各个颜色值得占比情况, 这样更方便不同size图像做对比, 归一化的函数为 Normalize(). ///…...

Flink架构

1、Apache Flink集群的核心架构&#xff1a; 1、client&#xff08;作业客户端&#xff09;&#xff1a;提交任务的地方叫做客户端 2、JobManager&#xff08;作业管理器&#xff09;&#xff1a;作用是用于管理集群中任务 3、TaskManager&#xff08;任务管理器&#xff09;&a…...

Packet Tracer路由器连接终端设备怎么配置?

在Packet Tracer中配置一台路由器和三台终端设备可以帮助你建立一个简单的局域网&#xff0c;以下是配置的基本步骤&#xff1a; 打开Packet Tracer&#xff0c;从左侧设备栏中拖拽一个路由器和三个终端设备到工作区。 连接设备&#xff1a;使用网线将路由器的端口与每台终端设…...

评估APP网页小程序代码UI开发H5估价师怎么评估开发精确研发价格?

作为一名应用程序开发评估师&#xff0c;可能涉及到的主要任务是为特定的应用程序提供估算开发成本和所需时间预测。为了为一个应用程序更准确地评估价格&#xff0c;须遵循以下几个步骤&#xff1a; 问: 如何让一个App更好、更精确地评估出价格&#xff1f; 答: 以下是一个可…...

16 Linux 内核定时器

一、Linux 时间管理和内核定时器简介 1. 内核时间管理简介 Linux 内核中有大量的函数需要时间管理&#xff0c;比如周期性的调度程序、延时程序、定时器等。 硬件定时器提供时钟源&#xff0c;时钟源的频率可以设置&#xff0c;设置好以后就周期性的产生定时中断&#xff0c;系…...

C++11 shared_ptr类型智能指针学习

智能指针和普通指针的用法类似,但是智能指针可以在适当时机自动释放分配的内存。 C++11有三种类型的智能指针,shared_ptr、unique_ptr 以及 weak_ptr; 先学习shared_ptr类型; shared_ptr<T> 的定义位于<memory>头文件,并位于 std 命名空间中; T 表示指针指…...

网络流量分类概述

1. 什么是网络流量&#xff1f; 一条网络流量是指在一段特定的时间间隔之内&#xff0c;通过网络中某一个观测点的所有具有相同五元组(源IP地址、目的IP地址、传输层协议、源端口和目的端口)的分组的集合。 比如(10.134.113.77&#xff0c;47.98.43.47&#xff0c;TLSv1.2&…...

JavaWeb篇_02——服务器简介及Tomcat服务器简介

服务器简介 硬件服务器的构成与一般的PC比较相似&#xff0c;但是服务器在稳定性、安全性、性能等方面都要求更高&#xff0c;因为CPU、芯片组、内存、磁盘系统、网络等硬件和普通PC有所不同。软件服务器&#xff08;英文名称Server&#xff09;&#xff0c;也称伺服器。指一个…...

2311d游戏引擎适配ios

原文 通过遵循arsd:simpledisplay(v11.0.0之前)上的一些旧代码,Apple的文档和Jacob的这一惊人贡献桥, 我已从金属绑定中删除了所有extern(Objective-C)代码,现在,所有Objective-C桥接代码都是使用D的反射生成的. 因此,给定此例代码: import core.attribute : selector; extern…...

网络唤醒(Wake-on-LAN, WOL)

远程唤醒最简单的方法&#xff1a;DDNSTOOpenwrt网络唤醒&#xff0c;完美实现。 原帖-远程唤醒_超详细windows设置远程唤醒wol远程连接&#xff08;远程开机&#xff09; WOL Web# 访问 Wake on Lan Over The Interweb by Depicus 可以无需借助软件很方便的从网页前端唤醒远…...

接口测试框架实战(一) | Requests 与接口请求构造

Requests 是一个优雅而简单的 Python HTTP 库&#xff0c;其实 Python 内置了用于访问网络的资源模块&#xff0c;比如urllib&#xff0c;但是它远不如 Requests 简单优雅&#xff0c;而且缺少了许多实用功能。所以&#xff0c;更推荐掌握 Requests 接口测试实战技能&#xff0…...

【C++】详解 void*

文章目录 1. void *是什么&#xff1f;2. void*详解3. 和void的区别4. 应用场景4.1 函数传参时不确定类型&#xff0c;或者要支持多类型的传参&#xff1b;4.2 当函数的返回值不考虑类型指关心大小的时候 5. 总结 今天看到一段代码&#xff0c;觉得非常有意思。 void* say_hell…...

Linux家目录变成了-bash-4.2$

Linux家目录变成了-bash-4.2$ Mark a workarround: 使用root用户&#xff0c;执行cp -a /etc/skel/. /home/zookeeper/&#xff08;不是root用户也可以&#xff09; 其中/home/zookeeper/目录是对应自己的家目录地址~ 若有帮到你&#xff0c;记得点赞&#xff0c;收藏呀…...

Python和SQLite游标处理多行数据

如果您需要处理多行数据&#xff0c;使用游标或其他适当的方法是更好的选择。以下是一些处理多行数据的方法&#xff1a; 使用游标&#xff1a;游标可以逐行处理查询结果&#xff0c;这对于大量数据或需要逐行处理的场景非常有用。以下是一个使用Python和SQLite的游标示例&…...

基于算法竞赛的c++编程(28)结构体的进阶应用

结构体的嵌套与复杂数据组织 在C中&#xff0c;结构体可以嵌套使用&#xff0c;形成更复杂的数据结构。例如&#xff0c;可以通过嵌套结构体描述多层级数据关系&#xff1a; struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型

CVPR 2025 | MIMO&#xff1a;支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题&#xff1a;MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者&#xff1a;Yanyuan Chen, Dexuan Xu, Yu Hu…...

React hook之useRef

React useRef 详解 useRef 是 React 提供的一个 Hook&#xff0c;用于在函数组件中创建可变的引用对象。它在 React 开发中有多种重要用途&#xff0c;下面我将全面详细地介绍它的特性和用法。 基本概念 1. 创建 ref const refContainer useRef(initialValue);initialValu…...

mongodb源码分析session执行handleRequest命令find过程

mongo/transport/service_state_machine.cpp已经分析startSession创建ASIOSession过程&#xff0c;并且验证connection是否超过限制ASIOSession和connection是循环接受客户端命令&#xff0c;把数据流转换成Message&#xff0c;状态转变流程是&#xff1a;State::Created 》 St…...

跨链模式:多链互操作架构与性能扩展方案

跨链模式&#xff1a;多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈&#xff1a;模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展&#xff08;H2Cross架构&#xff09;&#xff1a; 适配层&#xf…...

Springcloud:Eureka 高可用集群搭建实战(服务注册与发现的底层原理与避坑指南)

引言&#xff1a;为什么 Eureka 依然是存量系统的核心&#xff1f; 尽管 Nacos 等新注册中心崛起&#xff0c;但金融、电力等保守行业仍有大量系统运行在 Eureka 上。理解其高可用设计与自我保护机制&#xff0c;是保障分布式系统稳定的必修课。本文将手把手带你搭建生产级 Eur…...

12.找到字符串中所有字母异位词

&#x1f9e0; 题目解析 题目描述&#xff1a; 给定两个字符串 s 和 p&#xff0c;找出 s 中所有 p 的字母异位词的起始索引。 返回的答案以数组形式表示。 字母异位词定义&#xff1a; 若两个字符串包含的字符种类和出现次数完全相同&#xff0c;顺序无所谓&#xff0c;则互为…...

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别

OpenPrompt 和直接对提示词的嵌入向量进行训练有什么区别 直接训练提示词嵌入向量的核心区别 您提到的代码: prompt_embedding = initial_embedding.clone().requires_grad_(True) optimizer = torch.optim.Adam([prompt_embedding...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

使用Spring AI和MCP协议构建图片搜索服务

目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式&#xff08;本地调用&#xff09; SSE模式&#xff08;远程调用&#xff09; 4. 注册工具提…...