(10-2)Actor-Critic算法:Advantage Actor-Critic (A2C)算法

本文详细介绍了AdvantageActor-Critic(A2C)算法,一种结合策略学习和值函数估计的强化学习方法。文章涵盖了A2C的基本思想、优势函数的作用、训练流程以及实战应用,展示了A2C如何通过并行化和优势估计提升学习效率和性能。
摘要由CSDN通过智能技术生成

10.2  Advantage Actor-Critic (A2C)算法

Advantage Actor-Critic (A2C) 是一种强化学习算法,是 Actor-Critic 框架的一种变体。它的目标是通过结合演员(Actor)和评论家(Critic)来学习最优策略,同时提高算法的效率和稳定性。

10.2.1  A2C算法的基本思想

Advantage Actor-Critic(A2C)算法的基本思想是将策略学习和值函数估计结合在一起,通过并行化的方式来提高强化学习的效率。它是Actor-Critic框架的一种实现方式,旨在同时学习策略和值函数,以最大化预期累积奖励。

1. 演员(Actor)

演员负责学习策略,即在给定状态下选择动作的概率分布。演员网络的输出是动作的概率分布,通常使用softmax函数确保输出是有效的概率。演员的目标是找到一个最优策略,以最大化长期预期回报。

2. 评论家(Critic)

评论家负责学习状态-动作对的价值估计,即在给定状态下采取某个动作的预期累积奖励。评论家网络的输出是值函数估计,通常表示为Q值(动作值函数)。评论家的目标是学习一个准确的值函数,以提供对演员策略的反馈,帮助演员改进策略。

3. 优势估计(Advantage Estimation)

A2C的关键概念之一是优势估计,它表示了采取某个动作相对于采取平均动作的优势或差异。优势可以通过将Q值减去状态的基准值来计算,即:

Advantage = Q值-基准值

优势估计用于调整策略梯度的方向,以提高演员策略的性能。

4. 策略梯度更新

A2C使用策略梯度方法来更新演员网络的参数,以使得优势估计更大的动作概率增加,而优势估计较小的动作概率减小。这有助于改善策略,使得更有利于在给定状态下采取高回报的动作。

5. 并行化

A2C通常使用多个并行的环境来收集样本数据,以加速训练过程。这些并行环境同时更新演员和评论家网络,从而更有效地学习策略和值函数。

A2C的基本思想是通过结合策略学习和值函数估计来提高强化学习的效率和性能。演员学习如何选择动作,评论家评估动作的价值,而优势估计用于调整策略更新的方向,以最大化长期累积奖励。并行化环境采样可以加速学习过程,使A2C成为一种强大的强化学习算法。

10.2.2  优势函数(Advantage)的引入

优势函数(Advantage)在强化学习中是一种重要的概念,它用于表示某个状态-动作对相对于平均动作的优势或差异。优势函数的引入有助于改进策略学习,尤其在Actor-Critic算法中,如Advantage Actor-Critic (A2C) 和 Advantage Actor-Critic (A3C) 中起着关键作用。

优势函数表示了采取某个动作相对于平均动作的性能差异或优势,它用数值来表示,可以是正数、负数或零。优势的计算通常是通过将实际获得的回报(Q值或动作值函数的估计)与状态的基准值相减来实现的。

优势(Advantage)= Q值(状态-动作对的值函数估计) - 基准值(通常是在给定状态下所有动作的平均值或基准值函数的估计)

优势函数的引入有助于解决强化学习中的如下两个问题:

  1. 高方差问题:直接使用回报来计算策略梯度时,可能会导致高方差的梯度估计,使训练不稳定。优势函数可以减小这种方差。
  2. 基线引入问题:通过计算优势,可以引入一个基准(通常是平均值),从而更准确地估计动作的相对价值。

在策略梯度方法中,优势函数被用来计算策略梯度,从而指导策略更新。优势函数的正值表示某个动作在给定状态下表现良好,鼓励策略增加这个动作的概率;负值表示某个动作表现较差,鼓励策略减少这个动作的概率;零值表示动作的性能与平均性能相当,策略不作特别调整。

