强化学习记录

强化学习记录

SYuan03 Lv4

参考链接

https://blog.csdn.net/weixin_51545953/article/details/127466280

Transition与ReplayMemory

  1. Transition(过渡):Transition 是一个命名元组(named tuple),用来表示在环境中发生的一个单一的过渡。这个过渡包括了代理(智能体)观察到的情境(state)和采取的动作(action),以及随后的情境(next_state)和奖励(reward)结果。这个概念用来记录代理在环境中的互动和反馈,有助于后续的学习和决策。
  2. ReplayMemory(经验回放记忆):ReplayMemory 是一个有限大小的循环缓冲区,用来存储代理观察到的过渡。它的目的是为了重复使用这些数据。通过从中随机采样,可以获得一批不相关的过渡数据,用于训练深度强化学习模型,特别是DQN。经验回放记忆的存在对于稳定和改进DQN的训练过程非常重要,因为它有助于减少训练中的数据相关性问题,提高模型的效率和性能。

总之,这段文字描述了在深度强化学习中使用经验回放记忆的概念,以及它的两个组成部分:Transition 用于记录单个情境转换,ReplayMemory 用于存储这些过渡数据并支持随机采样以进行训练。这一技术有助于提高深度强化学习模型的训练效果。

举例

当我们训练一个深度强化学习模型(比如一个控制机器人玩游戏的模型),这个模型需要不断地学习如何在特定情境下采取正确的行动。经验回放记忆就像是这个模型的记忆系统。

Transition(过渡)是一种方式来记录代理在环境中的经历。假设我们正在训练一个智能机器人玩一个视频游戏。每个Transition可以看作是一条记录,记录了机器人在游戏中的一次互动。这个记录包括了机器人看到的游戏画面(情境),机器人采取的行动(比如移动、跳跃),以及之后获得的奖励(分数增加或减少)以及下一个情境。这些记录可以帮助机器人学习如何在不同情境下做出正确的决策。

ReplayMemory(经验回放记忆)就像是机器人的记忆库。它保存了很多过去的互动记录,而且它不仅仅是保存,还会不断更新。这个记忆库的好处在于,当我们要教机器人如何玩游戏的时候,我们可以随机挑选一些过去的记录,而不是只用最新的记录。这就好像是在学习一门新技能时,我们不仅仅会记住最近的练习,还会反复回顾过去的练习,这样我们的学习更加稳定。

举个例子,如果机器人曾经在游戏中遇到过一个特殊的敌人,但是很长时间没有再遇到,如果我们只用最新的记录来训练它,它可能会忘记如何应对这个敌人。但是如果我们从ReplayMemory中随机挑选过去的记录,就可以让机器人不断回顾之前的经验,从而更好地应对各种情况。

总之,经验回放记忆是一种方法,让深度强化学习模型能够从过去的经验中学习,而不仅仅依赖于最新的互动数据,从而提高模型的稳定性和性能。

DQN

DQN(Deep Q-Network)是一种深度强化学习模型,旨在解决强化学习问题,特别是在离散动作空间中的问题。它是由DeepMind开发的,最初被广泛应用于训练智能代理来玩视频游戏,如Atari 2600游戏。DQN以其在处理高维度状态空间和复杂任务中的出色表现而著名。

DQN的核心原理包括以下要点:

  1. Q-Value Function(Q-值函数):DQN的目标是学习一个称为Q-值函数的函数,通常用Q(s, a)表示。这个函数估计在给定状态s下采取动作a所获得的累积奖励的期望值。换句话说,它告诉代理在不同状态下采取不同动作的好坏程度。
  2. 深度神经网络:DQN使用深度神经网络来估计Q-值函数。这个神经网络通常是卷积神经网络(CNN),因为它能够有效地处理高维度的图像输入。神经网络的输入是环境状态的表示,输出是每个可能动作的Q-值。
  3. 经验回放:DQN引入了经验回放记忆(Experience Replay)的概念。经验回放是一种数据存储和随机采样方法,它允许代理存储和重用过去的经验,以减少数据的相关性,从而提高训练的稳定性。代理会在每个时间步将经验(状态、动作、奖励、下一个状态)存储在一个经验回放缓冲区中,并从中随机抽样小批量数据来进行训练。
  4. 目标网络:为了提高稳定性,DQN还使用了两个神经网络:一个是用来选择动作的主网络,另一个是用来估计目标Q值的目标网络。目标网络的参数是固定的一段时间,然后逐渐更新以逼近主网络的估计值。这有助于减轻训练中的不稳定性问题。

