python实现Actor-Critic算法

小小编辑 1年前 ⋅ 153 阅读

Actor-Critic算法是一种强化学习算法,结合了策略梯度方法(Actor)和值函数方法(Critic)。它的核心思想是同时学习一个策略和一个值函数,从而在更新策略时,利用值函数来减少方差,提高训练的稳定性和效率。

Actor-Critic算法有多种变体,其中最简单的是Advantage Actor-Critic(A2C)算法,以下是A2C算法的基本步骤:

构建Actor网络和Critic网络:Actor网络用于学习策略,Critic网络用于估计状态值函数或动作值函数。

初始化网络参数和优化器:初始化Actor和Critic网络的参数,选择适当的优化器。

采样轨迹:通过与环境交互,使用当前策略从状态中采样动作,并记录每个状态、动作和奖励,构成一个轨迹。

计算回报和Advantage:计算轨迹的累积奖励,以及使用Critic网络估计每个状态的值函数。然后计算Advantage,即累积奖励减去估计的值函数。

计算策略梯度:使用Advantage来计算策略梯度,以优化Actor网络的参数。同时,可以计算Critic网络的损失,例如均方误差(MSE)损失。

更新网络参数:分别使用策略梯度和Critic损失来更新Actor和Critic网络的参数。

重复:重复执行步骤3-6,通过与环境交互和更新网络,逐渐优化策略和值函数,以获得更高的累积奖励。

常见的Actor-Critic算法包括:

Advantage Actor-Critic(A2C):基本的Actor-Critic算法,使用Advantage来计算策略梯度。 Asynchronous Advantage Actor-Critic(A3C):A2C的并行版本,使用多个并行智能体来加速训练过程。

以下是一个使用Python和TensorFlow库实现Advantage Actor-Critic(A2C)算法的简单示例:

import numpy as np
import tensorflow as tf
import gym

# 创建环境
env = gym.make('CartPole-v1')
num_actions = env.action_space.n
num_states = env.observation_space.shape[0]

# 构建Actor网络
actor_model = tf.keras.Sequential([
    tf.keras.layers.Dense(24, activation='relu', input_shape=(num_states,)),
    tf.keras.layers.Dense(24, activation='relu'),
    tf.keras.layers.Dense(num_actions, activation='softmax')
])

# 构建Critic网络
critic_model = tf.keras.Sequential([
    tf.keras.layers.Dense(24, activation='relu', input_shape=(num_states,)),
    tf.keras.layers.Dense(24, activation='relu'),
    tf.keras.layers.Dense(1)
])

# 定义优化器
actor_optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)
critic_optimizer = tf.keras.optimizers.Adam(learning_rate=0.001)

# 定义训练参数
num_episodes = 1000
discount_factor = 0.99

# A2C算法
for episode in range(num_episodes):
    state = env.reset()
    episode_reward = 0
    
    while True:
        # 选择动作
        probs = actor_model.predict(np.expand_dims(state, axis=0))
        action = np.random.choice(num_actions, p=probs[0])
        
        # 执行动作并观察结果
        next_state, reward, done, _ = env.step(action)
        episode_reward += reward
        
        # 计算Advantage
        value = critic_model.predict(np.expand_dims(state, axis=0))[0][0]
        next_value = critic_model.predict(np.expand_dims(next_state, axis=0))[0][0]
        advantage = reward + discount_factor * next_value - value
        
        # 更新Actor网络
        with tf.GradientTape() as tape:
            actor_probs = actor_model(np.expand_dims(state, axis=0))
            log_probs = tf.math.log(actor_probs[0, action])
            actor_loss = -log_probs * advantage
        actor_grads = tape.gradient(actor_loss, actor_model.trainable_variables)
        actor_optimizer.apply_gradients(zip(actor_grads, actor_model.trainable_variables))
        
        # 更新Critic网络
        with tf.GradientTape() as tape:
            critic_value = critic_model(np.expand_dims(state, axis=0))
            critic_loss = tf.keras.losses.MeanSquaredError()(advantage, critic_value)
        critic_grads = tape.gradient(critic_loss, critic_model.trainable_variables)
        critic_optimizer.apply_gradients(zip(critic_grads, critic_model.trainable_variables))
        
        if done:
            print(f"Episode {episode+1}, Reward: {episode_reward}")
            break
        
        state = next_state

env.close()

在这个示例中,我们使用TensorFlow构建了一个Actor网络和一个Critic网络,然后使用A2C算法在OpenAI Gym的CartPole环境中进行训练。代码中实现了A2C算法的基本步骤,包括选择动作、执行动作、计算Advantage、更新Actor网络和Critic网络等。

请注意,这只是一个简化的示例,实际应用中可能需要更多的改进和调整,以处理不同的问题和环境。