当前位置: 首页 > news >正文

25/1/4 算法笔记<强化学习> 生成对抗模仿学习

        基于生成对抗网络的模仿学习,假设存在一个专家智能体,其策略可以看成最优策略,我们就可以通过直接模仿这个专家在环境中交互的动作数据来训练一个策略,并不需要用到环境提供的奖励信息。

        生成对抗模仿学习GAIL实质上就是模仿了专家策略的占用度量,即尽量使得策略在环境中的所有状态动作对(s,a) 的占用度量和专家策略的占用度量一致。

        占用度量表示状态动作对(s,a) 被访问到的概率。

        GAIL中有一个判别器和一个策略,策略相当于生成对抗网络中的生成器,给定一个状态,策略会输出这个状态下一个采取的动作,而判别器将状态动作对(s,a) 作为输入,输出一个0到1的实数,表示判别器认为该状态动作对(s,a) 是来自智能体策略而非专家的概率。判别器的目标是尽可能将专家数据的输出靠近0,将模仿者策略的输出靠近1,这样就可以将两组数据分辨开来。

        有了判别器之后,模仿者策略的目标就是其交互产生的轨迹能被判别器误认为专家轨迹。于是,我们就可以用判别器的输出作为奖励函数来训练模仿者策略。具体来说,若模仿者策略在环境中采样得到状态S ,并且采取动作a ,此时该动作对(s,a)会输入到判别器D中,输出D(s,a)的值,然后将奖励设置为r(s,a) = -logD(s,a)。于是,我们可以用任意强化学习算法,使用这些数据继续训练模仿者策略。最后,在对抗过程不断进行后,模仿者策略生成的数据分布将接近真实的专家数据分布,达到模仿学习的目标。

代码实践:

生成专家数据

首先我们需要一定量的专家数据,为此,预先通过PPO算法训练出一个表现良好的专家模型,再利用专家模型生成专家数据。

import gym
import torch
import torch.nn.functional as F
import torch.nn.as nn
import numpy as np
import matplotlib.pyplot as plt
from tqdm import tqdm
import random
import rl_utils
class PolicyNet(torch.nn.Module):def __init__(self,state_dim,hidden_dim,action_dim):super(PolicyNet,self).__init__()self.fc1 = torch.nn.Linear(state_dim,hidden_dim)self.fc2 = toech.nn.Linear(hidden_dim,action_dim)def forward(self,x):x = F.relu(self.fc1(x))return F.softmax(self.fc2(x),dim=1)
class ValueNet(torch.nn.Module):def __init__(self,state_dim,hidden_dim):super(ValueNet,self).__init__()self.fc1 = torch.nn.Linear(state_dim,hidden_dim)self.fc2 = torch.nn.Linear(hidden_dim,1)def forward(self,x):x = F.relu(self.fc1(x))return self.fc2(x)
class PPO:def__init__(self,state_dim,action_dim,actor_lr,critic_lr,lmbda,epochs,
eps,gamma,device):self.actor = PolicyNet(state_dim,hidden_dim,action_dim).to(device)self.critic = ValueNet(state_dim,hidden_dim).to(device)self.actor_optimizer = torch,optim.Adam(self.actor.parameters(),lr = actor_lr)self.critic_optimizer = torch.optim.Adam(self.critic.parameters(),lr = critic_lr)self.gamma = gammaself.lmbda = lmbdaself.epochs= epochs#一条序列的数据用于训练数据self.eps = eps #PPO中截断范围的参数self.device = devicedef take_action(self,state):state = torch.tensor([state],dtype=torch.float).to(self.device)probs = self.actor(state)action_dist = torch.distributions.Categorical(probs) #离散概率发布action = action_dist.sample()return action.item()def update(self,transition_dict):state = torch.tensor(transition_dict['states'],dtype=torch.float).to(self.device)actions = torch.tensor(transition_dict['actions']).view(-1,1).to(self.device)rewards = torch.tensor(transition_dict['rewards']).view(-1,1).to(self.device)next_states = torch.tensor(transition_dict['next_states']).view(-1,1)
.to(self.device)dones = torch.tensor(transition_dict['dones']).view(-1,1)
.to(self.device)td_target = rewards + self.gamma * self.critic(next_states) * (1-dones)td_delta = td_target - self.critic(states)advantage = rl_utils.compute_advantage(self.gamma,self.lmbda,td_delta.cpu()).to(self.device)old_log_probs = torch.log(self.actor(states).gather(1,actions)).detach()for _ in range(self.epochs):log_probs = torch.log(self.actor(states).gather(1,actions))ratio = torch.exp(log_probs - old_log_probs)surr1 = ratio * adaventagesurr2 = torch.clamp(ratio,1-self.eps,1+eps) * advantage #截断 #限制范围actor_loss = torch.mean(-torch.min(surr1,surr2)) #PPO损失函数critic_loss = torch.mean(F.mse_loss(self.critic(states),td_target,detach())) #评论家的损失self.actor_optimizer.zero_grad()self.critic_optimizer.zero_grad()actor_loss.backward()critic_loss.backward()self.actor_optimizer.step()self.critic_optimizer.step()

