强化学习 - Trust Region Policy Optimization (TRPO)

什么是机器学习

Trust Region Policy OptimizationTRPO)是一种策略梯度方法,用于解决强化学习问题。TRPO旨在通过限制策略更新的大小,提高训练的稳定性。这样可以防止在参数空间中迅速迭代导致过大的更新,从而保持策略在相邻状态上的相似性。

以下是一个使用 Python 和 TensorFlow/Keras 实现简单的 TRPO 的示例。在这个例子中,我们将使用 OpenAI GymCartPole 环境。

import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Model
from tensorflow.keras.layers import Dense, Input
from tensorflow.keras.optimizers import Adam
import gym# 定义TRPO Agent
class TRPOAgent:def __init__(self, state_size, action_size):self.state_size = state_sizeself.action_size = action_sizeself.gamma = 0.99  # 折扣因子self.lmbda = 0.95  # GAE(Generalized Advantage Estimation)的参数self.learning_rate = 0.001self.clip_ratio = 0.2# 构建演员(Actor)网络self.actor = self.build_actor()def build_actor(self):state_input = Input(shape=(self.state_size,))dense1 = Dense(64, activation='tanh')(state_input)dense2 = Dense(64, activation='tanh')(dense1)output = Dense(self.action_size, activation='softmax')(dense2)model = Model(inputs=state_input, outputs=output)model.compile(loss=self.trpo_loss, optimizer=Adam(lr=self.learning_rate))return modeldef get_action(self, state):state = np.reshape(state, [1, self.state_size])action_prob = self.actor.predict(state)[0]action = np.random.choice(self.action_size, p=action_prob)return action, action_probdef trpo_loss(self, y_true, y_pred):advantage = tf.placeholder(tf.float32, shape=(None, 1))old_policy_prob = tf.placeholder(tf.float32, shape=(None, self.action_size))new_policy_prob = y_predratio = tf.exp(tf.log(new_policy_prob + 1e-10) - tf.log(old_policy_prob + 1e-10))surrogate_loss = -tf.reduce_mean(ratio * advantage)kl_divergence = tf.reduce_sum(old_policy_prob * (tf.log(old_policy_prob + 1e-10) - tf.log(new_policy_prob + 1e-10)), axis=1)mean_kl_divergence = tf.reduce_mean(kl_divergence)grads = tf.gradients(surrogate_loss, self.actor.trainable_weights)grads_flatten = tf.concat([tf.reshape(g, [-1]) for g in grads], axis=0)fisher_vector_product = tf.gradients(mean_kl_divergence, self.actor.trainable_weights)fisher_vector_product_flatten = tf.concat([tf.reshape(fvp, [-1]) for fvp in fisher_vector_product], axis=0)fisher_vector_product_gradient = tf.reduce_sum(grads_flatten * fisher_vector_product_flatten)conjugate_gradient_step_direction = tf.placeholder(tf.float32, shape=(None,))conjugate_gradient_step = tf.gradients(fisher_vector_product_gradient, self.actor.trainable_weights)conjugate_gradient_step = tf.concat([tf.reshape(cgs, [-1]) for cgs in conjugate_gradient_step], axis=0)conjugate_gradient_step = conjugate_gradient_step / (conjugate_gradient_step @ conjugate_gradient_step_direction) * conjugate_gradient_step_directionflat_actor_gradients = tf.placeholder(tf.float32, shape=(None,))flat_fisher_vector_product = tf.placeholder(tf.float32, shape=(None,))kl_divergence_surrogate_loss_gradients = tf.gradients(mean_kl_divergence, self.actor.trainable_weights, -flat_actor_gradients)kl_divergence_surrogate_loss_gradients_flatten = tf.concat([tf.reshape(kldsg, [-1]) for kldsg in kl_divergence_surrogate_loss_gradients], axis=0)fisher_vector_product_surrogate_loss_gradients = tf.gradients(fisher_vector_product_gradient, self.actor.trainable_weights, flat_fisher_vector_product)fisher_vector_product_surrogate_loss_gradients_flatten = tf.concat([tf.reshape(fvpslg, [-1]) for fvpslg in fisher_vector_product_surrogate_loss_gradients], axis=0)grads_surrogate_loss_gradients = kl_divergence_surrogate_loss_gradients_flatten + fisher_vector_product_surrogate_loss_gradients_flattenconjugate_gradient_step_direction_result = np.zeros_like(flat_actor_gradients.shape)for _ in range(10):  # 通过共轭梯度法求解方程组feed_dict = {advantage: np.zeros((1, 1)),old_policy_prob: np.zeros((1, self.action_size)),flat_actor_gradients: np.zeros_like(conjugate_gradient_step_direction_result),flat_fisher_vector_product: conjugate_gradient_step_direction_result,}for i, placeholder in enumerate(self.actor._feed_input_tensors):feed_dict[placeholder] = np.zeros((1, *self.actor._feed_input_shapes[i][1:]))conjugate_gradient_step_direction_result = fisher_vector_product_gradients_result = grads_surrogate_loss_gradients_result = np.zeros_like(conjugate_gradient_step_direction_result)for _ in range(10):  # 通过逐步迭代求解共轭梯度方向feed_dict[conjugate_gradient_step_direction] = conjugate_gradient_step_direction_resultfeed_dict[flat_actor_gradients] = conjugate_gradient_step_direction_resultcgsdr, fvpgdr, gslgdr = tf.keras.backend.get_session().run([conjugate_gradient_step_direction, fisher_vector_product_gradients, grads_surrogate_loss_gradients],feed_dict=feed_dict)alpha = conjugate_gradient_step_direction_result @ conjugate_gradient_step / (cgsdr @ fisher_vector_product_gradients)conjugate_gradient_step_direction_result += alpha * cgsdrfisher_vector_product_gradients_result += alpha * fvpgdrgrads_surrogate_loss_gradients_result += alpha * gslgdrresidual = fisher_vector_product_gradients_result - grads_surrogate_loss_gradients_resultbeta = residual @ fisher_vector_product_gradients_result / (fisher_vector_product_gradients_result @ fisher_vector_product_gradients_result)conjugate_gradient_step_direction_result -= beta * residualreturn surrogate_lossdef compute_advantages(self, rewards, values, dones):advantages = np.zeros_like(rewards, dtype=np.float32)running_add = 0for t in reversed(range(len(rewards))):running_add = running_add * self.gamma * (1 - dones[t]) + rewards[t]advantages[t] = running_add - values[t]running_add = values[t] + advantages[t] * self.gamma * self.lmbdareturn advantagesdef train(self, states, actions, rewards, values, dones):states = np.vstack(states)actions = np.vstack(actions)rewards = np.vstack(rewards)values = np.vstack(values)dones = np.vstack(dones)old_policy_prob = self.actor.predict(states)advantages = self.compute_advantages(rewards, values, dones)# 计算共轭梯度方向feed_dict = {self.actor.input: states,self.actor.output: old_policy_prob,self.actor.sample_weights[0]: advantages,}flat_actor_gradients_result, flat_fisher_vector_product_result = tf.keras.backend.get_session().run([tf.concat([tf.reshape(grad, [-1]) for grad in tf.gradients(self.trpo_loss, self.actor.trainable_weights)], axis=0),tf.concat([tf.reshape(grad, [-1]) for grad in tf.gradients(tf.reduce_sum(tf.gradients(self.trpo_loss, self.actor.trainable_weights) @tf.gradients(self.trpo_loss, self.actor.trainable_weights), axis=1), self.actor.trainable_weights)], axis=0)],feed_dict=feed_dict)# 计算步长conjugate_gradient_step_direction_result = np.zeros_like(flat_actor_gradients_result)for _ in range(10):  # 通过共轭梯度法求解方程组feed_dict = {self.actor.input: states,self.actor.output: old_policy_prob,self.actor.sample_weights[0]: advantages,tf.placeholder(tf.float32, shape=(None,)): conjugate_gradient_step_direction_result,tf.placeholder(tf.float32, shape=(None,)): flat_fisher_vector_product_result,}flat_actor_gradients_result, flat_fisher_vector_product_result = tf.keras.backend.get_session().run([tf.concat([tf.reshape(grad, [-1]) for grad in tf.gradients(self.trpo_loss, self.actor.trainable_weights)], axis=0),tf.concat([tf.reshape(grad, [-1]) for grad in tf.gradients(tf.reduce_sum(tf.gradients(self.trpo_loss, self.actor.trainable_weights) @tf.gradients(self.trpo_loss, self.actor.trainable_weights), axis=1), self.actor.trainable_weights)], axis=0)],feed_dict=feed_dict)alpha = conjugate_gradient_step_direction_result @ flat_actor_gradients_result / (conjugate_gradient_step_direction_result @ flat_fisher_vector_product_result)conjugate_gradient_step_direction_result += alpha * flat_actor_gradients_result# 利用共轭梯度方向更新参数feed_dict = {self.actor.input: states,self.actor.output: old_policy_prob,self.actor.sample_weights[0]: advantages,tf.placeholder(tf.float32, shape=(None,)): conjugate_gradient_step_direction_result,}new_actor_parameters = tf.keras.backend.get_session().run([tf.concat([tf.reshape(param - alpha * grad, [-1]) for param, grad in zip(self.actor.trainable_weights, tf.gradients(self.trpo_loss, self.actor.trainable_weights))], axis=0)for alpha in [1e-3, 1e-2, 1e-1, 1e0, 1e1, 1e2]],feed_dict=feed_dict)new_actor_parameters = [np.reshape(new_param, param.shape) for new_param, param in zip(new_actor_parameters[0], self.actor.get_weights())]self.actor.set_weights(new_actor_parameters)# 初始化环境和Agent
env = gym.make('CartPole-v1')
state_size = env.observation_space.shape[0]
action_size = env.action_space.n
agent = TRPOAgent(state_size, action_size)# 训练TRPO Agent
num_episodes = 500
for episode in range(num_episodes):state = env.reset()total_reward = 0states, actions, rewards, values, dones = [], [], [], [], []for time in range(500):  # 限制每个episode的步数,防止无限循环# env.render()  # 如果想可视化训练过程,可以取消注释此行action, action_prob = agent.get_action(state)next_state, reward, done, _ = env.step(action)total_reward += rewardvalue = agent.actor.predict(np.reshape(state, [1, state_size]))[0]states.append(state)actions.append(action)rewards.append(reward)values.append(value)dones.append(done)state = next_stateif done:print("Episode: {}, Total Reward: {}".format(episode + 1, total_reward))agent.train(states, actions, rewards, values, dones)break# 关闭环境
env.close()

