强化学习术语与超参数整理(PPO)

最近在isaac lab中使用各个强化学习框架做对比训练,算法都是用的PPO,但是每个框架里超参数名字都不太一样,各种叫法弄得都混乱了,而且对齐不好很难对比出结论,在这里系统整理一下。

Isaac Lab支持的强化学习框架介绍-CSDN博客icon-default.png?t=N7T8https://blog.csdn.net/Vulcan_S/article/details/139470347?spm=1001.2014.3001.5502

通用参数

Rollout

想象一下你正在玩一个电子游戏,比如《超级马里奥兄弟》。在这个游戏中,你(作为智能体)的目标是尽可能多地收集金币并到达终点。每当你做出一个动作(比如跳跃、左右移动),游戏环境就会给你一个反馈,告诉你是否得到了金币、是否碰到了敌人(这会让你失去生命),以及你当前的位置。

Rollout就是你在这个游戏中连续玩的一段过程。 比如说,你从游戏的开始玩到第一个关卡结束,或者从某个检查点开始玩直到你死亡或者达到某个特定条件。在这个过程中,你不断地观察游戏的状态(比如马里奥的位置、敌人的位置、金币的数量等),做出决策(选择动作),然后得到游戏的反馈(奖励或惩罚)。

在PPO(Proximal Policy Optimization,近端策略优化)算法中,rollout的作用就像是你给算法提供了一段“游戏录像”。这段录像记录了你在玩游戏时的所有状态、动作和奖励。算法会看着这段录像,思考你哪些地方做得好(得到了金币),哪些地方做得不好(碰到了敌人),然后尝试学习如何玩得更好。

具体来说,PPO算法会利用这段录像中的数据来评估你当前的策略(即你是如何根据游戏状态选择动作的)是否足够好。如果不够好,算法会尝试调整你的策略,以便在下次玩游戏时能够做出更好的决策。这个调整的过程就是所谓的“策略更新”。

但是,PPO算法非常聪明,它不会让你的策略一下子变得完全不同(因为这可能会导致你完全不知道怎么玩游戏了)。相反,PPO会逐步地、谨慎地调整你的策略,确保每次调整都不会让你的表现变得太差。这就是PPO算法中“近端”这个词的含义——它只关注于当前策略附近的微小调整。

Episode

在强化学习框架中,episode代表了一个完整的智能体(agent)与环境(environment)之间的交互序列。具体而言,一个episode始于智能体处于某个初始状态(或初始状态分布中的一个状态),随后智能体根据当前策略选择并执行一个动作,环境则基于该动作给出新的状态和一个相应的即时奖励。这一过程不断重复,直到满足某个终止条件,如达到最大步数限制、游戏结束或任务完成等。至此,一个episode结束,智能体与环境之间的本次交互序列也宣告完成。

episode的长度(即包含的transitions数量)会影响智能体的学习效率和性能。过短的episode可能无法提供足够的信息供智能体学习,而过长的episode则可能导致学习过程变得复杂和不稳定。

在诸如围棋、象棋或电子游戏等场景中,一个episode可以对应一局完整的游戏。智能体通过不断与游戏环境进行交互来学习如何获胜。

在机器人控制任务中,一个episode可以代表机器人完成一个指定任务的过程,如从起点移动到终点、抓取物体等。

Epochs

在强化学习中,epochs的概念并不像在监督学习中那样直接。在监督学习中,一个epoch指的是整个训练集被网络完全遍历一次的过程。但在强化学习中,由于数据集(或称为经验)是不断通过与环境交互动态生成的,因此很难定义一个明确的“整个训练集”。

然而,在深度强化学习中,我们可能会将训练过程划分为多个“迭代”或“周期”,其中每个迭代包含了一定数量的训练步骤或交互轮次。这些迭代可以看作是强化学习中的“epochs”的类似物,尽管它们并不完全等同于监督学习中的epochs。