优势函数广泛应用于策略梯度算法,如Actor-Critic和Proximal Policy Optimization (PPO)等。在A2C算法中,优势函数用于计算策略梯度,以更新策略网络的参数,以改善策略。通过引入优势函数,策略梯度方法可以更稳定地学习,并且更容易处理连续动作空间和高维状态空间的问题。

总之,优势函数是一种重要的概念,用于强化学习中的策略优化。它通过表示状态-动作对相对于平均动作的优势,帮助策略学习更有效和稳定,从而提高了强化学习算法的性能。

10.2.3  A2C算法的训练流程

Advantage Actor-Critic (A2C) 算法的训练流程通常包括以下步骤:

(1)初始化

初始化演员(Actor)和评论家(Critic)的神经网络参数,设置其他算法参数,如学习率、折扣因子等。

(2)数据采集

同时启动多个并行环境(例如,在多个游戏环境中运行不同的游戏实例),每个并行环境中,使用当前策略(演员网络)与环境进行交互,收集样本数据。样本数据包括状态、采取的动作、即时奖励和下一个状态。

(3)计算优势函数

使用评论家网络计算每个状态-动作对的优势函数,即 Advantages = Q值-基准值。基准值可以是平均值,也可以是评论家网络的估计值。

(4)计算策略梯度

使用演员网络和优势函数计算策略梯度,通常使用策略梯度方法,例如,计算对数似然与优势函数的乘积的梯度。

(5)更新演员网络

使用策略梯度来更新演员网络的参数。通常采用梯度上升法,以最大化累积奖励。通过反向传播和优化算法(如Adam)来执行参数更新。

(6)更新评论家网络

使用均方误差或其他回归损失函数来训练评论家网络,以使其价值估计接近实际回报。通过反向传播和优化算法来执行参数更新。

(7)重复

重复步骤2至步骤6,直到达到预定的训练轮数或其他停止条件。可以同时收集更多的数据,并使用新的数据进行更新,以进一步改进策略和价值函数的估计。

(8)评估策略

在训练结束后,可以使用演员网络的最终参数来评估策略的性能。

可以在不同的环境下测试策略,并计算平均奖励或其他性能指标。

(9)保存模型(可选):可以保存训练后的演员和评论家网络模型,以备将来使用。

A2C算法的训练流程是一个迭代的过程,演员和评论家网络相互协作,通过反馈信号来改进策略。通过并行化环境采样和使用优势函数,A2C算法可以有效地学习复杂的策略,特别适用于连续动作空间和高维状态空间的问题。

10.2.4  A2C算法实战

下面是一个使用A2C算法的简单例子,该例子使用了一个自定义的环境,创建了一个虚构的状态空间和动作空间,并使用A2C来训练一个代理。