在这个例子中,我们定义了一个简单的TRPO Agent,包括演员(Actor)神经网络。在训练过程中,我们使用TRPO算法来更新演员网络的参数。请注意,TRPO算法的实现可能因问题的复杂性而有所不同,可能需要更多的技术和调整,如归一化奖励、使用更复杂的神经网络结构等。

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

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

相关文章

LandrayOA内存调优 / JAVA内存调优 / Tomcat web.xml 超时时间调优实战

目录 一、背景说明 二、LandrayOA / Tomcat 内存调优 2.1 \win64\tomcat\conf\web.xml 文件调优 2.2 \win64\tomcat\bin\catalina64.bat 文件调优 一、背景说明 随着系统的使用时间越来越长,数据量越多,发现系统的有些功能越来越慢&…

基于InceptionV2/InceptionV3/Xception不同参数量级模型开发构建中草药图像识别分析系统,实验量化对比不同模型性能

最近正好项目中在做一些识别相关的内容,我也陆陆续续写了一些实验性质的博文用于对自己使用过的模型进行真实数据的评测对比分析,感兴趣的话可以自行移步阅读即可: 《移动端轻量级模型开发谁更胜一筹,efficientnet、mobilenetv2、…

ubuntu 22 安装 node,npm,vue

1:安装 nodejs sudo apt update curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash - sudo apt update && sudo apt install -y nodejs node -v 2:安装npm sudo npm install n -g npm -v 3:安装vite npm install vite -g 4:运行vue 把项目拷贝到…

