【逆强化学习-2】最大熵学习(Maximum Entropy Learning)

文章目录

  • 0.引言
  • 1.算法原理
  • 2.仿真

0.引言

\qquad本文是逆强化学习系列的第2篇,其余博客传送门如下:

逆强化学习0-Introduction
逆强化学习1-学徒学习

\qquad最大熵学习是2008年出现的方法,原论文(链接见【逆强化学习0】的博客)使用的Reward的函数仍然是线性模型,但是优化的思想和之前谈到的学徒学习有本质差别,由于需要一些概率论和随机过程分析课程的知识,原paper的理论也十分晦涩难懂。本人凭借粗浅的理解给大家一个浅显易懂的解释。

原会议的presentation(PPT)永久免费
原paper见部分0- Introduction部分
GitHub源代码
本文点赞破百,解锁额外代码(DQN+maxEnt)

\qquad学徒学习(APP)是最大化间隙策略(MMP)的一种扩展,通过求解满足最大化间隙的Reward来计算Reward,从而使得Lean的行为越来越趋向于Expert(但又不好于Expert),这种方法往往叫做Feature Matching。其缺点在于对于存在多种合理的Reward的函数或者Expert存在多种次优轨迹时,该方法就无能为力了。APP本质是有约束优化问题,而优化变量是feature的discount-expectation基向量的坐标θ\thetaθ。然而对于每一个策略π\piπ而言,都可能存在多个Reward函数使其最优。当演示了次优行为时,需要多个策略混合来匹配特征计数,这就让Feature Matching这件事在Expert轨迹存在多个Feature期望值时变得非常模糊。在APP中,这是通过求平均的方式解决的,然而这明显不是一个合理的解决方案。
\qquad最大熵学习(MaxEnt)同样是Feature Matching的方法,与APP不同的是,其采用了一种有原则的方式消除了这种匹配歧义。而这种原则就是最大熵原则,该原则基于一种假设——即专家系统轨迹生成自己的专家特征期望的策略是最优轨迹(即下文的约束条件1).
\qquad可以简单的理解为,在APP中作为损失函数的特征匹配,在MaxEnt中被放入了约束条件中,而MaxEnt正是在满足这个约束条件的情况下,要求以θ\thetaθ为Reward函数参数时,轨迹概率分布P(ζ∣θ)P(\zeta|\theta)P(ζθ)的信息熵最大
\qquad至于为什么要求信息熵最大,原paper中并无详细说明,只是指出这已经在reference里面有了相关研究,本人查阅相关资料,给出以下几个理由供大家参考:

  1. 物理系统的稳定状态通常趋向于熵最大
  2. 只有P恒为0的概率分布熵才为0,正态分布是所有概率分布中熵最大的(会议presentation里面说均匀分布的信息熵最大,确认过是个错误结论,试想一下均匀分布的分布区间有限而正态无限)
  3. 熵越大,先验信息越少,最大熵估计也是统计决策理论中常用的一种估计原则

1.算法原理