PPO算法的工作过程分为两个阶段 

  1. 第一阶段:从零开始(Phase I: Let Policy Play to Gather Data)
    • 在这个阶段,策略(Policy)首先被用来“播放以收集数据”(play to gather data)。这意味着策略被放置在环境中,并执行动作以与环境交互,从而生成数据(即“轨迹”Trajectories)。
    • 接着,使用这些数据通过“监督学习”(Supervised Learning)和“复杂损失”(with complex loss)来“训练策略”。这里的监督学习可能指的是利用收集到的数据来优化策略,尽管在强化学习中,这通常不是传统意义上的监督学习,而是利用数据来估计梯度并更新策略的参数。
    • 这个阶段是一个迭代过程(Iterations),通过多次迭代来不断改进策略。
  2. 第二阶段:训练策略(Phase II: Train Policy on Gathered Data)
    • 在收集了足够的数据之后,进入第二阶段。在这一阶段,利用在第一阶段收集到的数据来“训练策略”。
    • 这里的“数据集”由多个“观测次数”(Episodes)或“时期”(Epochs)组成,每个观测次数或时期都包含了策略与环境交互的完整记录。
    • 在这个阶段,目标是进一步优化策略,使其能够更好地完成任务或最大化期望回报。

Batch Size

在强化学习中,batch size指的是在每次参数更新时所使用的经验(或称为样本)的数量。这些经验通常是以(状态,动作,奖励,下一个状态)四元组的形式存储的,并存储在经验回放(Experience Replay)缓冲区中。经验回放是一种技术,用于在训练过程中提高数据效率和稳定性。

在训练过程中,算法会从经验回放缓冲区中随机抽取一小批(即batch size指定数量的)经验样本,用于计算梯度并更新网络的参数。这样做可以减少样本之间的相关性,从而有助于稳定学习过程。

Mini Batch Size

它指的是在每次训练迭代(iteration)中,从训练数据集中随机选择并用于更新模型参数的数据样本数量。在深度学习和强化学习中,通常会将训练数据分成若干个大小相同的mini-batch,然后每次从一个mini-batch中随机采样一组样本进行梯度下降,以更新网络参数。这个过程中,mini-batch的大小就等于mini batch size。

这个参数的设置对于模型的训练效果和效率具有显著影响。

其影响包括:

  1. 加速训练:比全批量处理更快,因为每次处理的数据量更少。
  2. 提高泛化能力:通过随机选取不同批次的数据,帮助模型学习更多数据分布信息。
  3. 平衡训练:较大的batch size可能加速但降低稳定性,较小的则更稳定但训练时间较长。

选择mini batch size时,需考虑硬件资源、数据集大小,并观察模型在验证集上的表现来调整。不同模型和数据集可能需要不同的batch size以达到最佳效果。

设置技巧:

虽然较小的Mini Batch Size可以提高模型的稳定性和泛化能力,但过小的Mini Batch Size可能会导致梯度估计的噪声过大,从而影响模型的收敛速度和性能。因此,在实际应用中需要根据具体任务和数据集的特点来选择合适的Mini Batch Size。Mini Batch Size通常与其他超参数(如学习率、优化算法等)一起调整,以获得最佳的训练效果。因此,在调整Mini Batch Size时需要考虑这些超参数之间的相互作用和影响。

Batch Size 与 Mini-Batch Size 的区别主要体现在以下几个方面:

训练速度:Batch Size 越大,每次更新的参数就越多,因此训练速度越快。但是,如果 Batch Size 太大,可能会导致梯度更新方向不准确,从而降低模型性能。Mini-Batch Size 越大,计算梯度所需的计算资源就越多,因此训练速度越慢。但是,如果 Mini-Batch Size 太小,可能会导致梯度更新方向过于随机,从而降低训练效率。

模型性能:Batch Size 和 Mini-Batch Size 的选择会影响模型对训练数据的拟合程度。Batch Size 越大,模型对训练数据的拟合程度越高,但也有可能导致过拟合。Mini-Batch Size 越大,模型对训练数据的拟合程度越低,但可以避免过拟合。