大语言应用技术原理

大模型应用技术原理 RAG 向量数据库 对比 选型标准 开源vs.闭源vs. 源码可见客户端/SDK语言托管方式 self-hosted/on-premise redis,pgvector,milvusmanaged/cloud-native zilliz,pineconeembeded+cloud-native chroma,lanceDBself-hosted+cloud-native vald,drant,weaviate,vs…

OpenAI正式推出GPT商店 ChatGPT团队订阅服务一并推出

2024年1月11日消息,据外媒报道,如上周在给开发者的邮件中所宣布的一样,因ChatGPT而名声大噪的人工智能公司OpenAI,在本周正式推出了GPT商店,供用户分享和发现个性化的ChatGPT,同时他们也推出了面向各种不同…

git 基础操作

由于最近svn停止使用,github或gitlab等费用较高,所以最近尝试在本地用 git 现在本地进行代码管理。现总结一下 git 常用的操作命令和本地repository的创建步骤。 git init //初始化git status //查看文件夹状态git add . //添加文…

用C语言实现贪吃蛇游戏!!!

前言 大家好呀,我是Humble,不知不觉在CSND分享自己学过的C语言知识已经有三个多月了,从开始的C语言常见语法概念说到C语言的数据结构今天用C语言实现贪吃蛇已经有30余篇博客的内容,也希望这些内容可以帮助到各位正在阅读的小伙伴…

在 Redis 中使用 Lua 脚本执行复杂操作和事务

在 Redis 中使用 Lua 脚本执行复杂操作和事务 Redis 作为一个高性能的键值存储数据库,它的强大功能远不止于简单的数据存储和检索。Redis 自 2.6 版本起引入了对 Lua 脚本的支持,这意味着你可以在 Redis 服务器上直接运行 Lua 脚本。这一功能为执行复杂…

前端JavaScript篇之JavaScript 中如何进行隐式类型转换、加号(+)操作符什么时候用于字符串的拼接?为什么会有BigInt的提案?

