Actor-Critic 算法是强化学习中一种结合了策略迭代与价值迭代优点的集成方法。它通过将策略学习与价值学习融合,同时包含行动者(Actor)负责策略选择与评论家(Critic)关注价值评估,使得智能体在复杂环境中能够更高效地学习和适应。本文将深入探讨 Actor-Critic 算法的原理、实现细节,并通过代码实例展示如何在实践中应用该模型。
1. Actor-Critic 算法原理与公式推导Actor-Critic 算法的核心在于通过两个独立的神经网络——评论家(Critic)与行动者(Actor)——协同工作。评论家网络评估动作的价值,而行动者则根据当前策略选择动作。算法的目标是优化策略,使得最终的选择既能够获得较高的即时奖励,又能根据评论家的评估提升长期价值。
评论家网络
评论家网络通常采用深度神经网络,输入可以是状态($s$)或状态与动作对($s, a$),分别用于估计状态价值 $V(s)$ 或动作价值 $Q(s, a)$。评论家的损失函数通常采用均方误差(MSE)来度量预测与实际结果之间的差异:
[ \mathcal{L}_{critic} = \mathbb{E}[(y - \hat{y})^2] ]
其中,$y$ 是真正的价值或动作价值,$\hat{y}$ 是网络预测的结果。
行动者网络
行动者网络负责计算策略函数,指导智能体选择动作。其优化目标函数涉及计算自然梯度,以确保策略的更新在概率空间中进行:
[ \mathcal{L}_{actor} = -\mathbb{E}[A(s, a; \pi)] ]
其中,$A(s, a; \pi)$ 是动作价值函数与策略函数的乘积。
2. 实现与代码示例引入必要的库
首先,我们需要导入 torch
和其他必要的库来实现 Actor-Critic 算法。
import torch
import torch.nn as nn
import torch.nn.functional as F
import numpy as np
import gym
定义 Actor 和 Critic 网络
接下来,我们定义 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 = self.fc2(x)
x = F.softmax(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 类
在此类中,我们整合了 Actor 和 Critic 的功能,并实现了训练方法。
class ActorCritic:
def __init__(self, n_states, n_hiddens, n_actions,
actor_lr, critic_lr, gamma):
self.gamma = gamma
self.actor = PolicyNet(n_states, n_hiddens, n_actions)
self.critic = ValueNet(n_states, n_hiddens)
self.actor_optimizer = torch.optim.Adam(self.actor.parameters(), lr=actor_lr)
self.critic_optimizer = 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)
m = torch.distributions.Categorical(probs)
action = m.sample()
return action.item()
def update(self, states, actions, rewards, next_states, dones):
td_target = rewards + self.gamma * self.critic(next_states) * (1 - dones)
td_value = self.critic(states)
td_loss = F.mse_loss(td_value, td_target)
self.critic_optimizer.zero_grad()
td_loss.backward()
self.critic_optimizer.step()
log_probs = torch.log(self.actor(states).gather(1, actions.unsqueeze(-1)).squeeze())
adv = td_target - td_value.detach()
actor_loss = -log_probs * adv
self.actor_optimizer.zero_grad()
actor_loss.mean().backward()
self.actor_optimizer.step()
案例演示
在 OpenAI Gym 环境中实现 Actor-Critic 方法,以 CartPole-v1 环境为例。
def main():
env = gym.make('CartPole-v1')
n_states = env.observation_space.shape[0]
n_actions = env.action_space.n
n_hiddens = 128
actor_lr = 0.001
critic_lr = 0.01
gamma = 0.99
agent = ActorCritic(n_states, n_hiddens, n_actions,
actor_lr, critic_lr, gamma)
returns = []
for episode in range(1000):
state = env.reset()[0]
done = False
rewards = []
while not done:
action = agent.take_action(state)
next_state, reward, done, _, _ = env.step(action)
rewards.append(reward)
agent.update(state, action, reward, next_state, done)
state = next_state
rewards_sum = sum(rewards)
returns.append(rewards_sum)
print(f"Episode {episode}, Reward: {rewards_sum}")
env.close()
if __name__ == '__main__':
main()
3. 结论
通过本文的探讨与代码示例,我们可以看到 Actor-Critic 方法在强化学习中的应用。这种方法通过结合策略网络(Actor)和价值网络(Critic),使得智能体在复杂环境中能够更有效地学习到最优策略。实践代码展示了如何在 CartPole 环境中应用 Actor-Critic 算法,这为我们在实际项目中使用该方法提供了参考。随着机器学习技术的不断发展,Actor-Critic 方法将继续在各类应用领域展现出其独特的优势。
共同學習,寫下你的評論
評論加載中...
作者其他優質文章