【SSL-RL】自监督强化学习:随机潜在演员评论家 (SLAC)算法

        📢本篇文章是博主强化学习(RL)领域学习时,用于个人学习、研究或者欣赏使用,并基于博主对相关等领域的一些理解而记录的学习摘录和笔记,若有不当和侵权之处,指出后将会立即改正,还望谅解。文章分类在👉强化学习专栏:

       【强化学习】(43)---《自监督强化学习:随机潜在演员评论家 (SLAC)算法》

自监督强化学习:随机潜在演员评论家 (SLAC)算法

目录

1. 引言

2. SLAC算法的核心思想

2.1 隐变量模型的构建

2.2 自监督的潜在状态预测

2.3 重构与预测损失

2.4 Actor-Critic架构中的策略优化

3. SLAC算法的工作流程

3.1 数据编码

3.2 动态模型预测

3.3 重构观测与优化损失

3.4 策略优化

[Python] SLAC算法的实现示例

[Experiment] SLAC算法的应用示例

[Notice]  代码解析

4. SLAC的优势与挑战

5. 结论


1. 引言

        随机潜在演员评论家Stochastic Latent Actor-Critic (SLAC)算法 是一种用于连续控制任务的自监督强化学习算法,由Google Brain提出。SLAC结合了自监督学习和深度强化学习,通过构建一个隐变量模型(Latent Variable Model)来捕捉环境的潜在状态,并使用这些状态来进行策略优化。SLAC特别适合于高维观测(如图像)和部分可观测的环境。SLAC算法的主要目标是通过学习潜在空间的动态来更好地估计环境状态,进而提升智能体的策略学习效率。


2. SLAC算法的核心思想

SLAC通过以下三个核心模块实现强化学习中的表示学习和策略优化:

  • 隐变量模型(Latent Variable Model):SLAC构建了一个隐变量模型,将环(\theta)境的观测映射到低维的潜在空间,从而在潜在空间中进行预测和策略学习。
  • 自监督学习(Self-Supervised Learning):通过重构和预测未来潜在状态,SLAC可以在没有外部奖励的情况下学习潜在表示。
  • Actor-Critic架构:SLAC采用了Actor-Critic架构,其中策略(Actor)和价值函数(Critic)都在潜在空间中进行优化。

2.1 隐变量模型的构建

        在SLAC中,环境的高维观测( o_t )被映射到一个低维的潜在状态( z_t )。这个隐变量模型由以下几个部分组成:

  1. 编码器(Encoder):将观测( o_t )编码为潜在表示( z_t )
  2. 潜在动态模型(Latent Dynamics Model):预测潜在状态在时间上的演变,从而能够模拟环境的动态。
  3. 解码器(Decoder):从潜在空间重构观测,用于约束潜在表示能够捕捉到环境的关键信息。

SLAC中的编码器和解码器分别定义为:

[ z_t \sim q_\phi(z_t | o_t, z_{t-1}, a_{t-1}) ] [ \hat{o}t \sim p\theta(o_t | z_t) ]

其中,(\phi)(\theta)是编码器和解码器的参数。

2.2 自监督的潜在状态预测

        SLAC的潜在动态模型是一个随机过程,定义为:

[ z_{t+1} \sim p_\psi(z_{t+1} | z_t, a_t) ]

        通过自监督学习,SLAC训练潜在动态模型来预测未来的潜在状态,使得模型能够捕捉环境的动态变化。这种预测过程引入了随机性,以捕捉环境中的不确定性。

2.3 重构与预测损失

为了确保潜在表示能够有效地重构观测,并预测未来状态,SLAC的损失函数包括以下两个部分:

        重构损失(Reconstruction Loss):用于约束编码器和解码器,使得潜在表示能够重构原始观测。

[ L_{\text{recon}} = \mathbb{E}{q\phi(z_t | o_t)} \left[ -\log p_\theta(o_t | z_t) \right] ]

预测损失(Predictive Loss):用于训练潜在动态模型,使其能够预测未来的潜在状态。