实例10-2:在自定义环境使用A2C训练一个代理(源码路径:daima\10\ac.py

实例文件ac.py的具体实现代码如下所示:

import numpy as np
import tensorflow as tf

# 自定义环境
class CustomEnvironment:
    def __init__(self):
        self.num_states = 4
        self.num_actions = 2
        self.state = np.zeros(self.num_states)
        self.current_step = 0

    def reset(self):
        self.state = np.zeros(self.num_states)
        self.current_step = 0
        return self.state

    def step(self, action):
        if self.current_step < self.num_states:
            self.state[self.current_step] = action
            self.current_step += 1
        done = self.current_step >= self.num_states
        reward = sum(self.state) if done else 0
        return self.state, reward, done

# 定义演员-评论家网络(Actor-Critic Network)使用TensorFlow
class ActorCritic(tf.keras.Model):
    def __init__(self, num_actions):
        super(ActorCritic, self).__init__()
        self.common_layers = tf.keras.Sequential([
            tf.keras.layers.Dense(128, activation='relu'),
        ])
        self.actor = tf.keras.layers.Dense(num_actions, activation='softmax')
        self.critic = tf.keras.layers.Dense(1)

    def call(self, inputs):
        x = self.common_layers(inputs)
        action_probs = self.actor(x)
        value = self.critic(x)
        return action_probs, value

# 定义A2C算法
class A2C:
    def __init__(self, num_actions, lr=0.001, gamma=0.99):
        self.actor_critic = ActorCritic(num_actions)
        self.optimizer = tf.keras.optimizers.Adam(lr)
        self.gamma = gamma

    def select_action(self, state):
        action_probs, _ = self.actor_critic(state)
        action = tf.squeeze(tf.random.categorical(action_probs, 1), axis=-1)
        return action.numpy()

    def update(self, state, action, reward, next_state, done):
        with tf.GradientTape() as tape:
            action_probs, value = self.actor_critic(state)
            next_action_probs, next_value = self.actor_critic(next_state)
            
            td_error = reward + (1 - done) * self.gamma * next_value - value
            actor_loss = -tf.reduce_sum(tf.math.log(action_probs) * tf.one_hot(action, depth=action_probs.shape[-1]) * td_error)
            critic_loss = 0.5 * tf.reduce_sum(tf.square(td_error))
            entropy_loss = -tf.reduce_sum(action_probs * tf.math.log(action_probs))
            total_loss = actor_loss + critic_loss - 0.01 * entropy_loss

        grads = tape.gradient(total_loss, self.actor_critic.trainable_variables)
        self.optimizer.apply_gradients(zip(grads, self.actor_critic.trainable_variables))

# 主训练循环
def main():
    env = CustomEnvironment()
    num_actions = env.num_actions
    lr = 0.001
    gamma = 0.99
    max_episodes = 1000
    max_steps = 4  # 自定义环境中的状态数

    agent = A2C(num_actions, lr, gamma)

    for episode in range(max_episodes):
        state = env.reset()
        episode_reward = 0

        for step in range(max_steps):
            action = agent.select_action(np.expand_dims(state, axis=0))
            next_state, reward, done = env.step(action[0])
            agent.update(np.expand_dims(state, axis=0), action[0], reward, np.expand_dims(next_state, axis=0), done)

            state = next_state
            episode_reward += reward

            if done:
                break

        print(f"Episode {episode}, Total Reward: {episode_reward}")

if __name__ == "__main__":
    main()

上述代码演示了在自定义环境中使用A2C(Advantage Actor-Critic)算法训练一个强化学习学习任务的过程。以下是上述代码的实现流程:

(1)自定义环境

  1. 首先定义了一个自定义环境CustomEnvironment,该环境有一个状态空间和动作空间。
  2. reset方法用于重置环境的状态,step方法用于执行动作并返回新的状态、奖励和是否结束的标志。

(2)演员-评论家网络(Actor-Critic Network)

  1. 定义了一个演员-评论家网络模型ActorCritic,它包括了一个共享层(common_layers)、一个演员网络(actor)和一个评论家网络(critic)。
  2. 共享层用于共享状态表示,演员网络输出动作的概率分布,评论家网络输出状态的价值估计。

(3)A2C算法

  1. 定义A2C算法的类A2C,它包括了演员-评论家网络、优化器和超参数(学习率lr和折扣因子gamma)。
  2. select_action方法用于根据当前状态选择动作,这里使用了Categorical分布来采样动作。
  3. update方法用于执行A2C算法的更新步骤,包括计算TD误差、计算策略损失、计算价值损失、计算熵正则化损失以及总损失。
  4. 使用tf.GradientTape来计算梯度,并使用优化器进行参数更新。

(4)主训练循环

  1. 进入主训练循环main,其中包括多个训练周期(max_episodes)。
  2. 在每个周期内,我们重置环境,初始化状态,并开始迭代步骤。
  3. 在每个步骤中,我们使用select_action方法选择动作,执行动作并获得奖励、下一个状态和结束标志。
  4. 使用update方法更新代理的策略和价值函数,从而逐步提高性能。
  5. 记录每个周期的总奖励并输出。

这个示例演示了A2C算法的实现流程,该算法使用了自定义环境、演员-评论家网络和训练循环来训练一个代理以最大化累积奖励。你可以根据自己的需求修改环境、网络架构和超参数来适应不同的任务。 A2C是一种强化学习算法,通过策略梯度和值函数估计来优化代理的策略,以在不同环境中实现高性能。

未完待续

  • 21
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

码农三叔

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值