再探强化学习

主要记录一下自己仔细学习 RL 时的感悟。记录一下防止遗忘


Q-learning 和 DQN 都是基于值函数的(如 \(V\)\(Q\) 函数),而策略梯度(policy gradient)则是基于策略的。后者显式的训练一个策略,对这个策略使用梯度下降等方法。
actor-critic 本质上是对 policy gradient 的改进。核心是在训练策略(即 actor)的同时也训练一个评价这个策略的 critic。在 policy gradient 中,我们是将当前 actor 下的 trajectory 计算出来之后(倒序)求出 loss,即 \(\gamma\) 作为 discount factor 的加权和。进行梯度下降即可。而在 actor-critic 中,我们额外再训练一个 critic 作为衡量 actor 好坏的量度。critic 的 loss 可以设置为 \(r+\gamma V(s_{t+1})-V(s_t)\),训练时,需要先将 \(\gamma V(s_{t+1})\) 中的 \(V\) detach 一下,不更新。
在 actor-critic 中,由于 critic 的选择不同会产生许多不同的方法。其一般更新形式如下:
image
其中,\(\psi_t\) 可以有不同的选法。如 Q、V、A 等。
更新方式也有不同。
image


DQN 算法:本质上是求一个值函数 \(Q(s,a)\) 并依据这个函数来进行决策。这个函数可以通过 gradient descent 求,loss 值就是 \(r+\gamma \max_{a'}Q(s',a')-Q(s,a)\),假设 \(s'\)\(s\)\(a\) 操作之后的后继。可以通过学习的方法来求出 \(Q\) 函数。每次训练的数据 \((s,a,s',r)\) 是从 replay buffer 取出的
决策的时候,服从 \(\epsilon\)-贪婪策略,即在 \(s\) 的状态下,有 \(\epsilon\) 的概率随机,有 \(1-\epsilon\) 的概率直接选择 argmax。
很明显可以看到,策略的选择是依据值函数(\(Q、V\) 等)来进行的,因此是 value-based 的。


DQN 是 off-policy 的,因为有回放池的存在(replay buffer),每次 \(s_t\) 在 DQN 中找到\(Q\) 值最大的 action,并使用得到 \((s_t,a_t,s_{t+1},r_t)\) 并存入 replay buffer 中,每次随机从 replay buffer 中抽出几个 \((s,a)\) 对 Q-network 进行训练。


PPO 算法:也是基于策略(policy based)的 on policy 的算法,是对 TRPO 的改进。在传统的 TRPO 中,优化目标为:image
PPO 将这个限制条件写入了优化目标中。可以利用两种方法:PPO-惩罚和 PPO-截断来实现这个条件。其核心是利用优势函数 \(A(s,a)\) 来判断当前行为的概率是应该上升还是下降。
其中 \(A(s,a)\) 的定义:初始为 \(r_t+\gamma V(s_{t+1})-V(s_t)\)(TD 的时序残差值),后来经计算发现可以利用类似 TD+MC 的方式得到
image
这里,\(\delta_t\) 表示 TD 在 \(t\) 时刻的时序残差(\(r_t+\gamma V(s_{t+1})-V(s_t)\)
,这样结合了 TD 和 MC 的优点。其中,\(\lambda\) 也是一个超参数,代表越往后的步骤的影响有多大。
在 PPO 中,还有一种操作叫做剪切,表示就算 \(A\) 很大,这一步对策略 \(\pi\) 的影响也应有限,在 \(\epsilon\) 的范围内。即:
image
image
接着再分开训练 actor 和 critic 即可。


policy gradient 算法(基础版本的,叫做 reinforce 算法):输出一个策略即为输出 action 的分布,按照这个分布 sample 决策。设策略为 \(\pi_{\theta}\) 定义目标函数为 reward 的期望值 \(J(\theta)\)
经过推导,\(J\) 的梯度与下式有关:
image
直观理解,\(Q\) 越大,那么策略中这个决策的概率就应该越大(来获得更高的期望值)。
按照这个梯度来 gradient ascent 即可。


actor-critic 相当于是 policy gradient 的改进。在原始的 policy gradient(reinforce)中,\(J\) 的求解依赖于 \(Q(s,a)\),通常采用蒙特卡洛等方法求出。在 actor-critic 中,我们发现 image
因此对新的 \(J\) 进行更新。
image
在训练时,训练了两个网络:actor 和 critic。在 DQN 中,相当于只训练了 critic(即 Q-network),通过 \(\epsilon\)-greedy 的方式来进行决策(相当于没有训练 actor)。在 reinforce 中,只训练了 actor,critic 通过蒙特卡洛方法进行估测。
利用 actor-critic 框架,critic 依旧是 Q-network(具体 \(\psi_t\) 可以是 Q、V、A、时序残差 等),此外还训练了 actor 网络(如一个两层的网络,最后一层再取个 softmax 得到概率)。训练时,critic 网络就和普通 DQN 类似,用 TD 更新或者 DDQN 更新。而 actor 网络的更新就是拿概率的梯度和 \(\psi_t\) 计算(进行梯度上升/下降)。
image
image
(其中,states 的大小应为 \(batch\times state\_dim\),action 大小为 \(batch\times action\_dim\)


DDPG:是一种确定性(deterministic)的 RL 方法。在 PPO,朴素的 actor-critic 等算法中,策略 \(\pi\) 是一个分布,每次 policy net(actor)的 take action 函数实际上是 sample 出符合对应 \(\pi\) 分布的结果。这是具有随机性的。与之相对的是确定性做法,即每次返回的是一个确定性的策略。
具体是如何做的呢?和 DQN 有点像。在 DQN 中,我们又新建了一个 target Q network \(\hat{Q}\),来让 \(Q(s_t, a_t)\) 拟合 \(r+\gamma \max_a \hat{Q}(s_{t+1}, a)\)。在 DDPG 中,我们使用学习到的确定性策略 \(\mu(s)\) 来取代 \(\max_a\)。此外,由于当前的确定性策略和从 replay buffer 中取出的 \(\{s_t,a_t,s_{t+1},r_t\}\) 所对应的策略不一定一样,因此 actor 也需要一个对应的延迟更新的 target actor。共计 4 个。
更新时,critic 和之前一样取 \(Q(s_t,a_t)\)\(Q(s_{t+1},\mu(s_{t+1}))\) 的 MSE。actor 的更新借助公式,为 \(Q(s_{t+1},\mu(s_{t+1}))\) 的值直接求平均再取梯度。
image
target actor 和 critic 采取软更新。


学习一下 sinkhorn distance 的由来。
有个 \(d\times d\) 的矩阵 \(P_{i,j}\),其中对每行求和是 \(r_i\),对每列求和是 \(c_j\),且 \(\sum r_i=\sum c_j=1\)(因此能将这个过程看成 \(r,c\) 两个概率分布)。此外,\(P_{i,j}\)\(i\) 送到 \(j\) 也是有代价的,这个代价就是 \(M_{i,j}\),可以理解为“距离”,因为 optimal transport 也是从距离衍生出来的。\(M\) 需要满足的条件就是 \(M_{i,i}=0\)\(M_{i,j}\leq M_{i,k}+M_{k,j}\)。也就是说,答案即为 \(\sum_{i,j} P_{i,j}M_{i,j}\)
这里,\(P_{i,j}\) 被称为 transportation plan
解决原始的 optimal transport 是困难的,可以进行适当的简化。
定义熵为 \(h(P)=\sum_{i,j}P_{i,j}\log P_{i,j}\)
对原问题适当简化后:
image
将 KL 散度进一步简化,得到实际上需要最大化 \(h(P)\)
则原式\(\rightarrow \sum_{i,j} P_{i,j}M_{i,j}-\dfrac{1}{\lambda}h(P)\),这个问题是可以利用 sinkhorn 理论快速计算的。


实例化:利用 yaml 中的数据传入 __init__ 函数中进行初始化

posted @ 2024-03-14 16:35  SkyRainWind  阅读(23)  评论(0编辑  收藏  举报