diff --git a/docs/chapter1/chapter1.md b/docs/chapter1/chapter1.md index d51ac32..6bf8823 100644 --- a/docs/chapter1/chapter1.md +++ b/docs/chapter1/chapter1.md @@ -309,29 +309,44 @@ A: 针对是否需要对真实环境建模,强化学习可以分为有模型 * Exploitation 就是说你总是采取某一种策略。比如说,你可能打街霸,你采取的策略可能是蹲在角落,然后一直触脚。这个策略很可能可以奏效,但可能遇到特定的对手就失效。 * Exploration 就是说你可能尝试一些新的招式,有可能你会发出大招来,这样就可能一招毙命。 +### K-Armed Bandit +![](img/1.39.png) +与一般监督学习不同,强化学习任务的最终奖赏是在多步动作之后才能观察到,这里我们不妨先考虑比较简单的情形:最大化单步奖赏,即仅考虑一步操作。需注意的是,即便在这样的简化情形下,强化学习仍与监督学习有显著不同,因为机器需通过尝试来发现各个动作产生的结果,而没有训练数据告诉机器应当做哪个动作。 + +想要最大化单步奖赏需考虑两个方面:一是需知道每个动作带来的奖赏,二是要执行奖赏最大的动作。若每个动作对应的奖赏是一个确定值,那么尝试遍所有的动作便能找出奖赏最大的动作。然而,更一般的情形是,一个动作的奖赏值是来自于一个概率分布,仅通过一次尝试并不能确切地获得平均奖赏值。 + +实际上,单步强化学习任务对应了一个理论模型,即` K-臂赌博机(K-Armed Bandit)`。K-臂赌博机也被称为 `多臂赌博机(Multi-Armed Bandit) `。如上图所示,K-摇臂赌博机有 K 个摇臂,赌徒在投入一个硬币后可选择按下其中一个摇臂,每个摇臂以一定的概率吐出硬币,但这个概率赌徒并不知道。赌徒的目标是通过一定的策略最大化自己的奖赏,即获得最多的硬币。 + +* 若仅为获知每个摇臂的期望奖赏,则可采用`仅探索(exploration-only)法`:将所有的尝试机会平均分配给每个摇臂(即轮流按下每个摇臂),最后以每个摇臂各自的平均吐币概率作为其奖赏期望的近似估计。 + +* 若仅为执行奖赏最大的动作,则可采用`仅利用(exploitation-only)法`:按下目前最优的(即到目前为止平均奖赏最大的)摇臂,若有多个摇臂同为最优,则从中随机选取一个。 + +显然,仅探索法能很好地估计每个摇臂的奖赏,却会失去很多选择最优摇臂的机会;仅利用法则相反,它没有很好地估计摇臂期望奖赏,很可能经常选不到最优摇臂。因此,这两种方法都难以使最终的累积奖赏最大化。 + +事实上,探索(即估计摇臂的优劣)和利用(即选择当前最优摇臂)这两者是矛盾的,因为尝试次数(即总投币数)有限,加强了一方则会自然削弱另一方,这就是强化学习所面临的`探索-利用窘境(Exploration-Exploitation dilemma)`。显然,想要累积奖赏最大,则必须在探索与利用之间达成较好的折中。 ## Experiment with Reinforcement Learning -![](img/1.39.png) +![](img/1.40.png) 接下来进入一个实践环节。强化学习是一个理论跟实践结合的机器学习分支,需要去推导很多算法公式。然后去理解它算法背后的一些数学原理。另外一方面,上机实践通过实现算法,在很多实验环境里面去探索这个算法是不是可以得到预期效果也是一个非常重要的过程。 -![](img/1.40.png) +![](img/1.41.png) 我会在网页上面公布一些代码,会利用 Python 和深度学习的一些包(主要是用 PyTorch 为主),然后在[这个链接](https://github.com/cuhkrlcourse/RLexample)里面,我其实已经公布了一些 RL 相关的代码。 -![](img/1.41.png) +![](img/1.42.png) 你可以直接调用现有的包来实践。现在有很多深度学习的包可以用,熟练使用这里面的两三种,其实已经可以实现非常多的功能。所以你并不需要从头去去造轮子,就直接调用它里面的函数去实现你想实现的功能。 -![](img/1.42.png) +![](img/1.43.png) [ OpenAI](https://openai.com/) 是一个非盈利的人工智能研究公司。Open AI 公布了非常多的学习资源以及这个算法资源,他们之所以叫 Open AI,就是他们把所有开发的算法都 open source 出来。 ### Gym -![](img/1.43.png) +![](img/1.44.png) [OpenAI Gym](https://gym.openai.com/) 是一个环境仿真库,里面包含了很多现有的环境。针对不同的场景,我们可以选择不同的环境, @@ -353,11 +368,11 @@ $python >>>import gym ``` -![](img/1.44.png) +![](img/1.45.png) 强化学习的这个交互就是由 agent 跟环境进行交互。所以算法的 interface 也是用这个来表示。比如说我们现在安装了 OpenAI Gym。那我们这里就可以直接调入 Taxi-v2 的环境,就建立了这个环境。初始化这个环境过后,就可以进行交互了。Agent 得到这个观测过后,它就会输出一个 action。然后这个 action 会被这个环境拿进去执行这个 step,然后环境就会往前走一步,然后返回新的 observation 和 reward 以及一个 flag variable 就决定你这个游戏是不是结束了。几行代码就实现了强化学习里面的 framework。 -![](img/1.45.png) +![](img/1.46.png) 在 OpenAI Gym 里面有很经典的控制类游戏。 * 比如说 Acrobot,就是把这个两节铁杖,然后甩了立起来。 @@ -366,7 +381,7 @@ $python 大家可以点[这个链接](https://gym.openai.com/envs/#classic_control)看一看这些环境。在刚开始测试强化学习的时候,可以选择这些简单环境,因为这些环境在一两分钟之内,你就可以见到一个效果。 -![](img/1.46.png) +![](img/1.47.png) 这里我们看一下 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//) diff --git a/docs/chapter1/img/1.39.png b/docs/chapter1/img/1.39.png index 373dc02..6f52a11 100644 Binary files a/docs/chapter1/img/1.39.png and b/docs/chapter1/img/1.39.png differ diff --git a/docs/chapter1/img/1.40.png b/docs/chapter1/img/1.40.png index b3db399..373dc02 100644 Binary files a/docs/chapter1/img/1.40.png and b/docs/chapter1/img/1.40.png differ diff --git a/docs/chapter1/img/1.41.png b/docs/chapter1/img/1.41.png index 9aa5c7d..b3db399 100644 Binary files a/docs/chapter1/img/1.41.png and b/docs/chapter1/img/1.41.png differ diff --git a/docs/chapter1/img/1.42.png b/docs/chapter1/img/1.42.png index b720d49..9aa5c7d 100644 Binary files a/docs/chapter1/img/1.42.png and b/docs/chapter1/img/1.42.png differ diff --git a/docs/chapter1/img/1.43.png b/docs/chapter1/img/1.43.png index abba5ee..b720d49 100644 Binary files a/docs/chapter1/img/1.43.png and b/docs/chapter1/img/1.43.png differ diff --git a/docs/chapter1/img/1.44.png b/docs/chapter1/img/1.44.png index 5042b1c..abba5ee 100644 Binary files a/docs/chapter1/img/1.44.png and b/docs/chapter1/img/1.44.png differ diff --git a/docs/chapter1/img/1.45.png b/docs/chapter1/img/1.45.png index 77d3e2c..5042b1c 100644 Binary files a/docs/chapter1/img/1.45.png and b/docs/chapter1/img/1.45.png differ diff --git a/docs/chapter1/img/1.46.png b/docs/chapter1/img/1.46.png index ee03264..77d3e2c 100644 Binary files a/docs/chapter1/img/1.46.png and b/docs/chapter1/img/1.46.png differ diff --git a/docs/chapter1/img/1.47.png b/docs/chapter1/img/1.47.png new file mode 100644 index 0000000..ee03264 Binary files /dev/null and b/docs/chapter1/img/1.47.png differ diff --git a/docs/chapter3/chapter3.md b/docs/chapter3/chapter3.md index 3ecbdf2..db1420a 100644 --- a/docs/chapter3/chapter3.md +++ b/docs/chapter3/chapter3.md @@ -8,9 +8,9 @@ ![](img/3.1.png) -强化学习的三个重要的要素:状态、动作和奖励。强化学习智能体跟环境是一步一步交互的,就是我先观察一下状态,然后再输入动作。再观察一下状态,再输出动作,拿到这些 reward 。它是一个跟时间相关的序列决策的问题。 +**强化学习的三个重要的要素:状态、动作和奖励。**强化学习智能体跟环境是一步一步交互的,就是我先观察一下状态,然后再输入动作。再观察一下状态,再输出动作,拿到这些 reward 。它是一个跟时间相关的序列决策的问题。 -举个例子,在 $t-1$ 时刻,我看到了熊对我招手,那我下意识的可能输出的动作就是赶紧跑路。熊看到了有人跑了,可能就觉得发现猎物,开始发动攻击。而在 $t$ 时刻的话,我如果选择装死的动作,可能熊咬了咬我那个摔了几下就发现就觉得挺无趣的,可能会走开。这个时候,我再跑路的话可能就跑路成功了,就是这样子的一个序列决策的过程。 +举个例子,在 $t-1$ 时刻,我看到了熊对我招手,那我下意识的可能输出的动作就是赶紧跑路。熊看到了有人跑了,可能就觉得发现猎物,开始发动攻击。而在 $t$ 时刻的话,我如果选择装死的动作,可能熊咬了咬我,摔了几下就发现就觉得挺无趣的,可能会走开。这个时候,我再跑路的话可能就跑路成功了,就是这样子的一个序列决策的过程。 当然在输出每一个动作之前,你可以选择不同的动作。比如说在 $t$ 时刻,我选择跑路的时候,熊已经追上来了,如果说 $t$ 时刻,我没有选择装死,而我是选择跑路的话,这个时候熊已经追上了,那这个时候,其实我有两种情况转移到不同的状态去,就我有一定的概率可以逃跑成功,也有很大的概率我会逃跑失败。那我们就用状态转移概率 $p\left[s_{t+1}, r_{t} \mid s_{t}, a_{t}\right]$ 来表述说在 $s_t$ 的状态选择了 $a_t$ 的动作的时候,转移到 $s_{t+1}$ ,而且拿到 $r_t$ 的概率是多少。 @@ -27,7 +27,7 @@ MDP 就是序列决策这样一个经典的表达方式。MDP 也是强化学习 如上图所示,我们把这些可能的动作和可能的状态转移的关系画成一个树状图。它们之间的关系就是从 $s_t$ 到 $a_t$ ,再到 $s_{t+1}$ ,再到 $a_{t+1}$,再到 $s_{t+2}$ 这样子的一个过程。 -我们去跟环境交互,只能走完整的一条通路。这里面产生了一系列的一个决策的过程,就是我们跟环境交互产生了一个经验。我们会使用 P 函数(probability function)和 R 函数(reward function)来去描述环境。P 函数就是状态转移的概率,P 函数实际上反映的是环境的一个随机性。 +我们去跟环境交互,只能走完整的一条通路。这里面产生了一系列的一个决策的过程,就是我们跟环境交互产生了一个经验。我们会使用 `P 函数(probability function)`和 `R 函数(reward function)`来去描述环境。P 函数就是状态转移的概率,P 函数实际上反映的是环境的一个随机性。 比如,在熊发怒的情况下,我如果选择装死,假设熊看到人装死就一定会走的话,我们就称在这里面的状态转移概率就是百分之百。但如果说在熊发怒的情况下,我选择跑路而导致可能跑成功以及跑失败,出现这两种情况。那我们就可以用概率去表达一下说转移到其中一种情况的概率大概 10%,另外一种情况的概率大概是 90% 会跑失败。**如果我们知道这些状态转移概率和奖励函数的话,就说这个环境是已知的,因为我们是用这两个函数去描述环境的。**如果是已知的话,我们其实可以用动态规划去计算说,如果要逃脱熊,那么能够逃脱熊概率最大的最优策略是什么。很多强化学习的经典算法都是 model-free 的,就是环境是未知的。 @@ -105,7 +105,7 @@ $$ ![](img/3.14.png) -这种强化方式其实在数学上面一行公式就表达出来了。这种更新的方式叫做`时序差分(Temporal Difference)`。这个公式就是说可以拿下一步的 Q 值 $Q(S_{t+_1},A_{t+1})$ 来更新我这一步的 Q 值 $Q(S_t,A_t)$ 。 +这种强化方式其实在数学上面一行公式就表达出来了,这种更新的方式叫做`时序差分(Temporal Difference)`。这个公式就是说可以拿下一步的 Q 值 $Q(S_{t+_1},A_{t+1})$ 来更新我这一步的 Q 值 $Q(S_t,A_t)$ 。 为了理解这个公式,如图所示,我们先把 $R_{t+1}+\gamma Q\left(S_{t+1}, A_{t+1}\right.)$ 当作是一个目标值,就是 $Q(S_t,A_t)$ 想要去逼近的一个目标值。我们想要计算的就是 $Q(S_t,A_t)$ 。因为最开始 Q 值都是随机初始化或者是初始化为零,它需要不断地去逼近它理想中真实的 Q 值,我们就叫 target 。Target 就是未来收益的总和大概有多少,而且是带衰减的那个。 @@ -208,8 +208,6 @@ $$ 总结如上图所示。 - - ## References * [百面深度学习](https://book.douban.com/subject/35043939/)