第二十六课.深度强化学习(一)
目录
- 强化学习基本概念
- 数学基础回顾
- 强化学习中的专业术语
- 强化学习中的随机性
- 如何使用AI进行游戏
- 关于rewards和returns
- 价值函数Value Functions
- action-value function
- state-value function
- 再述用AI进行游戏
- 关于OpenAI Gym
强化学习基本概念
强化学习即 Reinforcement Learning,而现在所说的强化学习更多的实际是深度强化学习。本篇先了解强化学习中的基本概念。
数学基础回顾
首先,我们回顾随机变量Random Variable,随机变量是一个未知的量,它的值取决于一个随机事件的结果。以硬币投掷为例:
我们将正面朝上记为0,反面为1,抛硬币是一个随机事件,抛硬币的结果记为随机变量XXX,随机变量有两种取值情况(0或1),并且我们可以知道抛硬币结果的概率。
通常,我们用大写字母表示随机变量,用小写字母表示随机变量的观测值,观测值只是一个数值,没有随机性,比如我们抛硬币4次,可以记录以下4个观测值:x1=1,x2=1,x3=0,x4=1x_{1}=1,x_{2}=1,x_{3}=0,x_{4}=1x1=1,x2=1,x3=0,x4=1下面我们了解概率密度函数(PDF,Probability Density Function),概率密度函数的物理意义为:PDF反映随机变量在某个确定取值点上的可能性。
比如高斯分布,高斯分布是连续概率分布,标准高斯分布的PDF为:
可以看出,在随机变量XXX取值为0时的概率最大。
对于离散型的分布,假设随机变量取值为离散型(X∈{1,3,7}X\in\left\{1,3,7\right\}X∈{1,3,7}),其PDF为:
可以将PDF描述为:p(X=1)=0.2,p(X=3)=0.5,p(X=7)=0.3p(X=1)=0.2,p(X=3)=0.5,p(X=7)=0.3p(X=1)=0.2,p(X=3)=0.5,p(X=7)=0.3。
假设随机变量XXX的取值域为χ\chiχ,如果随机变量为连续型,则有:∫χp(X=x)dx=1\int_{\chi}p(X=x)dx=1∫χp(X=x)dx=1与XXX相关的分布f(X)f(X)f(X)的期望为:E[f(X)]=∫χp(X=x)f(x)dxE[f(X)]=\int_{\chi}p(X=x)f(x)dxE[f(X)]=∫χp(X=x)f(x)dx
如果随机变量为离散型,则有:∑x∈χp(X=x)=1\sum_{x\in\chi}p(X=x)=1x∈χ∑p(X=x)=1与XXX相关的分布f(X)f(X)f(X)的期望为:E[f(X)]=∑x∈χp(X=x)f(x)E[f(X)]=\sum_{x\in\chi}p(X=x)f(x)E[f(X)]=x∈χ∑p(X=x)f(x)
接下来了解随机抽样(Random Sampling),以黑箱摸球为例,假设一个箱子里有10个球:2个红球,5个绿球,3个蓝球。现在从中取一个球,我们想知道会摸出什么球。
所谓随机抽样就是从箱子中取出一个球,并观察到颜色,我们把这个过程叫做随机抽样。
我们可以借助Numpy.random下的choice函数模拟上述随机抽样,假设我们模拟100次(有放回):
from numpy.random import choicesamples=choice(['R','G','B'],size=100,p=[0.2,0.5,0.3])
print(samples)"""
['R' 'G' 'R' 'G' 'G' 'G' 'B' 'G' 'G' 'G' 'B' 'G' 'R' 'B' 'G' 'B' 'G' 'B''G' 'B' 'G' 'G' 'G' 'G' 'B' 'B' 'B' 'G' 'G' 'G' 'R' 'G' 'G' 'R' 'B' 'G''G' 'B' 'B' 'G' 'B' 'B' 'R' 'G' 'B' 'B' 'B' 'B' 'R' 'R' 'B' 'B' 'G' 'B''G' 'G' 'G' 'G' 'G' 'B' 'G' 'R' 'R' 'G' 'G' 'R' 'G' 'G' 'G' 'G' 'B' 'G''B' 'R' 'R' 'G' 'B' 'G' 'G' 'G' 'G' 'G' 'G' 'G' 'G' 'R' 'G' 'R' 'G' 'G''B' 'G' 'G' 'B' 'G' 'G' 'G' 'B' 'G' 'G']
"""
强化学习中的专业术语
我们以《超级马里奥》为背景,认识强化学习中的专业术语。
首先,我们讲解state与action,我们可以认为state sss 就是当前游戏的一帧画面:
action则是智能体agent的行为,在强化学习中,动作action由谁发出,谁就是智能体,action a∈{left,right,up}a\in\left\{left,right,up\right\}a∈{left,right,up}:
基于当前的state,agent做出某个action的过程被称为policy(策略)。函数policy π\piπ 被定义为:π(a∣s)=p(A=a∣S=s)∈[0,1]\pi(a|s)=p(A=a|S=s)\in[0,1]π(a∣s)=p(A=a∣S=s)∈[0,1]policy函数本质是一种概率密度函数,比如基于当前 state sss,我们有以下policy:π(left∣s)=0.2,π(right∣s)=0.7,π(up∣s)=0.1\pi(left|s)=0.2,\pi(right|s)=0.7,\pi(up|s)=0.1π(left∣s)=0.2,π(right∣s)=0.7,π(up∣s)=0.1这反映了agent会以0.7的概率选择动作right,以0.2的概率选择动作left,以0.1的概率选择动作up。具体采取的action由分布采样得到。
强化学习的本质就是学习policy函数,policy函数是指导机器根据state采取action的依据。
注意这些动作是具有随机性的(根据概率分布采样action),我们不索引max,而保留随机性,这有利于一些博弈问题,由于action的随机性,对手不能根据当前state准确预测出所采取的action,所以不能预判出下一个state的情况,同理不能顺序预测下一个state应该采取的action。
下面介绍奖励 reward RRR,奖励的设置由实际情况决定,比如我们可以设置:
- 马里奥收到一个金币,奖励为1:R=1R=1R=1;
- 赢了当前游戏:R=10000R=10000R=10000;
- 游戏失败:R=−10000R=-10000R=−10000;
- 什么都没发生:R=0R=0R=0;
state由于action触发到下一个state,该过程为状态转移 state transition。状态转移的随机性可以存在,也可以不存在,随机性是否存在取决于环境environment,比如:
比如我们让agent采取up的action,下一个state必然存在马里奥出现在上方的情况,但由于"环境"(即游戏程序)设置蘑菇怪 Goomba 会以0.8的概率向前走,0.2的概率向后走,这就导致下一个state并不是完全确定的,所以说此时的state具有随机性。
但不管是什么状态,我们总是用一帧图像描述。我们将状态记为随机变量SSS,下一个状态记为随机变量S′S^{'}S′,我们可将状态转移函数描述为概率密度函数:p(s′∣s,a)=p(S′=s′∣S=s,A=a)p(s'|s,a)=p(S'=s'|S=s,A=a)p(s′∣s,a)=p(S′=s′∣S=s,A=a)注意,状态转移函数只有环境能得到,玩家是不能得到的。
下面我们来了解:agent与environment的交互。
agent为马里奥,环境为游戏程序。状态sts_{t}st由环境得到,我们可以将其定义为一帧图像。agent根据sts_{t}st做出动作ata_{t}at。
在agent做出ata_{t}at后,环境会更新状态至st+1s_{t+1}st+1,同时给agent奖励rtr_{t}rt。
强化学习中的随机性
明白强化学习中随机性的来源是必要的。
- 第一个随机性来源于action,给定状态sss,动作是随机的,用随机变量AAA表示动作(aaa表示观测值),根据policy函数进行随机抽样:
- 第二个随机性来自状态转移,我们可以描述为,给定状态S=sS=sS=s,动作A=aA=aA=a,环境会随机生成状态S′∼p(⋅∣s,a)S'\sim p(\cdot|s,a)S′∼p(⋅∣s,a):
如何使用AI进行游戏
首先,我们利用强化学习获得policy函数π\piπ,然后进行以下循环:
- 观测到当前状态(一帧图像)s1s_{1}s1;
- 由policy函数计算概率分布,随机抽样得到动作a1a_{1}a1;
- 由环境生成下一个状态s2s_{2}s2,同时环境返回给agent一个奖励r1r_{1}r1;
- 由policy函数计算概率分布,随机抽样得到动作a2a_{2}a2;
- 同理如上操作⋅⋅⋅⋅⋅\cdot\cdot\cdot\cdot\cdot⋅⋅⋅⋅⋅
在以上循环中,我们可以得到一个(state,action,reward)组成的轨迹:s1,a1,r1,s2,a2,r2,...,sT,aT,rTs_{1},a_{1},r_{1},s_{2},a_{2},r_{2},...,s_{T},a_{T},r_{T}s1,a1,r1,s2,a2,r2,...,sT,aT,rT
关于rewards和returns
rewards在前面已经提到过,是agent获得的奖励。而returns的定义是:cumulative future reward,即未来的累计奖励,returns被翻译为回报。我们将ttt时刻的回报记为UtU_{t}Ut:Ut=Rt+Rt+1+Rt+2+⋅⋅⋅U_{t}=R_{t}+R_{t+1}+R_{t+2}+\cdot\cdot\cdotUt=Rt+Rt+1+Rt+2+⋅⋅⋅可以看出,UtU_{t}Ut为:从ttt时刻奖励RtR_{t}Rt一直求和至游戏结束时的奖励。
现在考虑一个问题:RtR_{t}Rt和Rt+1R_{t+1}Rt+1一样重要吗?
- 解释:一般,未来的奖励不如现在的奖励有价值,比如今天给我100美元和一年后给我100美元,我更倾向于选择今天就得到,因为未来的不确定性会让我怀疑一年后得不到100美元。
由于未来奖励的价值有削弱,所以我们更正回报,得到折扣回报的表达:Ut=Rt+γRt+1+γ2Rt+2+⋅⋅⋅U_{t}=R_{t}+\gamma R_{t+1}+\gamma^{2}R_{t+2}+\cdot\cdot\cdotUt=Rt+γRt+1+γ2Rt+2+⋅⋅⋅其中,γ\gammaγ为折扣率,是一个超参数,折扣率的设置会对强化学习的表现产生影响。
下面分析一下回报计算中的随机性。
前面已经知道,随机性有两个来源:
- action AAA是随机的:p[A=a∣S=s]=π(a∣s)p[A=a|S=s]=\pi(a|s)p[A=a∣S=s]=π(a∣s);
- 新状态S′S'S′是随机的:p[S′=s′∣S=s,A=a]=p(s′∣s,a)p[S'=s'|S=s,A=a]=p(s'|s,a)p[S′=s′∣S=s,A=a]=p(s′∣s,a);
注意到,对于i≥ti\geq ti≥t,奖励RiR_{i}Ri取决于Si+1S_{i+1}Si+1和AiA_{i}Ai,所以RiR_{i}Ri也是随机的。因此,给定某个状态St=stS_{t}=s_{t}St=st,该时刻的回报UtU_{t}Ut也会是随机的,UtU_{t}Ut取决于下面的随机变量:At,At+1,...,St+1,St+2,...A_{t},A_{t+1},...,S_{t+1},S_{t+2},...At,At+1,...,St+1,St+2,...
价值函数Value Functions
action-value function
根据前面讲过的回报returns,我们可以很直接地希望获得一种策略,使得ttt时刻的回报尽量大,但由于UtU_{t}Ut是随机变量,因此,我们可以使其期望最大达到一个良好的游戏结果。回报的期望记作:Qπ(st,at)=E[Ut∣St=st,At=at]Q_{\pi}(s_{t},a_{t})=E[U_{t}|S_{t}=s_{t},A_{t}=a_{t}]Qπ(st,at)=E[Ut∣St=st,At=at]函数QπQ_{\pi}Qπ又被称为基于π\piπ的 action-value function(动作-价值函数)。
注意,UtU_{t}Ut应该取决于随机变量:At,At+1,...,St+1,St+2,...A_{t},A_{t+1},...,S_{t+1},S_{t+2},...At,At+1,...,St+1,St+2,...,但在计算期望时,由于我们对后续不确定性的随机变量进行积分或求和,最终使得期望与初始观测值sts_{t}st和ata_{t}at,以及策略函数π(a∣s)\pi(a|s)π(a∣s),状态转移函数p(s′∣s,a)p(s'|s,a)p(s′∣s,a)有关。由于状态转移函数是环境决定的,故我们将动作-价值函数记作Qπ(st,at)Q_{\pi}(s_{t},a_{t})Qπ(st,at)。
给定当前状态sts_{t}st和policy函数π\piπ,通过计算Qπ(st,at)Q_{\pi}(s_{t},a_{t})Qπ(st,at),我们可以得到不同ata_{t}at下的UtU_{t}Ut的期望,从而可判断哪个动作可以获得更多回报。
补充一点:如果选择不同的policy函数,我们将得到不同的QπQ_{\pi}Qπ,我们可以选择最大的动作-价值函数,记作:Q∗(st,at)=maxπQπ(st,at)Q^{*}(s_{t},a_{t})=max_{\pi}Q_{\pi}(s_{t},a_{t})Q∗(st,at)=maxπQπ(st,at)函数Q∗Q^{*}Q∗被称为optimal action-value function,即最优动作-价值函数。
state-value function
状态-价值函数即state-value function,它是action-value function关于动作的期望:Vπ(st)=EA[Qπ(st,A)]V_{\pi}(s_{t})=E_{A}[Q_{\pi}(s_{t},A)]Vπ(st)=EA[Qπ(st,A)]状态-价值函数的意义在于:VπV_{\pi}Vπ可以反映当前状态的局势好坏,假设我们根据policy函数下围棋,VπV_{\pi}Vπ可以通过当前的棋盘状态告诉我们是快要胜利,还是快要失败。
如果动作是离散的,我们可以将state-value function表达为:Vπ(st)=EA[Qπ(st,A)]=∑aπ(a∣st)Qπ(st,a)V_{\pi}(s_{t})=E_{A}[Q_{\pi}(s_{t},A)]=\sum_{a}\pi(a|s_{t})Q_{\pi}(s_{t},a)Vπ(st)=EA[Qπ(st,A)]=a∑π(a∣st)Qπ(st,a)如果动作是连续的,比如自动驾驶的方向盘角度(-90度到+90度之间的连续值),我们可以将state-value function表达为:Vπ(st)=EA[Qπ(st,A)]=∫−90+90π(a∣st)Qπ(st,a)daV_{\pi}(s_{t})=E_{A}[Q_{\pi}(s_{t},A)]=\int_{-90}^{+90}\pi(a|s_{t})Q_{\pi}(s_{t},a)daVπ(st)=EA[Qπ(st,A)]=∫−90+90π(a∣st)Qπ(st,a)da
关于价值函数的理解:
- 选择某个policy函数π\piπ后,action-value function Qπ(st,at)Q_{\pi}(s_{t},a_{t})Qπ(st,at)可以告诉我们,在状态sts_{t}st下,agent选择动作ata_{t}at后获得的回报期望。
- state-value function Vπ(st)V_{\pi}(s_{t})Vπ(st)可以告诉我们,在状态sts_{t}st下,我们将要获胜的程度。很明显,如果状态越好,则VπV_{\pi}Vπ的值会越大。
- 延申一下,其实我们可以用VπV_{\pi}Vπ判断policy的好坏,如果策略函数π\piπ越好,则期望ES[Vπ(S)]E_{S}[V_{\pi}(S)]ES[Vπ(S)]越大。
再述用AI进行游戏
还是以超级玛丽为例:多捕捉金币,避开敌人,向前走,直到通关。我们要做的是写一个算法控制agent。我们可以有下面的方式:
第一种做法是学习policy函数π(a∣s)\pi(a|s)π(a∣s),这属于强化学习中的策略学习(Policy-Based Learning),当我们获得策略后,进行以下操作:
- 观测当前状态sts_{t}st;
- 随机抽样:at∼π(⋅∣st)a_{t}\sim\pi(\cdot|s_{t})at∼π(⋅∣st)。
另一种做法是学习最优动作-价值函数(optimal action-value function)Q∗(s,a)Q^{*}(s,a)Q∗(s,a),这属于强化学习中的价值学习(Value-Based Learning),当我们获得价值函数后,进行以下操作:
- 观测当前状态sts_{t}st;
- 选择Q∗(s,a)Q^{*}(s,a)Q∗(s,a)最大化对应的动作:at=argmaxaQ∗(st,a)a_{t}=argmax_{a}Q^{*}(s_{t},a)at=argmaxaQ∗(st,a)。
关于第二种做法,进行下面的补充:对于ttt时刻,我们可以使用不同的policy,这就导致我们可以计算出不同的回报期望Qπ(st,a)Q_{\pi}(s_{t},a)Qπ(st,a),但我们选择ttt时刻回报期望最大的policy,得到该时刻下,对于不同policy,选择动作aaa的最大回报Q∗(st,a)Q^{*}(s_{t},a)Q∗(st,a),我们统计所有aaa对应的Q∗(st,a)Q^{*}(s_{t},a)Q∗(st,a),取回报最大的那个action作为最优动作ata_{t}at。
关于OpenAI Gym
Gym 是一个用于开发和比较强化学习算法的工具包。它与各种数值计算库兼容,比如 tensorflow 和 Theano。Gym 库是测试问题(环境)的集合,我们可以使用它来制定强化学习算法。这些环境(environment)具有共享接口,允许我们编写通用算法。
Gym包含以下两个部分:
- Gym开源库:一个问题和环境的集合,用于提供测试强化学习算法的背景问题。
- Gym服务:一个API,用于对比训练后智能体的性能。
Gym的环境举例如下,有经典的控制问题:
也有小霸王游戏机里的游戏 Atari Games:
此处我以CartPole为例描述问题:黑色的小车可以在传送带上左右移动,我们给小车左右的力,使得小车上的木杆能够竖起来不倒下去。
Gym的安装简单:
pip install gym
在Python中调用Gym是容易的,我们以经典控制问题中的CartPole问题为例:
import gym# 构造问题环境
env=gym.make('CartPole-v0')# 环境重置,获取初始状态
state=env.reset()for t in range(100):# 渲染游戏,render会将当前state(一帧图像)以窗口可视化给我们看env.render()print(state)# 随机均匀地抽样一个动作,本行语句其实是错误的,实际应该由pi函数或Q*函数算出action,而不是简单的直接均匀抽样action=env.action_space.sample()# agent发出action,环境更新state,并返回reward,同时有两个返回对象done(布尔)和info(字典),info是调试信息state,reward,done,info=env.step(action)# 如果done=1,代表游戏结束(赢了或者输了)if done:print('Finished')break# 环境销毁
env.close()
第二十六课.深度强化学习(一)相关推荐
- OpenGL教程翻译 第二十六课 法线纹理
第二十六课 法线纹理 背景 我们之前使用的光照技术还算不错,光线在模型表面得到了很好的插值,为场景营造出真实感.但是这种效果还能够有非常大的提升.事实上,我们以前使用的这种插值方式在某种程度上来说是对 ...
- NeHe OpenGL教程 第二十六课:反射
转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...
- 第二十七课.深度强化学习(二)
目录 概述 价值学习 Deep Q Network DQN的训练:TD算法(Temporal Difference Learning) 策略学习 Policy Network 策略网络训练:Polic ...
- 深度强化学习_深度学习理论与应用第8课 | 深度强化学习
本文是博雅大数据学院"深度学习理论与应用课程"第八章的内容整理.我们将部分课程视频.课件和讲授稿进行发布.在线学习完整内容请登录www.cookdata.cn 深度强化学习是一种将 ...
- 深度学习(三十八)——深度强化学习(1)教程
教程 http://incompleteideas.net/sutton/book/the-book-2nd.html <Reinforcement Learning: An Introduct ...
- 深度学习(四十二)——深度强化学习(5)PPO, IMPALA, Hierarchical RL, OpenAI
PPO(Proximal Policy Optimization) PPO是2017年由OpenAI提出的一种基于随机策略的DRL算法,也是当前OpenAI的默认算法. PPO是一种Actor-Cri ...
- 深度学习(三十九)——深度强化学习(2)概述, Deep Q-learning Network(1)
概述 上图是深度强化学习的脉络图,参考文献中还有该领域的关键论文列表. 原图地址: http://louiskirsch.com/maps/reinforcement-learning 参考: htt ...
- 新版标准日本语初级_第二十六课
语法 1. 小句(动词简体形) + の + は 形です:动词小句加の使其名词化,表示做某动作的意思.这种名词化形式做主语,而谓语是表示性质.状态的一类形容词或二类形容词时,主语要用助词は来表示. ...
- 第二十六课_C语言开山篇
前言 从这篇文章开始,正式进入C语言的大门,这篇文章不讲技术,只是对C语言相关的东西,谈谈本id现阶段的一些看法.没空的可以忽略此篇文章. "想学好C语言,就要站在编译器的角度思考问题,要想 ...
最新文章
- Hadoop实例之利用MapReduce实现Wordcount单词统计 (附源代码)
- HDFS的访问方式之HDFS shell的常用命令
- pip安装deb_趟坑:使用pip安装TensorFlow
- 文献学习(part15)--Subspace Clustering via Good Neighbors
- HTML5 API详解(3):为何网页上要增加Battery电池状态API
- 11G新特性 -- 分区表和增量统计信息
- java实现工单派发_编写官方微信支付 Java SDK 的同学领下工单!
- 计算机学号生成准考证号,设计考场编排,生成准考证号
- matlab 7.0安装教程
- 《SteamVR2.2.0快速入门》(Yanlz+Unity+XR+OpenVR+OpenXR+SteamVR+Valve+Vive+Oculus+Quickstart+HMD+立钻哥哥++ok++)
- LM2586S 应用笔记
- windows PC 连接Windows作为无线显示器
- html和linux下目录路径中 杠,点杠,点点杠区别
- 搭建远程仓库(源)来托管 Sencha 包(Package)
- pacman yaourt使用
- 数据库delete语句菜鸟_MySQL视图
- 【瀑布流插件】vue-masonry
- qsort vs sort
- N76E003 驱动 ST7567 (SPI串口)
- NOJ1055叙拉古猜想——水题