强化学习-alphazero 算法理论
一、算法简介
简单地说,Alphazero=MCTS + SL(策略网络+价值网络) +Selfplay + resnet。 其中MCTS指的是蒙特卡洛树搜索,主要用于记录所有访问过的棋盘状态的各种属性,包括该状态访问次数,对该状平均评价分数等。 SL指监督学习算法,监督网络输出价值v和策略pai,用于拟合mcts推测出的策略和价值,并泛化到未见过的状态上。 Selfplay是一种训练方法,步骤是:实例化蒙特卡罗树和SL网络,进行自我博弈,以产生多样化的数据进行训练和更新。 resnet 众所周知是一种卷积神经网络,主要用于棋盘的特征提取。下面从采样和更新两个角度对上述几个部件进行介绍。文中所引代码来自alphazero GitHub 五子棋
1、蒙特卡洛树搜索
顾名思义,蒙特卡洛树搜索是一种利用树形数据结构进行搜索的算法,其节点存储是棋盘状态,根节点存储的是棋盘初始状态,其子节点存储是当前状态可能的下一状态。节点上存储的属性包括棋盘当前棋子位置s,访问s的次数n,对节点的估值v。
图一、蒙特卡洛树搜索的采样和更新(select, expand, simulate为采样,backpropagate为更新)
1.1 MCTS采样
mcts(蒙特卡洛树搜索)的采样分为三步:节点选择,节点拓展,和模拟推演。三步是依次执行的。
1.节点选择:初始化根节点,从根节点开始,对所有可能的子节点计算puct值,选择值最大的进入,puct计算公式如下
其中vi 是该节点的价值,N是父节点被访问次数,ni为本节点被访问的次数,C为超参数用于平衡利用和探索。
2.节点扩展:如果当前节点已经是树的叶子节点,则需对树进行节点扩展,具体步骤为:从可能的动作中选取一个执行,进入下一状态,并将这个新节点加入到父节点的子节点集中。
3.模拟推演:在将一个新节点加入树后,需要从这个节点的状态出发(如果此节点非终止状态),进行模拟推演,直至到达种植状态。在模拟中,不适用树来做决策,而是使用强化学习的actor和critic网络做决策。
1.2 MCTS更新
1. 反向回溯: 在模拟对局进行到终局状态后,一般会有胜负和的情况,记胜利的结局价值为1 失败的结局价值为-1,从叶子节点开始一次反溯其父节点,将沿途每个节点的访问次数+1,总价值加上新的结局价值,并用新的总价值除以访问次数得到平均价值。反向传播就是利用此次胜负结果,从这次推演的叶子节点开始,迭代查询出所有的父节点,并更新这些父节点上的价值估值vi 。
实际Alphazero算法中使用的mcts细节比上面描述的有所不同,在第三节算法流程中介绍
2、策略网络和价值网络
采样:在mcts采样到达第三步模拟推演时,开始使用策略网络和价值网络推演,从当前状态s开始,每次选择一动作a执行,直至到达终点获得胜负结果。
更新:这里需要注意,虽然网络结构用了策略网络和状态价值网络形式建模,但是其损失函数完全不同于actor critic的loss。actor critic 使用的是强化学习中的策略梯度损失和td error进行更新。而alphazero中的策略网络和价值网络更新方式是监督学习的方法,策略网络使用交叉熵损失,求网络输出策略和节点统计策略的差异。 价值网络使用均方差损失,求网络输出价值和节点monte carlo方法统计的价值均值之间的损失。【蒙特卡洛本身就是一种通过采样拟合近似计算问题的解或者概率分布,所以不能因为其带有策略和价值网络就默认用actor和critic的思想去理解,那就错了】
更新方式:价值网络和策略网络的输入是棋局推演中每一step的state,价值网络输出每一state的预估价值【范围[-1,1]】其label是该局最终的胜负情况,胜则+1,负则-1。策略网络输出的是每一state下采取的策略的概率分布,其标签为,使用的是均方差误差做回归损失,而policy的标签使用的是mcts推导出的策略分布,使用的是交叉熵损失做分类的损失。两项损失的和是网络的总损失
3.SelfPlay
selfplay 即使用模型和自己对战,因为模型在学习和变化,所以可以产生不同分布的数据,相比于alphago的对棋谱训练增加数据多样性,增强了泛化性。
alphazero要使用 mcts和sl 完成自博弈的过程,就需要mcts和sl 既可以输出先手的策略,也可以输出后手的策略。为实现这一点,mcts采取的方式是,在节点价值从叶子节点向根节点迭代更新时,每一次都传入 -value,即相邻两节点估值符号相反,这样使得每一个节点上的估值都是当前player对棋局的估值。 sl中的value和policy因为是学习拟合mcts的输出,所以其也具有了输出先后手策略和价值的能力。
二、算法整体流程介绍
整体伪代码如下
初始化价值网络 V 和策略网络 pi对于 i 在范围 1500 内循环:# 通过自对弈收集数据环境重置()初始化根节点当未完成时循环:动作, 动作概率 = 玩家获取动作()# 通常在 get_action 函数中涉及 400 次选择和扩展。# 如果任何一次迭代达到游戏结束,更新 MCTS 节点的值。当前状态 = 下一状态将根节点移至当前状态的节点如果收集到的数据 > 批量大小:使用收集到的数据训练策略网络和价值网络
相关文章:
强化学习-alphazero 算法理论
一、算法简介 简单地说,AlphazeroMCTS SL(策略网络价值网络) Selfplay resnet。 其中MCTS指的是蒙特卡洛树搜索,主要用于记录所有访问过的棋盘状态的各种属性,包括该状态访问次数,对该状平均评价分数等。 SL指监督学习算法&…...
使用 Rough.js 创建动态水平条形图
本文由ScriptEcho平台提供技术支持 项目地址:传送门 使用 Rough.js 创建动态可视化网络图 应用场景 Rough.js 是一个 JavaScript 库,它允许开发人员使用毛边风格创建可视化效果。该库适用于各种应用程序,例如: 数据可视化地图…...
Python教程(十):面向对象编程(OOP)
目录 专栏列表前言一、面向对象编程概述1.1 类和对象1.2 继承1.3 多态1.4 封装 二、Python 中的类和对象2.1 定义类2.2 __init__ 函数解释2.3 创建对象 三、继承3.1 基本继承3.2 创建子类对象 四、多态五、封装六. 访问限制七、综合实例结语 专栏列表 Python教程(一…...
CTFHUB-文件上传-文件头检查
开启题目 1.php内容: <?php eval($_POST[cmd]);?> 截屏截一个很小很小的图片,保存为 png 格式,把 1.png 和 1.php 放在同一文件夹,在此目录打开 cmd, 使用以下命令把 1.png 和 1.php 合成为图片马 copy 1.pn…...
c语言数组与指针,字符串与指针,指向函数的指针,malloca动态内存分配
数组与指针 数组: - 数组是一种数据结构,可以存储固定大小的一组相同类型的元素。在内存中,数组的元素是连续存储的。 指针: - 指针是一个变量,用于存储内存地址。指针本身占用内存,用来指向某个数据的地址。 数组与指针的关系…...
代码随想录算法训练营day30 | 452. 用最少数量的箭引爆气球 、435. 无重叠区间、763.划分字母区间
碎碎念:加油 参考:代码随想录 452. 用最少数量的箭引爆气球 题目链接 452. 用最少数量的箭引爆气球 思想 局部最优: 让重叠的气球尽量在一起,用一支弓箭射。 全局最优: 用最少数量的箭引爆气球。 首先对气球进行排…...
如何手动修复DLL丢失?2种手动修复dll文件方法
DLL(动态链接库)文件是Windows操作系统中非常重要的组成部分,它们包含了程序运行所需的代码和数据。然而,由于各种原因,如系统更新、软件卸载不当或病毒感染,DLL文件有时会丢失或损坏,导致程序无…...
Node.js(2)——压缩前端html
需求:把回车符(\r)和换行符(\n)去掉后,写入到新的html文件中 步骤: 读取源html文件内容正则替换字符串写入到新的html文件中 示例: 获取html文件中的内容并检查(同时…...
堆的实现-向上调整算法-向下调整算法-堆排序-TopK问题 C语言
堆的实现与堆排序及TopK问题的C语言代码 下面是详细的堆实现,包括向上调整、向下调整算法,以及堆排序和解决TopK问题的完整C语言示例代码。 1. 堆的实现 首先,定义堆的数据结构: #include <stdio.h> #include <stdli…...
【C++BFS】1466. 重新规划路线
本文涉及知识点 CBFS算法 LeetCode1466. 重新规划路线 n 座城市,从 0 到 n-1 编号,其间共有 n-1 条路线。因此,要想在两座不同城市之间旅行只有唯一一条路线可供选择(路线网形成一颗树)。去年,交通运输部…...
服务器并发模型
服务器: 单循环服务器:服务器在同一时刻只能响应一个客户端的请求 并发服务器模型:服务器在同一时刻可以响应多个客户端的请求 UDP:无连接 TCP:有连接 1.多进程 资源空间消耗大 效率低 2.多线程 相…...
Chapter 23 数据可视化——地图
欢迎大家订阅【Python从入门到精通】专栏,一起探索Python的无限可能! 文章目录 前言一、基础绘图二、视觉映射三、案例分析 前言 随着地理信息系统(GIS)技术的迅猛发展和大数据时代的到来,数据可视化已经成为分析和理…...
Linux笔记 --- 组合数据类型
结构体 简单的定义结构体的方法 struct student {char name;int age;float score; };//使用student模板创建两个结构体变量 struct student Jack,Rose; 结构体中可以存放除了函数以外的任何数据类型的数据,在创建结构体时student被称为结构体模板名称,…...
DaoCloud-Dockfile文件NGINX文件
Dockfile文件 安装依赖,打包,配置NGINX代理,最后把打完的包复制到服务器相应的文件夹下,构建镜像成功。 # syntax docker/dockerfile:experimental FROM xx.xx.xx.xx/public/node:16.14.2 as builder# LABEL maintainer"e…...
耳机行业中MIC ENC
0 Preface/Foreword ENC: Environment Noise Cancellation,环境降噪,主要指在通话过程中,戴着ENC通话降噪耳机的使用者,即使在嘈杂的环境,比如在嘈杂的街区,开着窗运行的汽车上,说话…...
python-自动化办公-Excel-Openpyxl
Python处理Excel数据之Openpyxl 1.1 Openpyxl库的安装使用 openpyxl模块是一个读写Excel 2010文档的 Python 库,如果要处理更早格式的Excel文档,需要用到额外的库,openpyxl是一个比较综合的工具,能够同时读取和修改Excel文档。其…...
图形编辑器基于Paper.js教程10:导入导出svg,导入导出json数据
深入了解Paper.js:实现SVG和JSON的导入导出功能 Paper.js是一款强大的矢量绘图JavaScript库,非常适合用于复杂的图形处理和交互式网页应用。本文将详细介绍如何在Paper.js项目中实现SVG和JSON格式的导入导出功能,这对于开发动态图形编辑器等…...
[STM32][Bootloader][教程]STM32 HAL库 Bootloader开发和测试教程
0. 项目移植 对于不想知道其执行过程的朋友来说,可以直接移植,我的板子是STM32F411CER6, 512K M4内核 项目地址: Bootloader(可以自己写标志位用于自测,项目中这部分代码已经被注释,可以打开自行测试&…...
如何手写一个SpringBoot框架
你好,我是柳岸花开。 在这篇文章中,我们将手写模拟SpringBoot的核心流程,让大家能够以一种简单的方式了解SpringBoot的大概工作原理。 项目结构 我们创建一个工程,包含两个模块: springboot模块,表示Spring…...
vite解决前端跨域步骤
Vite 解决跨域问题的原理主要是通过其内置的开发服务器功能实现的,具体来说,是通过 HTTP 代理(HTTP Proxy)机制。在开发环境中,Vite 服务器可以配置为一个代理服务器,将前端应用发出的请求转发到实际的后端…...
同步交互与异步交互:深入解析与选择
同步交互与异步交互:深入解析与选择 1、同步交互2、异步交互3、选择策略 💖The Begin💖点点关注,收藏不迷路💖 在软件开发的世界里,交互方式主要分为两大类:同步与异步。下面是对这两种方式的解…...
Day1
首先,大概学习了一下用anaconda去创建一个环境(因为Django是有python版本的要求),然后学着去切换环境。 创建环境:conda create -n django_study python3.10 激活环境:conda activate django_study 删除环…...
Introduction to Data Analysis with PySpark
1.DataFrame and RDDs 2.Spark Architecture 3. Data Formats and Data Sources 倘若您觉得我写的好,那么请您动动你的小手粉一下我,你的小小鼓励会带来更大的动力。Thanks....
基于双PI控制器结构的六步逆变器供电无刷直流电机调速simulink仿真
目录 1.课题概述 2.系统仿真结果 3.核心程序与模型 4.系统原理简介 4.1 无刷直流电机(BLDCM)原理 4.2 六步换相逆变器 4.3 双PI控制器设计 5.完整工程文件 1.课题概述 基于双PI控制器结构的六步逆变器供电无刷直流电机调速simulink仿真。双PI控制…...
双向链表的基本操作
#include<iostream> #include<cmath> #include<cstring> using namespace std; typedef long long ll; typedef struct line {int data;struct line *pre;//前指针struct line *next;//后指针 }line,*a; line* init_line(line*head) {cout<<"请输…...
modbus tcp和modbusRTU的区别是什么?
Modbus是一种应用广泛的通信协议,主要用于工业自动化和过程控制系统。Modbus有多种变体,其中Modbus TCP和Modbus RTU是最常见的两种。以下是它们之间的主要区别: 1. 基本定义 Modbus RTU (Remote Terminal Unit): 是基于串行通信的协议&am…...
web小游戏开发:拼图(四)对调和移动拼图玩法的实现
web小游戏开发:拼图(四)对调和移动拼图玩法的实现 对调方式对调模式实现移动方式移动的实现小结对调方式 在完成了原始拼图玩法后,剩下两个玩法其实相对就变得简单的多了。 对调模式,简单来说,就是选中两个图块,然后位置对调一下。 那么,我们来整理一下,看看需要哪…...
前端:Vue学习 - 智慧商城项目
前端:Vue学习 - 智慧商城项目 1. vue组件库 > vant-ui2. postcss插件 > vw 适配3. 路由配置4. 登录页面静态布局4.1 封装axios实例访问验证码接口4.2 vant 组件 > 轻提示4.3 短信验证倒计时4.4 登录功能4.5 响应拦截器 > 统一处理错误4.6 登录权证信息存…...
KVM调整虚拟机与CPU铆钉(绑定)关系
虚拟机铆钉CPU 把虚拟机的vCPU绑定在物理CPU上,即VCPU只在绑定的物理CPU上调度,在特定场景下达到提升虚拟机性能的目的。比如在NUMAQ系统中,把vCPU绑定在同一个NUMA节点上,可以避免CPU跨节点访问内存,避免影响虚拟机运…...
华火电焰灶:烹饪新宠,温暖与美味的完美融合
在众多厨房电器中,华火电焰灶以其独特的魅力和卓越的性能脱颖而出,成为了众多家庭的烹饪新宠。今天,就让我们一同走进华火电焰灶的精彩世界,探索它的非凡之处。 华火电焰灶,首先吸引人的便是其创新的等离子电生明火技术…...
wordpress模板查询/百度账号找回
Spring Boot - 静态资源处理、启动加载、日志处理 回顾 Spring Boot-初识 Hello WorldSpring Boot - Servlet、过滤器、监听器、拦截器我们通过启动日志,可以发现,spring boot 默认提供了静态资源处理。接下来,我们了解下,该如何应…...
成都网站制作长沙/长沙百度快速排名
1.数据库故障排查步骤,如何处理紧急数据库问题;首先根据报错信息找到故障原因.然后实施对应的解决方案.2.SQL调优步骤,如何来判断SQL语句存在问题,怎么定位问题,如何解决这些问题;可以建立一个Performance监控的列表,包…...
简单网上书店网站建设php/中国行业数据分析网
坑 意味着没有输出。变量都会保存到console里边 如果取消这个选项,则:有输出,运行完就结束了...
汽配网站源码/网店如何引流与推广
git .git目录提交我正在撰写一篇文章,概述了如何编写良好的Git提交消息,以及开发人员应遵循的各种Git提交消息约定和规则。 但是,正如我写的开发人员应遵循的最佳做法,我不断地发现自己在哪些开发商不应该做一个内部讨论。 我希望…...
贵阳网站设计与开发怎么做/服装店营销策划方案
为什么80%的码农都做不了架构师?>>> 仅仅为了获取函数名,就在函数体中嵌入硬编码的字符串,这种方法单调乏味还易导致错误,不如看一下怎样使用新的C99特性,在程序运行时获取函数名吧。 对象反射库、调试工…...
电脑怎么下免费wordpress/广州seo网络推广员
有关51单片机中断的形式和C语言编程格式void INT0()interrupt 0 using 1 {.... ..... } interrupt 0 指明是外部中断0; interrupt 1 指明是定时器中断0; interrupt 2 指明是外部中断1; interrupt 3 指明是定时器中断1; interrupt …...