接下来开始生成专家数据,我们只生成一条轨迹,并从中采样30个状态动作样本(s,a)。我们只用者30个专家数据样本来训练模仿策略。

def sample_-expert_data(n_episode):states = []actions = []for episode in range(n_episode):state = env.reset()done = Falsewhile not done:action = ppo_agent.take_action(state)states.append(state)actions.append(action)next_state,reward,done,_ = env.step(action)state = next_statereturn np.array(states),np.array(actions)

行为克隆的代码

在BC中,我们将专家数据中(st,at)的at视为标签,行为克隆算法BC则转化为监督学习中经典的分类问题,采用最大似然估计的训练方法可得到分类结果。

class BehaviorClone:def __init__(self,state_dim,hidden_dim,action_dim,lr):self.policy = policyNet(state_dim,hidden_dim,action_dim).to(device)self.optimizer = torch.optim.Adam(self.policy.parameters(),lr=lr)def learn(self,states,actions):states = torch.tensor(states,dtype=torch.float).to(device)actions = torch.tensor(actions).view(-1,1).to(device)log_probs = torch.log(self.policy(states).gather(1,actions))bc_loss = torch.mean(-log_probs) #最大似然估计self.optimizer.zero_grad()bc_loss.backward()    #关键,用最大似然估计来更新网络,使其更接近专家系统self.optimizer.step()def take_action(self,state):state = torch.tensor([state],dtype=torch.float).to(device)probs = self.policy(state)action_dist = torch.distributions.Categorical(probs)action = action_dist.sample()return action.item()def test_agent(agent,env,n_episode):return_list = []for episode in range(n_episode):episode_return = 0state = env.reset()done = Falsewhile not done:action = agent.take_action(state)next_state,reward,done,_ = env.step(action)state = next_stateepisode_return += rewardreturn_list.append(episode_return)return np.mean(return_list)

我们发现BC无法学习到最优策略,这主要是因为在数据量比较少的情况下容易发生过拟合

生成对抗模仿学习的代码

接下来我们实现GAIL的代码

首先实现判别器模型,其模型架构为一个两层的全连接网络,模型输入一个状态动作对,输出一个概率标量。

class Discriminator(nn.Module):def __init__(self,state_dim,hidden_dim,action_dim):super(Discriminator,self).__init__()self.fc1 = torch.nn.Linear(state_dim+action_dim,hidden_dim)self.fc2 = torch.nn.Linear(hidden_dim,1)def forward(self,x,a):cat = torch.cat([x,a],dim=1)x = F.relu(self.fc1(cat))return torch.sigmoid(self.fc2(x))

接下来正式实现GAIL的代码,在每一轮迭代中,GAIL中的策略和环境进行交互,采样新的状态动作对。基于专家数据和策略新采样的数据,首先训练判别器,然后将判别器的输出转换为策略的奖励信号,指导策略用PPO算法做训练。

class GAIL:def __init__(self,agent,state_dim,action_dim,hidden_dim,lr_d):self.discriminator = Discriminator(state_dim,hidden_dim,action_dim).to(device)self.discriminator_optimizer = torch.optim.Adam(self.discriminator,parameters(),
lr = lr_d)self.agent = agentdef learn(self,expert_s,expert_a,agent_s,agent_a,next_s,done):expert_states = torch.tensor(expert_s,dtype=torch.float).to(device)expert_actions = torch.tensor(expert_a).to(device)agent_states = torch.tensor(agent_s,dtype = torch.float).to(device)agent_actions = torch.tensor(agent_a).to(device)expert_actions = F.one_hot(expert_actions,num_classes = 2).float()agent_actions = F.one_hot(agent_actions,num_classes=2).float()expert_prob = self.discriminator(expert_states,expert_actions)agent_prob = self.discriminator(agent_states,agent_actions)discriminator_loss = nn.BCELoss()(agent_prob,torch.ones_like(agent_prob))+nn.BCELoss()(expert_prob,torch.zeros_like(expert_probs))self.discriminator_optimizer.zero_grad()discriminator_loss = .backward()self.discriminator_optimizer.step()reward = -torch.log(agent_prob).detach().cpu().numpy() #使用鉴别器输出的概率计算代理的奖励,奖励为负对数概率。这种奖励机制鼓励代理生成的数据更接近真实数据。transition_dict = {'states':agent_s,'actions':agent_a,'rewards':rewards,'next_states':next_s,'dones':dones}self.agent.update(transition_dict)