内存占用:Batch Size 越大,所需的内存空间就越多。Mini-Batch Size 越大,所需的内存空间就越少。

较小的Mini Batch Size之所以可以让模型更加稳定,主要基于以下几个原因: 

1. 减少梯度估计的方差
  • 随机性增加:较小的Mini Batch Size意味着每次迭代时模型仅基于一小部分数据进行更新,这增加了梯度估计的随机性。虽然这看似增加了噪声,但实际上这种随机性有助于模型避免陷入局部最优解,因为不同的Mini Batch可能会提供不同的梯度方向。
  • 平滑的收敛过程:随着迭代的进行,虽然每个Mini Batch的梯度估计可能有所波动,但整体上这些波动会相互抵消,使得模型的收敛过程更加平滑。这种平滑的收敛有助于减少模型在训练过程中的过拟合风险,并提高模型的泛化能力。
2. 提高模型的泛化能力
  • 隐式正则化效果:较小的Mini Batch Size实际上提供了一种隐式的正则化效果。由于每次迭代仅基于一小部分数据进行更新,模型无法完全拟合这部分数据,从而迫使模型学习更加通用的特征,而不是过度拟合训练数据中的噪声。
  • 避免局部最优:如前所述,较小的Mini Batch Size增加了梯度估计的随机性,这有助于模型跳出局部最优解,并探索更广阔的解空间。这有助于模型找到全局最优解或接近全局最优的解。
3. 平衡计算效率和稳定性
  • 计算效率:虽然较小的Mini Batch Size可能需要更多的迭代次数来完成一个epoch的训练,但它通常能够更快地收敛到较好的解,因为每次迭代都提供了更新的机会。此外,较小的Mini Batch Size还可以减少内存占用和计算资源的消耗。
  • 稳定性:通过平衡计算效率和稳定性,较小的Mini Batch Size可以在保证模型性能的同时,减少训练过程中的不稳定性。这种稳定性有助于模型在更广泛的场景下保持良好的表现。

熵系数(Entropy Coefficient)

在 rsl_rl 中该参数叫 entropy_coef

在stable_baseline3中该参数叫​​​​​​​ ​​​​​​​ent_coef

熵系数在PPO算法中用于控制策略的探索能力。在强化学习中,策略的熵可以表示为随机变量不确定性的度量,即策略在选择动作时的随机性或多样性。熵系数通过增加一个与策略熵成正比的项到损失函数中,来鼓励策略保持一定的探索性。这样做可以防止策略过早地收敛到局部最优解,从而提高算法的全局搜索能力。 

如何调整

  • 增加熵系数:当发现策略在训练过程中变得过于保守,即总是选择少数几个动作,导致探索不足时,可以尝试增加熵系数。这会增加策略在选择动作时的随机性,使其更有可能探索到新的、潜在的有益动作。
  • 减小熵系数:相反,如果策略已经足够稳定,且探索过多的动作导致训练效率低下时,可以减小熵系数。这将使策略更加专注于已知的有益动作,加速收敛过程。

在实践中,熵系数的值通常较小,如0.01(看到大部分例子里这个值都是0),但具体值需要根据任务复杂度和算法表现进行调整。

折扣因子(Gamma, γ)

在 rsl_rl 中该参数叫 gamma

折扣因子是强化学习中用于调节近远期影响的重要参数。它决定了未来奖励在当前决策中的相对重要性。具体来说,在计算期望回报时,未来的奖励会被乘以折扣因子的幂次方(随时间的推移而指数衰减)。因此,折扣因子越大,算法在决策时会考虑更长远的影响;折扣因子越小,算法则更注重眼前利益。