[ L_{\text{predict}} = \mathbb{E}{q\phi(z_t | o_t)} \left[ -\log p_\psi(z_{t+1} | z_t, a_t) \right] ]

        SLAC的最终损失函数可以写为:

[ L_{\text{total}} = L_{\text{recon}} + \lambda L_{\text{predict}} ]

其中,(\lambda)是用于平衡重构和预测损失的超参数。

2.4 Actor-Critic架构中的策略优化

        在SLAC中,策略优化是在潜在空间中进行的。SLAC采用了软演员-评论家(Soft Actor-Critic, SAC)算法,并将其应用于潜在空间。SAC是一种基于熵正则化的强化学习算法,目的是在学习最优策略的同时,鼓励策略的多样性。

        策略网络(Actor):在潜在空间中,策略网络 ( \pi_\theta(a_t | z_t) )生成动作分布,最大化策略的预期回报。

        价值网络(Critic):价值网络( Q_\psi(z_t, a_t) )估计给定潜在状态和动作的价值,用于更新策略。

        SAC的目标是最大化以下目标函数:

[ J(\pi) = \sum_{t=0}^\infty \mathbb{E}_{(z_t, a_t) \sim \pi} \left[ r(z_t, a_t) + \alpha \mathcal{H}(\pi(\cdot | z_t)) \right] ]

其中,(\alpha)是用于控制熵项的超参数,(\mathcal{H})是策略的熵,用于增加策略的探索性。

3. SLAC算法的工作流程

3.1 数据编码

        在每个时间步(t),环境的观测(o_t)被编码为潜在状态(z_t)。编码器 (q_\phi(z_t | o_t, z_{t-1}, a_{t-1}))将观测和过去的潜在状态、动作作为输入,输出当前的潜在状态。

3.2 动态模型预测

        SLAC使用潜在动态模型预测未来潜在状态 (z_{t+1})。通过这种自监督的预测机制,模型能够捕捉环境中的长期依赖关系。

3.3 重构观测与优化损失

        通过解码器(p_\theta(o_t | z_t)),SLAC尝试重构观测,以确保潜在表示捕捉了环境的关键信息。通过最小化重构损失和预测损失,SLAC能够有效学习潜在表示。

3.4 策略优化

        SLAC在潜在空间中使用SAC算法进行策略优化。通过最大化策略的预期回报和策略的熵,SLAC的策略网络学会在潜在空间中采取最优动作。


[Python] SLAC算法的实现示例

        以下是一个简化的SLAC实现,示例展示了如何使用PyTorch实现简化的SLAC模型,并进行训练以学习潜在表示和优化策略。这个实现包含了编码器、解码器和潜在动态模型,用于在潜在空间中对环境进行建模和策略学习。

        🔥若是下面代码复现困难或者有问题,欢迎评论区留言;需要以整个项目形式的代码,请在评论区留下您的邮箱📌,以便于及时分享给您(私信难以及时回复)。

"""《 SLAC算法的实现示例》时间:2024.11作者:不去幼儿园
"""
import torch
import torch.nn as nn
import torch.optim as optim
import numpy as np# 定义SLAC模型类
class SLAC(nn.Module):def __init__(self, obs_dim, act_dim, latent_dim):super(SLAC, self).__init__()self.encoder = Encoder(obs_dim, latent_dim)self.decoder = Decoder(latent_dim, obs_dim)self.latent_dyn_model = LatentDynamics(latent_dim, act_dim)def forward(self, obs, action):# 编码观测得到潜在表示latent_state = self.encoder(obs)# 解码重构观测recon_obs = self.decoder(latent_state)# 预测潜在状态的变化next_latent_state = self.latent_dyn_model(latent_state, action)return recon_obs, latent_state, next_latent_state# 定义SLAC模型中的编码器、解码器和潜在动态模型
class Encoder(nn.Module):def __init__(self, obs_dim, latent_dim):super(Encoder, self).__init__()self.fc1 = nn.Linear(obs_dim, 64)self.fc2 = nn.Linear(64, latent_dim)self.relu = nn.ReLU()def forward(self, obs):x = self.relu(self.fc1(obs))latent_state = self.fc2(x)return latent_stateclass Decoder(nn.Module):def __init__(self, latent_dim, obs_dim):super(Decoder, self).__init__()self.fc1 = nn.Linear(latent_dim, 64)self.fc2 = nn.Linear(64, obs_dim)self.relu = nn.ReLU()def forward(self, latent_state):x = self.relu(self.fc1(latent_state))recon_obs = self.fc2(x)return recon_obsclass LatentDynamics(nn.Module):def __init__(self, latent_dim, act_dim):super(LatentDynamics, self).__init__()self.fc1 = nn.Linear(latent_dim + act_dim, 64)self.fc2 = nn.Linear(64, latent_dim)self.relu = nn.ReLU()def forward(self, latent_state, action):x = torch.cat([latent_state, action], dim=1)x = self.relu(self.fc1(x))next_latent_state = self.fc2(x)return next_latent_state