DQN的训练目标是最小化Q-值函数的均方误差,以使其逼近真实的Q值。通过与环境互动并不断优化神经网络参数,DQN可以学习在不同情境下采取什么动作来最大化长期奖励。

总之,DQN是深度强化学习的一种方法,它使用深度神经网络来学习代理在不同情境下如何做出最佳决策。它在处理高维状态空间和离散动作空间的问题中表现出色,使得智能代理能够在各种环境中表现出色。

ReplayMemory

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Transition = namedtuple('Transition',
('state', 'action', 'next_state', 'reward'))


class ReplayMemory(object):

def __init__(self, capacity):
self.memory = deque([], maxlen=capacity)

def push(self, *args):
"""Save a transition"""
self.memory.append(Transition(*args))

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

def __len__(self):
return len(self.memory)

这是一个Python类ReplayMemory,它似乎是为了实现经验回放记忆(Replay Memory)的功能而设计的。经验回放记忆是在深度强化学习中用于存储和随机采样代理与环境互动的记录的数据结构。以下是该类及其方法的简要解释:

  1. __init__(self, capacity):这是类的构造函数,它初始化ReplayMemory对象。它接受一个capacity参数,表示Replay Memory的最大容量,即可以存储多少条记录。
  2. push(self, *args):这是一个方法,用于将代理与环境互动的记录(Transition)保存到Replay Memory中。它接受不定数量的参数*args,这些参数将被传递给Transition的构造函数以创建一个新的Transition对象,然后将其添加到Replay Memory中。
  3. sample(self, batch_size):这是一个方法,用于从Replay Memory中随机采样一批记录。它接受一个batch_size参数,表示要采样的记录数量。它使用random.sample函数从Replay Memory中随机选择指定数量的记录,并以列表的形式返回这些记录。
  4. __len__(self):这是一个特殊方法,用于获取Replay Memory中当前存储的记录数量。它可以通过内置的len函数来访问,以确定Replay Memory中的记录数。

下面是一个使用示例:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
from collections import deque
import random

# 创建ReplayMemory对象,容量为1000
capacity = 1000
memory = ReplayMemory(capacity)

# 将一条记录添加到Replay Memory
state = [0.1, 0.2, 0.3]
action = 1
next_state = [0.2, 0.3, 0.4]
reward = 0.5
memory.push(state, action, next_state, reward)

# 从Replay Memory中随机采样一批记录
batch_size = 32
sampled_batch = memory.sample(batch_size)

# 获取Replay Memory中记录的数量
memory_length = len(memory)

在上述示例中,首先创建了一个ReplayMemory对象,然后将一条记录添加到Replay Memory中。接着,使用sample方法随机采样了一批记录,最后使用__len__方法获取了Replay Memory中记录的数量。这个类有助于管理和维护强化学习中所需的经验回放数据。

select_action

select_action 函数:这个函数用于选择代理在给定状态下采取的动作,通常遵循 ε-贪心策略(epsilon-greedy policy)。 ε-贪心策略是一种平衡探索和利用的策略,其中有一个 ε(epsilon)的概率用于随机选择一个动作,以便代理可以探索新的动作,而 1-ε 的概率用于根据模型的Q值选择一个最优动作。初始时,ε 的值为 EPS_START,然后随着时间逐渐以指数方式衰减至 EPS_END。EPS_DECAY 控制衰减速率。

plot_duration

plot_durations 函数:这个函数是用于绘制训练过程中每一轮(episode)的持续时间,并计算最近100轮的平均值。在强化学习中,通常使用“滚动平均”来评估模型性能,因为这可以平滑不稳定的训练过程。这个函数将在训练的主循环中调用,用于绘制和更新训练进展的图表。最后的评估通常基于最近100个episode的平均表现。

折扣因子GAMMA

GAMMA 是折扣因子(discount factor),在强化学习中用于计算折扣回报(discounted return)。折扣回报是一个代理在一系列时间步内获得的奖励的折扣总和。

具体来说,折扣回报是通过以下方式计算的:

  1. 代理在每个时间步 t 处获得奖励 r(t)。
  2. 这些奖励 r(t) 从当前时间步 t 开始向未来的时间步 t+1, t+2, … 进行折扣。
  3. 折扣的过程通过乘以折扣因子 GAMMA 来实现。

折扣回报 G(t) 在时间步 t 处的计算方式是:

G(t) = r(t) + GAMMA * r(t+1) + GAMMA^2 * r(t+2) + GAMMA^3 * r(t+3) + …

