IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 第二十六课.深度强化学习(一) -> 正文阅读

[人工智能]第二十六课.深度强化学习(一)

强化学习基本概念

强化学习即 Reinforcement Learning,而现在所说的强化学习更多的实际是深度强化学习。本篇先了解强化学习中的基本概念。

数学基础回顾

首先,我们回顾随机变量Random Variable,随机变量是一个未知的量,它的值取决于一个随机事件的结果。以硬币投掷为例:
fig1
我们将正面朝上记为0,反面为1,抛硬币是一个随机事件,抛硬币的结果记为随机变量 X X X,随机变量有两种取值情况(0或1),并且我们可以知道抛硬币结果的概率。

通常,我们用大写字母表示随机变量,用小写字母表示随机变量的观测值,观测值只是一个数值,没有随机性,比如我们抛硬币4次,可以记录以下4个观测值: x 1 = 1 , x 2 = 1 , x 3 = 0 , x 4 = 1 x_{1}=1,x_{2}=1,x_{3}=0,x_{4}=1 x1?=1,x2?=1,x3?=0,x4?=1下面我们了解概率密度函数(PDF,Probability Density Function),概率密度函数的物理意义为:PDF反映随机变量在某个确定取值点上的可能性。

比如高斯分布,高斯分布是连续概率分布,标准高斯分布的PDF为:
fig2
可以看出,在随机变量 X X X取值为0时的概率最大。

对于离散型的分布,假设随机变量取值为离散型( X ∈ { 1 , 3 , 7 } X\in\left\{1,3,7\right\} X{1,3,7}),其PDF为:
fig3
可以将PDF描述为: p ( X = 1 ) = 0.2 , p ( X = 3 ) = 0.5 , p ( X = 7 ) = 0.3 p(X=1)=0.2,p(X=3)=0.5,p(X=7)=0.3 p(X=1)=0.2,p(X=3)=0.5,p(X=7)=0.3

假设随机变量 X X X的取值域为 χ \chi χ,如果随机变量为连续型,则有: ∫ χ p ( X = x ) d x = 1 \int_{\chi}p(X=x)dx=1 χ?p(X=x)dx=1 X X X相关的分布 f ( X ) f(X) f(X)的期望为: E [ f ( X ) ] = ∫ χ p ( X = x ) f ( x ) d x E[f(X)]=\int_{\chi}p(X=x)f(x)dx E[f(X)]=χ?p(X=x)f(x)dx

如果随机变量为离散型,则有: ∑ x ∈ χ p ( X = x ) = 1 \sum_{x\in\chi}p(X=x)=1 xχ?p(X=x)=1 X X X相关的分布 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 choice

samples=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 s s s 就是当前游戏的一帧画面:
fig4
action则是智能体agent的行为,在强化学习中,动作action由谁发出,谁就是智能体,action a ∈ { l e f t , r i g h t , u p } a\in\left\{left,right,up\right\} a{left,right,up}
fig5
基于当前的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] π(as)=p(A=aS=s)[0,1]policy函数本质是一种概率密度函数,比如基于当前 state s s s,我们有以下policy: π ( l e f t ∣ s ) = 0.2 , π ( r i g h t ∣ s ) = 0.7 , π ( u p ∣ s ) = 0.1 \pi(left|s)=0.2,\pi(right|s)=0.7,\pi(up|s)=0.1 π(lefts)=0.2,π(rights)=0.7,π(ups)=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 R R R,奖励的设置由实际情况决定,比如我们可以设置:

  • 马里奥收到一个金币,奖励为1: R = 1 R=1 R=1
  • 赢了当前游戏: R = 10000 R=10000 R=10000
  • 游戏失败: R = ? 10000 R=-10000 R=?10000
  • 什么都没发生: R = 0 R=0 R=0

state由于action触发到下一个state,该过程为状态转移 state transition。状态转移的随机性可以存在,也可以不存在,随机性是否存在取决于环境environment,比如:
fig6
比如我们让agent采取up的action,下一个state必然存在马里奥出现在上方的情况,但由于"环境"(即游戏程序)设置蘑菇怪 Goomba 会以0.8的概率向前走,0.2的概率向后走,这就导致下一个state并不是完全确定的,所以说此时的state具有随机性。

但不管是什么状态,我们总是用一帧图像描述。我们将状态记为随机变量 S S S,下一个状态记为随机变量 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(ss,a)=p(S=sS=s,A=a)注意,状态转移函数只有环境能得到,玩家是不能得到的。

下面我们来了解:agent与environment的交互。
fig7
agent为马里奥,环境为游戏程序。状态 s t s_{t} st?由环境得到,我们可以将其定义为一帧图像。agent根据 s t s_{t} st?做出动作 a t a_{t} at?
fig8
在agent做出 a t a_{t} at?后,环境会更新状态至 s t + 1 s_{t+1} st+1?,同时给agent奖励 r t r_{t} rt?