算法训练:

# 创建SLAC模型实例
obs_dim = 64
act_dim = 32
latent_dim = 16
slac_model = SLAC(obs_dim, act_dim, latent_dim)# 定义优化器和损失函数
optimizer = optim.Adam(slac_model.parameters(), lr=1e-3)
mse_loss = nn.MSELoss()# 训练SLAC模型
def train_slac_model(num_iterations, batch_size):for i in range(num_iterations):obs_batch = torch.randn(batch_size, obs_dim)action_batch = torch.randn(batch_size, act_dim)# 前向传播recon_obs, latent_state, next_latent_state = slac_model(obs_batch, action_batch)# 计算重构损失和预测损失recon_loss = mse_loss(recon_obs, obs_batch)predict_loss = mse_loss(next_latent_state, latent_state)total_loss = recon_loss + predict_loss# 反向传播和优化optimizer.zero_grad()total_loss.backward()optimizer.step()if i % 100 == 0:print(f"Iteration {i}, Total Loss: {total_loss.item()}")# 示例训练
train_slac_model(num_iterations=1000, batch_size=32)

[Experiment] SLAC算法的应用示例

        在复杂的强化学习任务中,例如连续控制问题,SLAC通过将高维观测映射到低维潜在空间,在潜在空间中进行动态建模和策略优化。SLAC特别适用于机器人控制和自主驾驶等需要处理连续动作空间的任务。以下是SLAC在强化学习中的应用示例,展示如何在潜在空间中进行策略优化。

应用流程

  1. 环境初始化:创建强化学习环境,定义观测和动作的维度。
  2. SLAC模型初始化:创建SLAC模型,包括编码器、解码器和潜在动态模型。
  3. 策略模型初始化:采用Soft Actor-Critic(SAC)算法,初始化Actor-Critic网络,并将潜在状态作为SAC的输入。
  4. 训练循环
    • 潜在状态编码:通过SLAC模型的编码器,将观测数据映射到潜在状态空间。
    • 策略选择:在潜在空间中使用SAC的Actor网络选择最优动作。
    • 环境交互与反馈:执行选择的动作,环境返回奖励和下一个观测。
    • 潜在动态预测:使用SLAC的动态模型预测下一个潜在状态,并计算预测损失。
    • 策略优化与模型同步:更新SLAC模型和SAC策略模型。