如何调整

  • 增加折扣因子:当任务需要长期规划时,应增加折扣因子。这会使算法在决策时更多地考虑未来的奖励,从而有利于学习出更加长远的策略。然而,过高的折扣因子可能导致算法收敛困难,因为需要处理大量的未来信息。
  • 减小折扣因子:相反,如果任务更注重短期收益或环境变化较快,应减小折扣因子。这会使算法更加关注当前的奖励,从而更快地适应环境变化。但过低的折扣因子可能导致算法过于短视,无法学习到长远的策略。

在选择折扣因子时,需要根据任务的具体需求进行权衡。一个常用的经验公式是1/(1-γ),它可以用来估计算法在决策时往前考虑的步数。根据任务的复杂度和奖励分布,可以选择一个合适的γ值,使得算法在“近视”和“远视”之间找到一个平衡点。一般任务例子里给的参数值gamma在0.99左右。

KL散度阈值

在 rsl_rl 中该参数叫 desired_kl

在 rl_games 中该参数叫 kl_threshold

The target KL-divergence for the adaptive learning rate schedule.

参数通常与自适应学习率调度器相关联,用于控制策略更新过程中新旧策略之间的KL散度(Kullback-Leibler Divergence)的目标值。这个参数的设置和调整对于保持策略的稳定性、优化学习速率以及确保算法性能至关重要。

KL散度是衡量两个概率分布之间差异的一种方式,在强化学习中,它常被用来评估新旧策略之间的差异程度。自适应学习率调度器会根据当前新旧策略的KL散度与目标KL散度的比较结果来调整学习率,以确保策略更新既不过于激进也不过于保守。

如何调整

较小的 desired_kl 值意味着算法希望新旧策略之间的差异较小,这有助于保持策略的稳定性;而较大的 desired_kl 值则允许更大的策略更新幅度,可能有助于算法更快地探索新的策略空间。

一般任务例子里该参数值在0.01左右;

TD(lambda)系数 

在 rsl_rl 中该参数叫 lam

在 skrl 中该参数叫 lambda

TD(lambda) coefficient (lam) for computing returns and advantages

这里的lambda参数是指TD(lambda)方法中的系数,用于计算回报(returns)和优势(advantage)。TD(lambda)是Temporal Difference learning的一种变体,它通过考虑未来多个时间步的奖励来估计当前状态的价值函数。lambda决定了在计算回报时,不同时间步上的奖励对当前状态价值函数估计的贡献程度。具体来说,lambda越大,越远的未来奖励对当前状态价值函数的影响就越大。

然而,在PPO算法的常规描述中,直接提及TD(lambda)来计算returns和advantage的情况并不常见,因为PPO通常使用更直接的方法来估计这些量,如GAE(Generalized Advantage Estimation)。如stable_baseline3中使用 gae_lambda

GAE(lambda)

Factor for trade-off of bias vs variance for Generalized Advantage Estimator

在 stable_baseline3 中该参数叫 gae_lambda

在 rl_games 中该参数叫 tau

为啥叫tau是这样解释的:(Lambda for GAE. Called tau by mistake long time ago because lambda is keyword in python)


gae_lambda是指GAE(Generalized Advantage Estimation)中的一个参数,用于权衡偏差(bias)和方差(variance)之间的平衡。

GAE是一种用于估计优势函数的方法,它通过加权不同时间步的TD误差来计算优势估计。gae_lambda越大,算法在估计优势函数时会更多地考虑未来的信息,这有助于减小方差但可能增加偏差;gae_lambda越小,算法则更关注当前时间步的信息,这有助于减小偏差但可能增加方差。

gae_lambda 的值通常在 0 到 1 之间,接近1,不同的值会影响优势估计的平滑程度:

当 λ = 0 时,GAE 退化为单步的TD(Temporal Difference)目标,此时方差最大,偏差最小。

当 λ = 1 时,GAE 退化为完整的蒙特卡洛(Monte Carlo)方法,此时方差最小,偏差最大。

clip参数

在 rl_games 中该参数叫 e_clip

在 rsl_rl 中该参数叫 clip_param

在 stable_baseline3 中该参数叫 clip_range

