【深度学习·命运-5】一文了解深度强化学习

Proximal Policy Optimization (PPO) 强化学习

Proximal Policy Optimization (P PPO) 是一种基于策略梯度的强化学习算法,它属于 策略优化(Policy Optimization)方法家族,并且在 深度强化学习(Deep Reinforcement Learning, DRL)中具有重要的地位。PPO 是由 OpenAI 提出的,它相较于之前的策略梯度方法(如 TRPO)具有更好的计算效率和更简单的实现,因此被广泛应用于各种强化学习任务。

1. PPO 背景与动机

在强化学习中,策略梯度方法是通过直接优化策略(Policy)来解决问题的一类算法。这类方法的优势在于它能够处理高维度的 连续动作空间大规模状态空间,并且具有较好的泛化能力。

然而,直接优化策略梯度往往存在一些挑战,最常见的问题之一是策略更新的 不稳定性,即每次更新可能会导致策略发生过大的变化,进而导致训练过程不收敛或收敛到不良的局部最优解。

TRPO(Trust Region Policy Optimization)中,提出了通过对策略进行限制(通过设置 KL 散度)来解决这一问题,从而控制每次更新的步长。但 TRPO 的缺点在于计算开销较大,尤其是在计算 自然梯度 时需要大量的计算资源。

PPO(Proximal Policy Optimization)正是为了解决这一问题而提出的,它通过 限制每次策略更新的幅度,从而在保持稳定性的同时,减少了计算复杂度。PPO 的计算效率远超 TRPO,并且在多个强化学习任务中取得了令人满意的结果。

2. PPO 的基本思想

PPO 的核心思想是在每次策略更新时,加入一个 剪切目标函数,从而确保新旧策略之间的差异不会过大。这样可以有效防止策略的更新过大导致训练不稳定。具体来说,PPO 使用 重要性采样(Importance Sampling)来衡量新旧策略的差异,并通过 剪切(clipping) 来限制重要性采样的范围,从而限制更新的幅度。

PPO 的目标是最大化策略的期望回报,同时通过限制每次策略更新的步长来确保训练的稳定性。其优化目标函数在以下两个方面做了权衡:

  1. 期望回报最大化
  2. 策略更新的幅度控制

3. PPO 的目标函数

PPO 的目标函数由两个部分组成:目标函数剪切函数

3.1 目标函数

假设当前策略为 πθ\pi_\theta,目标是最大化每个时间步的 优势函数(Advantage Function),即:

At=Rt−V(st)A_t = R_t - V(s_t)

其中:

  • RtR_t 是从时间步 tt 开始的实际回报;
  • V(st)V(s_t) 是状态 sts_t 下的值函数;
  • AtA_t 是优势函数,表示当前状态下某个动作的相对好坏。

PPO 的目标是最大化以下的 期望优势函数

Et[min⁡(rt(θ)At,clip(rt(θ),1−ϵ,1+ϵ)At)]\mathbb{E}_t \left[ \min \left( r_t(\theta) A_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) A_t \right) \right]

其中:

  • rt(θ)=πθ(at∣st)πθold(at∣st)r_t(\theta) = \frac{\pi_\theta(a_t|s_t)}{\pi_{\theta_{\text{old}}}(a_t|s_t)} 是 重要性采样比率,表示新策略和旧策略对相同动作的概率比;
  • ϵ\epsilon 是一个超参数,控制更新的幅度;
  • clip(x,1−ϵ,1+ϵ)\text{clip}(x, 1 - \epsilon, 1 + \epsilon) 是对 rt(θ)r_t(\theta) 进行 裁剪(Clipping),确保更新幅度不会超过某个阈值。
3.2 裁剪策略

通过引入 裁剪操作,PPO 限制了 rt(θ)r_t(\theta) 的变化范围,避免了策略的过大更新。具体来说,PPO 在每次优化时通过对重要性采样比率进行裁剪,计算目标函数:

LCLIP(θ)=Et[min⁡(rt(θ)At,clip(rt(θ),1−ϵ,1+ϵ)At)]L^{CLIP}(\theta) = \mathbb{E}_t \left[ \min \left( r_t(\theta) A_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) A_t \right) \right]

  • 当 rt(θ)r_t(\theta) 落在 [1−ϵ,1+ϵ][1 - \epsilon, 1 + \epsilon] 范围内时,目标函数为 rt(θ)Atr_t(\theta) A_t;
  • 当 rt(θ)r_t(\theta) 超出该范围时,目标函数被 裁剪,变为 clip(rt(θ),1−ϵ,1+ϵ)At\text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) A_t,避免了过大的更新。

4. PPO 的算法步骤

