目录

  • 强化学习基本概念
    • 数学基础回顾
    • 强化学习中的专业术语
    • 强化学习中的随机性
    • 如何使用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​=argmaxa​Q∗(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()

第二十六课.深度强化学习(一)相关推荐

  1. OpenGL教程翻译 第二十六课 法线纹理

    第二十六课 法线纹理 背景 我们之前使用的光照技术还算不错,光线在模型表面得到了很好的插值,为场景营造出真实感.但是这种效果还能够有非常大的提升.事实上,我们以前使用的这种插值方式在某种程度上来说是对 ...

  2. NeHe OpenGL教程 第二十六课:反射

    转自[翻译]NeHe OpenGL 教程 前言 声明,此 NeHe OpenGL教程系列文章由51博客yarin翻译(2010-08-19),本博客为转载并稍加整理与修改.对NeHe的OpenGL管线 ...

  3. 第二十七课.深度强化学习(二)

    目录 概述 价值学习 Deep Q Network DQN的训练:TD算法(Temporal Difference Learning) 策略学习 Policy Network 策略网络训练:Polic ...

  4. 深度强化学习_深度学习理论与应用第8课 | 深度强化学习

    本文是博雅大数据学院"深度学习理论与应用课程"第八章的内容整理.我们将部分课程视频.课件和讲授稿进行发布.在线学习完整内容请登录www.cookdata.cn 深度强化学习是一种将 ...

  5. 深度学习(三十八)——深度强化学习(1)教程

    教程 http://incompleteideas.net/sutton/book/the-book-2nd.html <Reinforcement Learning: An Introduct ...

  6. 深度学习(四十二)——深度强化学习(5)PPO, IMPALA, Hierarchical RL, OpenAI

    PPO(Proximal Policy Optimization) PPO是2017年由OpenAI提出的一种基于随机策略的DRL算法,也是当前OpenAI的默认算法. PPO是一种Actor-Cri ...

  7. 深度学习(三十九)——深度强化学习(2)概述, Deep Q-learning Network(1)

    概述 上图是深度强化学习的脉络图,参考文献中还有该领域的关键论文列表. 原图地址: http://louiskirsch.com/maps/reinforcement-learning 参考: htt ...

  8. 新版标准日本语初级_第二十六课

    语法   1. 小句(动词简体形) + の + は 形です:动词小句加の使其名词化,表示做某动作的意思.这种名词化形式做主语,而谓语是表示性质.状态的一类形容词或二类形容词时,主语要用助词は来表示. ...

  9. 第二十六课_C语言开山篇

    前言 从这篇文章开始,正式进入C语言的大门,这篇文章不讲技术,只是对C语言相关的东西,谈谈本id现阶段的一些看法.没空的可以忽略此篇文章. "想学好C语言,就要站在编译器的角度思考问题,要想 ...

最新文章

  1. Hadoop实例之利用MapReduce实现Wordcount单词统计 (附源代码)
  2. HDFS的访问方式之HDFS shell的常用命令
  3. pip安装deb_趟坑:使用pip安装TensorFlow
  4. 文献学习(part15)--Subspace Clustering via Good Neighbors
  5. HTML5 API详解(3):为何网页上要增加Battery电池状态API
  6. 11G新特性 -- 分区表和增量统计信息
  7. java实现工单派发_编写官方微信支付 Java SDK 的同学领下工单!
  8. 计算机学号生成准考证号,设计考场编排,生成准考证号
  9. matlab 7.0安装教程
  10. 《SteamVR2.2.0快速入门》(Yanlz+Unity+XR+OpenVR+OpenXR+SteamVR+Valve+Vive+Oculus+Quickstart+HMD+立钻哥哥++ok++)
  11. LM2586S 应用笔记
  12. windows PC 连接Windows作为无线显示器
  13. html和linux下目录路径中 杠,点杠,点点杠区别
  14. 搭建远程仓库(源)来托管 Sencha 包(Package)
  15. pacman yaourt使用
  16. 数据库delete语句菜鸟_MySQL视图
  17. 【瀑布流插件】vue-masonry
  18. qsort vs sort
  19. N76E003 驱动 ST7567 (SPI串口)
  20. NOJ1055叙拉古猜想——水题

热门文章

  1. 一段关于Unix与 Linux的暗黑史
  2. 快手二面:Java 里的 for (;;) 与 while (true),哪个更快?
  3. 分布式动态配置后浪推前浪 -- Nacos
  4. 按下电源后的几秒钟,CPU在干嘛?
  5. Leader晋升失败,CTO说,没有商业敏感度,迟早被淘汰
  6. 高并发场景下更新数据库报错,记录一次 MySQL 死锁问题的解决
  7. Scrum Mastery:产品开发中如何优化产品价值?
  8. 智办事:高效的目标管理,让企业战略目标得以实现
  9. 企业如何进行团队协作?
  10. 拥抱开源 加入分享 贡献小力量