几个关键点

  • 鉴别器的作用:鉴别器用于区分专家数据和代理生成的数据,其输出的概率用于计算代理的奖励。
  • 奖励计算:通过负对数概率计算奖励,使得代理在生成数据时更倾向于生成与专家数据相似的样本。
  • 代理更新:使用计算得到的奖励和其他数据来更新代理的策略,使其更好地模仿专家的行为。

通过上面的实验对比我们可以直观地感受到,在数据样本有限的情况下,BC不能学习到最优策略,但是GAIL在相同的专家数据下可以取得非常好的结果,这一方面归因于GAIL的训练目标(拉近策略和专家的占用度)十分贴合模仿学习任务的目标,避免了BC中的复合误差问题;另一方面得益于在GAIL的训练中,策略可以和环境交互出更多的数据,以此训练判别器,进而生成对基于策略“量身定做”的指导奖励信号。

相关文章:

25/1/4 算法笔记<强化学习> 生成对抗模仿学习

基于生成对抗网络的模仿学习,假设存在一个专家智能体,其策略可以看成最优策略,我们就可以通过直接模仿这个专家在环境中交互的动作数据来训练一个策略,并不需要用到环境提供的奖励信息。 生成对抗模仿学习GAIL实质上就是模仿了专家…...

Flink维表方案选型

Iceberg Iceberg 采用全量预加载数据的方式将维度表数据全部加载到内存中进行关联,虽然可以避免频繁访问外部数据库,但对计算节点的内存消耗很高,不能适用于数量很大的维度表。除此之外,当 Iceberg 维表数据更新后,可…...

Oracle Database 23ai 新特性: UPDATE 和 DELETE 语句的直接联接

Oracle Database 23c 引入了一系列令人振奋的新特性,其中一项尤为引人注目的是对 UPDATE 和 DELETE 语句支持直接联接(Direct Join)。这一新功能极大地简化了复杂数据操作的实现,提升了性能,并为数据库开发者提供了更强…...

机器学习之随机森林算法实现和特征重要性排名可视化

随机森林算法实现和特征重要性排名可视化 目录 随机森林算法实现和特征重要性排名可视化1 随机森林算法1.1 概念1.2 主要特点1.3 优缺点1.4 步骤1.5 函数及参数1.5.1 函数导入1.5.2 参数 1.6 特征重要性排名 2 实际代码测试 1 随机森林算法 1.1 概念 是一种基于树模型的集成学…...

网络安全图谱以及溯源算法

​ 本文提出了一种网络攻击溯源框架&#xff0c;以及一种网络安全知识图谱&#xff0c;该图由六个部分组成&#xff0c;G <H&#xff0c;V&#xff0c;A&#xff0c;E&#xff0c;L&#xff0c;S&#xff0c;R>。 1|11.知识图 ​ 网络知识图由六个部分组成&#xff0c…...

单片机-外部中断

中断是指 CPU 在处理某一事件 A 时&#xff0c;发生了另一事件 B&#xff0c;请求 CPU 迅速去处理(中断发生)&#xff1b;CPU 暂时停止当前的工作(中断响应)&#xff0c; 转去处理事件 B(中断服务)&#xff1b;待 CPU 将事件 B 处理完毕后&#xff0c;再回到原来事件 A 被中断的…...

《解锁计算机视觉智慧:编程实现图片场景文字描述的开源宝藏》

《解锁计算机视觉智慧&#xff1a;编程实现图片场景文字描述的开源宝藏》 一、MiniGPT-4&#xff1a;小模型撬动大视觉理解&#xff08;一&#xff09;项目概览&#xff08;二&#xff09;核心亮点&#xff08;三&#xff09;上手体验 二、ClipCap-Chinese&#xff1a;中文场景…...

onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制

文章目录 1. 页面跳转方式2. 你的场景分析3. 页面生命周期4. 总结5. 建议 在微信小程序中&#xff0c;页面跳转时&#xff0c; onLoad 生命周期函数是否执行取决于跳转的方式和小程序的页面栈管理机制。以下是详细说明&#xff1a; 1. 页面跳转方式 微信小程序提供了多种页面…...

