强化学习-你在游戏中对战的人机是如何对付你的!

2023-11-09 01:20

本文主要是介绍强化学习-你在游戏中对战的人机是如何对付你的!,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

目录

1.与环境交互的数据介绍

2.要完成的目标分析

3.baseline方法

4.Onpolicy与Offpolicy策略。


在前面我写了一篇文章叫《强化学习-什么是强化学习?白话文告诉你!》这篇文章用了很通俗易懂的例子介绍了强化学习的一些基本的知识点。

读完上面的文章,再来看本篇文章算是比较合适,因为,研究嘛,终究是离不开数学的,所以本篇文章包含大量的公式,虽然学习公式的过程很难受,但是收获是绝对有的!

想必大家或多或少都玩过游戏,而强化学习现在在游戏领域应用很多。

我们来想象一下,一个游戏中应该有一个操作对象,这个对象就是一个智能体,这个智能体的每一步行动都会得到一个奖励(你比如说你往前一步捡到一个血包,那你的血量会增加,你放了一个技能,你的能量会减少,但被你砍到的敌人的血量会减少等等)。

一个游戏有一个终止状态吧,你比如王者荣耀,一方水晶破了,就代表游戏结束了,再比如今年过年很火的合成大西瓜,屏幕满了就表示游戏结束了。

那么一局游戏从开始到结束,一个智能体是不是会存在很多很多种状态,也会发出很多很多次动作,一直到游戏结束。这整个过程的状态走向以及动作序列正是强化学习需要研究的内容。

这一个完整的过程,我们叫做episod,即一个生命周期,那么整个生命周期的奖励值就是:

 我们不能只考虑每一步的奖励值,而要考虑整个生命周期的生命值,也就是上面的R

1.与环境交互的数据介绍

超级玛丽这个游戏应该是很多人小时候都玩过,那么如果这个游戏用强化学习来操作小人,那么交互图就是下图:

那么我们如何来记录一个智能体的一局游戏记录呢?答案如下:

其中S表示状态(state)a表示动作(action),S1通过a1到达S2,S2通过动作到达S3,如此迭代一直到ST。

那么问题来了,智能体怎么知道执行什么动作才能得到更多的奖励呢?

这就是强化学习要解决的核心问题了。

下面我们来看几个东西:

第一个问题:动作执行概率。

可以训练神经网络。

这个网络是在求什么呢

其实是在求

这个是什么玩意呢?它是代表状态St时候,执行动作at的概率。该值是通过调整网络的参数集合\theta来训练得到的。

 

第二个问题:状态转换概率。

这个玩意是说状态St时候,执行动作at,到达状态St+1的概率是多少。那么在游戏里面,这个是不用我们管的,因为游戏规则都已经写好了。比如你放个技能,那你的下一个状态肯定是能量减少了。

 

第三个问题:奖励值。

那奖励怎么算呢,奖励是根据当前action和state共同决定的,这个在游戏里面也是游戏规则规定的,比如你被英雄A砍了一刀,你要掉多少血,你被英雄B砍一刀,你要掉多少血等等。

若不是在游戏里面,在其他领域,也可以根据action和state来设计奖励函数。

 

第四个问题:得到记录表达式。

那么了解了上面的这些玩意,我们就可以看这个公式了:

这个公式是模型的输出结果,它表示的就是一条记录表达式。里面有每个状态以及每个状态下执行的动作。

上面的过程如下图:

2.要完成的目标分析

那么到底要完成什么事情呢,上一小节其实已经说了,我们要求的是\theta参数集。

因为我们要训练网络,所以我们要找到一个最优的参数集合。

那么什么样的参数集是最好的呢?

答案是得到奖励值最多的参数集合是最好的!

于是我们就有如下这个公式:

这个就代表总体奖励期望值最高的时候下的参数集。也就是目标函数

期望是什么,比如一个人平常考试分数就在70-90分,那么我们对他的期望就是80分左右。

为什么要用期望而不是准确值呢,因为智能体的这一系列过程有非常多的随机性,即使\theta相同,得到的action也不相同。

有了这个目标函数,下一步就是对目标函数进行求解。