限制策略更新中的比率(ratio)的变化范围,以防止策略更新过于激进,从而保持算法的稳定性。这个参数在PPO的损失函数中起到了“裁剪”的作用,因此被称为“clip parameter for ppo loss”。e_clip 限制了新旧策略比率(ratio)的变化范围,通常是一个介于0和1之间的值。当比率超出这个范围时,它会被裁剪到这个范围内。

这个参数有助于防止策略更新过大,从而避免训练过程中的不稳定现象,如性能急剧下降或发散。

  • 在没有特定任务经验的情况下,一个常见的初始值设置是 e_clip = 0.2。这个值在多个任务和环境中被证明是有效的。这意味着在计算PPO的损失函数时,新旧策略的比率将被裁剪到 [1 - 0.2, 1 + 0.2] 或 [0.8, 1.2] 的范围内。
  • 如果训练过程中性能波动较大:尝试减小 e_clip 的值,这会使策略更新更加保守,有助于稳定训练过程。
  • 如果训练过程过于稳定但性能提升缓慢:考虑增大 e_clip 的值,以允许更大的策略更新,可能会带来更快的性能提升,但也要注意不要引入不稳定因素。

具体来说,PPO算法中的损失函数通常包括两个部分:策略损失(surrogate loss)和值函数损失(value function loss)。策略损失用于更新策略网络,而值函数损失用于更新值网络(预测状态价值的网络)。在这里,我们主要关注策略损失,特别是与 e_clip 相关的部分。

 stable_baseline3中的clip使用代码:

# ratio between old and new policy, should be one at the first iteration
ratio = th.exp(log_prob - rollout_data.old_log_prob)

# clipped surrogate loss
policy_loss_1 = advantages * ratio
policy_loss_2 = advantages * th.clamp(ratio, 1 - clip_range, 1 + clip_range)
policy_loss = -th.min(policy_loss_1, policy_loss_2).mean()

rl_games中参数

minibatch_size

指 Mini Batch Size 大小

horizon_length

同 skrl 中的 rollouts 参数

官方解释:

Horizon length per each actor. Total number of steps will be num_actors*horizon_length * num_agents

horizon_length参数指的是每个actor(或称为agent)在每个episode中与环境交互的最大步数(或时间步)。在强化学习中,一个episode指的是从初始状态开始,直到达到终止状态(如游戏结束、达到某个目标或达到最大步数限制)为止的完整交互过程。

num_minibatches 即 minibatches的个数计算:

num_minibatches = horizon_length * num_actors // minibatch_size

num_actors

Number of running actors/environments.

num_actors通常指的是同时运行的演员(actors)或环境(environments)的数量。在强化学习的上下文中,演员(actor)是一个术语,用于指代执行动作(actions)并接收环境反馈(通常是奖励和新的状态)的实体。在分布式或多进程强化学习设置中,使用多个演员可以显著提高学习效率,因为它们能够并行地探索环境并收集数据。

具体来说,num_actors的值决定了框架将同时启动多少个独立的环境实例,每个实例都由一个单独的演员控制。每个演员在自己的环境中执行动作,收集数据,并可能将这些数据发送到中央的学习算法(如神经网络)进行训练。通过这种方式,框架能够更快地收集训练所需的样本,从而加速学习过程。

例如,如果你将num_actors设置为4,那么你的框架将同时运行4个环境实例,每个实例都由一个演员控制。这四个演员将并行地与环境交互,收集数据,并将这些数据用于训练中央的模型。这种并行化的方法尤其适用于那些需要大量数据来训练的学习任务,因为它能够显著减少收集足够数据所需的时间。


看意思跟isaac lab里num_envs是一样的,如果配置了num_envs,那么 num_actors 可以配置为 -1

num_actors: -1  # configured from the script (based on num_envs)

mini_epochs

同stable_baseline3 中的 n_epochs 参数

同 skrl 中的 learning_epochs 参数

Number of miniepochs. Good value is in [1,10]

