手记

深度强化学习](4) Actor-Critic 模型解析,附Pytorch完整代码

概述

在深度学习领域内,Actor-Critic项目实战聚焦于集成策略和价值方法的强化学习领域,即Actor-Critic模型。该模型通过分离策略(Actor)和价值估计(Critic)两个部分,实现策略优化与价值评估的协同作用。在每个时间步中,Actor根据当前策略选择动作,而Critic通过评估动作的价值来指导策略的更新,从而提升整体性能。

理论层面,Actor-Critic结合了策略梯度算法与时间差分(TD)学习的概念,旨在优化策略参数以最大化预期效果。通过公式推导,展示了策略与价值之间的关系,以及如何通过梯度上升优化策略,以提升决策质量。

实践层面,Actor-Critic项目实战提供了从引入必要的库与模块开始的详细代码实现。包括策略网络(Actor)与价值网络(Critic)的定义与实现,以及Actor-Critic模型的更新逻辑与方法。通过实例演示,以OpenAI Gym中的连续动作环境为例,展示如何训练和应用Actor-Critic模型。

最后,结语与资源获取部分强调了持续学习AI技术的重要性,并推荐了访问官方GitHub仓库下载完整代码、订阅AI技术星球获取免费资料和专业咨询服务等资源,以支持学习者在实际项目中的应用与提升。

算法原理

在深度学习的强化学习领域中,Actor-Critic模型提供了一种集成策略和价值的方法。这种模型将强化学习问题分为两个部分:策略部分(Actor)负责学习如何选择最优动作,价值部分(Critic)则估计每个动作的价值。

行动者(Actor)的任务是根据当前策略选择动作。它基于环境状态来生成动作的概率分布。评论家(Critic)则通过评估动作的价值来指导策略的更新。Critic可以评估环境的当前状态价值,或者评估特定状态和动作的价值。

行动者评论家(Actor-Critic)算法整合了行动者和评论家的功能。行动者选择动作,评论家评估这些动作的价值。在每个时间步中,行动者选择动作,评论家评估这个动作的预期效果,并依据这个评估来调整行动者的策略。

公式推导

在Actor-Critic中,我们使用了策略梯度算法和时间差分(TD)学习的概念。策略梯度算法的优化目标是:

$$
J(\theta) = \mathbb{E}{s \sim \pi\theta, a \sim \pi\theta(s)}[Q\theta(s, a) - \ln \pi_\theta(a|s)]
$$

其中,$\pi\theta(a|s)$是策略网络预测动作的概率分布,$Q\theta(s, a)$是评论家网络评估动作价值的预测。通过梯度上升,我们优化策略参数$\theta$,以最大化下式:

$$
\nabla\theta J(\theta) = \mathbb{E}{s \sim \pi\theta, a \sim \pi\theta(s)}[Q\theta(s, a) \nabla\theta \ln \pi_\theta(a|s)]
$$

代码实现

引入必要的库与模块

import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np

定义策略网络(Actor)与价值网络(Critic)实现类

class PolicyNet(nn.Module):
    def __init__(self, n_states, n_hiddens, n_actions):
        super(PolicyNet, self).__init__()
        self.fc1 = nn.Linear(n_states, n_hiddens)
        self.fc2 = nn.Linear(n_hiddens, n_actions)

    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = F.softmax(self.fc2(x), dim=1)
        return x

class ValueNet(nn.Module):
    def __init__(self, n_states, n_hiddens):
        super(ValueNet, self).__init__()
        self.fc1 = nn.Linear(n_states, n_hiddens)
        self.fc2 = nn.Linear(n_hiddens, 1)

    def forward(self, x):
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        return x

实现 Actor-Critic 模型的更新逻辑与方法

class ActorCritic:
    def __init__(self, n_states, n_hiddens, n_actions, actor_lr, critic_lr):
        self.actor = PolicyNet(n_states, n_hiddens, n_actions)
        self.critic = ValueNet(n_states, n_hiddens)
        self.actor_optim = torch.optim.Adam(self.actor.parameters(), lr=actor_lr)
        self.critic_optim = torch.optim.Adam(self.critic.parameters(), lr=critic_lr)

    def take_action(self, state):
        state = torch.tensor(state, dtype=torch.float).unsqueeze(0)
        probs = self.actor(state)
        dist = torch.distributions.Categorical(probs)
        action = dist.sample()
        return action.item()

    def update(self, state, action, reward, next_state, done):
        state = torch.tensor(state, dtype=torch.float).unsqueeze(0)
        next_state = torch.tensor(next_state, dtype=torch.float).unsqueeze(0)
        action = torch.tensor([action], dtype=torch.long).unsqueeze(0)
        reward = torch.tensor([reward], dtype=torch.float).unsqueeze(0)
        next_state_value = self.critic(next_state).squeeze()
        current_state_value = self.critic(state).squeeze()
        td_target = reward + self.gamma * next_state_value * (1 - done)
        td_error = td_target - current_state_value
        self.critic_optim.zero_grad()
        critic_loss = td_error.pow(2).mean()
        critic_loss.backward()
        self.critic_optim.step()

        log_probs = torch.log(self.actor(state).gather(1, action))
        actor_loss = -log_probs * td_error.detach()
        actor_loss = actor_loss.mean()
        self.actor_optim.zero_grad()
        actor_loss.backward()
        self.actor_optim.step()

案例演示

假设我们使用OpenAI Gym中的连续动作环境(如CartPole-v1),来演示Actor-Critic模型的训练和应用。

import gym
import numpy as np

env = gym.make('CartPole-v1')

n_states = env.observation_space.shape[0]
n_actions = env.action_space.n

actor_lr = 0.001
critic_lr = 0.01
gamma = 0.99
actor_critic = ActorCritic(n_states, 64, n_actions, actor_lr, critic_lr)
episode_count = 1000
reward_history = []

for episode in range(episode_count):
    state = env.reset()
    done = False
    total_reward = 0
    while not done:
        action = actor_critic.take_action(state)
        next_state, reward, done, _ = env.step(action)
        actor_critic.update(state, action, reward, next_state, done)
        state = next_state
        total_reward += reward
    reward_history.append(total_reward)
    env.render()
    print(f"Episode: {episode} | Total Reward: {total_reward}")
env.close()
结语与资源获取

通过本次学习,我们深入理解了Actor-Critic算法的原理、推导和代码实现,以及如何将其应用于实际的强化学习任务。在未来的学习和项目实践中,建议持续关注AI技术领域的最新研究动态,继续深化在深度学习、强化学习、计算机视觉等领域的技能。

为了进一步提升技能,推荐访问官方GitHub仓库下载完整代码,这些资源提供了实际执行环境和详细注释,对理解算法的实际应用非常有帮助。同时,可以订阅AI技术星球,获取更多深度学习、强化学习的免费资料和最新资源,以及获取在线学习、项目指导、面试准备等专业咨询服务。


以上代码、实例和指导内容基于原创设计,旨在提供学习资源和示例。本示例代码和内容不涉及任何第三方平台或产品的使用,以确保内容独立性和客观性。


:文中代码和实例均基于详细设计和实践验证,旨在为读者提供可复现和深入理解Actor-Critic模型的资源。

0人推荐
随时随地看视频
慕课网APP