强化学习中的随机性

明白强化学习中随机性的来源是必要的。

  • 第一个随机性来源于action,给定状态 s s s,动作是随机的,用随机变量 A A A表示动作( a a a表示观测值),根据policy函数进行随机抽样:
    fig9
  • 第二个随机性来自状态转移,我们可以描述为,给定状态 S = s S=s S=s,动作 A = a A=a A=a,环境会随机生成状态 S ′ ~ p ( ? ∣ s , a ) S'\sim p(\cdot|s,a) Sp(?s,a)
    fig10

如何使用AI进行游戏

首先,我们利用强化学习获得policy函数 π \pi π,然后进行以下循环:

  • 观测到当前状态(一帧图像) s 1 s_{1} s1?
  • 由policy函数计算概率分布,随机抽样得到动作 a 1 a_{1} a1?
  • 由环境生成下一个状态 s 2 s_{2} s2?,同时环境返回给agent一个奖励 r 1 r_{1} r1?
  • 由policy函数计算概率分布,随机抽样得到动作 a 2 a_{2} a2?
  • 同理如上操作 ? ? ? ? ? \cdot\cdot\cdot\cdot\cdot ?????

在以上循环中,我们可以得到一个(state,action,reward)组成的轨迹: s 1 , a 1 , r 1 , s 2 , a 2 , r 2 , . . . , s T , a T , r T s_{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被翻译为回报。我们将 t t t时刻的回报记为 U t U_{t} Ut? U t = R t + R t + 1 + R t + 2 + ? ? ? U_{t}=R_{t}+R_{t+1}+R_{t+2}+\cdot\cdot\cdot Ut?=Rt?+Rt+1?+Rt+2?+???可以看出, U t U_{t} Ut?为:从 t t t时刻奖励 R t R_{t} Rt?一直求和至游戏结束时的奖励。

现在考虑一个问题: R t R_{t} Rt? R t + 1 R_{t+1} Rt+1?一样重要吗?

  • 解释:一般,未来的奖励不如现在的奖励有价值,比如今天给我100美元和一年后给我100美元,我更倾向于选择今天就得到,因为未来的不确定性会让我怀疑一年后得不到100美元。

由于未来奖励的价值有削弱,所以我们更正回报,得到折扣回报的表达: U t = R t + γ R t + 1 + γ 2 R t + 2 + ? ? ? U_{t}=R_{t}+\gamma R_{t+1}+\gamma^{2}R_{t+2}+\cdot\cdot\cdot Ut?=Rt?+γRt+1?+γ2Rt+2?+???其中, γ \gamma γ为折扣率,是一个超参数,折扣率的设置会对强化学习的表现产生影响。

下面分析一下回报计算中的随机性。

前面已经知道,随机性有两个来源:

  • action A A A是随机的: p [ A = a ∣ S = s ] = π ( a ∣ s ) p[A=a|S=s]=\pi(a|s) p[A=aS=s]=π(as)
  • 新状态 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=sS=s,A=a]=p(ss,a)

注意到,对于 i ≥ t i\geq t it,奖励 R i R_{i} Ri?取决于 S i + 1 S_{i+1} Si+1? A i A_{i} Ai?,所以 R i R_{i} Ri?也是随机的。因此,给定某个状态 S t = s t S_{t}=s_{t} St?=st?,该时刻的回报 U t U_{t} Ut?也会是随机的, U t U_{t} Ut?取决于下面的随机变量: A t , A t + 1 , . . . , S t + 1 , S t + 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,我们可以很直接地希望获得一种策略,使得 t t t时刻的回报尽量大,但由于 U t U_{t} Ut?是随机变量,因此,我们可以使其期望最大达到一个良好的游戏结果。回报的期望记作: Q π ( s t , a t ) = E [ U t ∣ S t = s t , A t = a t ] 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(动作-价值函数)。