max_epochs

Maximum number of epochs to run.

在rl_games里,总的 timesteps = horizon_length * max_epochs

max_epochs参数指的是算法运行时的最大轮次(epochs)数。这里的“轮次”或“迭代”是指算法在整个训练数据集或环境状态上重复执行学习步骤的次数。

作用

  1. 训练停止条件max_epochs为训练过程设定了一个明确的停止条件。当算法达到指定的轮次后,无论当前性能如何,训练都会停止。这有助于避免无限期的训练,节省计算资源。

  2. 性能平衡:通过设定合适的max_epochs值,可以在模型的性能(如找到更优策略的能力)和训练成本(如时间、计算资源)之间找到平衡。过小的max_epochs可能导致模型学习不足,而过大的值则可能增加过拟合的风险或不必要的计算开销。

  3. 实验可重复性:在科研或工业应用中,设定固定的max_epochs有助于确保实验的可重复性。这意味着不同的研究人员或团队在相同的条件下应该能够得到相似的结果。

  • 需要注意的是,max_epochs并不总是决定训练过程的唯一停止条件。在某些情况下,算法可能会因为达到其他条件(如性能收敛、梯度消失/爆炸等)而提前停止。

rsl_rl中参数

目前用下来个人感觉rsl_rl的训练速度、可拓展性、配置、可视化是几个框架中做的比较好的,缺点是master分支还只支持PPO算法;从训练输出的日志里可以看到每秒步数,数据收集和学习分别花了多长时间,各个reward在当前iteration数值等等;

 rsl_rl的任务参数配置与训练输出日志

num_mini_batches

这个参数的说明和使用尤其要注意,官方文档里没有介绍,实际是用来计算 mini batch size 的,而不是代表 mini batch size 的大小,计算公式如下:

mini batch size = num_envs * num_steps / num_mini_batches

所以num_mini_batches这个值越大,mini batch size 值反而越小;

num_learning_epochs

同stable_baseline3 中的 n_epochs 参数

num_steps_per_env

number of steps per environment per iteration

同stable_baseline3 中的 n_steps 参数

同 skrl 中的 rollouts 参数

这个数值大了,collection时间会加大,learning的时间会更大;

推荐数值:

 num_steps_per_env = trial.suggest_categorical("steps_per_env", [8, 16, 32, 64, 128, 256, 512, 1024, 2048])

rsl_rl 中,num_steps_per_env 部分代码, for i in range(self.num_steps_per_env) 就是在 Rollout 或者说就是一个 collection 

start_iter = self.current_learning_iteration
tot_iter = start_iter + num_learning_iterations
for it in range(start_iter, tot_iter):
    start = time.time()
    # Rollout
    with torch.inference_mode():
        for i in range(self.num_steps_per_env):
            actions = self.alg.act(obs, critic_obs)
            obs, rewards, dones, infos = self.env.step(actions)
            obs = self.obs_normalizer(obs)
            if "critic" in infos["observations"]:
                critic_obs = self.critic_obs_normalizer(infos["observations"]["critic"])
            else:
                critic_obs = obs
            obs, critic_obs, rewards, dones = (
                obs.to(self.device),
                critic_obs.to(self.device),
                rewards.to(self.device),
                dones.to(self.device),
            )
            self.alg.process_env_step(rewards, dones, infos)

            if self.log_dir is not None:
                # Book keeping
                # note: we changed logging to use "log" instead of "episode" to avoid confusion with
                # different types of logging data (rewards, curriculum, etc.)
                if "episode" in infos:
                    ep_infos.append(infos["episode"])
                elif "log" in infos:
                    ep_infos.append(infos["log"])
                cur_reward_sum += rewards
                cur_episode_length += 1
                new_ids = (dones > 0).nonzero(as_tuple=False)
                rewbuffer.extend(cur_reward_sum[new_ids][:, 0].cpu().numpy().tolist())
                lenbuffer.extend(cur_episode_length[new_ids][:, 0].cpu().numpy().tolist())
                cur_reward_sum[new_ids] = 0
                cur_episode_length[new_ids] = 0

        stop = time.time()
        collection_time = stop - start

