深度学习经典算法PPO的通俗理解

简介: #1 前置知识点 基本概念 [https://www.yuque.com/docs/share/04b60c4c-90ec-49c7-8a47-0dae7d3c78c7?#](https://www.yuque.com/docs/share/04b60c4c-90ec-49c7-8a47-0dae7d3c78c7?#) (部分符合的定义在这里) 要理解PPO,就必须先理解Actor

1 前置知识点

基本概念
https://www.yuque.com/docs/share/04b60c4c-90ec-49c7-8a47-0dae7d3c78c7?#
(部分符合的定义在这里)

要理解PPO,就必须先理解Actor-Critic.
Actor负责输出policy,也就是在某个状态下执行各种action的概率分布
Critic负责输出Vaue of state。
Actor和Critic的默契:Actor相信Critic给的状态的value就是真的; Critic也相信Actor选送过来的(s,a)中的a就是最优的action。通过不断的迭代,强化这个信任关系的正确性。
(这体现了我们的价值观 [因为信任,所以简单],哈哈哈~)
image.png

所以这样就不难理解Critic的Loss是怎么来的了,Critic的输出就是state的Value,那就让Critic模型的输出使得以下公式成立:
$$V_s=r_{s,a}+\gamma V_{s'}$$ 
其中,$r_{s,a}, s,a,s'$是训练Critic需要的数据,$s'$是在状态$s$下执行动作$a$得到新状态, $r_{s,a}$是reward, $\gamma$ 是discount factor。
跟基础概念的区别是,这里的系统假定是执行动作$a$只能到$s'$, 没有体现执行$a$可以得到不同的状态; (但是其实这种概率可以体现在训练数据中,因为$(s,a,r_{s,a})
$$和$$s'$ 不一定是一一对应,其概率可以通过sampling得到的数据分布体现)
所以Critic的Loss就是$|r_{s,a}+\gamma V_{s'}-Vs|$,也就是所谓的TD(Time Difference)-Error的L1,或者L2也可以.
那么Actor的Loss怎么计算呢?
这里就先来明白Advantage的概念,其实也就是TD-Error
 $$Adv=r_{s,a}+\gamma V_{s'}-Vs$$ 
之所以称之为Advantage,是因为假如Advantage>0, 就是说实际执行$a$之后,发现当前的状态Value实际上比当前Critic估计出来的要大,所以这是个好的Action,它能够让$V_s$ 变大,Actor应该增大这个action的概率;反之,Advantage<0,这个action就是不好的,应该减小执行它概率。
所以Actor的Loss就是$$-log(\pi(a|s))*Adv$$, 因为要最小化Loss,所以前面加个负号;Adv的符号代表了应该增大这个action的输出概率,还是减小这个action的输出概率;Adv的大小代表了增加或减小的幅度应该有多大。

2 Proximal Policy Optimization(PPO)

2.1 PPO主要是来解决什么问题?

它是为了让我们在训练Agent的时候能够take the biggest possible improvement step on a policy using the data we currently have, without stepping so far that we accidentally cause performance collapse。就是更新policy的时候尽可能步子迈大点,但也要防止扯着蛋,即模型参数崩了。

2.2 PPO怎么解决这个问题的?

简单来说,相同的网络结构,维护两组模型参数Old和New,在每次迭代的时候去更新New的参数,但是要控制New的模型输出Policy和Old的Policy不要差距太大,本轮迭代结束后,把New的参数覆盖掉Old的参数。

怎么去控制差距不要太大呢?作者给了两种方式: PPO-Penalty, PPO-Clip

2.2.1 PPO-Clip

先说PPO-Clip, 它通过下面的公式来更新策略:
$$\theta_{k+1}=arg max_{\theta}E_{s,a \sim \pi_{\theta_k}}[L(s,a,\theta_k,\theta)]$$ 
就是最大化$L(s,a,\theta_k,\theta)$,
$$L(s,a,\theta_k,\theta)=min \left( \frac{\pi_{\theta}(a|s)}{\pi_{\theta_k}(a|s)}A^{\pi_{\theta_k}}(s,a) , clip \left( \frac{\pi_{\theta}(a|s)}{\pi_{\theta_k}(a|s)}, 1-\epsilon, 1+\epsilon \right)A^{\pi_{\theta_k}}(s,a) \right)$$
这个形式主要是为了让我们理解为啥叫PPO-Clip(我感觉直接用后面那个Clip项其实就够了,这个表达有点冗余),$\theta_k$ 就是当前Old的参数,$\theta$ 是New的参数。$\pi_{\theta}(a|s)$ 是New Actor输出的Policy上状态$s$时执行$a$的概率,$\pi_{\theta_k}(a|s)$ 表示的Old Actor输出的Policy上状态$s$时执行$a$的概率。$A^{\pi_{\theta_k}}(s,a)$是基于Old Critic得到的Advantage.
对这个公式进行改写,更容易看出它的真实目的,
$$L(s,a,\theta_k,\theta)=min \left( \frac{\pi_{\theta}(a|s)}{\pi_{\theta_k}(a|s)}A^{\pi_{\theta_k}}(s,a) , g \left( \epsilon, A^{\pi_{\theta_k}}(s,a) \ \right) \right)$$
其中,

$$g \left( \epsilon, A \right)=\left\{ \begin{aligned} &(1+\epsilon)A & A\ge 0 \\ &(1-\epsilon)A & A< 0 \end{aligned} \right.$$  当Advantage>=0的时候, $$L(s,a,\theta_k,\theta)=min \left( \frac{\pi_{\theta}(a|s)}{\pi_{\theta_k}(a|s)}, (1+\epsilon) \right)A^{\pi_{\theta_k}}(s,a) $$ 这就清楚的说明,这时候应该增大$\pi_{\theta}(a|s)$,也就是认为这个action是好的,增加选择$a$的概率。但是通过$1+\epsilon$ 限制增大的幅度。 同理,当Advantage<0的时候 $$L(s,a,\theta_k,\theta)=min \left( \frac{\pi_{\theta}(a|s)}{\pi_{\theta_k}(a|s)}, (1-\epsilon) \right)A^{\pi_{\theta_k}}(s,a) $$ 缩小$\pi_{\theta}(a|s)$,但是幅度不能小于$1-\epsilon$ 另外,根据我的理解,$\pi_{\theta_k}(a|s)$应该截断梯度,也就是反向传到的时候用不着去更新Old Actor的参数。在OpenAI Spinningup的代码([https://github.com/openai/spinningup/blob/master/spinup/algos/pytorch/ppo/ppo.py](https://github.com/openai/spinningup/blob/master/spinup/algos/pytorch/ppo/ppo.py))确实是这样处理的,但是在Tianshou的代码里([https://github.com/thu-ml/tianshou/blob/master/tianshou/policy/ppo.py](https://github.com/thu-ml/tianshou/blob/master/tianshou/policy/ppo.py))没有做截断,结果也OK,想来对于$\pi_{\theta}(a|s)$来说,$\pi_{\theta_k}(a|s)$就是一个scalar factor, 这个factor是变量还是静态值,也许影响不那么大,而且本轮迭代结束后$\theta_k$也会被覆盖掉,反向传导更新了也白搭。 到这里,其实说的都是如何更新Actor。 怎么更新Critic的参数呢? $$L_c(s,a,r_{s,a},s')=|r_{s,a}+V^{\pi_{\theta_k}}_{s'}-V^{\pi_{\theta}}|$$ 唯一的不同是target value是用Old Critic计算的,这也是DRL领域的常规操作了. 小结一下,PPO-Clip就是通过Clip操作来防止步子迈太大的。作者实验证明Clip的效果比Penalty好。 ### 2.2.2 PPO-Penalty $$L^{KLPEN}(\theta)=\frac{\pi_{\theta}(a|s)}{\pi_{\theta_k}(a|s)}A^{\pi_{\theta_k}}(s,a) -\beta KLD\left( \pi_{\theta}(*|s), \pi_{\theta_k}(*|s) \right)$$ 理解上上面的,这个理解起来也就容易了,就是增加一个新旧Policy差异的惩罚项,差异通过KL divergence来衡量 (PS: 如理解有误支持,欢迎批评指正~)

目录
相关文章
|
3月前
|
机器学习/深度学习 人工智能 算法
深度学习入门:理解神经网络与反向传播算法
【9月更文挑战第20天】本文将深入浅出地介绍深度学习中的基石—神经网络,以及背后的魔法—反向传播算法。我们将通过直观的例子和简单的数学公式,带你领略这一技术的魅力。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你打开深度学习的大门,让你对神经网络的工作原理有一个清晰的认识。
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
深度学习中的优化算法及其应用
【10月更文挑战第8天】 本文将探讨深度学习中常用的优化算法,包括梯度下降法、Adam和RMSProp等,介绍这些算法的基本原理与应用场景。通过实例分析,帮助读者更好地理解和应用这些优化算法,提高深度学习模型的训练效率与性能。
152 63
|
14天前
|
机器学习/深度学习 人工智能 算法
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
垃圾识别分类系统。本系统采用Python作为主要编程语言,通过收集了5种常见的垃圾数据集('塑料', '玻璃', '纸张', '纸板', '金属'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对图像数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。然后使用Django搭建Web网页端可视化操作界面,实现用户在网页端上传一张垃圾图片识别其名称。
57 0
基于Python深度学习的【垃圾识别系统】实现~TensorFlow+人工智能+算法网络
|
14天前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
50 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
|
14天前
|
机器学习/深度学习 人工智能 算法
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
蔬菜识别系统,本系统使用Python作为主要编程语言,通过收集了8种常见的蔬菜图像数据集('土豆', '大白菜', '大葱', '莲藕', '菠菜', '西红柿', '韭菜', '黄瓜'),然后基于TensorFlow搭建卷积神经网络算法模型,通过多轮迭代训练最后得到一个识别精度较高的模型文件。在使用Django开发web网页端操作界面,实现用户上传一张蔬菜图片识别其名称。
57 0
基于深度学习的【蔬菜识别】系统实现~Python+人工智能+TensorFlow+算法模型
|
2月前
|
机器学习/深度学习 数据采集 算法
如何在一夜之间成为模型微调大师?——从零开始的深度学习修炼之旅,让你的算法功力飙升!
【10月更文挑战第5天】在机器学习领域,预训练模型具有强大的泛化能力,但直接使用可能效果不佳,尤其在特定任务上。此时,模型微调显得尤为重要。本文通过图像分类任务,详细介绍如何利用PyTorch对ResNet-50模型进行微调,包括环境搭建、数据预处理、模型加载与训练等步骤,并提供完整Python代码。通过调整超参数和采用早停策略等技巧,可进一步优化模型性能。适合初学者快速上手模型微调。
103 8
|
2月前
|
机器学习/深度学习 JSON 搜索推荐
深度学习的协同过滤的推荐算法-毕设神器
深度学习的协同过滤的推荐算法-毕设神器
46 4
|
2月前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
3月前
|
机器学习/深度学习 人工智能 算法
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
文本分类识别系统。本系统使用Python作为主要开发语言,首先收集了10种中文文本数据集("体育类", "财经类", "房产类", "家居类", "教育类", "科技类", "时尚类", "时政类", "游戏类", "娱乐类"),然后基于TensorFlow搭建CNN卷积神经网络算法模型。通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型,并保存为本地的h5格式。然后使用Django开发Web网页端操作界面,实现用户上传一段文本识别其所属的类别。
98 1
【新闻文本分类识别系统】Python+卷积神经网络算法+人工智能+深度学习+计算机毕设项目+Django网页界面平台
|
2月前
|
机器学习/深度学习 算法
深度学习中的优化算法及其应用
本文探讨了深度学习中常用的优化算法,包括梯度下降、随机梯度下降、动量方法和Adam方法。通过对比这些算法的优缺点及适用场景,帮助读者更好地理解和应用这些优化方法。
32 2