# 定义SLAC与SAC联合的智能体
class SLACAgent:def __init__(self, obs_dim, act_dim, latent_dim, actor_lr=3e-4, critic_lr=3e-4):self.slac_model = SLAC(obs_dim, act_dim, latent_dim)self.actor = Actor(latent_dim, act_dim)self.critic = Critic(latent_dim, act_dim)self.slac_optimizer = optim.Adam(self.slac_model.parameters(), lr=3e-4)self.actor_optimizer = optim.Adam(self.actor.parameters(), lr=actor_lr)self.critic_optimizer = optim.Adam(self.critic.parameters(), lr=critic_lr)def select_action(self, latent_state):mean, std = self.actor(latent_state)dist = Normal(mean, std)action = dist.sample()return action, dist.log_prob(action)def update(self, obs_batch, action_batch, reward_batch, next_obs_batch):# 使用SLAC模型进行编码和预测recon_obs, latent_state, next_latent_pred = self.slac_model(obs_batch, action_batch)next_latent_state = self.slac_model.encoder(next_obs_batch)# 计算重构损失和预测损失recon_loss = torch.mean((recon_obs - obs_batch) ** 2)predict_loss = torch.mean((next_latent_pred - next_latent_state) ** 2)slac_loss = recon_loss + predict_loss# 更新SLAC模型self.slac_optimizer.zero_grad()slac_loss.backward()self.slac_optimizer.step()# 计算Critic损失并更新q_value = self.critic(latent_state, action_batch)next_q_value = reward_batch + 0.99 * self.critic(next_latent_state, self.actor(next_latent_state)[0]).detach()critic_loss = torch.mean((q_value - next_q_value) ** 2)self.critic_optimizer.zero_grad()critic_loss.backward()self.critic_optimizer.step()# 计算Actor损失并更新action, log_prob = self.select_action(latent_state)actor_loss = torch.mean(-self.critic(latent_state, action) + 0.2 * log_prob)self.actor_optimizer.zero_grad()actor_loss.backward()self.actor_optimizer.step()

实例训练:

# 训练SLAC智能体
def train_slac_agent(agent, env, num_episodes):for episode in range(num_episodes):obs = env.reset()done = Falseepisode_reward = 0while not done:obs_tensor = torch.tensor(obs, dtype=torch.float32).unsqueeze(0)latent_state = agent.slac_model.encoder(obs_tensor)# 选择动作并与环境交互action, _ = agent.select_action(latent_state)action_np = action.detach().numpy()next_obs, reward, done, _ = env.step(action_np)# 存储并更新模型agent.update(obs_tensor, action, reward, torch.tensor(next_obs, dtype=torch.float32).unsqueeze(0))obs = next_obsepisode_reward += rewardprint(f"Episode {episode + 1}: Total Reward = {episode_reward}")# 示例用法
obs_dim = 64
act_dim = 32
latent_dim = 16
slac_agent = SLACAgent(obs_dim, act_dim, latent_dim)# 训练SLAC Agent
train_slac_agent(slac_agent, env, num_episodes=100)

[Notice]  代码解析

  • 潜在状态表示学习:SLAC模型将高维观测编码为潜在状态,使得模型在潜在空间中进行策略选择和动态建模。
  • Actor-Critic策略优化:在潜在空间中使用SAC算法,通过Critic网络估计潜在状态和动作的价值,Actor网络选择最大化长期回报的动作。
  • 重构和预测损失:SLAC模型通过重构和预测损失优化潜在状态表示,使得潜在空间能够有效描述环境动态。

        由于博文主要为了介绍相关算法的原理应用的方法,缺乏对于实际效果的关注,算法可能在上述环境中的效果不佳或者无法运行,一是算法不适配上述环境,二是算法未调参和优化,三是没有呈现完整的代码,四是等等。上述代码用于了解和学习算法足够了,但若是想直接将上面代码应用于实际项目中,还需要进行修改。


4. SLAC的优势与挑战

优势

  1. 适用于高维观测:SLAC通过隐变量模型,将高维观测映射到低维潜在空间,在图像和视频等高维输入上表现优异。
  2. 捕捉环境动态:SLAC的潜在动态模型能够预测未来状态,捕捉环境中的长期依赖关系。
  3. 高效的探索策略:通过在潜在空间中进行策略优化,SLAC能够更高效地学习策略,减少计算负担。

挑战

  1. 计算开销较高:SLAC的实现需要编码器、解码器和动态模型的协同工作,对计算资源要求较高。
  2. 超参数敏感性:SLAC的性能对模型结构和超参数设置较为敏感,可能需要在具体任务中进行细致的调优。
  3. 潜在空间的解释性:SLAC学习的潜在表示在一定程度上是黑箱的,缺乏解释性。

5. 结论

        Stochastic Latent Actor-Critic (SLAC) 算法通过整合自监督学习和深度强化学习,提供了一种有效处理高维观测和部分可观测环境的方法。通过学习潜在空间中的动态变化和策略优化,SLAC在多种连续控制任务中表现出色,为复杂环境中的智能体学习提供了新的思路和方法。

参考文献:Stochastic Latent Actor-Critic: Deep Reinforcement Learning with a Latent Variable Model

 更多自监督强化学习文章,请前往:【自监督强化学习】专栏 


     文章若有不当和不正确之处,还望理解与指出。由于部分文字、图片等来源于互联网,无法核实真实出处,如涉及相关争议,请联系博主删除。如有错误、疑问和侵权,欢迎评论留言联系作者,或者添加VX:Rainbook_2,联系作者。✨

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

详解MySQL安装

目录 Ubantu 1. 使⽤apt安装MySQL 2.查看MySQL状态 3. MySQL 安装安全设置 4.设置密码 卸载MySQL Centos 1. 确认当前的系统版本 2.下载MySQL源 3.安装MySQL 4.启动mysqld 5.查看MySQL状态 6.设置开机自启动 7.查看MySQL密码,并登录 8.修改密码 Ubant…

【MATLAB源码-第213期】基于matlab的16QAM调制解调系统软硬判决对比仿真,输出误码率曲线对比图。

操作环境: MATLAB 2022a 1、算法描述 一、16QAM调制原理 在16QAM(16 Quadrature Amplitude Modulation)调制中,一个符号表示4个比特的数据。这种调制方式结合了幅度调制和相位调制,能够在相同的频谱资源下传输更多的…

Renesas R7FA8D1BH (Cortex®-M85) Data Flash程序功能实现

目录 概述 1 Data Flash空间 2 FSP配置参数 3 源代码介绍 3.1 源代码 3.2 中断函数 3.3 源代码文件 4 测试 4.1 测试实现 4.2 测试 概述 本文主要介绍使用FSP提供的库函数操作Renesas R7FA8D1BH (Cortex-M85) Data Flash的方法,笔者使用FSP配置参数&#x…

计算机组成原理知识点汇总,零基础入门到精通,收藏这篇就够了

计算机发展历程 计算机硬件的发展 计算机的四代变化 1946年世界上第一台电子数字计算机(Electronic Numerical Integrator And Computer, ENIAC) 1)第一代计算机(1946-1957)电子管时代。特点:逻辑元件采…

动态规划——01背包问题

目录 零、背包问题 一、01背包 二、分割等和子集 三、目标和 四、最后一块石头的重量II 零、背包问题 背包问题(Knapsack problem)是一种组合优化的NP完全问题。 问题可以描述为:给定一组物品,每种物品都有自己的重量和价格,在限定的总…

30.2 不得不谈的lsm:分层结构和lsm数据结构

本节重点介绍 : LSM树核心特点LSM树的核心结构 MemTableImmutable MemTableSSTable LSM树的Compact策略 size-tiered 策略leveled策略 LSM树(Log-Structured-Merge-Tree) LSM树的名字往往会给初识者一个错误的印象,事实上,LSM树并不像B树、红黑树一样…

宏观经济学笔记

【拯救者】宏观经济学速成 国民生产总值GNP: GNP 衡量一国(地区)成员在一定时期内运用生产要素所生产的全部最终产品和服务的市场价值。凡是本国国民所 创造的收入,不管生产要素是否在国内,都计入本国GNP中。 GDP本国居民在本国创造的价值外国居民在本国…

模块二:central cache实现

一、central cache介绍 结构也是一个哈希桶,大小划分和 thread cache哈希桶一样,区别在于挂的不是自由链表而是 span 链表,里面连接了许多 span 二、span介绍 1、实现思路 span 就是 central cache 向 page cache 申请的大块内存&#xff…

D-FINE:在DETRs模型中将回归任务重新定义为细粒度分布优化