Visio 画阀门 符号 : 电动阀的画法

本篇文章介绍阀门&#xff0c;很多朋友在利用Visio绘画管道流程简图时&#xff0c;需要进行阀门符号的绘画&#xff0c;而Visio提供的阀门符号种类并不是很齐全。 本篇文章给出电动阀的画法&#xff1a; 下图是液动阀的符号&#xff1a; 首先&#xff0c;找到“更多形状”中的…...

OOM排查思路

K8S 容器的云原生生态&#xff0c;改变了服务的交付方式&#xff0c;自愈能力和自动扩缩等功能简直不要太好用。 有好的地方咱要夸&#xff0c;不好的地方咱也要说&#xff0c;真正的业务是部署于容器内部&#xff0c;而容器之外&#xff0c;又有一逻辑层 Pod 。 对于容器和…...

《Spring Framework实战》10:4.1.4.2.详细的依赖和配置

欢迎观看《Spring Framework实战》视频教程 集合 <list/>、<set/>、<map/>和<props/>元素分别设置Java集合类型list、set、map和properties的属性和参数。以下示例显示了如何使用它们&#xff1a; <bean id"moreComplexObject" class&qu…...

网络安全-XSS跨站脚本攻击(基础篇)

漏洞扫描的原理 1.跨站脚本攻击介绍 xss跨站脚本攻击&#xff1a; xSS 全称&#xff08;Cross site Scripting &#xff09;跨站脚本攻击&#xff0c;是最常见的Web应用程序安全漏洞之一&#xff0c;位于OWASP top 10 2013/2017年度分别为第三名和第七名&#xff0c;XSS是指攻…...

Git的学习和常见问题

文章目录 1.初始化配置2.新建仓库3.添加和提交文件4.git reset 回退版本5.git diff 查看差异6.git rm 删除文件7.文件 .gitigonre8.克隆远程仓库9.将已有的本地仓库关联到远程仓库10.分支的基本操作11.解决合并冲突配置问题 最近基于GeekHour的视频学习Git&#xff0c;记录了一…...

Flink源码解析之:Flink on k8s 客户端提交任务源码分析

Flink on k8s 客户端提交任务源码分析 当我们需要在代码中提交Flink job到kubernetes上时&#xff0c;需要如何做呢&#xff1f;要引入什么第三方依赖&#xff1f;需要提供什么内容&#xff1f;flink是如何将job提交到k8s上的&#xff1f;经过了什么样的流程&#xff0c;内部有…...

STLG_02_02_MS SQL - SSMS的安装和使用

SQL Server Management Studio (SSMS) 是 Microsoft 提供的一个集成环境&#xff0c;用于管理、开发和维护 SQL Server 数据库和 Analysis Services 数据库。 一、安装 SSMS 下载 SSMS: 访问 Microsoft 官方网站的 SSMS 下载页面。选择适合你操作系统的版本进行下载。SSMS 支持…...

git 常用命令和本地合并解决冲突

目录 一、常用命令 二、本地可视化合并分支解决冲突 一、常用命令 最近&#xff0c;使用mac电脑&#xff0c;无法直接使用小乌龟进行可视化操作&#xff0c;现在记录一些常用命令。 拉取&#xff1a; git clone <git url> 仅拉起某个单独分支&#xff1a; git clo…...

ThinkPHP 8高效构建Web应用-获取请求对象

【图书介绍】《ThinkPHP 8高效构建Web应用》-CSDN博客 《2025新书 ThinkPHP 8高效构建Web应用 编程与应用开发丛书 夏磊 清华大学出版社教材书籍 9787302678236 ThinkPHP 8高效构建Web应用》【摘要 书评 试读】- 京东图书 使用VS Code开发ThinkPHP项目-CSDN博客 编程与应用开…...

机器人技术:ModbusTCP转CCLINKIE网关应用

在当今自动化生产与智能制造领域&#xff0c;ModbusTCP转CC-LinkIE网关KJ-MTCPZ-CCIES的应用正日益成为提升生产效率、实现设备间高效通信的重要技术手段。这一转换技术不仅打破了不同通信协议间的壁垒&#xff0c;还为机器人产品的应用提供了更为广阔的舞台。ModbusTCP作为一种…...

C语言的语法

