文章目录
简而言之,RL是研究代理以及代理如何通过反复试验来学习的方法。它正式提出了这样一种思想,即通过奖励或惩罚人的行为使其将来更有可能重复或放弃该行为。以下两篇文章会结合本篇理论部分给出代码实践:
ppo算法 关键公式+代码(一)
ppo算法 关键公式+代码(二)
1、术语
强化学习的主要特征是代理和环境。环境是代理生存并与之互动的世界。在交互的每个步骤中,代理都会得到(可能是部分)对世界状态的观察,然后根据状态决定要采取的行动。当代理对它进行操作时,环境会发生变化,但也可能会自行发生变化。
代理还从环境中感知到奖励信号,该数字告诉它当前世界状态的好坏。代理的目标是最大化其累积的奖励,称为return。强化学习方法是代理可以通过学习行为来实现其目标的方法。
为了更具体地讨论RL的作用,我们需要引入其他术语。我们需要了解一下概念:
- 状态和观察(states and observations),
- 动作空间(action spaces),
- 策略(policies),
- 序列(trajectories),
- 不同的收益表述(different formulations of return),
- RL优化问题(the RL optimization problem),
- 价值函数(value functions)。
1.1状态和观察(States and Observations)
状态 s 是对世界状态的完整描述。不包含关于世界的信息
观察 o 是对状态s的部分描述,可以解释部分被状态忽略的信息。
在深度RL中,我们几乎总是用实值向量,矩阵或高阶张量表示状态和观测值。例如,视觉观察可以用其像素值的RGB矩阵表示。机器人的状态可以用其关节角度和速度来表示。
当代理能够观察到环境的完整状态时,我们说该环境是 fully observed。当主体只能看到部分观察时,我们说环境是partially observed的。
1.2 动作空间(action space)
不同的环境允许不同类型的动作。给定环境中所有有效动作的集合通常称为动作空间。
某些环境(例如Atari和Go),代理能够执行的动作是离散的,例如如上下左右这四个动作,我们称它的动作空间为离散动作空间(discrete action spaces)。而其他环境(例如,代理在物理世界中控制机器人的环境),代理的动作是连续的,例如电机角度控制。我们称为连续动作空间(continuous action spaces),在连续空间中,动作是实值向量。
这种区分对深度RL中的方法产生了一些深远的影响。一些算法系列只能在一种情况下直接应用,而在另一种情况下则必须进行大量修改。
1.3 策略(Policies)
策略是使用代理来决定采取何种行动的规则。
如果它可以是确定性的,通常用 μ \mu μ表示:
a t = μ ( s t ) a_t = \mu(s_t) at=μ(st)
如果是随机的,通产用 π \pi π表示:
a t ∼ π ( ⋅ ∣ s t ) a_t \sim \pi(\cdot | s_t) at∼π(⋅∣st)
在深度RL中,我们处理参数化策略:输出为可计算函数的策略,这些函数取决于一组参数(例如神经网络的权重和偏差),我们可以通过一些优化算法进行调整以更改行为。
我们通常用 θ \theta θ或表示这种策略的参数 ϕ \phi ϕ,然后将其作为下标写在策略符号上:
a t = μ θ ( s t ) a_t = \mu_{\theta}(s_t) at=μθ(st)
a t = π θ ( ⋅ ∣ s t ) a_t = \pi_{\theta}(\cdot | s_t) at=πθ(⋅∣st)
1.3.1 确定性策略(Deterministic Policies):
下面使用tensorflow编写的连续动作空间的确定性策略的简单代码:
obs = tf.keras.Input(shape=(None, obs_dim), dtype=tf.float32)
net = mlp(hidden_dims=(64,64), activation=tf.tanh)(obs)
actions = tf.keras.layers.dense(units=act_dim, activation=None)(net)
其中,mlp是一个给定结构和激活函数的神经网络,神经网络直接输出动作值。
1.3.2 随机策略(Stochastic Policies)
随机策略指的是神经网络,或者策略模型,它输出的是动作的概率分布,而不是某个特定的动作,然后再根据概率去对动作进行采样,深度RL中两种最常见的随机策略是分类策略(categorical policies )和对角高斯策略(diagonal Gaussian policies)。
分类策略可用于离散动作空间,而对角线高斯策略可用于连续动作空间。对于使用和训练随机策略,两个关键计算至关重要:
- 从策略中对行为取样,
- 计算特定动作的对数可能性(log likelihoods ), log π θ ( a ∣ s ) \log \pi _ {\theta}(a | s) logπθ(a∣s)。
分类政策(Categorical Policies)
分类策略就像是针对离散操作的分类器。他给出当前状态下每个离散动作的概率。我们可以与构建分类模型相同的方式为分类策略构建神经网络:输入是观察值,然后是若干层(卷积层或全连接层,具体取决于输入的类型),然后便得到最后一个线性层提供每个动作的logit,然后再加上softmax将logit转换为概率。
采样 :给定每个动作的概率,像Tensorflow Probability这样的框架具有内置的采样工具。例如,请参阅tfp.distributions.Categorical文档或tfp.distributions.Multinomial。
对数似然 : 将最后一层概率表示为 P θ P _ {\theta} Pθ。它是一个包含很多动作的向量,因此我们可以将动作视为向量的索引。我们可以通过索引来获得向量中的动作的对数似然率:
log π θ ( a ∣ s ) = log [ P θ ( s ) ] a \log \pi _ {\theta}(a | s)= \log [P _ {\theta} (s)]_a logπθ(a∣s)=log[Pθ(s)]a
高斯策略(Diagonal Gaussian Policies)
多元高斯分布(或多元正态分布)由均值向量 μ \mu μ和协方差矩阵 Σ \Sigma Σ来描述。对角高斯分布是一种特殊情况,其中协方差矩阵仅在对角线上有数值。所以,我们可以用一个向量表示它。
对角高斯策略始终具有一个神经网络,该神经网络将观测值映射为平均动作 μ θ \mu _ {\theta} μθ。然后通常有两种不同的方式表示协方差矩阵:
-
用一个对数标准偏差的向量 log σ \log \sigma logσ表示,它不是关于状态的函数: log σ \log \sigma logσ是独立参数。(VPG,TRPO和PPO的实现是通过这种方式实现的。)
-
由一个神经网络提供,是一个关于状态的函数,以记录标准偏差 log σ θ ( s ) \log \sigma _ {\theta}(s) logσθ(s)。它可以选择与均值网络共享某些层。
请注意,在两种情况下,我们都输出对数标准偏差而不是直接输出标准偏差。这是因为log stds可以随意接受中的任何值 ( − ∞ , ∞ ) (-\infty,\infty) (−∞,∞),而stds必须为非负数。如果您不必强制执行这些约束,则训练参数会更容易。可以通过对数标准偏差取幂,立即获得标准偏差,因此通过这种方式表示它们不会损失任何信息。
采样:给定平均动作 μ θ \mu _ {\theta} μθ和标准偏差 σ θ ( s ) \sigma _ {\theta}(s) σθ(s),以及一个,来自高斯分布 ( z ∼ N ( 0 , I ) ) (z \sim \mathcal {N}(0,I)) (z∼N(0,I))的噪声向量 z z z,可以使用以下公式计算动作样本:
a = μ θ ( s ) + σ θ ( s ) ⊙ z a = \mu _ {\theta}(s)+ \sigma _ {\theta}(s)\odot z a=μθ(s)+σθ(s)⊙z
其中 ⊙ \odot ⊙表示两个向量的元素之间乘积。我们可以使用标准函数来计算噪声向量,例如tf.random.normal。或者,您可以直接将均值和标准差提供给tfp.distributions.Normal对象,然后使用该值进行采样。
对数似然:具有k维的动作a向量,其高斯分布具有均值