目录 JavaScript 中如何进行隐式类型转换加法操作符&#xff08;&#xff09;比较操作符&#xff08;、>、<&#xff09;对象的隐式转换ToPrimitive 方法ToPrimitive 方法的作用ToPrimitive 方法的规则总结 加号&#xff08;&#xff09;操作符什么时候用于字符串的拼接&…

雨云VPS搭建PalWorld服务器,幻兽帕鲁开服联机教程(Windows),0基础保姆级教程

雨云VPS用Windows系统搭建幻兽帕鲁私服&#xff0c;PalWorld开服联机教程&#xff0c;零基础保姆级教程&#xff0c;本教程使用一键脚本来搭建幻兽帕鲁服务端&#xff0c;并讲了如何配置游戏参数&#xff0c;如何更新服务端等。 最近这游戏挺火&#xff0c;很多人想跟朋友联机…

实体关系抽取与属性补全的技术浅析

目录 前言1. 实体关系抽取2 实体关系抽取的方法2.1 基于模板的方法2.2 基于监督学习的关系抽取2.3 基于深度学习的关系抽取2.4 基于预训练语言模型的关系抽取 3 属性补全3.1 属性补全任务简介3.1 抽取式属性补全3.2 生成式属性补全 4 未来发展趋势结语 前言 在信息爆炸时代&am…

Python学习之路-Django基础:工程搭建

Python学习之路-Django基础:工程搭建 环境安装 创建虚拟环境 mkvirtualenv django_1.11.10 -p python3安装Django 使用Django 1.11.10版本 pip install django1.11.10创建工程 在使用Flask框架时&#xff0c;项目工程目录的组织与创建是需要我们自己手动创建完成的。在dj…

用甘特图有效管理多个项目进度

当公司或组织同时承担多个项目时,合理规划各项目的时间节点与资源分配对确保高效完成至关重要。采用甘特图可以直观地展示多个项目的时间进程、关键里程碑以及资源分配情况,便于从宏观层面全面把控各项目的动态。 在线甘特图软件 zz-plan.com 提供了非常强大的时间轴规划功能,支…

栈的基础知识

一、栈的定义与特点 栈&#xff1a;只能在表的一端&#xff08;栈顶&#xff09;进行插入和删除运算的线性表 逻辑结构 与线性表相同&#xff0c;仍为一对一关系 存储结构 用顺序栈和链栈存储均可&#xff0c;但顺序栈更常见 访问结点时依照后进先出&a…

漏洞复现-万户OA text2Html 任意文件读取(附漏洞检测脚本)

免责声明 文章中涉及的漏洞均已修复&#xff0c;敏感信息均已做打码处理&#xff0c;文章仅做经验分享用途&#xff0c;切勿当真&#xff0c;未授权的攻击属于非法行为&#xff01;文章中敏感信息均已做多层打马处理。传播、利用本文章所提供的信息而造成的任何直接或者间接的…

vue父子组件传值问题

在Vue中&#xff0c;父子组件之间的数据传递可以通过props和事件来实现。 使用props传递数据&#xff1a;父组件可以通过props将数据传递给子组件&#xff0c;子组件可以在模板中直接使用这些数据。父组件可以通过v-bind指令将数据绑定到子组件的props上。例如&#xff1a; v…

初识Cargo-Rust的包管理器

Cargo 是Rust的 包管理器。Cargo 会下载您Rust 的包依赖项&#xff0c;编译包&#xff0c;生成可分发的包&#xff0c;并将它们上传到crates.io - Rust 社区的包注册表。 安装的方法 安装 Rust 和 Cargo 获得 Cargo 的最简单方法是使用rustup脚本&#xff0c;获取当前稳定版本…

Cesium介绍及3DTiles数据加载时添加光照效果对比

一、Cesium简介 Cesium原意是化学元素铯&#xff0c;铯是制造原子钟的关键元素&#xff0c;通过命名强调了Cesium产品专注于基于时空数据的实时可视化应用。熟悉GIS开发领域的读者都知道&#xff0c;Cesium是一个用于创建3D地理空间应用程序的开源JavaScript库&#xff0c;它允…

《SPSS统计学基础与实证研究应用精解》视频讲解:数据缺失值处理

《SPSS统计学基础与实证研究应用精解》4.12 视频讲解 视频为《SPSS统计学基础与实证研究应用精解》张甜 杨维忠著 清华大学出版社 一书的随书赠送视频讲解4.12节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。本书旨在手把手教会…

GraphicsMagick 的 OpenCL 开发记录(二十五)

文章目录 如何修复R6025 pure virtual function call问题 <2022-04-19 周二> 如何修复R6025 pure virtual function call问题 运气好&#xff0c;修复了这个问题。即&#xff0c;在ExitInstance()函数中调用一下MagickLib::DestroyMagick();即可。 过程中也经历了尝试…