最近在isaac lab中使用各个强化学习框架做对比训练,算法都是用的PPO,但是每个框架里超参数名字都不太一样,各种叫法弄得都混乱了,而且对齐不好很难对比出结论,在这里系统整理一下。
Isaac Lab支持的强化学习框架介绍-CSDN博客https://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算法的工作过程分为两个阶段
- 第一阶段:从零开始(Phase I: Let Policy Play to Gather Data)
- 在这个阶段,策略(Policy)首先被用来“播放以收集数据”(play to gather data)。这意味着策略被放置在环境中,并执行动作以与环境交互,从而生成数据(即“轨迹”Trajectories)。
- 接着,使用这些数据通过“监督学习”(Supervised Learning)和“复杂损失”(with complex loss)来“训练策略”。这里的监督学习可能指的是利用收集到的数据来优化策略,尽管在强化学习中,这通常不是传统意义上的监督学习,而是利用数据来估计梯度并更新策略的参数。
- 这个阶段是一个迭代过程(Iterations),通过多次迭代来不断改进策略。
- 第二阶段:训练策略(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。
这个参数的设置对于模型的训练效果和效率具有显著影响。
其影响包括:
- 加速训练:比全批量处理更快,因为每次处理的数据量更少。
- 提高泛化能力:通过随机选取不同批次的数据,帮助模型学习更多数据分布信息。
- 平衡训练:较大的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可以在保证模型性能的同时,减少训练过程中的不稳定性。这种稳定性有助于模型在更广泛的场景下保持良好的表现。
rl_games中参数
minibatch_size
指 Mini Batch Size 大小
horizon_length
同 skrl 中的 rollouts 参数
horizon_length
参数指的是每个actor(或称为agent)在每个episode中与环境交互的最大步数(或时间步)。在强化学习中,一个episode指的是从初始状态开始,直到达到终止状态(如游戏结束、达到某个目标或达到最大步数限制)为止的完整交互过程。num_minibatches 即 minibatches的个数计算:
num_minibatches = horizon_length * num_actors // minibatch_size
官方解释:
Horizon length per each actor. Total number of steps will be num_actors*horizon_length * num_agents
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 参数
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)数。这里的“轮次”或“迭代”是指算法在整个训练数据集或环境状态上重复执行学习步骤的次数。作用
训练停止条件:
max_epochs
为训练过程设定了一个明确的停止条件。当算法达到指定的轮次后,无论当前性能如何,训练都会停止。这有助于避免无限期的训练,节省计算资源。性能平衡:通过设定合适的
max_epochs
值,可以在模型的性能(如找到更优策略的能力)和训练成本(如时间、计算资源)之间找到平衡。过小的max_epochs
可能导致模型学习不足,而过大的值则可能增加过拟合的风险或不必要的计算开销。实验可重复性:在科研或工业应用中,设定固定的
max_epochs
有助于确保实验的可重复性。这意味着不同的研究人员或团队在相同的条件下应该能够得到相似的结果。
- 需要注意的是,
max_epochs
并不总是决定训练过程的唯一停止条件。在某些情况下,算法可能会因为达到其他条件(如性能收敛、梯度消失/爆炸等)而提前停止。
mini_epochs
Number of miniepochs. Good value is in [1,10]
同 skrl 中的 learning_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
同stable_baseline3 中的 n_steps 参数
number of steps per environment per iteration
num_steps_per_env
参数通常指的是在每个迭代(iteration)中,每个环境(environment)将执行的动作步数(steps)。这个参数在配置强化学习训练过程时非常重要,因为它直接影响到训练的效率、稳定性和最终模型的性能。具体来说,
num_steps_per_env
的作用和意义包括以下几个方面:
控制训练数据量:通过设置每个环境在每个迭代中执行的动作步数,可以控制每次迭代收集到的数据量。更多的数据通常意味着模型可以学习到更多的信息,但也可能导致训练时间增加和过拟合的风险。
平衡训练速度和稳定性:在强化学习中,训练速度和稳定性往往是相互制约的。较小的
num_steps_per_env
值可以加快迭代速度,但可能导致模型学习不够充分;而较大的值则可能增加训练的稳定性,但也会延长训练时间。适应不同的环境和任务:不同的强化学习任务和环境可能需要不同的
num_steps_per_env
值。例如,对于需要长时间交互和复杂决策的任务,可能需要设置较大的值以确保模型能够充分学习;而对于简单的任务,较小的值可能就足够了。与其他参数协同作用:
num_steps_per_env
通常需要与其他训练参数(如学习率、批量大小、迭代次数等)协同作用,以达到最佳的训练效果。
max_iterations
同 rl_games 中的 max_epochs
max_iterations
参数指的是设置训练过程中的最大迭代次数。这里的“迭代”通常指的是算法在训练过程中重复执行的基本学习步骤,每次迭代都会根据当前的数据和策略来更新模型或策略的参数,以期望找到更优的解决方案。
stable_baseline3中参数
n_steps
参数
n_steps
指的是在每个更新周期(即每次模型参数更新之前)中,每个环境需要运行(或模拟)的步数。这个参数在多种强化学习框架和算法中都有应用,特别是在那些使用经验回放(experience replay)或类似机制的算法中,如深度Q网络(DQN)、深度确定性策略梯度(DDPG)等。当你看到这样的参数说明时:
param n_steps: The number of steps to run for each environment per update
这意味着,在模型对参数进行一次更新之前,每个环境实例将连续运行
n_steps
步。这些步骤中产生的经验(通常是状态、动作、奖励和下一个状态的元组)会被存储起来,用于后续的训练过程。
(i.e. rollout buffer size is n_steps * n_envs where n_envs is number of environment copies running in parallel)
这里进一步解释了
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是一个关键概念,它指的是智能体在环境中进行的一系列模拟交互步骤,用于收集数据并评估或改进当前策略。
这个参数在强化学习的算法设计和实现中起着至关重要的作用,因为它直接关联到数据收集的效率、策略的稳定性和算法的总体性能。
数据收集:通过执行多个rollout,智能体可以收集到更丰富的数据样本(包括状态、动作、奖励等)。这些数据是后续进行策略评估和改进的基础。增加
rollouts
的数量可以提高数据的多样性和代表性,从而有助于更准确地评估策略的性能。策略稳定性:在执行多个rollout后,智能体可以基于更全面的数据来更新其策略。这有助于减少因单次或少量数据波动导致的策略不稳定现象,提高策略的鲁棒性和可靠性。
计算效率:虽然增加
rollouts
的数量可以提高数据的丰富性和准确性,但过多的rollout也会增加计算成本和时间消耗。因此,合理设置rollouts
的值可以在保证数据质量的同时,提高计算效率。算法性能:
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
指的就是在每次使用这些数据来更新策略时,算法会重复进行的学习迭代次数。
更新策略:
- 使用收集到的数据来更新智能体的策略。
- 在这个过程中,算法会重复执行
learning_epochs
次迭代。每次迭代都会根据当前的数据集(可能包含多个回合的数据)来优化策略参数,以最大化累积奖励的期望。- 每次迭代可能包括计算梯度、更新权重、评估性能等步骤。
learning_epochs
的值会影响训练的稳定性和效率。过小的值可能导致策略学习不足,而过大的值则可能增加计算成本并导致过拟合。它通常需要与其他超参数(如学习率、批量大小、折扣因子等)一起调整,以获得最佳的学习效果。
timesteps
Total number of timesteps
在Isaac Lab里可以设置 --max_iterations,那么:
timesteps = max_iterations * rollouts
learning_starts
learning_starts
参数指的是在算法开始正式学习之前,需要收集多少步的转换样本(即智能体与环境交互的样本)。这些步骤通常用于初始化智能体的经验回放缓冲区(如果算法使用了经验回放机制)或积累足够的初始数据以供算法在后续的学习过程中使用。作用
避免过早学习:在强化学习的早期阶段,智能体可能还没有收集到足够的有代表性的数据来指导其学习。因此,通过
learning_starts
参数,算法可以延迟学习的开始,直到它积累了足够多的初始数据。这有助于避免智能体在数据不足的情况下进行过早的、可能不准确的学习。提高学习稳定性:在收集到足够的初始数据后,智能体的学习过程可能会更加稳定。这是因为初始数据可以帮助算法更好地理解环境的动态特性,并为其后续的学习提供一个更坚实的基础。
适应不同任务:不同的强化学习任务可能需要不同数量的初始数据来支持学习。通过调整
learning_starts
参数,算法可以更灵活地适应不同任务的需求,从而优化其性能。在复杂的游戏或物理控制任务中,智能体可能需要更多的初始数据来理解环境的动态特性,因此
learning_starts
的值可能会设置得相对较高。而在相对简单的任务中,智能体可能能够更快地开始学习,因此learning_starts
的值可以相对较低。此外,值得注意的是,
learning_starts
参数并不是所有强化学习算法都会使用的。它更多地出现在那些使用了经验回放机制的算法中,如深度Q网络(DQN)等。在这些算法中,经验回放缓冲区用于存储智能体与环境交互的样本,并在后续的学习过程中随机选择这些样本来更新模型的参数。因此,learning_starts
参数在这些算法中尤为重要,因为它决定了算法何时开始使用这些样本来进行学习。
以上只是一小部分,注意还是PPO的超参数,后续有时间继续整理....