下面就简单介绍一下这个熵,对于连续变量而言,信息熵通常表示为
Ent=∫x∽π−p(x)logp(x)Ent=\int_{x\backsim \pi}-p(x)logp(x)Ent=xπp(x)logp(x)
对于强化学习任务而言,最大化信息熵写为:
max⁡∑ζ∈D−P(ζ∣θ)logP(ζ∣θ)s.t.{∑ζ∈DP(ζ∣θ)fζ=f~∑ζ∈DP(ζ∣θ)=1\begin{aligned} & \max\sum_{\zeta \in D}-P(\zeta| \theta)logP(\zeta| \theta) \\ s.t. &\begin{cases} \sum_{\zeta\in D}P(\zeta| \theta)f_\zeta = \widetilde{f} \\[2ex] \sum_{\zeta \in D}P(\zeta | \theta)=1 \\ \end{cases} \end{aligned}s.t.maxζDP(ζθ)logP(ζθ)ζDP(ζθ)fζ=fζDP(ζθ)=1

构造拉格朗日函数
L(P,λ,μ)=∑ζ∈D[P(ζ∣θ)logP(ζ∣θ)+λ(P(ζ∣θ)fζ−f~)+μ(P(ζ∣θ)−1)]L(P,\lambda,\mu)= \sum_{\zeta \in D}[P(\zeta|\theta)logP(\zeta|\theta)+\lambda (P(\zeta|\theta)f_{\zeta}-\widetilde{f})+\mu(P(\zeta|\theta)-1)]L(P,λ,μ)=ζD[P(ζθ)logP(ζθ)+λ(P(ζθ)fζf)+μ(P(ζθ)1)]

应用拉格朗日函数的KKT条件
∇LP=∑ζ∈DlogP(ζ∣θ)+1+λfζ+μ=0①∇Lλ=∑ζ∈DP(ζ∣θ)fζ−f~=0②∇Lμ=∑ζ∈DP(ζ∣θ)−1=0③\begin{array} {cl} \nabla L_P =& \sum_{\zeta \in D}logP(\zeta|\theta)+1+\lambda f_{\zeta}+\mu=0 &①\\ \nabla L_{\lambda}=&\sum_{\zeta\in D}P(\zeta| \theta)f_\zeta - \widetilde{f} = 0 &②\\ \nabla L_{\mu} =& \sum_{\zeta \in D}P(\zeta | \theta)-1=0 &③ \end{array} LP=Lλ=Lμ=ζDlogP(ζθ)+1+λfζ+μ=0ζDP(ζθ)fζf=0ζDP(ζθ)1=0
由①③式得
P(ζ∣θ)=exp(−1−μ−λfζ)∑ζ∈Dexp(−1−μ−λfζ)P(\zeta|\theta)=\frac{exp(-1-\mu-\lambda f_{\zeta})}{\sum_{\zeta \in D}exp(-1-\mu-\lambda f_{\zeta})}P(ζθ)=ζDexp(1μλfζ)exp(1μλfζ)
\qquad光靠这个式子肯定是解不出最优的θ\thetaθ的,这就要提到原paper的另一个假设——使用θ\thetaθ参数的Reward函数Rθ(τ)R_\theta(\tau)Rθ(τ)时,ζ\zetaζ轨迹的概率P(ζ∣θ)P(\zeta|\theta)P(ζθ)正比于Rθ(ζ)R_{\theta}(\zeta)Rθ(ζ)的自然指数,再加上概率归一性约束,可得专家系统策略的轨迹概率为:
P(ζ∣θ)=exp(Rθ(ζ))∫τ∈D[exp(Rθ(τ))dτ]P(\zeta|\theta)=\frac{exp(R_\theta(\zeta))}{\int_{\tau\in D}\left[{exp(R_{\theta}(\tau))}{\rm d}\tau \right]} P(ζθ)=τD[exp(Rθ(τ))dτ]exp(Rθ(ζ))
需要注意的是,这里的R(θ)R(\theta)R(θ)指的是累积奖赏而非单步奖赏。
maxent1
上式中的ZZZ在paper中又被称为partial function,原文是已知原系统的dynamic model的,即已知系统的状态转移概率。在不知道状态转移概率时ZZZ无法直接求得,通常也有三种方法:

  1. 拉普拉斯近似(Laplace Approximation)
  2. 值函数近似(Value Function Approximation)
  3. 采样近似(Sample-Based Approximation)

有读者肯定会疑问,原paper中给出的损失函数不是最大信息熵而是最大似然,这又是为什么。原paper中给出了一个让人难以理解的解释:

Maximizing the entropy of the distribution over paths subject to the feature constraints from observed data implies that we maximize the likelihood of the observed data under the maximum entropy (exponential family) distribution derived above (Jaynes 1957).

——即从观测数据上满足feature matching的约束(约束1)的条件下最大化轨迹分布的信息熵等价于在最大信息熵分布的条件下从观测数据最大化似然。本文不对此深究,感兴趣的朋友可以研究一下下面这篇论文

Jaynes, E. T. 1957. Information theory and statistical mechanics. Physical Review 106:620–630.

\qquad而假设是专家系统是最大熵分布的,因此对专家轨迹概率使用最大似然,得到
L(θ)=∑ζ∈Elogp(ζ∣θ)L(\theta)=\sum_{\zeta\in E}logp(\zeta|\theta)L(θ)=ζElogp(ζθ)
即轨迹概率的最大似然。代入最大熵分布下的轨迹概率公式(其中E代表Expert的轨迹空间,而D代表Agent的轨迹空间(可以认为是全部轨迹空间),E的采样空间是与损失函数直接挂钩的,而D的采样空间则用来对ZZZ估计的):
L(θ)=∑τ∈Elogp(τ∣θ)=∑τ∈Elog1Zexp(Rθ(τ))=∑τ∈ERθ(τ)−MlogZ=∑τ∈ERθ(τ)−Mlog∑τ∈Dexp(Rθ(τ))∇θL=∑τ∈EdRθ(τ)dθ−M1∑τ∈Dexp(Rθ(τ))∑τ∈D[exp(Rθ(τ))dRθ(τ)dθ]=∑τ∈EdRθ(τ)dθ−M∑τ∈D[exp(Rθ(τ))∑τ∈Dexp(Rθ(τ))dRθ(τ)dθ]=∑τ∈EdRθ(τ)dθ−M∑τ∈D[p(τ∣θ)dRθ(τ)dθ]=∑τ∈EdRθ(τ)dθ−M∑si∈S[p(s∣θ)drθ(s)dθ]\begin{aligned} L(\theta) &=\sum_{\tau\in E}logp(\tau|\theta)\\ &=\sum_{\tau\in E}log\frac{1}{Z}exp(R_{\theta}(\tau))\\ &=\sum_{\tau\in E}R_{\theta}(\tau)-MlogZ\\ &=\sum_{\tau\in E}R_{\theta}(\tau)-Mlog\sum_{\tau\in D}exp(R_{\theta}(\tau))\\ \nabla _{\theta}L&=\sum_{\tau \in E}\frac{dR_{\theta}(\tau)}{d\theta}-M\frac{1}{\sum_{\tau\in D}exp(R_{\theta}(\tau))}\sum_{\tau\in D}\left[exp(R_{\theta}(\tau))\frac{dR_{\theta}(\tau)}{d\theta}\right]\\ &=\sum_{\tau \in E}\frac{dR_{\theta}(\tau)}{d\theta}-M\sum_{\tau\in D}\left[\frac{exp(R_{\theta}(\tau))}{\sum_{\tau\in D}exp(R_{\theta}(\tau))}\frac{dR_{\theta}(\tau)}{d\theta}\right]\\ &=\sum_{\tau \in E}\frac{dR_{\theta}(\tau)}{d\theta}-M\sum_{\tau\in D}\left[p(\tau|\theta)\frac{dR_{\theta}(\tau)}{d\theta} \right]\\ &=\sum_{\tau \in E}\frac{dR_{\theta}(\tau)}{d\theta}-M\sum_{s_i\in S}\left[p(s|\theta)\frac{dr_{\theta}(s)}{d\theta} \right]\\ \end{aligned} L(θ)θL=τElogp(τθ)=τElogZ1exp(Rθ(τ))=τERθ(τ)MlogZ=τERθ(τ)MlogτDexp(Rθ(τ))=τEdθdRθ(τ)MτDexp(Rθ(τ))1τD[exp(Rθ(τ))dθdRθ(τ)]=τEdθdRθ(τ)MτD[τDexp(Rθ(τ))exp(Rθ(τ))dθdRθ(τ)]=τEdθdRθ(τ)MτD[p(τθ)dθdRθ(τ)]=τEdθdRθ(τ)MsiS[p(sθ)dθdrθ(s)]
归一化的损失函数为:
∇θL‾=1M∑τ∈EdRθ(τ)dθ−∑si∈S[p(s∣θ)drθ(s)dθ]\nabla _{\theta}\overline{L}=\frac{1}{M}\sum_{\tau \in E}\frac{dR_{\theta}(\tau)}{d\theta}-\sum_{s_i\in S}\left[p(s|\theta)\frac{dr_{\theta}(s)}{d\theta} \right]θL=M1τEdθdRθ(τ)siS[p(sθ)dθdrθ(s)]
其中M是专家轨迹的条数,如果状态空间是无限的,则不能直接套用此公式(但不代表无法解决)。
对于线性Reward,轨迹的累积Reward为
Rθ(ζ)=θTfζ=∑sj∈ζθTfsjR_{\theta}(\zeta)=\theta ^T f_{\zeta}=\sum_{s_j\in \zeta}\theta ^T f_{s_j}Rθ(ζ)=θTfζ=sjζθTfsj
Expert产生的Feature Expectation为
f~=1m∑ifζ~i\widetilde{f}=\frac{1}{m}\sum_{i}f_{\widetilde{\zeta}_i}f=m1ifζi
损失函数梯度可表示为:
∇θL=f~−∑si∈SDsifsi\nabla_{\theta}L=\widetilde{f}-\sum_{s_i\in S}D_{s_i}f_{si}θL=fsiSDsifsi
其中D为状态访问频次(State Visitiation Frequency),可以通过不断与环境互动近似出。
总结一下这个公式的推导需要注意一下几点:

  1. 最大熵原则是建立在Feature Matching的基础上的,而轨迹概率分布的公式则是由最大熵原则+约束推导出的
  2. 最大熵原则的轨迹概率分布公式,未知配分函数项Z是在全部轨迹集上求和,因此是使用Agent的轨迹进行近似
  3. 最大化专家系统的轨迹概率似然其实是一个与原问题等价的优化问题,因此损失函数导数的第一项是在Expert的Demonstrations上求和(或求积分),而不是Agent的。

2.仿真

\qquad本文的仿真平台参照了github上的资源,并进行了略微修改(仿真环境在学徒学习那篇有了详细介绍,在此就不再赘述了):

GitHub源代码
本文点赞破百,解锁额外代码(DQN+maxEnt)

使用方法仍然是直接运行train.py即可(注意需要在mountaincar/maxent/的目录下运行)。和学徒学习的代码一样,也是基于Q-Table的。
\qquad源代码中对Feature没有做任何的提取,直接将每个状态(20个位置采样×20个速度采样总共400个离散状态)作为Feature。假设不同特征之间是解耦的,Feature Matrix就是对角矩阵,即因此状态访问频次×特征即特征访问频次。
\qquad在源代码中learner_feature_expectations即特征访问频次,而归一化之后即为梯度的第二项
源代码的其中一部分如下:

	expert = expert_feature_expectations(feature_matrix, demonstrations)learner_feature_expectations = np.zeros(n_states)theta = -(np.random.uniform(size=(n_states,)))episodes, scores = [], []for episode in range(30000):state = env.reset()score = 0if (episode != 0 and episode == 10000) or (episode > 10000 and episode % 5000 == 0):learner = learner_feature_expectations / episodemaxent_irl(expert, learner, theta, theta_learning_rate)while True:state_idx = idx_state(env, state)action = np.argmax(q_table[state_idx])next_state, reward, done, _ = env.step(action)irl_reward = get_reward(feature_matrix, theta, n_states, state_idx)next_state_idx = idx_state(env, next_state)update_q_table(state_idx, action, irl_reward, next_state_idx)learner_feature_expectations += feature_matrix[int(state_idx)]

看完原github的程序,本人还有一个疑点,即是maxent.py文件中的一段

def maxent_irl(expert, learner, theta, learning_rate):gradient = expert - learnertheta += learning_rate * gradient# Clip thetafor i in range(len(theta)):if theta[i]>0:theta[i]=0

\qquad原文中的clip theta实际上是防止theta超过0,类似于深度学习中的梯度截断操作,然而这个操作在我尝试多次之后并无用处,而且也没有任何意义(因为在theta>0后,也会在下一次迭代时通过学习使得theta重新<0)。本人的建议是增加一个学习率递减的schedule,并且将clip的范围从[-inf,0]修改到[-0.5,0.5],可以获得相对稳定的学习率曲线,下面分别是clip(-0.5,0.5)和clip(-0.5,0)的对比:

clip(-0.5,0.5)clip(-0.5,0)
np.clip在这里插入图片描述

\qquad可以发现增加一部分梯度的正向范围反而更有利于学习,这是由于expert-learn的极小值是在0处取得的,然而在学习率固定时,改函数会在离散迭代时在0附近震荡,梯度若在0处截断会导致学习率锐减为0(可能正是原作者用意?)。

下面是test.py保存的几组gif的图

Reward=-158Reward=-138Reward=-146
在这里插入图片描述在这里插入图片描述在这里插入图片描述

希望本文对您有帮助,谢谢阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544423.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

面试官又整新活,居然问我for循环用i++和++i哪个效率高?

前几天&#xff0c;一个小伙伴告诉我&#xff0c;他在面试的时候被面试官问了这么一个问题&#xff1a;在for循环中&#xff0c;到底应该用 i 还是 i &#xff1f;听到这&#xff0c;我感觉这面试官确实有点不按套路出牌了&#xff0c;放着好好的八股文不问&#xff0c;净整些幺…

面试官:如何实现 List 集合去重?

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;本文已收录《Java常见面试题》系列&#xff0c;开源地址&#xff1a;https://gitee.com/mydb/interviewList 去重指的…

Windows重装Anaconda3失败解决方案【重装失败10来次首次成功的案例!】

文章目录0.环境1.原因2.解决方案0.环境 Win10 Anaconda3 2018版 python 3.7.1 注意&#xff01;此种情况只会在windows上发生&#xff0c;因为在linux上你只需要删除anaconda3整个文件夹&#xff0c;重新安装一定会成功&#xff01; 1.原因 Anaconda肯定是没有成功安装的&am…

python读取pcd点云/转numpy(python2+python3,非ROS环境)

0.引言 \qquadROS的PCL库支持python读取点云&#xff0c;ROS1关联的是python2&#xff08;2.7&#xff09;&#xff0c;ROS2关联的是python3&#xff08;>3.5&#xff09;&#xff0c;但这对于windows的用户和没装ROS的ubuntu用户似乎不够友好。下面就介绍两种不需要ros的方…

Java中List排序的3种方法!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;在某些特殊的场景下&#xff0c;我们需要在 Java 程序中对 List 集合进行排序操作。比如从第三方接口中获取所有用户的列表&…

Spring 事务失效的 8 种场景!

在日常工作中&#xff0c;如果对Spring的事务管理功能使用不当&#xff0c;则会造成Spring事务不生效的问题。而针对Spring事务不生效的问题&#xff0c;也是在跳槽面试中被问的比较频繁的一个问题。点击上方卡片关注我今天&#xff0c;我们就一起梳理下有哪些场景会导致Spring…

vscode无法识别constexpr

问题 vscode 无法识别constexpr&#xff08;常指针类型&#xff09; 方法 打开工程路径下的.vscode文件夹&#xff08;一般是自动隐藏的&#xff0c;CtrlH显示隐藏&#xff09;设置c_cpp_properties.json文件如下&#xff1a; {"configurations": [{"name…

三流Java搞技术,二流Java搞框架,一流Java…

如何反驳“99&#xff05; 的 Java 程序员都是 Spring 程序员”这句话&#xff1f;答案是不能。互联网发展至今&#xff0c;站在巨人肩膀上编程像一日三餐一样寻常。Spring Boot 的确凭一己之力拉低了 Java 开发的门槛&#xff0c;可普通开发与高开之间&#xff0c;真就因为一个…

【Ubuntu】vscode配置PCL库/vscode无法导入PCL库

问题 PCL库是ROS框架自带的点云处理库&#xff0c;可以通过find_package(PCL REQUIRED)在CMakeLists.txt中导入&#xff0c;但是vscode却无法识别&#xff0c;出现问题如下&#xff1a; 注意&#xff0c;本文解决方案仅限Ubuntu&#xff01; 解决方案 打开工程路径下的.vsc…

面试官:HashSet是如何保证元素不重复的?

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;本文已收录《Java常见面试题》系列&#xff0c;开源地址&#xff1a;https://gitee.com/mydb/interviewHashSet 实现…

【Ubuntu】Ubuntu 20.04无法识别网口/以太网/有线网卡

这里写自定义目录标题0.症状1.查看网卡类型2.下载网卡驱动3.安装网卡驱动0.症状 \qquad表现为插入以太网网口后右上角没有显示网络&#xff0c;即没有下图的音量左侧的标志 打开设置的【网络】选项没有以太网接入&#xff0c;然而以太网口信号灯仍然正常闪烁。这种情况基本可以…

小心Lombok用法中的坑

刚才写完了代码&#xff0c;自测的时候&#xff0c;出现了NPE问题。排查的时候发现是Lombok的坑&#xff0c;以前也遇到过&#xff0c;所以觉得有必要过来记录一下。我先描述一下现象&#xff0c;我的代码里面订单服务A 需要调用缓存服务B&#xff0c;服务B就是一个Bean&#x…

【VSCode】VSCode使用conda环境时找不到python包/找不到Module

这里写自定义目录标题0.问题描述1.原因2.解决方法0.问题描述 \qquad首先需要排除是否是VSCode未配置conda环境的问题&#xff0c;当然&#xff0c;相信VSCode的老粉都不会犯这个低级错误&#xff0c;请CtrlP&#xff0c;在搜索框>select interpreter检查一下python环境。 …

PS如何对JPG文件直接抠图

如何JPG文件直接抠图 先转为智能对象&#xff1a; 再栅格化图层 此进即可直接进行抠图&#xff01;

更快的Maven来了,我的天,速度提升了8倍!

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;周末被 maven-mvnd 刷屏了&#xff0c;于是我也下载了一个 mvnd 体验了一把。虽然测试的数据都是基于我本地项目&#xff0c…

Java 中接口和抽象类竟然有 7 点不同?

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;本文已收录《Java常见面试题》系列&#xff1a;https://gitee.com/mydb/interviewJava 是一门面向对象的编程语言&am…

粉丝不在于多,在于够残

李善友&#xff1a;所有可能被互联网取代的组织一定会被取代 2015-07-30 格局视野 格局视野 格局视野 微信号 geju365 功能介绍 格局生涯学院官方自媒体。面向互联网人的在线商学院。推送互联网行业知识&#xff0c;培养互联网实操人才。聚焦新行业、新模式、新公司、新人物。…

保姆级教学:缓存穿透、缓存击穿和缓存雪崩!

前言对于从事后端开发的同学来说&#xff0c;缓存已经变成的项目中必不可少的技术之一。没错&#xff0c;缓存能给我们系统显著的提升性能。但如果你使用不好&#xff0c;或者缺乏相关经验&#xff0c;它也会带来很多意想不到的问题。今天我们一起聊聊如果在项目中引入了缓存&a…

Fast Global Registration (ECCV 2016) 论文解析

目录0.友情链接1. 论文核心思想1.1. 点云特征匹配1.2. 两个校验1.3. 鲁棒函数与BR对偶1.4.1. Black-Rangarjan Duality (BR对偶性&#xff09;1.4.2.Derivation of Φρ\Phi_\rhoΦρ​1.4.3.E(T,L)E(\bm{T},L)E(T,L)的优化求解方法4.写在后面0.友情链接 FGR基本介绍 CSDN博客…

系统盘压缩卷小于可用空间_操作系统中的可用空间管理

系统盘压缩卷小于可用空间可用空间管理 (Free space management) As we know that the memory space in the disk is limited. So we need to use the space of the deleted files for the allocation of the new file. one optical disk allows only one write at a time in t…