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

强化学习中的自我博弈(self-play)

自我博弈(Self-Play)[1]是应用于智能体于智能体之间处于对抗关系的训练方法,这里的对抗关系指的是一方的奖励上升必然导致另一方的奖励下降。通过轮流训练双方的智能体就能使得双方的策略模型的性能得到显著提升,使得整个对抗系统达到正和博弈的效果。这种训练机制最早运用于跳棋游戏[2],后来在棋类,MOBA类等对抗性策略游戏中被广泛应用,例如AlphaGo、AlphaStar。

自我博弈有三个主要创新点。第一是探索课程,在稀疏奖励的环境下,将最终目标分割成若干个容易实现的小目标,每个目标都基于一定的奖励,使奖励变得稠密,并对智能体的探索行为给予一定的奖励。但随着训练的进行,探索奖励应当逐渐衰减为0。第二是对手抽样,智能体在面对过强或过弱的对手时,训练都会难以取得成效,因此环境中需要存储对手不同时期的训练版本,让较弱的一方有机会获胜,较弱的一方策略提升的同时会反过来促进较强一方变得更强。第三是鲁棒学习策略,为了防止智能体的策略拟合在某一种固定的对手身上,需要给对手引入多样性,给环境引入随机变量。

为了判断智能体的强弱,使自我博弈使用水平相近的智能体进行对抗训练,根据ML-Agents中的做法,较好的解决方式是引入ELO评级系统,这是一种计算零和游戏中两个玩家之间相对水平的方法。每一个玩家都有一个初始ELO分数(通常为1200),通过对战胜负结果更新ELO分数,假定玩家A的初始ELO分数为,玩家A的初始ELO分数为,则玩家A的预期胜利概率为:
E A = 1 1 + 1 0 R B − R A 400 E_A = \frac{1}{1+10^{\frac{R_B-R_A}{400}}} EA=1+10400RBRA1

比赛结束后,玩家A的分数调整为:

R A ′ = R A + K ( S A − E A ) R'_A = R_A + K(S_A-E_A) RA=RA+K(SAEA)

自我博弈是强化学习的对抗性训练经常采用的训练方式,是一个对抗双方模型交替训练的过程。智能体1和智能体2身为对抗双方,可以在对手的早期模板中选择自己合适训练环境。也就是说,对方的智能体在己方训练的时候相当于环境的一部分,对手的策略也极大影响了自身的策略。

在这里插入图片描述

因此,双方交替训练的时机以及选择对手的策略是影响自我博弈结果的重要因素,当双方训练进度不一致时,会造成双方的竞技水平不平衡,不利于双方策略的学习。实验中智能体每隔一段时间会保存自己的副本,在训练的时候会从敌方的副本中抽取一个当做训练的对手,抽取的策略有很多种,例如每个样本概率平均、最近的样本概率最大并线性变化等。

其中K为可调整的超参数,是比赛结果,赢了则值为1,反之为0。
[1]Bansal T, Pachocki J, Sidor S, et al. Emergent complexity via multi-agent competition[J]. arXiv preprint arXiv:1710.03748, 2017.
[2]Samuel A L. Some studies in machine learning using the game of checkers[J]. IBM Journal of research and development, 1959, 3(3): 210-229.

相关文章:

  • 数据库精选题(三)(SQL语言精选题)(按语句类型分类)
  • 解决 uniapp h5 页面在私有企微iOS平台 间歇性调用uni api不成功问题(uni.previewImage为例)。
  • uniapp实现幻灯功能方法及代码
  • springboot 搭建一个 测试redis 集群连通性demo
  • Java热部署:让应用更新如丝般顺滑,告别繁琐重启!
  • openEuler2203SP3自定义ios
  • android怎么知道FileProvider应该导入的包名是什么?androidx.core.content.FileProvider
  • 华为开发者大会:全场景智能操作系统HarmonyOS NEXT
  • python web框架哪家强?Flask、Django、FastAPI对比
  • idea导入文件里面的子模块maven未识别处理解决办法
  • 外部存储器
  • 【Vue】图片懒加载的实现
  • 【计算机】我不允许还有人不知道数据库是什么
  • Rust语言-线程间的消息传递mpsc::Sender
  • echarts Y轴展示时间片段,series data数据 也是时间片段,鼠标放上去 提示框显示对应的时间片段
  • 5分钟即可掌握的前端高效利器:JavaScript 策略模式
  • bootstrap创建登录注册页面
  •  D - 粉碎叛乱F - 其他起义
  • HomeBrew常规使用教程
  • IOS评论框不贴底(ios12新bug)
  • JS 面试题总结
  • JS学习笔记——闭包
  • Leetcode 27 Remove Element
  • Material Design
  • PHP变量
  • React系列之 Redux 架构模式
  • Redis 懒删除(lazy free)简史
  • Theano - 导数
  • Vim Clutch | 面向脚踏板编程……
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • VuePress 静态网站生成
  • Web标准制定过程
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 搭建gitbook 和 访问权限认证
  • 海量大数据大屏分析展示一步到位:DataWorks数据服务+MaxCompute Lightning对接DataV最佳实践...
  • 如何实现 font-size 的响应式
  • 收藏好这篇,别再只说“数据劫持”了
  • 提升用户体验的利器——使用Vue-Occupy实现占位效果
  • PostgreSQL之连接数修改
  • 第二十章:异步和文件I/O.(二十三)
  • 数据可视化之下发图实践
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • #Datawhale AI夏令营第4期#AIGC方向 文生图 Task2
  • #define、const、typedef的差别
  • (1/2)敏捷实践指南 Agile Practice Guide ([美] Project Management institute 著)
  • (第一天)包装对象、作用域、创建对象
  • (附源码)ssm高校实验室 毕业设计 800008
  • (转)GCC在C语言中内嵌汇编 asm __volatile__
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .net Application的目录
  • .net core 6 使用注解自动注入实例,无需构造注入 autowrite4net
  • .net core Swagger 过滤部分Api
  • .net php 通信,flash与asp/php/asp.net通信的方法
  • .NET/C# 中设置当发生某个特定异常时进入断点(不借助 Visual Studio 的纯代码实现)
  • .net企业级架构实战之7——Spring.net整合Asp.net mvc