max_iterations

同 rl_games 中的 max_epochs

max_iterations参数指的是设置训练过程中的最大迭代次数。这里的“迭代”通常指的是算法在训练过程中重复执行的基本学习步骤,每次迭代都会根据当前的数据和策略来更新模型或策略的参数,以期望找到更优的解决方案。

stable_baseline3中参数

n_steps

同 skrl 中的 rollouts 参数

n_steps 参数指的是在每个环境(或称为每个任务实例)中,每次更新策略或价值函数之前需要执行的步骤数。这个参数与训练过程中的数据收集、策略更新频率以及计算效率等方面紧密相关。

这意味着,在每个环境实例中,智能体会连续执行n_steps个动作,与环境进行交互,并收集这一过程中的状态、动作、奖励等数据。完成这些步骤后,智能体会基于收集到的数据来更新其策略或价值函数。

这里进一步解释了n_steps的作用。如果n_envs是并行运行的环境副本数量,那么rollout buffer(即经验回放缓冲区)的大小将是n_steps * n_envs。这意味着,在每次更新之前,你将从所有环境副本中收集到这么多步骤的经验。

总的来说,n_steps是一个关键的超参数,它影响了模型的训练效率和效果。通过调整n_steps,你可以控制每次更新前收集到的经验数量,进而影响模型的学习速度和稳定性。在实际应用中,你可能需要根据具体任务和环境来实验不同的n_steps值,以找到最优的设置。

n_epochs

n_epochs 参数指的是在每次更新策略网络时,对收集到的数据(即,在一个批次(batch)内收集的轨迹或经验)进行优化的轮次(epochs)数量。

在PPO算法中,为了更新策略网络(通常是神经网络),算法会首先通过与环境交互来收集一定数量的数据(例如,通过多个回合(episodes)的模拟)。这些数据随后被用来更新策略网络,以改善其性能。然而,直接使用这些数据来更新网络可能会导致训练过程不稳定,因为每次迭代中收集的数据分布可能会因为策略的改变而发生显著变化(即,数据分布漂移问题)。

为了缓解这个问题,PPO采用了一种称为“surrogate loss”(替代损失)的技术,它试图在保持新策略和旧策略足够接近的同时,最大化策略的性能。在PPO中,这通常通过限制新旧策略之间的比率(称为KL散度或类似的度量)来实现。

n_epochs 参数就是在使用这些数据来优化策略网络时,对同一批数据进行多少次遍历(epoch)的参数。每次遍历都会使用整个批次的数据来更新网络,但由于网络权重的更新,每次遍历的数据对于网络的“难度”可能会逐渐降低(因为网络正在学习并适应这些数据)。因此,增加n_epochs可以增加网络对这批数据的拟合程度,但也可能导致过拟合于当前批次的数据,从而减少对未来数据的泛化能力。

在实践中,n_epochs 的选择是一个超参数,需要根据具体任务进行调整。较小的n_epochs值可能使训练过程更加稳定,但可能导致学习速度较慢;而较大的n_epochs值可能加速学习过程,但也可能增加过拟合的风险。

skrl中参数

rollouts

number of rollouts before updating

rollouts 指在更新智能体的策略或价值函数之前,需要执行的rollout数量。这里的rollout是一个关键概念,它指的是智能体在环境中进行的一系列模拟交互步骤,用于收集数据并评估或改进当前策略。