PPO 的训练过程包括以下几个步骤:

  1. 数据采集:代理与环境交互,收集轨迹数据,包含状态、动作、奖励等信息。
  2. 计算优势函数:根据收集的轨迹数据,计算每个时间步的优势函数 AtA_t,通常使用 广义优势估计(GAE, Generalized Advantage Estimation)来计算。
  3. 优化目标函数:使用 梯度下降Adam 优化器 来最小化目标函数(即最大化期望回报): LCLIP(θ)=Et[min⁡(rt(θ)At,clip(rt(θ),1−ϵ,1+ϵ)At)]L^{CLIP}(\theta) = \mathbb{E}_t \left[ \min \left( r_t(\theta) A_t, \text{clip}(r_t(\theta), 1 - \epsilon, 1 + \epsilon) A_t \right) \right]
  4. 更新策略:根据优化的结果,更新策略网络的参数。
  5. 重复步骤 1-4,直到达到训练目标或收敛。

5. PPO 的优缺点

优点:
  • 简单且高效:PPO 比 TRPO 更简单且计算效率更高,因为它避免了 TRPO 中复杂的自然梯度计算。PPO 的实现非常简单,易于扩展到各种任务。
  • 稳定性:通过剪切目标函数,PPO 有效地避免了大幅度的策略更新,从而保证了训练过程的稳定性。
  • 适用性广:PPO 不依赖于任何特定的策略参数化,因此可以应用于各种强化学习任务,尤其是在连续动作空间的任务中表现优异。
缺点:
  • 超参数调节:虽然 PPO 是一种相对稳定的算法,但它仍然依赖于超参数的调节,尤其是 ϵ\epsilon(裁剪系数)和学习率等。
  • 训练过程较慢:PPO 比一些其他强化学习算法(如 DQN)训练过程慢,尤其是在涉及大规模数据的任务中。

6. PPO 的应用

PPO 在很多强化学习任务中都有广泛应用,尤其在 机器人控制游戏模拟环境 等领域。OpenAI 在多个项目中使用 PPO,包括 OpenAI Gym 中的一些复杂环境,以及 MuJoCo 仿真环境中的物理控制任务。

典型应用:
  • 机器人控制:PPO 在多种机器人控制任务中都表现出了优异的性能,尤其是在连续控制任务(如平衡机器人)中。
  • 视频游戏:PPO 在一些复杂的游戏环境中表现出色,尤其是 Atari 游戏3D 游戏
  • 自动驾驶:PPO 还可以用于训练自动驾驶系统,通过与环境的交互来学习最优驾驶策略。

7. PPO 代码实现

以下是使用 TensorFlowGym 库的 PPO 简单实现:

import gym
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers

# 创建环境
env = gym.make('CartPole-v1')

# PPO超参数
gamma = 0.99
epsilon = 0.2
learning_rate = 0.001
epochs = 10
batch_size = 64

# 构建策略网络
class PPOModel(tf.keras.Model):
    def __init__(self, action_space):
        super(PPOModel, self).__init__()
        self.dense1 = layers.Dense(128, activation='relu')
        self.dense2 = layers.Dense(128, activation='relu')
        self.policy = layers.Dense(action_space, activation='softmax')
        self.value = layers.Dense(1)

    def call(self, inputs):
        x = self.dense1(inputs)
        x = self.d

深度 Q 网络(Deep Q-Network, DQN)

深度 Q 网络(DQN) 是一种结合了 深度学习强化学习 的方法,广泛应用于处理复杂的强化学习任务,尤其是在 高维度状态空间(如图像)下。DQN 是 Q-learning 的一种扩展,采用深度神经网络来逼近 Q 函数,从而能够处理那些传统 Q-learning 无法处理的高维问题。

1. Q-learning 简要回顾

Q-learning 是一种基于值函数的强化学习算法,目的是找到一个最优的动作选择策略。通过不断更新 Q 值,学习代理(Agent)在每个状态下选择最佳的动作。

Q-learning 的目标是学习一个动作价值函数 Q(s,a)Q(s, a),表示在状态 ss 下采取动作 aa 所得到的期望回报。该值的更新公式为:

Q(s,a)←Q(s,a)+α(r+γmax⁡a′Q(s′,a′)−Q(s,a))Q(s, a) \leftarrow Q(s, a) + \alpha \left( r + \gamma \max_{a'} Q(s', a') - Q(s, a) \right)

其中:

  • α\alpha 是学习率,决定了新的估计与旧的估计之间的平衡;
  • γ\gamma 是折扣因子,表示未来奖励的权重;
  • rr 是当前奖励;
  • s′s' 是当前状态 ss 执行动作 aa 后的下一状态;
  • a′a' 是可能的下一个动作。

Q-learning 算法通过不断更新 Q 值来逼近最优的 Q 函数,最终使得代理能够在每个状态下选择最优的动作。

2. DQN 的基本思想

在传统的 Q-learning 中,Q 值是一个简单的表格,它存储了每个状态-动作对的价值。然而,当状态空间非常大(如图像)时,使用表格存储 Q 值变得不可行。在这种情况下,深度 Q 网络(DQN)应运而生,它使用 深度神经网络 来逼近 Q 函数,从而解决高维度状态空间的问题。

DQN 将传统的 Q-learning 中的 Q 函数通过一个深度神经网络来逼近,即:

Q(s,a;θ)≈Q∗(s,a)Q(s, a; \theta) \approx Q^*(s, a)

其中,θ\theta 是神经网络的参数。通过使用深度神经网络,DQN 可以处理图像、声音等复杂的输入数据。

3. DQN 的关键技术

DQN 结合了传统 Q-learning 和深度神经网络,同时采用了一些关键的技术来稳定训练过程,避免训练过程中常见的问题。DQN 主要包含以下几个核心技术:

3.1 经验回放(Experience Replay)

经验回放是 DQN 的一个关键技术,它通过 经验池(Experience Replay Buffer)存储代理在环境中经历的状态-动作-奖励-下一状态四元组 (s,a,r,s′)(s, a, r, s'),然后从中随机采样一小批数据来更新 Q 网络。

  • 经验回放的优势在于它打破了训练数据之间的相关性,从而减少了 时间序列相关性 带来的不稳定问题。
  • 通过随机抽样的方式,经验回放提高了数据的利用效率,使得每个样本都能被多次使用。
3.2 目标网络(Target Network)

为了进一步稳定训练过程,DQN 引入了 目标网络(Target Network)的概念。目标网络与主 Q 网络结构相同,但它的参数 θ−\theta^- 每隔一定的步数才会更新一次。

Q-learning 的更新公式中包含 max⁡a′Q(s′,a′)\max_{a'} Q(s', a'),而如果直接使用当前 Q 网络来估计下一状态的最大 Q 值,可能会导致 Q 值的估计不稳定。为了避免这种情况,DQN 使用目标网络来提供一个稳定的目标。

DQN 的更新公式如下:

y=r+γmax⁡a′Q(s′,a′;θ−)y = r + \gamma \max_{a'} Q(s', a'; \theta^-) L(θ)=E[(Q(s,a;θ)−y)2]L(\theta) = \mathbb{E}[(Q(s, a; \theta) - y)^2]

其中:

  • θ−\theta^- 是目标网络的参数;
  • θ\theta 是当前网络的参数;
  • L(θ)L(\theta) 是损失函数,表示当前网络输出与目标 yy 之间的误差。
3.3 目标网络的冻结

目标网络并不是每一步都更新,而是每隔一定时间或一定步数后才更新一次。这种做法能有效避免 Q 网络在训练时不断变化,从而提高训练的稳定性。

4. DQN 的训练过程

DQN 的训练过程与传统 Q-learning 类似,只是将 Q 函数用深度神经网络来表示,并且利用经验回放和目标网络来增强稳定性。训练过程大致如下:

  1. 初始化

    • 初始化 Q 网络和目标网络,并将目标网络的参数与 Q 网络的参数一致;
    • 初始化经验回放池;
    • 设置折扣因子 γ\gamma,学习率 α\alpha 和目标网络更新频率。
  2. 与环境交互

    • 在环境中选择一个动作 ata_t;
    • 观察环境返回的奖励 rtr_t 和下一状态 st+1s_{t+1};
    • 将 (st,at,rt,st+1)(s_t, a_t, r_t, s_{t+1}) 存储到经验回放池中。
  3. 从经验回放池中采样

    • 随机从经验池中采样一小批数据;
    • 计算目标 yy: yt=rt+γmax⁡a′Q(st+1,a′;θ−)y_t = r_t + \gamma \max_{a'} Q(s_{t+1}, a'; \theta^-) 其中 θ−\theta^- 为目标网络的参数。
  4. 更新 Q 网络

    • 使用均方误差(MSE)损失函数更新 Q 网络的参数 θ\theta: L(θ)=E[(Q(s,a;θ)−y)2]L(\theta) = \mathbb{E}[(Q(s, a; \theta) - y)^2]
    • 通过梯度下降法最小化损失函数,更新网络参数。
  5. 更新目标网络

    • 每隔一定步数,将 Q 网络的参数复制到目标网络中。
  6. 重复上述过程,直到训练完成。

5. DQN 的优缺点

优点

  • 能够处理高维度输入:DQN 能够处理传统 Q-learning 无法应对的高维度输入(如图像、视频等),因为它利用深度神经网络来逼近 Q 函数。
  • 稳定的训练过程:通过经验回放和目标网络,DQN 能有效减少训练过程中的不稳定性,避免了直接使用当前网络进行 Q 值估计的问题。
  • 适应复杂任务:DQN 在多个复杂的任务(如 Atari 游戏、机器人控制)中取得了显著的成功。

缺点

  • 计算资源消耗大:由于 DQN 需要大量的训练数据,并且训练过程中需要进行多次神经网络的前向传播和反向传播,因此计算资源消耗较大。
  • 训练过程慢:尽管 DQN 改善了训练的稳定性,但相较于传统的 Q-learning,DQN 的训练过程较慢,尤其是在处理大型数据时。
  • 高维度的动作空间:虽然 DQN 可以处理高维度状态空间,但在动作空间较大的问题中,DQN 仍然存在一定的局限性。

6. DQN 的应用

  • Atari 游戏:DQN 最著名的应用是在 Atari 2600 游戏中的表现。DQN 能够通过视觉输入(游戏画面)学习如何玩多种 Atari 游戏,并且在很多游戏中超过了人类专家的水平。
  • 机器人控制:DQN 被应用于各种机器人控制任务,如机器人导航、物品抓取等。
  • 自动驾驶:DQN 还在自动驾驶、路径规划等领域得到了应用,通过学习环境中的反馈信号来做出决策。

7. DQN 代码实现

以下是 DQN 的简化实现,使用 Keras 和 OpenAI Gym 来训练一个在 CartPole 环境中的代理:

import gym
import numpy as np
import tensorflow as tf
from tensorflow.keras import layers, models
from collections import deque
import random

# 环境初始化
env = gym.make('CartPole-v1')

# DQN 网络模型
def build_model():
    model = models.Sequential([
        layers.Dense(24, activation='relu', input_shape=(4,)),
        layers.Dense(24, activation='relu'),
        layers.Dense(2, activation='linear')  # 2 个动作:左,右
    ])
    model.compile(optimizer

='adam', loss='mse') return model

经验回放池

class ExperienceReplay: def init(self, max_size=10000): self.buffer = deque(maxlen=max_size)

def add(self, experience):
    self.buffer.append(experience)

def sample(self, batch_size):
    return random.sample(self.buffer, batch_size)

def size(self):
    return len(self.buffer)

Q-learning 超参数

gamma = 0.99 # 折扣因子 epsilon = 1.0 # 探索率 epsilon_decay = 0.995 epsilon_min = 0.01 batch_size = 64 target_update_freq = 10 learning_rate = 0.001 num_episodes = 500

DQN 训练过程

def train_dqn(): model = build_model() target_model = build_model() target_model.set_weights(model.get_weights()) # 复制初始权重 replay_buffer = ExperienceReplay() total_rewards = []

for episode in range(num_episodes):
    state = env.reset()
    state = np.reshape(state, [1, 4])
    episode_reward = 0
    
    while True:
        # 选择动作
        if np.random.rand() < epsilon:
            action = env.action_space.sample()  # 随机动作
        else:
            q_values = model.predict(state)
            action = np.argmax(q_values)  # 选择 Q 值最大的动作
        
        # 执行动作,得到新的状态和奖励
        next_state, reward, done, _ = env.step(action)
        next_state = np.reshape(next_state, [1, 4])
        replay_buffer.add((state, action, reward, next_state, done))
        episode_reward += reward
        
        # 训练模型
        if replay_buffer.size() >= batch_size:
            batch = replay_buffer.sample(batch_size)
            for state, action, reward, next_state, done in batch:
                target = reward
                if not done:
                    target = reward + gamma * np.max(target_model.predict(next_state))
                target_f = model.predict(state)
                target_f[0][action] = target
                model.fit(state, target_f, epochs=1, verbose=0)
        
        state = next_state
        
        if done:
            break
    
    # 更新目标网络
    if episode % target_update_freq == 0:
        target_model.set_weights(model.get_weights())
    
    # epsilon 衰减
    if epsilon > epsilon_min:
        epsilon *= epsilon_decay
    
    total_rewards.append(episode_reward)
    print(f"Episode {episode+1}/{num_episodes}, Reward: {episode_reward}")

return total_rewards

训练 DQN

train_dqn()


### 总结

深度 Q 网络(DQN)结合了强化学习中的 Q-learning 和深度学习中的神经网络技术,能够处理高维度状态空间,并且通过经验回放和目标网络等技巧提高了训练的稳定性。DQN 在多个实际任务(如游戏、机器人控制等)中取得了显著成功,成为强化学习领域的重要方法。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值