首先我们看看奖励值期望如何求,我们先举个例子,假如让你估计一名同学下一次的考试成绩期望分数,你怎么估计,你肯定会想,让这个同学考100次试,我取个平均分就是他的成绩期望值。

这是什么办法呢?这就是大数定律。我们也可以用这个办法来求奖励值期望。

N代表我要把这个过程进行的次数,比如一万次,那i就从1到1w,针对每一次的过程,状态t=1到t=T,首先将每一次状态转换的奖励值累加,得到每一个过程的总奖励值,然后将1w次过程的奖励值相加,得到1w次过程的奖励值,最后再求平均值,就是我们要的期望值。

期望值我们求到了,但是我们要的不是期望值,而是参数集啊?那么如何来求参数集呢?

我们往下看:

\pi \theta \left ( \tau \right )表示当前序列的可能性,\gamma \left ( \tau \right )是奖励值,我们将J\left ( \theta \right )改写一下:

再计算梯度:

继续变形:

以上就是经过数学变换的目标函数。

3.baseline方法

如何来获取数据呢?

不断进行每个过程。然后做好每个过程的下图记录:

然后将数据带入目标公式:

但是以上过程有一个问题,有些任务几乎全都是奖励,而惩罚值很少,这就会造成一个问题,就是智能体无法通过负的惩罚值来知道自己什么不应该做,因为它得到的大多数是奖励值,而惩罚值很少。

这种情况我们就可以做一个去均值处理。也就是把奖励值减去一个baseline(下面用b表示):

 其中b(也就是baseline)的值为:

这样是不是就解决了奖励值中,负数(惩罚值)很少但正数(奖励值)很多的问题呢。

4.Onpolicy与Offpolicy策略。

Onpolicy:就是训练数据是由当前agent和环境不断交互得到。

这就有一个问题。

在这个公式中是含\theta的,也就是说你交互一次得到的数据,只能在当前\theta下迭代一次,因为这条数据用完后\theta​​​​​​​会发生改变,一旦发生改变,那么这条数据就不能够再使用了。那就必须再交互一次得到一条数据,再进行下一次迭代。

所以效率相对不高。

Offpolicy:就是利用别的agent与环境交互得到的数据来用,这样就解决了上述的问题。

 

有什么问题,欢迎一起讨论。

 

参考资料:强化学习实战课程

作者qq:1518887260

于2021年3月7日

这篇关于强化学习-你在游戏中对战的人机是如何对付你的!的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/373433

相关文章

Python实例题之pygame开发打飞机游戏实例代码

《Python实例题之pygame开发打飞机游戏实例代码》对于python的学习者,能够写出一个飞机大战的程序代码,是不是感觉到非常的开心,:本文主要介绍Python实例题之pygame开发打飞机... 目录题目pygame-aircraft-game使用 Pygame 开发的打飞机游戏脚本代码解释初始化部

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Python开发文字版随机事件游戏的项目实例

《Python开发文字版随机事件游戏的项目实例》随机事件游戏是一种通过生成不可预测的事件来增强游戏体验的类型,在这篇博文中,我们将使用Python开发一款文字版随机事件游戏,通过这个项目,读者不仅能够... 目录项目概述2.1 游戏概念2.2 游戏特色2.3 目标玩家群体技术选择与环境准备3.1 开发环境3

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java深度学习库DJL实现Python的NumPy方式

《Java深度学习库DJL实现Python的NumPy方式》本文介绍了DJL库的背景和基本功能,包括NDArray的创建、数学运算、数据获取和设置等,同时,还展示了如何使用NDArray进行数据预处理... 目录1 NDArray 的背景介绍1.1 架构2 JavaDJL使用2.1 安装DJL2.2 基本操

Python开发围棋游戏的实例代码(实现全部功能)

《Python开发围棋游戏的实例代码(实现全部功能)》围棋是一种古老而复杂的策略棋类游戏,起源于中国,已有超过2500年的历史,本文介绍了如何用Python开发一个简单的围棋游戏,实例代码涵盖了游戏的... 目录1. 围棋游戏概述1.1 游戏规则1.2 游戏设计思路2. 环境准备3. 创建棋盘3.1 棋盘类

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert