【RL Latest Tech】安全强化学习(Safe RL):理论、方法与应用

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

       【强化学习】(26)---《安全强化学习(Safe RL):理论、方法与应用》

安全强化学习(Safe RL):理论、方法与应用

目录

1.引言

2.什么是安全强化学习?

3.关键概念

4.安全强化学习的主要方法

1. 约束强化学习(Constrained Reinforcement Learning)

2. 屏蔽强化学习(Shielded RL)

3. 风险约束策略梯度(Risk-Constrained Policy Gradient)

[Python] Safe RL伪代码

[Notice]  伪代码解释:

5.应用与案例

6.结论


1.引言

        在强化学习(Reinforcement Learning, RL)中,智能体通过与环境的交互来学习一个策略,以最大化长期累积回报。然而,传统的强化学习算法在优化回报时往往不考虑智能体行为的安全性,导致在训练或部署过程中可能出现不安全的行为。**安全强化学习Safe Reinforcement Learning,Safe RL)**正是在此背景下提出的,它旨在在优化回报的同时确保智能体的行为符合某些安全约束。这对于实际应用尤为重要,如自动驾驶、机器人控制、医疗系统等场景中,安全问题至关重要,任何不安全的行为都可能带来严重后果。下图是约束策略优化(Constrained Policy Optimization, CPO)算法图。


2.什么是安全强化学习?

        安全强化学习是强化学习的一个分支,重点在于在学习过程中及部署过程中满足一定的安全约束。这些安全约束可以是物理、伦理或法律层面的限制。例如,自动驾驶汽车的强化学习模型应避免发生碰撞,医疗领域的强化学习模型需要避免对病人健康产生风险。

        在强化学习的传统框架下,智能体学习的是一个最优策略( \pi^* ),该策略通过最大化累积奖励(回报)( G_t = \sum_{k=0}^{\infty} \gamma^k R_{t+k} ) 来优化智能体的行为决策。这里, ( R_t )是时间步( t )的奖励值,( \gamma \in [0, 1] )是折扣因子。然而,安全强化学习不仅仅考虑累积奖励,还需要确保在整个学习过程中智能体的行为是安全的。这就引入了安全约束,用公式表达为:

[ \text{maximize } \mathbb{E} \left[ \sum_{t=0}^{\infty} \gamma^t R_t \right] \quad \text{subject to } \mathbb{P}(s_t \in \mathcal{S}_{unsafe}) = 0, \forall t ]

其中,( \mathcal{S}_{unsafe} ) 是不安全状态的集合。安全强化学习通过在策略优化过程中增加约束条件来保证智能体不会进入不安全的状态。


3.关键概念

1. 安全约束

        在安全强化学习中,**安全约束(Safety Constraints)**是决定智能体行为是否安全的标准。通常,安全约束可以体现在以下几方面:

  • 物理限制:如机器人避免碰撞或超过速度限制。
  • 资源限制:如能量消耗不超过一定阈值。
  • 伦理或法律限制:如自动驾驶汽车遵守交通规则,或医疗系统不能给患者带来过度的健康风险。

        这些约束可以是硬约束(Hard Constraints),即必须严格遵守的约束,也可以是软约束(Soft Constraints),即在一定范围内可以违反但需要付出代价。

2. 风险敏感优化

        在传统强化学习中,优化目标通常是最大化期望回报 ( \mathbb{E}[G_t] )。然而,在安全强化学习中,我们需要**风险敏感(Risk-Sensitive)**的优化目标。具体来说,风险可以用多种方式进行度量,例如:

  • 方差(Variance):衡量回报的不确定性。
  • 在险价值(Value at Risk, VaR):在给定的置信水平下,可能发生的最大损失。
  • 条件在险价值(Conditional Value at Risk, CVaR):考虑了最坏情况下的损失。

通过引入风险度量,安全强化学习可以避免智能体在某些不确定的情况下做出高风险的决策。

[ \text{maximize } \mathbb{E} \left[ \sum_{t=0}^{\infty} \gamma^t R_t \right] \quad \text{subject to } \text{Risk}(G_t) \leq \delta ]

其中,( \delta )是风险的容忍水平。

3. 奖励塑形与惩罚机制

        为了引导智能体学习到安全的行为,奖励塑形(Reward Shaping) 是一种常见的技术。具体做法是,将奖励函数修改为同时考虑回报和安全性的组合:

[ R'(s, a, s') = R(s, a, s') - \lambda \cdot \text{Cost}(s, a, s') ]

其中,( R(s, a, s') )是原始的奖励函数,( \text{Cost}(s, a, s') ) 是智能体在状态 ( s )采取动作( a )后进入状态( s' )时的安全代价,( \lambda )是代价权重。这样,当智能体采取不安全行为时,会受到惩罚,从而促使智能体学习到更安全的策略。


4.安全强化学习的主要方法

        安全强化学习有多种实现方法,以下介绍几种常见的算法及其特点。

1. 约束强化学习(Constrained Reinforcement Learning)

约束强化学习 的目标是在遵守安全约束的前提下最大化回报。其优化问题可以形式化为:

[ \max_{\pi} \mathbb{E}{\pi}\left[ G_t \right] \quad \text{subject to } \mathbb{E}{\pi}\left[ C_t \right] \leq c_{max} ]

其中,( C_t )是时间步( t )的代价函数(如安全成本),( c_{max} )是代价的上限。

常用的算法包括:

  • 约束策略优化(Constrained Policy Optimization, CPO):在策略优化过程中直接处理约束。
  • Lagrangian Relaxation:将约束问题转换为拉格朗日乘子问题,通过优化原问题和约束问题的拉格朗日形式来解决。

2. 屏蔽强化学习(Shielded RL)

        屏蔽强化学习(Shielded Reinforcement Learning) 是一种结合形式化验证和强化学习的技术。通过引入一个“屏蔽器(Shield)”,智能体在采取动作之前,会通过屏蔽器检查该动作是否安全。如果不安全,屏蔽器会拒绝该动作并建议安全的替代动作。

        这种方法尤其适用于高风险环境,如自动驾驶和机器人控制。在屏蔽强化学习中,屏蔽器的设计往往依赖于形式化方法,如线性时序逻辑(Linear Temporal Logic, LTL)等。

3. 风险约束策略梯度(Risk-Constrained Policy Gradient)

        风险约束策略梯度(Risk-Constrained Policy Gradient) 是一种基于策略梯度的安全强化学习方法,特别适用于连续动作空间。其目标是在约束总风险的同时最大化累积回报。具体的优化目标为:

[ \max_{\theta} \mathbb{E}{\pi{\theta}} \left[ G_t \right] \quad \text{subject to } \text{CVaR}_{\alpha}(G_t) \leq \delta ]

其中,( \text{CVaR}_{\alpha} ) 是给定置信水平 ( \alpha )的条件在险价值,( \delta )是风险容忍度。通过策略梯度法,智能体可以逐渐学习到在风险受控下的最优策略。


[Python] Safe RL伪代码

        下面给出了一个典型的安全强化学习(Safe Reinforcement Learning)的Python伪代码。该伪代码展示了如何实现约束强化学习,考虑到安全约束,使用拉格朗日乘子法来解决安全性问题。

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

"""《Safe RL伪代码》
    时间:2024.10.07
    作者:不去幼儿园
"""
import numpy as np
import gym

# 环境初始化
env = gym.make("YourEnvironment-v0")
state_dim = env.observation_space.shape[0]
action_dim = env.action_space.n

# 参数初始化
gamma = 0.99  # 折扣因子
alpha = 0.01  # 学习率
lambda_lr = 0.005  # 拉格朗日乘子的学习率
episodes = 1000
constraint_threshold = 10.0  # 约束上限

# 策略网络
class PolicyNetwork:
    def __init__(self):
        # 定义网络参数,例如全连接层、激活函数等
        pass

    def forward(self, state):
        # 计算动作概率分布
        pass

    def update(self, gradients):
        # 更新网络参数
        pass

# 拉格朗日乘子初始化
lambda_param = 1.0

# 策略网络
policy = PolicyNetwork()

# 训练过程
for episode in range(episodes):
    state = env.reset()
    done = False
    rewards = []
    costs = []

    while not done:
        # 根据策略选择动作
        action_probs = policy.forward(state)
        action = np.random.choice(action_dim, p=action_probs)

        # 执行动作,获取下一个状态、奖励和成本
        next_state, reward, done, info = env.step(action)
        cost = info.get('cost', 0)  # 获取成本,成本表示不安全行为的发生程度

        # 记录奖励和成本
        rewards.append(reward)
        costs.append(cost)

        # 更新状态
        state = next_state

    # 计算累积奖励和成本
    G = sum([gamma ** t * r for t, r in enumerate(rewards)])
    C = sum([gamma ** t * c for t, c in enumerate(costs)])

    # 计算拉格朗日损失
    lagrangian_loss = -G + lambda_param * (C - constraint_threshold)

    # 计算策略梯度并更新策略网络
    policy_gradients = compute_gradients(lagrangian_loss)
    policy.update(policy_gradients)

    # 更新拉格朗日乘子
    lambda_param += lambda_lr * (C - constraint_threshold)

    # 确保拉格朗日乘子非负
    lambda_param = max(0, lambda_param)

    # 打印每个episode的进度
    print(f"Episode {episode + 1}: Reward = {G}, Cost = {C}, Lambda = {lambda_param}")

# 伪代码结束

# 辅助函数 - 计算策略梯度(伪函数)
def compute_gradients(loss):
    # 实现策略梯度计算
    return gradients


[Notice]  伪代码解释:

  1. 环境初始化

    • 使用 gym 库来创建强化学习环境,state_dim 和 action_dim 分别表示状态和动作的维度。
  2. 参数初始化

    • 包括折扣因子 gamma、学习率 alpha、拉格朗日乘子的学习率 lambda_lr 以及约束阈值 constraint_threshold 等。
  3. 策略网络

    • PolicyNetwork 类是一个简单的策略网络,用于预测动作概率分布。
    • 其方法 forward() 计算动作概率,update() 通过策略梯度更新参数。
  4. 训练过程

    • 在每个 episode 中,智能体与环境交互并根据当前策略选择动作。
    • 每次执行动作后,获取下一个状态、奖励、成本,以及是否结束。
    • cost 通过 info 字典获取,表示智能体在当前状态执行动作后产生的安全成本。
  5. 拉格朗日损失

    • 损失函数由累积奖励 ( G ) 和累积成本 ( C ) 构成,使用拉格朗日乘子 ( \lambda ) 来权衡两者。
    • lagrangian_loss 是拉格朗日损失,它平衡奖励与违反安全约束的代价。
  6. 策略更新

    • 通过 compute_gradients() 计算策略梯度,然后调用 policy.update() 更新策略。
  7. 更新拉格朗日乘子

    • 使用拉格朗日乘子法的学习率 ( \lambda_{\text{lr}} ) 来调整乘子值,确保成本在预定阈值内。
    • lambda_param 必须保持为非负。
  • 这个伪代码提供了安全强化学习的一般框架。在实际实现中,可能需要使用神经网络、梯度下降优化器(例如 Adam)、和其他策略评估方法。
  • 由于安全强化学习涉及约束优化,策略的调整需要反复验证是否满足安全条件,因此实际实现中可能会引入更多的调试和验证过程。

5.应用与案例

1. 自动驾驶

        在自动驾驶领域,安全是至关重要的。自动驾驶汽车需要在复杂的交通环境中做出实时决策,确保遵守交通规则,避免碰撞和其他事故。安全强化学习可以帮助自动驾驶系统通过学习来不断优化其决策策略,同时确保在各种场景下都能保持安全。

        通过引入安全约束,如速度限制、车道保持和避障策略,自动驾驶系统可以在确保安全的同时逐步提高驾驶效率。屏蔽强化学习在此类场景中尤为适用,可以在系统做出危险决策前予以纠正。

2. 医疗决策

        在医疗领域,强化学习可以应用于个性化治疗方案的制定。然而,医疗决策涉及患者健康的风险,因此需要特别注意安全问题。安全强化学习可以通过约束不安全行为或决策来避免患者受到潜在的伤害。

        例如,在癌症治疗中,强化学习可以用于优化化疗的剂量和时间表。然而,过高的剂量可能会导致严重的副作用,因此系统需要学习在确保治疗效果的同时最小化不良反应。

3. 机器人控制

        在机器人控制中,安全问题同样重要,特别是在与人类共存的环境中。机器人需要通过学习来理解环境和人类的行为模式,并做出相应的安全决策。

        通过安全强化学习,机器人可以在执行任务时避免危险行为,如避免碰撞、正确处理易碎物品或在紧急情况下采取适当的行动。


6.结论

        安全强化学习作为强化学习的一个重要分支,不仅要优化长期回报,还要确保智能体在学习和部署过程中遵守安全约束。通过引入安全约束、风险敏感优化和奖励塑形等技术,安全强化学习为智能体在复杂和不确定的环境中做出安全且有效的决策提供了重要工具和方法。

参考文献:

Joshua Achiam, David Held, Aviv Tamar, Pieter Abbeel,2017,Constrained Policy Optimization

简介: 这篇论文提出了**约束策略优化(Constrained Policy Optimization, CPO)**算法,该算法旨在通过约束优化的方式训练安全的强化学习智能体。它利用二阶梯度信息来直接处理安全约束,从而确保在学习过程中,策略的改进始终在安全约束内。该方法在许多高风险场景(如机器人控制)中都表现出色。

Safe RL评估环境:

Safety Gym: Environment for Evaluating Safe Reinforcement Learning Agents

简介: 介绍了一个专门用于评估安全强化学习算法的环境框架,称为 Safety Gym。该环境提供了多种任务设置,智能体需要在复杂的物理环境中进行任务,同时保持行为的安全性。Safety Gym 已成为评估安全强化学习算法的标准工具之一。


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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

qt-Quick笔记之Dark Mode And Light Mode In Application

qt-Quick笔记之Dark Mode And Light Mode In Application code review! 文章目录 qt-Quick笔记之Dark Mode And Light Mode In Application1.运行2.目录结构3.main.qml4.main.cpp5.main.pro6.main.qrc 本例修改自视频教程:Qt QML | 🌙 Dark Mode And ☀…

visual studio安装

一、下载Visual Studio 访问Visual Studio官方网站。下载 Visual Studio Tools - 免费安装 Windows、Mac、Linux 在主页上找到并点击“下载 Visual Studio”按钮。 选择适合需求的版本,例如“Visual Studio Community”(免费版本)&#x…

基于Springboot框架的学术期刊遴选服务-项目演示

项目介绍 本课程演示的是一款 基于Javaweb的水果超市管理系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的 Java 学习者。 1.包含:项目源码、项目文档、数据库脚本、软件工具等所有资料 2.带你从零开始部署运行本套系统 3.该项目附…

【C++篇】位图与布隆过滤器

目录 一,位图 1.1,位图的概念 1.2,位图的设计与实现 1.5,位图的应用举例 1.4,位图常用应用场景 二,布隆过滤器 2.1,定义: 2.2,布隆过滤器的实现 2.3, 应…

GESP2023年12月认证C++六级( 第三部分编程题(1)闯关游戏)

参考程序代码&#xff1a; #include <cstdio> #include <cstdlib> #include <cstring> #include <algorithm> #include <string> #include <map> #include <iostream> #include <cmath> using namespace std;const int N 10…

list容器(详解)

list的介绍及使用&#xff08;了解&#xff0c;后边细讲&#xff09; 1.1 list的介绍&#xff08;双向循环链表&#xff09; https://cplusplus.com/reference/list/list/?kwlist&#xff08;list文档介绍&#xff09; 1. list是可以在常数范围内在任意位置进行插入和删除的序…

RGB565转BITMAP[C#---2]

这是楼主在开发C#上位机的时候遇到的另一个问题&#xff0c;怎么把RGB565转为BITMAP&#xff0c;在CSDN上搜索&#xff0c;要么是安卓平台的&#xff0c;要么是2011年的古早代码&#xff08;还没排版&#xff09;&#xff0c;还是靠自己和DEEPSEEK的智慧解决了(●’◡’●) 当然…

pytorch实现门控循环单元 (GRU)

人工智能例子汇总&#xff1a;AI常见的算法和例子-CSDN博客 特性GRULSTM计算效率更快&#xff0c;参数更少相对较慢&#xff0c;参数更多结构复杂度只有两个门&#xff08;更新门和重置门&#xff09;三个门&#xff08;输入门、遗忘门、输出门&#xff09;处理长时依赖一般适…

【赵渝强老师】Spark RDD的依赖关系和任务阶段

Spark RDD彼此之间会存在一定的依赖关系。依赖关系有两种不同的类型&#xff1a;窄依赖和宽依赖。 窄依赖&#xff1a;如果父RDD的每一个分区最多只被一个子RDD的分区使用&#xff0c;这样的依赖关系就是窄依赖&#xff1b;宽依赖&#xff1a;如果父RDD的每一个分区被多个子RD…

为何在Kubernetes容器中以root身份运行存在风险?

作者:马辛瓦西奥内克(Marcin Wasiucionek) 引言 在Kubernetes安全领域,一个常见的建议是让容器以非root用户身份运行。但是,在容器中以root身份运行,实际会带来哪些安全隐患呢?在Docker镜像和Kubernetes配置中,这一最佳实践常常被重点强调。在Kubernetes清单文件中,…

Docker 安装详细教程(适用于CentOS 7 系统)

目录 步骤如下&#xff1a; 1. 卸载旧版 Docker 2. 配置 Docker 的 YUM 仓库 3. 安装 Docker 4. 启动 Docker 并验证安装 5. 配置 Docker 镜像加速 总结 前言 Docker 分为 CE 和 EE 两大版本。CE即社区版&#xff08;免费&#xff0c;支持周期7个月&#xff09;&#xf…

[MRCTF2020]Ez_bypass1(md5绕过)

[MRCTF2020]Ez_bypass1(md5绕过) ​​ 这道题就是要绕过md5强类型比较&#xff0c;但是本身又不相等&#xff1a; md5无法处理数组&#xff0c;如果传入的是数组进行md5加密&#xff0c;会直接放回NULL&#xff0c;两个NuLL相比较会等于true&#xff1b; 所以?id[]1&gg…

Deep Crossing:深度交叉网络在推荐系统中的应用

实验和完整代码 完整代码实现和jupyter运行&#xff1a;https://github.com/Myolive-Lin/RecSys--deep-learning-recommendation-system/tree/main 引言 在机器学习和深度学习领域&#xff0c;特征工程一直是一个关键步骤&#xff0c;尤其是对于大规模的推荐系统和广告点击率预…

C++多线程编程——基于策略模式、单例模式和简单工厂模式的可扩展智能析构线程

1. thread对象的析构问题 在 C 多线程标准库中&#xff0c;创建 thread 对象后&#xff0c;必须在对象析构前决定是 detach 还是 join。若在 thread 对象销毁时仍未做出决策&#xff0c;程序将会终止。 然而&#xff0c;在创建 thread 对象后、调用 join 前的代码中&#xff…

Rust中使用ORM框架diesel报错问题

1 起初环境没有问题&#xff1a;在Rust开发的时候起初使用的是mingw64平台加stable-x86_64-pc-windows-gnu编译链&#xff0c;当使用到diesel时会报错&#xff0c;如下&#xff1a; x86_64-w64-mingw32/bin/ld.exe: cannot find -lmysql具体信息很长这是主要信息是rust找不到链…

Fastdds学习分享_xtpes_发布订阅模式及rpc模式

在之前的博客中我们介绍了dds的大致功能&#xff0c;与组成结构。本篇博文主要介绍的是xtypes.分为理论和实际运用两部分.理论主要用于梳理hzy大佬的知识&#xff0c;对于某些一带而过的部分作出更为详细的阐释&#xff0c;并在之后通过实际案例便于理解。案例分为普通发布订阅…

Windows:AList+RaiDrive挂载阿里云盘至本地磁盘

零、前言 电脑存储的文件多了&#xff0c;出现存储空间不够用的情况。又没前买新的硬盘或者笔记本电脑没有额外的插槽提供给新的硬盘。遇到这种情况&#xff0c;我想到可以使用网盘&#xff0c;但单纯的网盘又要上传下载&#xff0c;极其麻烦。看到WPS云盘可以直接挂载本地&…

Unity游戏(Assault空对地打击)开发(3) 摄像机的控制

详细步骤 打开My Assets或者Package Manager。 选择Unity Registry。 搜索Cinemachine&#xff0c;找到 Cinemachine包&#xff0c;点击 Install按钮进行安装。 关闭窗口&#xff0c;新建一个FreeLook Camera&#xff0c;如下。 接着新建一个对象Pos&#xff0c;拖到Player下面…

保姆级教程Docker部署Zookeeper官方镜像

目录 1、安装Docker及可视化工具 2、创建挂载目录 3、运行Zookeeper容器 4、Compose运行Zookeeper容器 5、查看Zookeeper运行状态 6、验证Zookeeper是否正常运行 1、安装Docker及可视化工具 Docker及可视化工具的安装可参考&#xff1a;Ubuntu上安装 Docker及可视化管理…

力扣73矩阵置零

给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 输入&#xff1a;matrix [[1,1,1],[1,0,1],[1,1,1]] 输出&#xff1a;[[1,0,1],[0,0,0],[1,0,1]] 输入&#xff1a;matrix [[0,1,2,0],[3,4,5,2],[…