强化学习第一章(蘑菇书)
之前也学过一点,但是不够系统,想利用这一次机会好好把一些概念理顺清楚。
第一部分肯定是强化学习的概念问题。强化学习(reinforcement learning,RL)讨论的问题是智能体(agent)怎么在复杂、不确定的环境(environment)中最大化它能获得的奖励。
主要的一个问题就是,在强化学习过程中,智能体与环境一直在交互。智能体在环境中获取某个状态后,它会利用该状态输出一个动作 (action),这个动作也称为决策(decision)。然后这个动作会在环境中被执行,环境会根据智能体采取的动作,输出下一个状态以及当前这个动作带来的奖励。智能体的目的就是尽可能多地从环境中获取奖励。
通过学习后,归纳了几点,简单地打了一个表格来概括一下子。
监督学习 | 强化学习 |
---|---|
输入的样本是独立同分布的 | 输入的是序列数据 |
会告诉learner什么是正确的标签 | learner需要自己去发现哪些动作可以带来最多的reward |
没有trial-and-error exploration的过程 | 智能体需要试错探索来获得能力 |
有supervisor | 没有非常强的监督者(supervisor),只有奖励信号(reward signal) |
除了这些,还想要强调的是,在RL中,智能体的动作会影响它随后得到的数据,这一点是非常重要的。在训练智能体的过程中,很多时候我们也是通过正在学习的智能体与环境交互来得到数据的。所以如果在训练过程中,智能体不能保持稳定,就会使我们采集到的数据非常糟糕。我们通过数据来训练智能体,如果数据有问题,整个训练过程就会失败。所以在强化学习里面一个非常重要的问题就是,怎么让智能体的动作一直稳定地提升。
(1)DeepMind 研发的走路的智能体
(2)机械臂抓取
(3)OpenAI 的机械臂翻魔方
(4)穿衣服的智能体
好多其实现在与OR(运筹优化)结合越来越紧密了,尤其是深度强化学习,现在越来越嵌入到运筹优化领域了,之前读到的一些文献也有涉及。具体的应用大家可以自行百度,我这里就不展开了哈哈哈。
在一个强化学习环境里面,智能体的目的就是选取一系列的动作来最大化奖励,所以这些选取的动作 必须有长期的影响。但在这个过程里面,智能体的奖励其实是被延迟了的,就是我们现在选取的某一步动作,可能要等到很久后才知道这一步到底产生了什么样的影响。如图 1.13 所示,在玩雅达利的 Pong 游戏时,我们可能只有到最后游戏结束时,才知道球到底有没有被击打过去。过程中我们采取的上升(up)或 下降(down)动作,并不会直接产生奖励。强化学习里面一个重要的课题就是近期奖励和远期奖励的权衡 (trade-off),研究怎么让智能体取得更多的远期奖励。
在与环境的交互过程中,智能体会获得很多观测。针对每一个观测,智能体会采取一个动作,也会得到一个奖励。所以历史是观测、动作、奖励的序列:
H t = o 1 , r 1 , a 1 , … , o t , a t , r t H_{t}=o_{1}, r_{1}, a_{1}, \ldots, o_{t}, a_{t}, r_{t} Ht=o1,r1,a1,…,ot,at,rt
智能体在采取当前动作的时候会依赖于它之前得到的历史,所以我们可以把整个游戏的状态看成关于这个历史的函数:
S t = f ( H t ) S_{t}=f\left(H_{t}\right) St=f(Ht)
这一部分感觉还是很有必要记一下的。
对于一个强化学习智能体,它可能有一个或多个如下的组成成分。
V π ( s ) ≐ E π [ G t ∣ s t = s ] = E π [ ∑ k = 0 ∞ γ k r t + k + 1 ∣ s t = s ] , 对于所有的 s ∈ S V_{\pi}(s) \doteq \mathbb{E}_{\pi}\left[G_{t} \mid s_{t}=s\right]=\mathbb{E}_{\pi}\left[\sum_{k=0}^{\infty} \gamma^{k} r_{t+k+1} \mid s_{t}=s\right] \text {, 对于所有的 } s \in S Vπ(s)≐Eπ[Gt∣st=s]=Eπ[∑k=0∞γkrt+k+1∣st=s], 对于所有的 s∈S
Q π ( s , a ) ≐ E π [ G t ∣ s t = s , a t = a ] = E π [ ∑ k = 0 ∞ γ k r t + k + 1 ∣ s t = s , a t = a ] Q_{\pi}(s, a) \doteq \mathbb{E}_{\pi}\left[G_{t} \mid s_{t}=s, a_{t}=a\right]=\mathbb{E}_{\pi}\left[\sum_{k=0}^{\infty} \gamma^{k} r_{t+k+1} \mid s_{t}=s, a_{t}=a\right] Qπ(s,a)≐Eπ[Gt∣st=s,at=a]=Eπ[∑k=0∞γkrt+k+1∣st=s,at=a]
p s s ′ a = p ( s t + 1 = s ′ ∣ s t = s , a t = a ) p_{s s^{\prime}}^{a}=p\left(s_{t+1}=s^{\prime} \mid s_{t}=s, a_{t}=a\right) pss′a=p(st+1=s′∣st=s,at=a) , R ( s , a ) = E [ r t + 1 ∣ s t = s , a t = a ] R(s, a)=\mathbb{E}\left[r_{t+1} \mid s_{t}=s, a_{t}=a\right] R(s,a)=E[rt+1∣st=s,at=a]
当我们有了策略、价值函数和模型3个组成部分后,就形成了一个马尔可夫决策过程(Markov decision process)。
然后再来说一下强化学习智能体的类型,常用的就两种分类的方式:
中间还有很多Q&A,这地方就不赘述了。直接进入到我们的代码环节。强化学习还可以通过pytorch,TensorFlow来实战。
安装好gym库以后,就可以实验了。
import gym #导入gym包
env = gym.make('CartPole-v0') #构建试验环境
结果如下图所示,但是只会显示几秒就会自动消失。这是因为我们还没开始训练机器人。
CartPole-v0 环境有两个动作:将小车向左移动和将小车向右移动。我们还可以得到观测:小车当前的位置,小车当前往左、往右移的速度,杆的角度以及杆的最高点(顶端)的速度。 观测越详细,我们就可以更好地描述当前所有的状态。这里有奖励的定义,如果能多走一步,我们就会得到一个奖励(奖励值为1),所以我们需要存活尽可能多的时间来得到更多的奖励。当杆的角度大于某一个角度(没能保持平衡),或者小车的中心到达图形界面窗口的边缘,或者累积步数大于200,游戏就结束了,我们就输了。所以智能体的目的是控制杆,让它尽可能地保持平衡以及尽可能保持在环境的中央。
import gym
env = gym.make('CartPole-v0')
env.reset() #重置
for _ in range(1000):
env.render()
action = env.action_space.sample()
observation, reward, done, info = env.step(action) #env.step方法有四个返回值,观测,奖励,完成和信息
print(observation)
env.close()
这一部分的输出很长,是一个四维的观测,从S->A->R->S’
Reference:
【1】https://datawhalechina.github.io/easy-rl/#/chapter1/chapter1
【2】https://zhuanlan.zhihu.com/reinforce