add k-armed bandit
This commit is contained in:
@@ -309,29 +309,44 @@ A: 针对是否需要对真实环境建模,强化学习可以分为有模型
|
||||
* Exploitation 就是说你总是采取某一种策略。比如说,你可能打街霸,你采取的策略可能是蹲在角落,然后一直触脚。这个策略很可能可以奏效,但可能遇到特定的对手就失效。
|
||||
* Exploration 就是说你可能尝试一些新的招式,有可能你会发出大招来,这样就可能一招毙命。
|
||||
|
||||
### K-Armed Bandit
|
||||

|
||||
|
||||
与一般监督学习不同,强化学习任务的最终奖赏是在多步动作之后才能观察到,这里我们不妨先考虑比较简单的情形:最大化单步奖赏,即仅考虑一步操作。需注意的是,即便在这样的简化情形下,强化学习仍与监督学习有显著不同,因为机器需通过尝试来发现各个动作产生的结果,而没有训练数据告诉机器应当做哪个动作。
|
||||
|
||||
想要最大化单步奖赏需考虑两个方面:一是需知道每个动作带来的奖赏,二是要执行奖赏最大的动作。若每个动作对应的奖赏是一个确定值,那么尝试遍所有的动作便能找出奖赏最大的动作。然而,更一般的情形是,一个动作的奖赏值是来自于一个概率分布,仅通过一次尝试并不能确切地获得平均奖赏值。
|
||||
|
||||
实际上,单步强化学习任务对应了一个理论模型,即` K-臂赌博机(K-Armed Bandit)`。K-臂赌博机也被称为 `多臂赌博机(Multi-Armed Bandit) `。如上图所示,K-摇臂赌博机有 K 个摇臂,赌徒在投入一个硬币后可选择按下其中一个摇臂,每个摇臂以一定的概率吐出硬币,但这个概率赌徒并不知道。赌徒的目标是通过一定的策略最大化自己的奖赏,即获得最多的硬币。
|
||||
|
||||
* 若仅为获知每个摇臂的期望奖赏,则可采用`仅探索(exploration-only)法`:将所有的尝试机会平均分配给每个摇臂(即轮流按下每个摇臂),最后以每个摇臂各自的平均吐币概率作为其奖赏期望的近似估计。
|
||||
|
||||
* 若仅为执行奖赏最大的动作,则可采用`仅利用(exploitation-only)法`:按下目前最优的(即到目前为止平均奖赏最大的)摇臂,若有多个摇臂同为最优,则从中随机选取一个。
|
||||
|
||||
显然,仅探索法能很好地估计每个摇臂的奖赏,却会失去很多选择最优摇臂的机会;仅利用法则相反,它没有很好地估计摇臂期望奖赏,很可能经常选不到最优摇臂。因此,这两种方法都难以使最终的累积奖赏最大化。
|
||||
|
||||
事实上,探索(即估计摇臂的优劣)和利用(即选择当前最优摇臂)这两者是矛盾的,因为尝试次数(即总投币数)有限,加强了一方则会自然削弱另一方,这就是强化学习所面临的`探索-利用窘境(Exploration-Exploitation dilemma)`。显然,想要累积奖赏最大,则必须在探索与利用之间达成较好的折中。
|
||||
|
||||
## Experiment with Reinforcement Learning
|
||||

|
||||

|
||||
接下来进入一个实践环节。强化学习是一个理论跟实践结合的机器学习分支,需要去推导很多算法公式。然后去理解它算法背后的一些数学原理。另外一方面,上机实践通过实现算法,在很多实验环境里面去探索这个算法是不是可以得到预期效果也是一个非常重要的过程。
|
||||
|
||||
|
||||
|
||||

|
||||

|
||||
|
||||
我会在网页上面公布一些代码,会利用 Python 和深度学习的一些包(主要是用 PyTorch 为主),然后在[这个链接](https://github.com/cuhkrlcourse/RLexample)里面,我其实已经公布了一些 RL 相关的代码。
|
||||
|
||||

|
||||

|
||||
|
||||
你可以直接调用现有的包来实践。现在有很多深度学习的包可以用,熟练使用这里面的两三种,其实已经可以实现非常多的功能。所以你并不需要从头去去造轮子,就直接调用它里面的函数去实现你想实现的功能。
|
||||
|
||||

|
||||

|
||||
|
||||
[ OpenAI](https://openai.com/) 是一个非盈利的人工智能研究公司。Open AI 公布了非常多的学习资源以及这个算法资源,他们之所以叫 Open AI,就是他们把所有开发的算法都 open source 出来。
|
||||
|
||||
### Gym
|
||||
|
||||

|
||||

|
||||
|
||||
[OpenAI Gym](https://gym.openai.com/) 是一个环境仿真库,里面包含了很多现有的环境。针对不同的场景,我们可以选择不同的环境,
|
||||
|
||||
@@ -353,11 +368,11 @@ $python
|
||||
>>>import gym
|
||||
```
|
||||
|
||||

|
||||

|
||||
|
||||
强化学习的这个交互就是由 agent 跟环境进行交互。所以算法的 interface 也是用这个来表示。比如说我们现在安装了 OpenAI Gym。那我们这里就可以直接调入 Taxi-v2 的环境,就建立了这个环境。初始化这个环境过后,就可以进行交互了。Agent 得到这个观测过后,它就会输出一个 action。然后这个 action 会被这个环境拿进去执行这个 step,然后环境就会往前走一步,然后返回新的 observation 和 reward 以及一个 flag variable 就决定你这个游戏是不是结束了。几行代码就实现了强化学习里面的 framework。
|
||||
|
||||

|
||||

|
||||
在 OpenAI Gym 里面有很经典的控制类游戏。
|
||||
|
||||
* 比如说 Acrobot,就是把这个两节铁杖,然后甩了立起来。
|
||||
@@ -366,7 +381,7 @@ $python
|
||||
|
||||
大家可以点[这个链接](https://gym.openai.com/envs/#classic_control)看一看这些环境。在刚开始测试强化学习的时候,可以选择这些简单环境,因为这些环境在一两分钟之内,你就可以见到一个效果。
|
||||
|
||||

|
||||

|
||||
|
||||
这里我们看一下 CartPole 的这个环境。对于这个环境,有两个动作,Cart 往左移还是往右移。这里得到了观测:这个车当前的位置,Cart 当前的往左往右移的速度,这个杆的角度以及它的杆的最高点的速度。
|
||||
|
||||
@@ -562,6 +577,8 @@ print('平均回合奖励 = {}'.format(np.mean(episode_rewards)))
|
||||
* [强化学习:原理与Python实现](https://book.douban.com/subject/34478302/)
|
||||
* [白话强化学习与PyTorch](https://book.douban.com/subject/34809676/)
|
||||
* [OpenAI Spinning Up ](https://spinningup.openai.com/en/latest/spinningup/rl_intro.html#)
|
||||
* [神经网络与深度学习](https://nndl.github.io/)
|
||||
* [机器学习](https://book.douban.com/subject/26708119//)
|
||||
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user