这个参数在强化学习的算法设计和实现中起着至关重要的作用,因为它直接关联到数据收集的效率、策略的稳定性和算法的总体性能。

  1. 数据收集:通过执行多个rollout,智能体可以收集到更丰富的数据样本(包括状态、动作、奖励等)。这些数据是后续进行策略评估和改进的基础。增加rollouts的数量可以提高数据的多样性和代表性,从而有助于更准确地评估策略的性能。

  2. 策略稳定性:在执行多个rollout后,智能体可以基于更全面的数据来更新其策略。这有助于减少因单次或少量数据波动导致的策略不稳定现象,提高策略的鲁棒性和可靠性。

  3. 计算效率:虽然增加rollouts的数量可以提高数据的丰富性和准确性,但过多的rollout也会增加计算成本和时间消耗。因此,合理设置rollouts的值可以在保证数据质量的同时,提高计算效率。

  4. 算法性能rollouts的值对算法的性能有显著影响。较少的rollout可能导致数据不足,从而无法充分评估策略的性能;而过多的rollout则可能增加不必要的计算负担。因此,需要根据具体的任务需求和计算资源来合理设置这个参数。

learning_epochs

同stable_baseline3 中的 n_epochs 参数

number of learning epochs during each update

mini_batches

同 rsl_rl 中的 num_mini_batches

Number of mini-batches to sample (default: 1)

learning_epochs

number of learning epochs during each update 

在训练过程中,你会收集智能体与环境交互的数据(即状态、动作、奖励的序列),并使用这些数据来更新智能体的策略。这里,learning_epochs指的就是在每次使用这些数据来更新策略时,算法会重复进行的学习迭代次数。

  1. 更新策略

    • 使用收集到的数据来更新智能体的策略。
    • 在这个过程中,算法会重复执行learning_epochs次迭代。每次迭代都会根据当前的数据集(可能包含多个回合的数据)来优化策略参数,以最大化累积奖励的期望。
    • 每次迭代可能包括计算梯度、更新权重、评估性能等步骤。
  • learning_epochs的值会影响训练的稳定性和效率。过小的值可能导致策略学习不足,而过大的值则可能增加计算成本并导致过拟合。它通常需要与其他超参数(如学习率、批量大小、折扣因子等)一起调整,以获得最佳的学习效果。

timesteps

Total number of timesteps

在Isaac Lab里可以设置 --max_iterations,那么:

timesteps = max_iterations * rollouts

learning_starts

learning_starts参数指的是在算法开始正式学习之前,需要收集多少步的转换样本(即智能体与环境交互的样本)。这些步骤通常用于初始化智能体的经验回放缓冲区(如果算法使用了经验回放机制)或积累足够的初始数据以供算法在后续的学习过程中使用。 

作用

  1. 避免过早学习:在强化学习的早期阶段,智能体可能还没有收集到足够的有代表性的数据来指导其学习。因此,通过learning_starts参数,算法可以延迟学习的开始,直到它积累了足够多的初始数据。这有助于避免智能体在数据不足的情况下进行过早的、可能不准确的学习。

  2. 提高学习稳定性:在收集到足够的初始数据后,智能体的学习过程可能会更加稳定。这是因为初始数据可以帮助算法更好地理解环境的动态特性,并为其后续的学习提供一个更坚实的基础。

  3. 适应不同任务:不同的强化学习任务可能需要不同数量的初始数据来支持学习。通过调整learning_starts参数,算法可以更灵活地适应不同任务的需求,从而优化其性能。

在复杂的游戏或物理控制任务中,智能体可能需要更多的初始数据来理解环境的动态特性,因此learning_starts的值可能会设置得相对较高。而在相对简单的任务中,智能体可能能够更快地开始学习,因此learning_starts的值可以相对较低。

此外,值得注意的是,learning_starts参数并不是所有强化学习算法都会使用的。它更多地出现在那些使用了经验回放机制的算法中,如深度Q网络(DQN)等。在这些算法中,经验回放缓冲区用于存储智能体与环境交互的样本,并在后续的学习过程中随机选择这些样本来更新模型的参数。因此,learning_starts参数在这些算法中尤为重要,因为它决定了算法何时开始使用这些样本来进行学习。


以上只是一小部分,注意还是PPO的超参数,后续有时间继续整理.... 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值