强化学习系列--演员-评论员算法(Actor-Critic Algorithm)

强化学习系列--演员-评论员算法(Actor-Critic Algorithm)

  • 介绍
    • 示例代码(pytorch)
    • 示例代码(tensorflow)

介绍

演员-评论员算法(Actor-Critic Algorithm)是一种结合了值函数估计和策略梯度方法的强化学习算法。该算法同时训练一个策略网络(演员)和一个值函数网络(评论员)。演员根据当前策略选择动作,评论员根据当前状态估计值函数,并作为基准线来计算策略梯度的更新。

以下是演员-评论员算法的详细步骤:

  1. 初始化策略网络的参数 θ \theta θ 和值函数网络的参数 ω \omega ω
  2. 对于每个回合:
    • 初始化状态 s s s
    • 根据策略网络,选择动作 a a a
    • 执行动作 a a a,观察奖励 r r r 和下一个状态 s ′ s' s
    • 使用值函数网络估计当前状态的值函数 V ( s ; ω ) V(s;\omega) V(s;ω)
    • 计算累积奖励 G t G_t Gt,可以使用蒙特卡洛方法或者使用折扣因子 γ \gamma γ 来计算:
      G t = r + γ V ( s ′ ; ω ) G_t = r + \gamma V(s';\omega) Gt=r+γV(s;ω)
    • 计算优势函数 A t A_t At,用于估计策略梯度的更新量:
      A t = G t − V ( s ; ω ) A_t = G_t - V(s;\omega) At=GtV(s;ω)
    • 使用策略网络的策略梯度公式更新策略网络的参数 θ \theta θ
      Δ θ = α ∇ θ log ⁡ ( π ( a ∣ s ; θ ) ) A t \Delta\theta = \alpha \nabla_\theta \log(\pi(a|s;\theta)) A_t Δθ=αθlog(π(as;θ))At
    • 使用值函数网络的损失函数更新值函数网络的参数 ω \omega ω,例如使用均方误差(MSE)损失:
      Δ ω = β ( G t − V ( s ; ω ) ) ∇ ω V ( s ; ω ) \Delta\omega = \beta (G_t - V(s;\omega)) \nabla_\omega V(s;\omega) Δω=β(GtV(s;ω))ωV(s;ω)
    • 更新策略网络和值函数网络的参数:
      θ ← θ + Δ θ \theta \leftarrow \theta + \Delta\theta θθ+Δθ
      ω ← ω + Δ ω \omega \leftarrow \omega + \Delta\omega ωω+Δω
  3. 重复步骤2直到达到指定的回合数或达到停止条件。

在演员-评论员算法中,策略网络充当演员的角色,通过策略梯度方法来更新策略参数,以最大化累积奖励。值函数网络充当评论员的角色,估计状态的值函数并作为基准线来计算优势函数。通过同时训练演员和评论员,演员-评论员算法可以更稳定地学习策略并减小梯度估计的方差。

请注意,上述步骤中的超参数 α \alpha α β \beta β 是学习率,用于控制参数更新的步长。而折扣因子 γ \gamma γ 是用于平衡当前奖励和未来奖励的重要性。这些超参数需要根据具体问题进行调优。

示例代码(pytorch)

下面是一个使用PyTorch实现演员-评论员(Actor-Critic)算法的简单示例代码:

import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
import numpy as npclass ActorCritic(nn.Module):def __init__(self, num_states, num_actions, alpha_actor, alpha_critic, gamma):super(ActorCritic, self).__init__()self.num_states = num_statesself.num_actions = num_actionsself.alpha_actor = alpha_actorself.alpha_critic = alpha_criticself.gamma = gammaself.actor = nn.Sequential(nn.Linear(num_states, 32),nn.ReLU(),nn.Linear(32, num_actions),nn.Softmax(dim=-1))self.critic = nn.Sequential(nn.Linear(num_states, 32),nn.ReLU(),nn.Linear(32, 1))self.actor_optimizer = optim.Adam(self.actor.parameters(), lr=alpha_actor)self.critic_optimizer = optim.Adam(self.critic.parameters(), lr=alpha_critic)def get_action(self, state):state = torch.from_numpy(state).float().unsqueeze(0)action_probs = self.actor(state)action = torch.multinomial(action_probs, num_samples=1).item()return actiondef update(self, states, actions, rewards, next_states, dones):states = torch.tensor(states).float()actions = torch.tensor(actions).unsqueeze(1)rewards = torch.tensor(rewards).unsqueeze(1)next_states = torch.tensor(next_states).float()dones = torch.tensor(dones).unsqueeze(1)next_state_values = self.critic(next_states)target_values = rewards + self.gamma * next_state_values * (1 - dones)advantages = target_values - self.critic(states)actor_loss = -(advantages.detach() * torch.log(self.actor(states))).mean()critic_loss = F.mse_loss(self.critic(states), target_values.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()# 示例中的环境需要根据具体问题进行定义
class Environment:def __init__(self, num_states, num_actions):self.num_states = num_statesself.num_actions = num_actionsdef reset(self):return np.zeros((self.num_states,))def step(self, action):next_state = np.random.randn(self.num_states)  # 示例中的随机状态转移reward = np.random.randn()  # 示例中的随机奖励done = False  # 示例中的终止条件return next_state, reward, done# 示例中的问题配置
num_states = 10
num_actions = 4
alpha_actor = 0.001
alpha_critic = 0.01
gamma = 0.99
num_episodes = 1000env = Environment(num_states, num_actions)
agent = ActorCritic(num_states, num_actions, alpha_actor, alpha_critic, gamma)for episode in range(num_episodes):state = env.reset()done = Falsetotal_reward = 0while not done:action = agent.get_action(state)next_state, reward, done = env.step(action)agent.update([state], [action], [reward], [next_state], [done])state = next_statetotal_reward += rewardprint(f"Episode: {episode}, Total reward: {total_reward}")

在示例代码中,我们使用PyTorch实现了一个简单的演员-评论员(Actor-Critic)代理。演员网络(Actor)使用多层感知机(MLP)作为策略网络,输出动作的概率分布。评论员网络(Critic)也使用MLP作为值函数网络,输出状态的值函数估计。

在每个回合中,根据当前策略选择动作,并与环境进行交互。然后,根据奖励和下一个状态计算目标值和优势函数。使用优势函数更新策略网络的参数,使用目标值更新值函数网络的参数。重复这个过程直到达到指定的回合数。

示例代码(tensorflow)

下面是一个简单的Python代码示例,演示演员-评论员算法的实现:

import numpy as np
import tensorflow as tfclass ActorCritic:def __init__(self, num_states, num_actions, alpha_actor, alpha_critic, gamma):self.num_states = num_statesself.num_actions = num_actionsself.alpha_actor = alpha_actorself.alpha_critic = alpha_criticself.gamma = gammaself.actor_network = self.build_actor_network()self.critic_network = self.build_critic_network()def build_actor_network(self):inputs = tf.keras.Input(shape=(self.num_states,))x = tf.keras.layers.Dense(32, activation='relu')(inputs)x = tf.keras.layers.Dense(self.num_actions, activation='softmax')(x)model = tf.keras.Model(inputs=inputs, outputs=x)model.compile(optimizer=tf.keras.optimizers.Adam(lr=self.alpha_actor), loss='categorical_crossentropy')return modeldef build_critic_network(self):inputs = tf.keras.Input(shape=(self.num_states,))x = tf.keras.layers.Dense(32, activation='relu')(inputs)x = tf.keras.layers.Dense(1)(x)model = tf.keras.Model(inputs=inputs, outputs=x)model.compile(optimizer=tf.keras.optimizers.Adam(lr=self.alpha_critic), loss='mean_squared_error')return modeldef get_action(self, state):state = np.reshape(state, (1, self.num_states))action_probs = self.actor_network.predict(state)[0]action = np.random.choice(np.arange(self.num_actions), p=action_probs)return actiondef update(self, states, actions, rewards, next_states, dones):states = np.array(states)actions = np.array(actions)rewards = np.array(rewards)next_states = np.array(next_states)next_state_values = self.critic_network.predict(next_states)next_state_values = np.squeeze(next_state_values)target_values = rewards + self.gamma * next_state_values * (1 - dones)advantages = target_values - self.critic_network.predict(states).flatten()self.actor_network.fit(states, tf.keras.utils.to_categorical(actions, num_classes=self.num_actions),sample_weight=advantages, verbose=0)self.critic_network.fit(states, target_values, verbose=0)# 示例中的环境需要根据具体问题进行定义
class Environment:def __init__(self, num_states, num_actions):self.num_states = num_statesself.num_actions = num_actionsdef reset(self):return np.zeros((self.num_states,))def step(self, action):next_state = np.random.randn(self.num_states)  # 示例中的随机状态转移reward = np.random.randn()  # 示例中的随机奖励done = False  # 示例中的终止条件return next_state, reward, done# 示例中的问题配置
num_states = 10
num_actions = 4
alpha_actor = 0.001
alpha_critic = 0.01
gamma = 0.99
num_episodes = 1000env = Environment(num_states, num_actions)
agent = ActorCritic(num_states, num_actions, alpha_actor, alpha_critic, gamma)for episode in range(num_episodes):state = env.reset()done = Falsetotal_reward = 0while not done:action = agent.get_action(state)next_state, reward, done = env.step(action)agent.update([state], [action], [reward], [next_state], [done])state = next_statetotal_reward += rewardprint(f"Episode: {episode}, Total reward: {total_reward}")

在示例代码中,我们定义了一个简单的问题环境(Environment)和一个演员-评论员(ActorCritic)代理。演员-评论员代理使用一个神经网络作为策略网络(演员)和另一个神经网络作为值函数网络(评论员)。策略网络通过softmax函数输出动作的概率分布,值函数网络输出状态的值函数估计。

在每个回合中,根据当前策略选择动作,并与环境进行交互。然后,根据奖励和下一个状态计算目标值和优势函数。使用优势函数更新策略网络的参数,使用目标值更新值函数网络的参数。重复这个过程直到达到指定的回合数。

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

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

相关文章

XXL-JOB

XXL-JOB是一个分布式的任务调度平台。 目的:为了自动完成特定的任务,在约定的特定时间去执行任务的过程。 原因:在spring中有scheduled,放到业务层代码上面也可以。但是其无法做到高可用、防止重复执行,单机处理极限…

uniapp使用uni.chooseLocation()打开地图选择位置

使用uni.chooseLocation()打开地址选择位置&#xff1a; 在Uniapp源码视图进行设置 添加这个属性&#xff1a;"requiredPrivateInfos":["chooseLocation"] ​ </template><view class"location_box"><view class"locatio…

4.12 TCP 连接,一端断电和进程崩溃有什么区别?

目录 TCP keepalive TCP 的保活机制 主机崩溃 进程崩溃 有数据传输的场景 客户端主机宕机&#xff0c;又迅速重启 客户端主机宕机&#xff0c;一直没有重启 TCP连接服务器宕机和进程退出情况总结 TCP keepalive TCP 的保活机制 TCP 保活机制需要通过 socket 接口设置 S…

anguar12里面FormControl学习

在Angular 12中&#xff0c;要动态修改FormGroup&#xff0c;你可以使用patchValue()方法或setValue()方法。 使用patchValue()方法&#xff1a; import { Component, OnInit } from angular/core; import { FormBuilder, FormGroup } from angular/forms;Component({selector:…

Java 语言实现冒泡排序

Java 语言实现冒泡排序 介绍 冒泡排序是一种简单直观的排序算法&#xff0c;它重复地比较相邻的两个元素&#xff0c;如果顺序错误就交换它们&#xff0c;直到没有需要交换的元素为止。冒泡排序的思路是通过每一轮的比较将最大&#xff08;或最小&#xff09;的元素逐渐“冒泡…

Mybatis-动态sql和分页

目录 一.什么是Mybatis动态分页 二.mybatis中的动态SQL 在BookMaaper.xml中写sql BookMapper BookBiz接口类 BookBizImpl实现接口类 demo测试类 ​编辑 测试结果 三.mybatis中的模糊查询 mybatis中的#与$有是什么区别 在BookMapper.xml里面建立三个模糊查询 ​编辑 …

用Cmake build OpenCV后,在VS中查看OpenCV源码的方法(环境VS2022+openCV4.8.0) Part II

用Cmake build OpenCV后&#xff0c;在VS中查看OpenCV源码的方法 Part II 用Cmake build OpenCV后&#xff0c;在VS中查看OpenCV源码的方法&#xff08;环境VS2022openCV4.8.0&#xff09; Part I_松下J27的博客-CSDN博客 在上一篇文章中&#xff0c;我用cmake成功的生成了ope…

无涯教程-分类算法 - 逻辑回归

逻辑回归是一种监督学习分类算法&#xff0c;用于预测目标变量的概率&#xff0c;目标或因变量的性质是二分法&#xff0c;这意味着将只有两种可能的类。 简而言之&#xff0c;因变量本质上是二进制的&#xff0c;其数据编码为1(代表成功/是)或0(代表失败/否)。 在数学上&…

pymysql记录【持续更新】

文章目录 pymysql记录安装参考基础教程其它 pymysql记录 安装参考 超详细 MySQL8.0的下载、安装配置教程、连接数据可视图形化界面和卸载及MySQL基本使用教程&#xff08;霸霸看了都说好&#xff09; 基础教程 数据库创建 参考Python 操作数据库 - 迷途小书童的Note迷途小书…

169. 多数元素(哈希表)

169. 多数元素 给定一个大小为 n 的数组 nums &#xff0c;返回其中的多数元素。多数元素是指在数组中出现次数 大于 ⌊ n/2 ⌋ 的元素。 你可以假设数组是非空的&#xff0c;并且给定的数组总是存在多数元素。 class Solution { public:int majorityElement(vector<int&…

【网络】IP网络层和数据链路层

IP协议详解 1.概念 1.1 四层模型 应用层&#xff1a;解决如何传输数据&#xff08;依照什么格式/协议处理数据&#xff09;的问题传输层&#xff1a;解决可靠性问题网络层&#xff1a;数据往哪里传&#xff0c;怎么找到目标主机数据链路层&#xff08;物理层&#xff09;&…

Vue3中的计算属性和属性监听

compute计算属性 Vue3中可以通过 compute进行监听计算属性&#xff0c;他返回的是一个ref的对象&#xff0c;也就是说 通过compuye这种方式计算属性实际上是进行了ref的操作 import { computed } from vue const user reactive({firstName: A,lastName: B }) // 只有getter的…

space-around和space-between区别

space-around和space-between是CSS中用于控制Flex容器中项目之间间距的两个属性。 justify-content: space-around;&#xff1a;这个属性将在Flex容器中平均分配项目之间的空间&#xff0c;同时在首尾两侧也留有一半的空间。也就是说&#xff0c;项目之间的间隔是相等的&#x…

ubuntu下自启动设置,为了开机自启动launch文件

1、书写sh脚本文件 每隔5秒钟启动一个launch文件&#xff0c;也可以直接在一个launch文件中启动多个&#xff0c;这里为了确保启动顺利&#xff0c;添加了一些延时 #! /bin/bash ### BEGIN INIT sleep 5 gnome-terminal -- bash -c "source /opt/ros/melodic/setup.bash…

java八股文面试[数据结构]——ConcurrentHashMap原理

HashMap不是线程安全&#xff1a; 在并发环境下&#xff0c;可能会形成环状链表&#xff08;扩容时可能造成&#xff0c;具体原因自行百度google或查看源码分析&#xff09;&#xff0c;导致get操作时&#xff0c;cpu空转&#xff0c;所以&#xff0c;在并发环境中使用HashMap是…

认识Mybatis的关联关系映射,灵活关联表对象之间的关系

目录 一、概述 ( 1 ) 介绍 ( 2 ) 关联关系映射 ( 3 ) 关联讲述 二、一对一关联映射 2.1 数据库创建 2.2 配置文件 2.3 代码生成 2.4 编写测试 三、一对多关联映射 四 、多对多关联映射 给我们带来的收获 一、概述 ( 1 ) 介绍 关联关系映射是指在数据库中&…

【C++杂货铺】探索vector的底层实现

文章目录 一、STL1.1 什么是STL?1.2 STL的版本1.3 STL的六大组件 二、vector的介绍及使用2.1 vector的介绍2.2 vector的使用2.2.1 vector的定义2.2.2 vector iterator2.2.3 vector空间增长问题2.2.4 vector增删查改 2.3 vector\<char\> 可以替代 string 嘛&#xff1f; …

day30| 332.重新安排行程、51. N皇后、37. 解数独

目录&#xff1a; 解题及思路学习 332. 重新安排行程 给你一份航线列表 tickets &#xff0c;其中 tickets[i] [fromi, toi] 表示飞机出发和降落的机场地点。请你对该行程进行重新规划排序。 所有这些机票都属于一个从 JFK&#xff08;肯尼迪国际机场&#xff09;出发的先…

MyBatis与Spring的集成整合加优化分页功能

目录 一.为什么要将MyBatis和Spring整合&#xff1f;&#xff1f;&#xff1f; 二.配置环境 2.1 pom文件 2.2 xml文件 三.演示举例 四.Aop整合pageHelper 分页插件 今天的分享就到这啦&#xff01;&#xff01;&#xff01; 一.为什么要将MyBatis和Spring整合&#xff1f…

arm: day8

1.中断实验&#xff1a;按键控制led灯 流程&#xff1a; key.h /*************************************************************************> File Name: include/key.h> Created Time: 2023年08月21日 星期一 17时03分20秒***************************************…