C语言的语法与应用探讨 C语言作为一种高效的程序设计语言&#xff0c;自1970年代问世以来&#xff0c;一直在科学计算、系统编程、嵌入式系统等领域中扮演着重要角色。本文将深入探讨C语言的基本语法、数据结构、控制结构以及其在实际应用中的重要性。 一、C语言基础 1.1 数…...

ElasticsearchJavaClient工具类分析

最近升级了Elasticsearch版本&#xff0c;从7.X升级到8.X的变化还是比较大的&#xff0c;原来7版本用的是RestHighLevelClient&#xff0c;8.X弃用RestHighLevelClient转而支持ElasticsearchClient&#xff0c;并且api调用方式经过建造者模式的改造&#xff0c;变成了链式调用。…...

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇&#xff0c;在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下&#xff1a; 【Note】&#xff1a;如果你已经完成安装等操作&#xff0c;可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作&#xff0c;重…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明&#xff1a; 想象一下&#xff0c;你正在用eNSP搭建一个虚拟的网络世界&#xff0c;里面有虚拟的路由器、交换机、电脑&#xff08;PC&#xff09;等等。这些设备都在你的电脑里面“运行”&#xff0c;它们之间可以互相通信&#xff0c;就像一个封闭的小王国。 但是&#…...

Cursor实现用excel数据填充word模版的方法

cursor主页&#xff1a;https://www.cursor.com/ 任务目标&#xff1a;把excel格式的数据里的单元格&#xff0c;按照某一个固定模版填充到word中 文章目录 注意事项逐步生成程序1. 确定格式2. 调试程序 注意事项 直接给一个excel文件和最终呈现的word文件的示例&#xff0c;…...

R语言AI模型部署方案:精准离线运行详解

R语言AI模型部署方案:精准离线运行详解 一、项目概述 本文将构建一个完整的R语言AI部署解决方案,实现鸢尾花分类模型的训练、保存、离线部署和预测功能。核心特点: 100%离线运行能力自包含环境依赖生产级错误处理跨平台兼容性模型版本管理# 文件结构说明 Iris_AI_Deployme…...

Day131 | 灵神 | 回溯算法 | 子集型 子集

Day131 | 灵神 | 回溯算法 | 子集型 子集 78.子集 78. 子集 - 力扣&#xff08;LeetCode&#xff09; 思路&#xff1a; 笔者写过很多次这道题了&#xff0c;不想写题解了&#xff0c;大家看灵神讲解吧 回溯算法套路①子集型回溯【基础算法精讲 14】_哔哩哔哩_bilibili 完…...

Linux相关概念和易错知识点(42)(TCP的连接管理、可靠性、面临复杂网络的处理)

目录 1.TCP的连接管理机制&#xff08;1&#xff09;三次握手①握手过程②对握手过程的理解 &#xff08;2&#xff09;四次挥手&#xff08;3&#xff09;握手和挥手的触发&#xff08;4&#xff09;状态切换①挥手过程中状态的切换②握手过程中状态的切换 2.TCP的可靠性&…...

django filter 统计数量 按属性去重

在Django中&#xff0c;如果你想要根据某个属性对查询集进行去重并统计数量&#xff0c;你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求&#xff1a; 方法1&#xff1a;使用annotate()和Count 假设你有一个模型Item&#xff0c;并且你想…...

高等数学(下)题型笔记(八)空间解析几何与向量代数

目录 0 前言 1 向量的点乘 1.1 基本公式 1.2 例题 2 向量的叉乘 2.1 基础知识 2.2 例题 3 空间平面方程 3.1 基础知识 3.2 例题 4 空间直线方程 4.1 基础知识 4.2 例题 5 旋转曲面及其方程 5.1 基础知识 5.2 例题 6 空间曲面的法线与切平面 6.1 基础知识 6.2…...

SpringBoot+uniapp 的 Champion 俱乐部微信小程序设计与实现,论文初版实现

摘要 本论文旨在设计并实现基于 SpringBoot 和 uniapp 的 Champion 俱乐部微信小程序&#xff0c;以满足俱乐部线上活动推广、会员管理、社交互动等需求。通过 SpringBoot 搭建后端服务&#xff0c;提供稳定高效的数据处理与业务逻辑支持&#xff1b;利用 uniapp 实现跨平台前…...

【HTML-16】深入理解HTML中的块元素与行内元素

HTML元素根据其显示特性可以分为两大类&#xff1a;块元素(Block-level Elements)和行内元素(Inline Elements)。理解这两者的区别对于构建良好的网页布局至关重要。本文将全面解析这两种元素的特性、区别以及实际应用场景。 1. 块元素(Block-level Elements) 1.1 基本特性 …...