趋近智
直接使用连续样本 (st,at,rt+1,st+1),(st+1,at+1,rt+2,st+2),… 来训练一个深度神经网络近似器 Q(s,a;θ) 会带来重大问题。神经网络通常假设训练数据点是独立同分布的 (IID)。然而,在强化学习中:
为解决这些问题,深度Q网络采用了一种称为经验回放的技术。
核心思想简单而有效:代理不会立即使用最新的经验进行训练,而是将其经验存储在一个大型内存缓冲区中,通常称为回放缓冲区或回放内存。一个“经验”或“转换”通常以元组形式存储: (st,at,rt+1,st+1)。
回放缓冲区通常具有固定的容量(例如,存储最近的100万个转换)。当新的经验到来时,它们会被添加到缓冲区中,如果缓冲区已满,则可能覆盖最旧的经验。
在学习阶段,算法不是使用最新的转换,而是从回放缓冲区中随机抽取一个小批量的转换。然后使用这些随机抽取的转换对Q网络的参数 θ 进行梯度下降更新。
此流程图显示了代理交互、将转换存储在回放缓冲区中,以及从缓冲区采样以更新DQN的独立学习过程。
collections.deque,带有maxlen参数)常用于高效实现,便于添加新经验和移除旧经验。这里是一个Python代码片段,说明了存储和采样:
import random
from collections import deque, namedtuple
# 定义转换的结构
Transition = namedtuple('Transition',
('state', 'action', 'next_state', 'reward'))
class ReplayMemory:
def __init__(self, capacity):
# 使用 deque 作为固定大小的循环缓冲区
self.memory = deque([], maxlen=capacity)
def push(self, *args):
"""保存一个转换"""
self.memory.append(Transition(*args))
def sample(self, batch_size):
"""采样一个随机批次的转换"""
return random.sample(self.memory, batch_size)
def __len__(self):
return len(self.memory)
# --- 用法 ---
# 初始化缓冲区
memory = ReplayMemory(10000) # 容量为10,000
# 在交互循环中:
# state, action, next_state, reward = get_experience_from_env(...)
# memory.push(state, action, next_state, reward)
# 在学习步骤中(如果缓冲区有足够样本):
# if len(memory) > BATCH_SIZE:
# transitions = memory.sample(BATCH_SIZE)
# # 解包批次:
# # batch = Transition(*zip(*transitions))
# # 使用此批次执行梯度更新...
经验回放是一项基本技术,它对DQN的成功贡献很大,使其能够有效地从像素等高维输入中学习。它很好地解决了强化学习训练流程中由相关数据引起的核心不稳定问题。下一节将介绍另一项重要技术——固定Q目标,该技术解决了非平稳目标值的问题。
这部分内容有帮助吗?
© 2026 ApX Machine Learning用心打造