python实现策略梯度(Policy Gradient)算法

小小编辑 1年前 ⋅ 245 阅读

策略梯度(Policy Gradient)是一类强化学习算法,用于训练智能体在环境中做出决策以最大化累积奖励。与值函数方法不同,策略梯度直接学习一个策略(policy),该策略将状态映射到动作的概率分布。通过调整策略的参数,智能体可以优化其性能,以获得更高的累积奖励。

策略梯度算法的核心思想是使用梯度上升法(Gradient Ascent)来更新策略的参数,使得选择高回报动作的概率增加,而选择低回报动作的概率减少。通常使用累积奖励的期望值作为目标,使用梯度上升法来最大化该目标。

以下是策略梯度算法的基本步骤:

定义策略:使用参数化的函数来表示策略,例如使用神经网络。策略函数接受状态作为输入,输出每个动作的概率分布。

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

计算回报:计算轨迹的累积奖励,即通过一系列动作获得的总奖励。

计算策略梯度:计算每个状态、动作对的策略梯度,即累积奖励乘以动作的概率。

更新策略参数:使用梯度上升法来更新策略的参数,使得策略梯度逐步增加。

重复:重复执行步骤2-5,通过与环境交互和更新策略,逐渐优化策略以获得更高的累积奖励。

以下是一个使用Python和TensorFlow库实现策略梯度算法(REINFORCE算法)的简单示例:

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]

# 构建策略网络
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')
])

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

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

# 策略梯度算法(REINFORCE)
for episode in range(num_episodes):
    state = env.reset()
    episode_reward = 0
    actions = []
    rewards = []
    
    while True:
        # 选择动作
        probs = model.predict(np.expand_dims(state, axis=0))
        action = np.random.choice(num_actions, p=probs[0])
        actions.append(action)
        
        # 执行动作并观察结果
        next_state, reward, done, _ = env.step(action)
        rewards.append(reward)
        episode_reward += reward
        
        if done:
            # 计算累积奖励
            discounted_rewards = [sum(rewards[i:] * (discount_factor ** np.arange(len(rewards) - i)))
                                  for i in range(len(rewards))]
            
            # 计算策略梯度并更新网络参数
            with tf.GradientTape() as tape:
                probs = model(np.expand_dims(state, axis=0))
                log_probs = tf.math.log(probs[0, actions])
                loss = -tf.reduce_mean(log_probs * discounted_rewards)
            grads = tape.gradient(loss, model.trainable_variables)
            optimizer.apply_gradients(zip(grads, model.trainable_variables))
            
            print(f"Episode {episode+1}, Reward: {episode_reward}")
            break
        
        state = next_state

env.close()

在这个示例中,我们使用TensorFlow构建了一个简单的策略网络,然后使用REINFORCE算法在OpenAI Gym的CartPole环境中进行训练。代码中实现了策略梯度算法的基本步骤,包括选择动作、执行动作、计算累积奖励和更新策略网络参数。

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