GAMMA 的值通常在 0 到 1 之间,控制了对未来奖励的重要性。具体来说:

  • GAMMA 接近 1 时,未来奖励具有较高的重要性,代理更关注长期回报。
  • GAMMA 接近 0 时,未来奖励的影响几乎被忽略,代理更关注即时奖励。

在实际的强化学习任务中,选择合适的 GAMMA 值取决于任务的性质,例如,如果任务需要代理长期规划和考虑未来奖励,那么较高的 GAMMA 值可能更合适。然而,它也可以根据任务的要求进行调整,以权衡长期和短期奖励的重要性。

目标网络

目标网络即target_net

policy_net是参数一直在变化的

policy_nettarget_net 是DQN算法中的两个神经网络,它们有不同的作用,并协同工作以稳定学习过程。让我更详细地解释它们的作用:

  1. policy_net:这是DQN算法中的主要神经网络,它用于估计每个状态下采取每个动作的Q值。具体来说,对于给定的状态,policy_net会输出一个Q值向量,其中每个元素对应一个可能的动作,表示采取该动作时的Q值。智能体根据这些Q值来选择最佳的动作。policy_net的参数会在训练中不断更新,以使其能够更准确地估计Q值。

  2. target_net:这是一个目标神经网络,其主要作用是用于估计未来状态下的最大Q值。在Q-learning的更新公式中,需要估计下一个状态(s’)下的最大Q值,但由于在训练中不断变化的policy_net的参数,这可能导致目标值不稳定。因此,引入了target_net,它的参数是一个policy_net在某个时刻的快照,不会频繁更新。在训练中,可以使用target_net来计算目标Q值,以减小目标值的不稳定性,从而使学习过程更稳定。

具体来说,target_net的参数不会像policy_net那样频繁更新,而是定期进行更新,例如每隔一定数量的步骤。这使得目标Q值更稳定,有助于减小训练中的振荡和不稳定性。

总之,policy_net用于估计当前状态下的Q值,而target_net用于估计未来状态下的最大Q值,通过这两个网络的协同工作,DQN算法能够更稳定地学习并提高智能体的性能。

关于优化器

1
2
3
4
5
6
# 优化模型,首先将梯度置为0,然后进行反向传播,最后进行梯度裁剪
optimizer.zero_grad()
loss.backward()
torch.nn.utils.clip_grad_value_(policy_net.parameters(), 100)
# 使用优化器来更新模型参数,使得梯度下降
optimizer.step()

这段代码是深度学习模型训练的标准步骤,用于优化模型的权重以减小损失函数的值。以下是对每个步骤的解释:

  1. optimizer.zero_grad(): 这一行代码的目的是将模型参数的梯度(gradients)清零。在反向传播算法中,梯度是损失函数相对于模型参数的导数,用来指示如何更新模型参数以减小损失。在每一次训练迭代之前,都需要清零梯度,以避免累积的梯度影响后续迭代。
  2. loss.backward(): 这是反向传播的步骤,用于计算模型参数相对于损失函数的梯度。它分析模型的预测和真实目标之间的差距,然后反向传播这个误差,以计算每个参数的梯度。这一步是为了计算出如何调整模型参数以减小损失。
  3. torch.nn.utils.clip_grad_value_(policy_net.parameters(), 100): 这行代码进行了梯度裁剪(gradient clipping)。梯度裁剪是一种处理梯度爆炸问题的技巧,它限制了梯度的最大值,防止梯度变得过大,从而导致训练不稳定。在这里,梯度的值被裁剪到最大值为100,即如果任何梯度的绝对值大于100,它们将被截断为100。这有助于防止梯度爆炸问题。
  4. optimizer.step(): 最后,这一行代码使用优化器来更新模型参数。根据计算的梯度,优化器会根据指定的优化算法(如随机梯度下降或Adam)来微调模型的参数,以减小损失函数的值。这个步骤是用来实际更新模型权重,使模型更好地拟合训练数据。

综上所述,这些步骤组成了深度学习模型的训练过程,其中包括了清零梯度、反向传播计算梯度、梯度裁剪以处理梯度爆炸问题,以及使用优化器来更新模型参数。这些步骤循环迭代,直到模型达到满意的性能或训练停止的条件被满足。

  • 标题: 强化学习记录
  • 作者: SYuan03
  • 创建于 : 2023-10-23 11:23:50
  • 更新于 : 2024-03-10 19:37:13
  • 链接: https://bblog.031105.xyz/posts/23-Fall-Courses-MachineLearning/强化学习记录.html
  • 版权声明: 本文章采用 CC BY-NC-SA 4.0 进行许可。
评论