diff --git a/docs/README.md b/docs/README.md index 20c427c..14fa8a7 100644 --- a/docs/README.md +++ b/docs/README.md @@ -14,7 +14,7 @@ - bilibili:[李宏毅《深度强化学习》](https://www.bilibili.com/video/BV1MW411w79n) ## 目录 -- [P1 强化学习基础](https://datawhalechina.github.io/leedeeprl-notes/#/chapter1/chapter1) +- [P1 强化学习概述](https://datawhalechina.github.io/leedeeprl-notes/#/chapter1/chapter1) - [P2 表格型方法](https://datawhalechina.github.io/leedeeprl-notes/#/chapter2/chapter2) - [P3 策略梯度](https://datawhalechina.github.io/leedeeprl-notes/#/chapter3/chapter3) - [P4 近端策略优化 (PPO) 算法](https://datawhalechina.github.io/leedeeprl-notes/#/chapter4/chapter4) diff --git a/docs/chapter1/chapter1.md b/docs/chapter1/chapter1.md index f993f21..0cfab11 100644 --- a/docs/chapter1/chapter1.md +++ b/docs/chapter1/chapter1.md @@ -3,7 +3,7 @@ ## Reinforcement Learning ![](img/1.1.png) -强化学习讨论的问题是说一个 agent 怎么在一个复杂不确定的环境里面去极大化它能获得的这个奖励。示意图由两部分组成,一部分是agent,下面一部分是环境。然后在强化学习过程中,Agent 跟 environment 其实一直在交互。当 agent 在环境里面获取到状态,agent 会利用这个状态会输出一个 action,一个决策。然后这个决策会放到这个环境之中去,然后环境会通过这个 agent 采取的决策,输出下一个状态以及当前的这个决策得到的奖励。Agent 的目的就是为了尽可能多的从环境中获取这个奖励。 +强化学习讨论的问题是说一个 agent 怎么在一个复杂不确定的环境里面去极大化它能获得的这个奖励。示意图由两部分组成,一部分是 agent,下面一部分是环境。然后在强化学习过程中,Agent 跟 environment 其实一直在交互。当 agent 在环境里面获取到状态,agent 会利用这个状态会输出一个 action,一个决策。然后这个决策会放到这个环境之中去,然后环境会通过这个 agent 采取的决策,输出下一个状态以及当前的这个决策得到的奖励。Agent 的目的就是为了尽可能多的从环境中获取这个奖励。 ![](img/1.2.png) @@ -29,9 +29,7 @@ -![](img/1.6.png) - -通过跟监督学习比较,我们可以总结出这个强化学习的一些特征。 +![](img/1.6.png)通过跟监督学习比较,我们可以总结出这个强化学习的一些特征。 * 首先它是有这个 trial-and-error exploration,它需要通过在环境里面探索来获取对这个环境的理解。 * 第二点是这个强化学习 agent 会从环境里面获得延迟的奖励。 @@ -56,7 +54,7 @@ ![](img/1.9.png) -上图是强化学习的一个经典例子,就是在雅达利叫 Pong 的一个游戏。这个游戏就是通过把这个球然后拍到左边,然后左边这个选手需要把这个球拍到右边,这里我给大家看的是训练好的一个 agent 。大家可以猜猜哪一边是强化学习的 agent 。右边是强化学习的agent 。你会发现它,一直在做这种无意义的一些振动,而正常的选手不会出现这种这样的行为。 +上图是强化学习的一个经典例子,就是在雅达利叫 Pong 的一个游戏。这个游戏就是通过把这个球然后拍到左边,然后左边这个选手需要把这个球拍到右边,这里我给大家看的是训练好的一个 agent 。大家可以猜猜哪一边是强化学习的 agent 。右边是强化学习的 agent,你会发现它,一直在做这种无意义的一些振动,而正常的选手不会出现这种这样的行为。 ![](img/1.10.png) @@ -210,16 +208,50 @@ Policy 就是决定了这个 agent 的行为,它其实是一个函数,把输 ![](img/1.34.png) 另外,我们是可以通过 agent 到底有没有学习这个环境模型来分类。 -* 有一类这个强化学习 agent 我们可以叫它 model-based RL agent,就是它通过学习这个状态的转移来采取措施。 -* 另外一种是 model-free RL agent,就是它没有去直接估计这个状态的转移,也没有得到环境的具体转移变量,然后它通过学习 value function 和 policy function 进行决策。这种 model-free 的模型里面它并没有一个环境转移的一个模型。 +* 第一种是 `model-based` RL agent,它通过学习这个状态的转移来采取措施。 +* 另外一种是 ` model-free` RL agent,它没有去直接估计这个状态的转移,也没有得到环境的具体转移变量。它通过学习 value function 和 policy function 进行决策。这种 model-free 的模型里面没有一个环境转移的一个模型。 + +Q: 有模型学习和免模型学习有什么区别? + +针对是否需要对真实环境建模,强化学习可以分为有模型学习和免模型学习。 + +* 有模型学习是指根据环境中的经验,构建一个虚拟世界,同时在真实环境和虚拟世界中学习; + +* 免模型学习是指不对环境进行建模,直接与真实环境进行交互来学习到最优策略。 + +我们可以用马尔可夫决策过程来定义强化学习任务,并表示为四元组 $$,即状态集合、动作集合、状态转移函数和奖励函数。如果这四元组中所有元素均已知,且状态集合和动作集合在有限步数内是有限集,则机器可以对真实环境进行建模,构建一个虚拟世界来模拟真实环境的状态和交互反应。 + +具体来说,当智能体知道状态转移函数 $P(s_{t+1}|s_t,a_t)$ 和奖励函数 $R(s_t,a_t)$ 后,它就能知道在某一状态下执行某一动作后能带来的奖励和环境的下一状态,这样智能体就不需要在真实环境中采取动作,直接在虚拟世界中学习和规划策略即可。这种学习方法称为`有模型学习`。 ![](img/1.35.png) +上图是有模型强化学习的流程图。 + +然而在实际应用中,智能体并不是那么容易就能知晓马尔科夫决策过程中的所有元素的。通常情况下,状态转移函数和奖励函数很难估计,甚至连环境中的状态都可能是未知的,这时就需要采用免模型学习。免模型学习没有对真实环境进行建模,智能体只能在真实环境中通过一定的策略来执行动作,等待奖励和状态迁移,然后根据这些反馈信息来更新行为策略,这样反复迭代直到学习到最优策略。 + +那么,有模型强化学习与免模型强化学习有哪些区别?各自有些优势呢? + +总的来说,有模型学习相比于免模型学习仅仅多出一个步骤,即对真实环境进行建模。因此,一些有模型的强化学习方法,也可以在免模型的强化学习方法中使用。在实际应用中,如果不清楚该用有模型强化学习还是免模型强化学习,可以先思考一下,在智能体执行动作前,是否能对下一步的状态和奖励进行预测,如果可以,就能够对环境进行建模,从而采用有模型学习。 + +免模型学习通常属于数据驱动型方法,需要大量的采样来估计状态、动作及奖励函数,从而优化动作策略。例如,在 Atari 平台上的《太空侵略者》(Space Invader)游戏中,免模型的深度强化学习需要大约 2 亿帧游戏画面才能学到比较理想的效果。相比之下,有模型学习可以在一定程度上缓解训练数据匮乏的问题,因为智能体可以在虚拟世界中行训练。 + +免模型学习的泛化性要优于有模型学习,原因是有模型学习算需要对真实环境进行建模,并且虚拟世界与真实环境之间可能还有差异,这限制了有模型学习算法的泛化性。 + +有模型的强化学习方法可以对环境建模,使得该类方法具有独特魅力,即“想象能力”。在免模型学习中,智能体只能一步一步地采取策略,等待真实环境的反馈;而有模型学习可以在虚拟世界中预测出所有将要发生的事,并采取对自己最有利的策略。 + + +目前,大部分深度强化学习方法都采用了免模型学习,这是因为: + +* 免模型学习更为简单直观且有丰富的开源资料,像 DQN、AlphaGo 系列等都采用免模型学习; +* 在目前的强化学习研究中,大部分情况下环境都是静态的、可描述的,智能体的状态是离散的、可观察的(如 Atari 游戏平台),这种相对简单确定的问题并不需要评估状态转移函数和奖励函数,直接采用免模型学习,使用大量的样本进行训练就能获得较好的效果。 + +![](img/1.36.png) + 把几类模型放到同一个 pie chart 里面。三个组成部分:value function、policy、model。按一个 agent 具不具有三者中的两者或者一者可以把它分成很多类。 ### Exploration and Exploitation -![](img/1.36.png) +![](img/1.37.png) 在强化学习里面,Exploration 和 Exploitation 是两个很核心的问题。 * Exploration 的意思是说我们怎么去探索这个环境。通过尝试不同的行为,然后可以得到一个最佳的策略,得到最大奖励的策略。 @@ -228,7 +260,7 @@ Policy 就是决定了这个 agent 的行为,它其实是一个函数,把输 因为在刚开始的时候这个强化学习 agent 并不知道它采取了某个行为会发生什么,所以它只能通过试错去探索。所以 Exploration 就是在试错来理解采取的这个行为到底可不可以得到好的奖励。Exploitation 是说我们直接采取已知的可以得到很好奖励的行为。所以这里就面临一个 trade-off。怎么通过牺牲一些短期的 reward 来获得行为的理解。 -![](img/1.37.png) +![](img/1.38.png) 这里我再给大家举一些例子来说明 Exploration 和 Exploitation 的定义。 * 比如说我们在选择餐馆的时候。 @@ -249,37 +281,37 @@ Policy 就是决定了这个 agent 的行为,它其实是一个函数,把输 ### Experiment with Reinforcement Learning -![](img/1.38.png) +![](img/1.39.png) 接下来我们会进入一个实践环节。强化学习其实是一个理论跟实践结合的一个机器学习分支,需要去推导很多算法公式。然后去理解它算法背后的一些数学原理。另外一方面,上机实践通过实现算法,然后在很多实验环境里面去真正探索这个算法是不是可以得到预期效果也是一个非常重要的一个过程。所以我希望大家把实践提到一个很高的高度,真正去实践这个强化学习的算法。 -![](img/1.39.png) +![](img/1.40.png) 然后我们这门课程,我会在网页上面公布一些代码,会有很多会利用到 Python编程,然后也会利用到深度学习的一些包,主要是用 PyTorch 为主,然后在[这个链接](https://github.com/cuhkrlcourse/RLexample)里面,我其实已经公布了一些 RL 相关的代码。 -![](img/1.40.png) +![](img/1.41.png) 你就直接调用现有的包来实践,现在其实有很多深度学习的包可以用,熟练使用这里面的两三种其实已经可以实现非常多的功能。所以你并不需要从头去去造轮子,就直接调用它里面的函数去实现你想实现的功能。 -![](img/1.41.png) +![](img/1.42.png) 强化学习的话就不得不提 OpenAI 这家公司。OpenAI 是一个非盈利的人工智能研究公司。Open AI 公布了非常多的学习资源以及这个算法资源,他们之所以叫 Open AI,就是他们把他们所有开发的这些算法都 open source 出来。 -![](img/1.42.png) +![](img/1.43.png) `OpenAI Gym` 里面包含了很多现有的环境,比如说这个 Atari 游戏,然后还有一些强化学习里面比较经典的一些控制的环境。Gym Retro 是这个 gym 环境的进一步扩展,包含了更多的一些游戏。 -![](img/1.43.png) +![](img/1.44.png) 强化学习的这个交互就是由 agent 跟环境进行交互。所以我们算法的 interface 也是用这个来表示。比如说我们现在安装了 OpenAI Gym。那我们这里就可以直接调入 Taxi-v2 的环境,就建立了一个这个环境初始化这个环境过后,就可以进行交互了。Agent 得到这个观测过后,它就会输出一个 action。然后这个 action 会被这个环境拿进去执行这个step,然后环境就会往前走一步,然后返回新的 observation 和 reward 以及一个 flag variable 就决定你现在这个游戏是不是结束了。这几行代码就实现了强化学习里面的 framework。 -![](img/1.44.png) +![](img/1.45.png) 在OpenAI Gym 里面有很经典的控制类游戏,比如说 Acrobot,就是把这个两节铁杖,然后甩了立起来。还有 CartPole,通过控制一个平板,让这个木棍立起来。还有 MountainCar 的一个例子,就通过前后移动这个车,让它到达这个旗子的位置。大家可以去[这个链接](https://gym.openai.com/envs/#classic_control)看一看这些环境。在刚开始测试强化学习的时候,可以选择这些简单环境,因为这些环境可能是在一两分钟之内你就可以见到一个效果。 -![](img/1.45.png) +![](img/1.46.png) 这里我们看一下 CartPole 的这个环境。对于这个环境,有两个动作,Cart 往左移还是往右移。这里得到了观测:它这个车当前的位置,Cart 当前的往左往右移的速度,这个杆的这个角度以及它的杆的最高点的这个速度。 @@ -298,7 +330,7 @@ observation, reward, done, info = env.step(action) -## Todo +## To-do * Gym 安装过程 * RL例子 diff --git a/docs/chapter1/img/1.35.png b/docs/chapter1/img/1.35.png index 0dd57c7..e6bd0f1 100644 Binary files a/docs/chapter1/img/1.35.png and b/docs/chapter1/img/1.35.png differ diff --git a/docs/chapter1/img/1.36.png b/docs/chapter1/img/1.36.png index 5f94a01..0dd57c7 100644 Binary files a/docs/chapter1/img/1.36.png and b/docs/chapter1/img/1.36.png differ diff --git a/docs/chapter1/img/1.37.png b/docs/chapter1/img/1.37.png index 03951c2..5f94a01 100644 Binary files a/docs/chapter1/img/1.37.png and b/docs/chapter1/img/1.37.png differ diff --git a/docs/chapter1/img/1.38.png b/docs/chapter1/img/1.38.png index 373dc02..03951c2 100644 Binary files a/docs/chapter1/img/1.38.png and b/docs/chapter1/img/1.38.png differ diff --git a/docs/chapter1/img/1.39.png b/docs/chapter1/img/1.39.png index b3db399..373dc02 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 9aa5c7d..b3db399 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 b720d49..9aa5c7d 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 abba5ee..b720d49 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 5042b1c..abba5ee 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 77d3e2c..5042b1c 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 ee03264..77d3e2c 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 new file mode 100644 index 0000000..ee03264 Binary files /dev/null and b/docs/chapter1/img/1.46.png differ diff --git a/docs/chapter9/变量的范围和寿命.md b/docs/chapter9/变量的范围和寿命.md new file mode 100644 index 0000000..e69de29