晚上回家看到一篇新颖的研究内容, 也是目标检测相关的《D-FINE: REDEFINE REGRESSION TASK IN DETRS AS FINE-GRAINED DISTRIBUTION REFINEMENT》 ,原文地址在这里,如下所示: 如果想进一步了解相关的研究工作建议移步阅读原英文论…

数据结构 ——— 链式二叉树oj题:单值二叉树

目录 题目要求 手搓一个单值二叉树 代码实现 题目要求 如果二叉树每个节点都具有相同的值,那么该二叉树就是单值二叉树。 只有给定的树是单值二叉树时,才返回 true;否则返回 false 手搓一个单值二叉树 代码演示: // 数据类…

使用Windbg排查C++软件安装包安装时被安全防护软件拦截导致安装线程堵塞卡住的问题

目录 1、问题描述 2、初步分析 3、将Windbg附加到安装包进程上进行分析 4、在Windbg中查看相关变量的值,并设置断点进行动态调试 4.1、在Windbg中查看相关变量的值 4.2、在Windbg中使用bp命令设置断点进行动态调试 5、腾讯电脑管家已经退出,但其…

一键直达Windows11精简版下载地址:附快速安装教程!

许多用户想知道Windows11精简版下载地址在哪里?这里系统之家小编将给大家分享最新的Windows11精简版系统下载地址,方便大家下载与安装。该版本系统删除大量不必要的组件和功能,让系统运作速度变得更快更流畅,但没有过度精简&#…

Mesh网格

Mesh(网格) 定义:Mesh 是一个包含顶点、三角形、顶点法线、UV坐标、颜色和骨骼权重等数据的对象。它定义了3D模型的几何形状。 功能: 顶点(Vertices):构成3D模型的点。 三角形(Triangles)&…

【机器学习】28. 强化学习(Bellman, Q-learning, DQN, 优先级经验回放)

强化学习 定义强化学习的核心要素马尔可夫决策过程价值函数Bellman 方程Q Learning深度Q学习算法 (DQN)DQN 的核心思想DQN 的工作流程经验回放:(随机抽样)目标网络:损失函数 优先级经验回放(Pri…

大数据-217 Prometheus 安装配置 启动服务 监控服务

点一下关注吧!!!非常感谢!!持续更新!!! 目前已经更新到了: Hadoop(已更完)HDFS(已更完)MapReduce(已更完&am…

利用RANSAC算法拟合平面并生成包围框的点云处理方法,点云聚类、质心坐标、倾斜角度、点云最小外接矩形

该代码用于分析和处理点云数据,通过对点云数据进行裁剪、平面拟合和生成包围框来提取特定区域的特征并发布结果。主要使用了RANSAC算法来识别并拟合平面,从而提取平面的法向量,接着根据该平面计算出该区域的最小矩形包围框(Boundi…

算法妙妙屋-------1.递归的深邃回响:二叉树的奇妙剪枝

大佬们好呀,这一次讲解的是二叉树的深度搜索,大佬们请阅 1.前言 ⼆叉树中的深搜(介绍) 深度优先遍历(DFS,全称为DepthFirstTraversal),是我们树或者图这样的数据结构中常⽤的⼀种…

深入解析DHCP带来了什么功能,服务器回应到底是用广播还是单播呢?

前言 不知道大家在看到这个图的时候第一时间想到的是什么,【好复杂】【看不懂】【终端数好多】,这里不看整体的结构怎么样,来看看终端数量都非常的多,终端要与网络中进行通信,势必需要IP地址,从最开始学习到…

<项目代码>YOLOv8 棉花识别<目标检测>

YOLOv8是一种单阶段(one-stage)检测算法,它将目标检测问题转化为一个回归问题,能够在一次前向传播过程中同时完成目标的分类和定位任务。相较于两阶段检测算法(如Faster R-CNN),YOLOv8具有更高的…

知乎日报前三周总结

目录 前言 首页 网络请求 上拉加载 详情页 加载WebView 左右滑动 主页与详情页同步更新 总结 前言 在这几周进行了知乎日报的仿写,这篇博客来总结一下前三周仿写的内容 首页 首页的界面如图所示,其实就是一个导航栏和一个数据视图组成的&#…