在强化学习中,Q-learning或基于值函数的强化学习方法对于网络参数的调整是基于"优化Q值",而策略梯度方法或Actor-Critic方法则是基于"优化策略"。
1. 优化Q值(如:Q-learning)
在Q-learning中,我们试图学习一个Q函数,该函数可以预测在给定状态下采取某个动作的预期回报。Loss函数通常表示为预测Q值与实际Q值(通过贝尔曼方程计算得到)之间的均方误差。
import torch
import torch.nn as nn
import torch.optim as optim
class QNetwork(nn.Module):
# ... (定义网络结构)
# 实例化网络和优化器
q_network = QNetwork()
optimizer = optim.Adam(q_network.parameters(), lr=0.001)
# 假设我们有一批转换数据:(states, actions, rewards, next_states, dones)
# 其中,dones是一个表示终止状态的布尔数组
# 预测Q值
predicted_q_values = q_network(states).gather(1, actions.unsqueeze(1)).squeeze(1)
# 使用贝尔曼方程计算目标Q值
next_max_q_values = q_network(next_states).max(1)[0]
target_q_values = rewards + (1 - dones) * 0.99 * next_max_q_values
# 计算loss
loss = nn.MSELoss()(predicted_q_values, target_q_values.detach())
# 反向传播和优化
optimizer.zero_grad()
loss.backward()
optimizer.step()
2. 优化策略(如:Actor-Critic)
在Actor-Critic方法中,我们有两个网络:Actor网络和Critic网络。Actor负责生成动作,Critic评估Actor生成的动作。Loss函数通常包括两部分:策略梯度loss(用于优化Actor)和价值函数loss(用于优化Critic)。
import torch
import torch.nn as nn
import torch.optim as optim
import torch.nn.functional as F
class Actor(nn.Module):
# ... (定义Actor网络结构)
class Critic(nn.Module):
# ... (定义Critic网络结构)
# 实例化网络和优化器
actor = Actor()
critic = Critic()
actor_optimizer = optim.Adam(actor.parameters(), lr=0.001)
critic_optimizer = optim.Adam(critic.parameters(), lr=0.001)
# 假设我们有一批数据:(states, actions, rewards, next_states, dones)
# 以及由Actor网络生成的动作概率log_probs和Critic网络评估的状态值values
# 计算优势函数A(s, a) = Q(s, a) - V(s),这里简化处理,直接使用rewards作为Q(s, a)的近似值
advantages = rewards - values
# Actor的loss函数:策略梯度loss,使用log概率乘以优势函数来计算
actor_loss = -torch.mean(log_probs * advantages.detach())
# Critic的loss函数:均方误差loss,用于预测状态值V(s)与目标状态值(使用TD误差计算)之间的误差
td_errors = rewards + (1 - dones) * 0.99 * critic(next_states) - values
critic_loss = nn.MSELoss()(values, td_errors.detach())
# 反向传播和优化Actor网络
actor_optimizer.zero_grad()
actor_loss.backward()
actor_optimizer.step()
# 反向传播和优化Critic网络
critic_optimizer.zero_grad()
critic_loss.backward()
critic_optimizer.step()