注意, U t U_{t} Ut?应该取决于随机变量: A t , A t + 1 , . . . , S t + 1 , S t + 2 , . . . A_{t},A_{t+1},...,S_{t+1},S_{t+2},... At?,At+1?,...,St+1?,St+2?,...,但在计算期望时,由于我们对后续不确定性的随机变量进行积分或求和,最终使得期望与初始观测值 s t s_{t} st? a t a_{t} at?,以及策略函数 π ( a ∣ s ) \pi(a|s) π(as),状态转移函数 p ( s ′ ∣ s , a ) p(s'|s,a) p(ss,a)有关。由于状态转移函数是环境决定的,故我们将动作-价值函数记作 Q π ( s t , a t ) Q_{\pi}(s_{t},a_{t}) Qπ?(st?,at?)

给定当前状态 s t s_{t} st?和policy函数 π \pi π,通过计算 Q π ( s t , a t ) Q_{\pi}(s_{t},a_{t}) Qπ?(st?,at?),我们可以得到不同 a t a_{t} at?下的 U t U_{t} Ut?的期望,从而可判断哪个动作可以获得更多回报。


补充一点:如果选择不同的policy函数,我们将得到不同的 Q π Q_{\pi} Qπ?,我们可以选择最大的动作-价值函数,记作: Q ? ( s t , a t ) = m a x π Q π ( s t , a t ) 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 π ( s t ) = E A [ Q π ( s t , 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 π ( s t ) = E A [ Q π ( s t , A ) ] = ∑ a π ( a ∣ s t ) Q π ( s t , 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?π(ast?)Qπ?(st?,a)如果动作是连续的,比如自动驾驶的方向盘角度(-90度到+90度之间的连续值),我们可以将state-value function表达为: V π ( s t ) = E A [ Q π ( s t , A ) ] = ∫ ? 90 + 90 π ( a ∣ s t ) Q π ( s t , a ) d a V_{\pi}(s_{t})=E_{A}[Q_{\pi}(s_{t},A)]=\int_{-90}^{+90}\pi(a|s_{t})Q_{\pi}(s_{t},a)da Vπ?(st?)=EA?[Qπ?(st?,A)]=?90+90?π(ast?)Qπ?(st?,a)da

关于价值函数的理解:

  • 选择某个policy函数 π \pi π后,action-value function Q π ( s t , a t ) Q_{\pi}(s_{t},a_{t}) Qπ?(st?,at?)可以告诉我们,在状态 s t s_{t} st?下,agent选择动作 a t a_{t} at?后获得的回报期望。
  • state-value function V π ( s t ) V_{\pi}(s_{t}) Vπ?(st?)可以告诉我们,在状态 s t s_{t} st?下,我们将要获胜的程度。很明显,如果状态越好,则 V π V_{\pi} Vπ?的值会越大。
  • 延申一下,其实我们可以用 V π V_{\pi} Vπ?判断policy的好坏,如果策略函数 π \pi π越好,则期望 E S [ V π ( S ) ] E_{S}[V_{\pi}(S)] ES?[Vπ?(S)]越大。

再述用AI进行游戏

还是以超级玛丽为例:多捕捉金币,避开敌人,向前走,直到通关。我们要做的是写一个算法控制agent。我们可以有下面的方式:

第一种做法是学习policy函数 π ( a ∣ s ) \pi(a|s) π(as),这属于强化学习中的策略学习(Policy-Based Learning),当我们获得策略后,进行以下操作:

  • 观测当前状态 s t s_{t} st?
  • 随机抽样: a t ~ π ( ? ∣ s t ) 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),当我们获得价值函数后,进行以下操作:

  • 观测当前状态 s t s_{t} st?
  • 选择 Q ? ( s , a ) Q^{*}(s,a) Q?(s,a)最大化对应的动作: a t = a r g m a x a Q ? ( s t , a ) a_{t}=argmax_{a}Q^{*}(s_{t},a) at?=argmaxa?Q?(st?,a)

关于第二种做法,进行下面的补充:对于 t t t时刻,我们可以使用不同的policy,这就导致我们可以计算出不同的回报期望 Q π ( s t , a ) Q_{\pi}(s_{t},a) Qπ?(st?,a),但我们选择 t t t时刻回报期望最大的policy,得到该时刻下,对于不同policy,选择动作 a a a的最大回报 Q ? ( s t , a ) Q^{*}(s_{t},a) Q?(st?,a),我们统计所有 a a a对应的 Q ? ( s t , a ) Q^{*}(s_{t},a) Q?(st?,a),取回报最大的那个action作为最优动作 a t a_{t} at?

关于OpenAI Gym

Gym 是一个用于开发和比较强化学习算法的工具包。它与各种数值计算库兼容,比如 tensorflow 和 Theano。Gym 库是测试问题(环境)的集合,我们可以使用它来制定强化学习算法。这些环境(environment)具有共享接口,允许我们编写通用算法。

Gym包含以下两个部分:

  • Gym开源库:一个问题和环境的集合,用于提供测试强化学习算法的背景问题。
  • Gym服务:一个API,用于对比训练后智能体的性能。

Gym的环境举例如下,有经典的控制问题:
fig11
也有小霸王游戏机里的游戏 Atari Games:
fig12
此处我以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()
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-07-05 20:20:08  更:2021-07-05 20:20:26 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年12日历 -2024/12/21 23:52:23-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码