4.DQN算法
关键词
深度Q网络(deep Q-network,DQN):基于深度学习的Q学习算法,其结合了价值函数近似(value function approximation)与神经网络技术,并采用目标网络和经验回放等方法进行网络的训练。
状态-价值函数(state-value function):其输入为演员某一时刻的状态,输出为一个标量,即当演员在对应的状态时,预期的到过程结束时间段内所能获得的价值。
状态-价值函数贝尔曼方程(state-value function Bellman equation):基于状态-价值函数的贝尔曼方程,它表示在状态 $s_t$ 下对累积奖励 $G_t$ 的期望。
Q函数(Q-function): 其也被称为动作价值函数(action-value function)。其输入是一个状态-动作对,即在某一具体的状态采取对应的动作,假设我们都使用某个策略 $\pi$ ,得到的累积奖励的期望值有多大。
目标网络(target network):其可解决在基于时序差分的网络中,优化目标 $Q_{\pi}\left(s_{t}, a_{t}\right) = r_{t}+ ...
5.策略梯度
关键词
策略(policy):在每一个演员中会有对应的策略,这个策略决定了演员的后续动作。具体来说,策略就是对于外界的输入,输出演员现在应该要执行的动作。一般地,我们将策略写成 $\pi$ 。
回报(return):一个回合(episode)或者试验(trial)得到的所有奖励的总和,也被人们称为总奖励(total reward)。一般地,我们用 $R$ 来表示它。
轨迹(trajectory):一个试验中我们将环境输出的状态 $s$ 与演员输出的动作 $a$ 全部组合起来形成的集合称为轨迹,即 $\tau=\left\{s_{1}, a_{1}, s_{2}, a_{2}, \cdots, s_{t}, a_{t}\right\}$ 。
奖励函数(reward function):用于反映在某一个状态采取某一个动作可以得到的奖励分数,这是一个函数。即给定一个状态-动作对 ($s_1$,$a_1$) ,奖励函数可以输出 $r_1$ 。给定 ($s_2$,$a_2$),它可以输出 $r_2$。 把所有的 $r$ 都加起来,我们就得到了 $R(\tau)$ ,它代表某一个轨迹 $\tau$ ...
6.演员-评论家算法
关键词
优势演员-评论员(advantage actor-critic,A2C)算法:一种改进的演员-评论员(actor-critic)算法。
异步优势演员-评论员(asynchronous advantage actor-critic,A3C)算法:一种改进的演员-评论员算法,通过异步的操作,实现强化学习模型训练的加速。
路径衍生策略梯度(pathwise derivative policy gradient):一种使用Q学习来求解连续动作的算法,也是一种演员-评论员算法。其会对演员提供价值最大的动作,而不仅仅是提供某一个动作的好坏程度。
习题6-1 完整的优势演员-评论员算法的工作流程是怎样的?在传统的方法中,我们有一个策略 $\pi$ 以及一个初始的演员与环境交互、收集数据以及反馈。通过每一步得到的反馈,我们进一步更新我们的策略 $\pi$ ,通常我们使用的更新方式是策略梯度。但是对于演员-评论员算法,我们不是直接使用每一步得到的数据和反馈进行策略 $\pi$ 的更新,而是使用这些数据和反馈进行价值函数的估计,这里我们通常使用的算法包括时序差分和蒙特卡洛等算法以及基于它们的优化 ...
7.DDPG算法
关键词
深度确定性策略梯度(deep deterministic policy gradient,DDPG):在连续控制领域经典的强化学习算法,是深度Q网络在处理连续动作空间的一个扩充方法。具体地,从命名就可以看出,“深度”表明使用了深度神经网络;“确定性”表示其输出的是一个确定的动作,可以用于连续动作环境;“策略梯度”代表的是它用到的是策略网络,并且每步都会更新一次,其是一个单步更新的策略网络。其与深度Q网络都有目标网络和经验回放的技巧,在经验回放部分是一致的,在目标网络的更新上有些许不同。
习题7-1 请解释随机性策略和确定性策略,两者有什么区别?(1)对于随机性策略 $\pi_\theta(a_t|s_t)$ ,我们输入某一个状态 $s$,采取某一个动作 $a$ 的可能性并不是百分之百的,而是有一个概率的,就好像抽奖一样,根据概率随机抽取一个动作。
(2)对于确定性策略 $\mu_{\theta}(s_t)$ ,其没有概率的影响。当神经网络的参数固定之后,输入同样的状态,必然输出同样的动作,这就是确定性策略。
7-2 对于连续动作的控制空间和离散动作的控制空间,如果我们都采取策 ...
8.PPO算法
关键词
同策略(on-policy):要学习的智能体和与环境交互的智能体是同一个时对应的策略。
异策略(off-policy):要学习的智能体和与环境交互的智能体不是同一个时对应的策略。
重要性采样(important sampling):使用另外一种分布,来逼近所求分布的一种方法,在强化学习中通常和蒙特卡洛方法结合使用,公式如下:
\int f(x) p(x) \mathrm{d} x=\int f(x) \frac{p(x)}{q(x)} q(x) \mathrm{d} x=E_{x \sim q}[f(x){\frac{p(x)}{q(x)}}]=E_{x \sim p}[f(x)]我们在已知 $q$ 的分布后,可以使用上式计算出从 $p$ 这个分布采样 $x$ 代入 $f$ 以后得到的期望值。
近端策略优化(proximal policy optimization,PPO):避免在使用重要性采样时由于在 $\theta$ 下的 $p_{\theta}\left(a_{t} | s_{t}\right)$ 与在 $\theta ‘$ 下的 $p_{\theta’} ...
9.稀疏奖励
关键词
设计奖励(reward shaping):当智能体与环境进行交互时,我们人为设计一些奖励,从而“指挥”智能体,告诉其采取哪一个动作是最优的。需要注意的是,这个奖励区别于环境的奖励。其可以提高我们估算Q函数时的准确性。
内在好奇心模块(intrinsic curiosity module,ICM):其代表好奇心驱动这个技术中的增加新的奖励函数以后的奖励函数。
课程学习(curriculum learning):一种广义的用在强化学习中训练智能体的方法,其在输入训练数据的时候,采取由易到难的顺序进行输入,也可以人为设计它的学习过程。这个方法在机器学习和强化学习中普遍使用。
逆课程学习(reverse curriculum learning):相较于课程学习,逆课程学习为更广义的方法。其从最终最理想的状态 [我们称之为黄金状态(gold state)] 开始,依次去寻找距离黄金状态最近的状态作为想让智能体达到的阶段性的“理想”状态。当然,我们会在此过程中有意地去掉一些极端的状态,即太简单、太难的状态。综上,逆课程学习是从黄金状态反推的方法。
分层强化学习(hierarchical r ...
1.Cython概述
1、关于Cython1.1 CythonCython 是一门编程语言,它将 C、C++ 的静态类型系统融合在了 Python 身上。文件的后缀是 .pyx,它是 Python 的一个超集;语法是 Python 语法和 C 语法的混血,当然我们说它是 Python 的一个超集,因此你写纯 Python 代码也是可以的。
cython 是一个编译器,负责将 Cython 源代码翻译成高效的 C 或者 C++ 源代码;Cython 源文件被编译之后的最终形式可以是 Python 的扩展模块(.pyd),也可以是一个独立的可执行文件。
因此 Cython 的强大之处就在于它将 Python 和 C 结合了起来,可以让你像写 Python 代码一样的同时还可以获得 C 的高效率;所以我们看到 Cython 相当于是高级语言 Python 和低级语言 C 之间的一个融合。
1.2 Cython和CPython的区别Python 是一门语言,它有自己的语法规则。按照 Python 语言规定的语法规则编写的代码就是 Python 源代码,但是源代码只是一个或多个普通的文本文件,需要使用 Python ...
2.Cython编译运行
1、概述Python 和 C、C++ 之间一个最重要的差异就是 Python 是解释型语言,而 C、C++ 是编译型语言。
而Cython 同 C、C++ 类似,在源代码运行之前也需要一个编译的步骤,不过这个编译可以是隐式的,也可以是显式的。而自动编译 Cython 的一个很棒的特性就是它使用起来和纯 Python 是差不多的,无论是显式还是隐式,都可以将 Python 的一部分(计算密集)使用 Cython 重写,因此 Cython 的编译需求可以达到最小化。因为没有必要将所有的代码都用 Cython 编写,而是将那些需要优化的代码使用 Cython 编写即可。
编译Cython有以下几个选择:
Cython 代码可以在 IPython 解释器中进行编译,并交互式运行。
Cython 代码可以在导入的时候自动编译。
Cython 代码可以通过类似于 Python 的 disutils 模块的编译工具进行独立编译。
Cython代码可以被继承到标准的编译系统,例如:make、CMake、SCons。
这些选择可以让我们在几个特定的场景应用 Cython,从一端的快速交互式探索到另一 ...
3.Cython语法介绍
1、概述Cython 和 Python 的差别从大方向上来说无非两个,
运行时解释和预先编译;
动态类型和静态类型。
2、解释执行 VS 编译执行对比一下 Python 虚拟机执行 Python 代码和操作系统执行已经编译的 C 代码之间的差别:
2.1 Python执行过程Python代码在运行之前,会先被编译成 pyc 文件(里面存储的是 Python 底层的PyCodeObject 对象),然后读取里面的 PyCodeObject 对象,执行内部的字节码。而字节码是能够被 Python 虚拟机解释或者执行的基础指令集,并且虚拟机独立于平台,因此在一个平台生成的字节码可以在任意平台运行。
虚拟机将一个高级字节码翻译成一个或者多个可以被操作系统执行、最终被CPU执行的低级操作(指令)。这种虚拟化很常见并且十分灵活,可以带来很多好处:其中一个好处就是不会被挑剔的编译器嫌弃(相较于编译型语言,在一个平台编译的可执行文件在其它平台上可能就用不了了),而缺点是运行速度比本地编译好的代码慢。
2.2 C执行过程在 C 的角度,由于不存在虚拟机或者解释器,因此也就不存在所谓的高级字节码。C ...
4.Cython中扩展类
1、Python类和扩展类之间的差异首先 Python 中 “一切皆对象”,怎么理解呢?首先在最基本的层次上,一个对象有三样东西:地址、值、类型,通过 id 函数可以获取地址并将每一个对象都区分开来,使用 type 获取类型。Python 中对象有很多属性,这些属性都放在自身的属性字典里面,这个字典可以通过 __dict__ 获取。调用对象的某一个属性的时候,可以通过 . 的方式来调用,Python 也允许我们通过 class 关键字自定义一个类。
123456789101112class A: passprint(A.__name__) # AA.__name__ = "B"print(A.__name__) # Btry: int.__name__ = "INT"except Exception as e: # 内建类型 和 扩展类型 不允许修改属性 print(e) # can't set attributes of built-in/extension type 'int'
除了 ...
6.Cython使用C/C++外部库
1、在Cython中声明外部的C代码要用 Cython 包装 C 源文件,必须在 Cython 中声明使用的 C 组件的接口。为此,Cython 提供了一个 extern语句,它的目的就是告诉 Cython,希望从指定的 C 头文件中使用 C 结构。语法如下:
123cdef extern from "header_name": # 相应的声明, 你希望使用哪些 C 结构, 那么就将其定义在这里 # 如果不需要的话可以写上一个pass
1. Cython 编译器会在生成的源文件中写入 #include "header_name"
2. 在 extern 语句块中的类型、函数以及其它声明都可以在 Cython 中直接使用
3. Cython 会在编译时检查 C 的声明是否正确,如果不正确会编译错误。
extern 语句块中的声明类似于 C,会用它来介绍之前说的结构体、共同体。另外 extern 关键字可以和 cdef 组合,一起添加到任意的 C 声明中。
extern 会在生成的源文件中写入一个 #include 语句,但如果不希望 ...
5.Cython模块导入
1、概述Python 提供了 modules 和 packages 来组织项目,这允许函数、类、变量等,按照各自的功能或者实现的业务,分组到各自的逻辑单元中,从而使项目更容易理解和定位。并且模块和包也使得代码重用变得容易,在 Python 中我们使用 import 语句访问其它 module 和 package 中的函数。
而 Cython 也支持将项目分成多个模块,首先它完全支持 import 语句,并且含义与 Python 中的含义完全相同。这就允许我们在运行时访问外部纯 Python 模块中定义的 Python 对象,或者其它扩展模块中定义的可以被访问的 Python 对象。
只有 import 的话,Cython 是不允许两个模块访问彼此的 cdef、cpdef 定义的函数、ctypedef、struct 等等,也不允许访问对其它的扩展类型进行 C 一级的访问。比如:cython_test1.pyx 和 cython_test2.pyx ,这两个文件之间无法通过 import 互相访问,当然 cimport 也无法实现这一点。
而为了解决这一问题,Cython 提供了相应类型的 ...