20与19的PushBlock.yaml一样:https://github.com/Unity-Technologies/ml-agents/blob/develop/config/ppo/PushBlock.yaml
下载后的配置文件路径在 E:\ml-agents-release_19\config\ppo\PushBlock.yaml
目录
2.1.8 learning_rate_schedule 学习率调整策略
2.6 time_horizon 每个训练步长包含的最大时间步数
配置文件内容-PushBlock.yaml
behaviors:
PushBlock:
trainer_type: ppo
hyperparameters:
batch_size: 128
buffer_size: 2048
learning_rate: 0.0003
beta: 0.01
epsilon: 0.2
lambd: 0.95
num_epoch: 3
learning_rate_schedule: linear
network_settings:
normalize: false
hidden_units: 256
num_layers: 2
vis_encode_type: simple
reward_signals:
extrinsic:
gamma: 0.99
strength: 1.0
keep_checkpoints: 5
max_steps: 2000000
time_horizon: 64
summary_freq: 60000这是一个ML-Agents配置文件的示例,以下是其中各个参数的详细的解释:
- behaviors:行为列表,指定了每个行为的训练设置和网络架构。
- PushBlock:行为名称。
- trainer_type:训练器的类型,这里是PPO。
- hyperparameters:超参数,包括以下几个:
- batch_size:每个训练批次的大小。
- buffer_size:经验缓存的大小。
- learning_rate:学习率。
- beta:熵正则化参数。
- epsilon:控制策略更新步长的参数。
- lambd:GAE参数。
- num_epoch:PPO算法中的epoch数。
- learning_rate_schedule:学习率调整策略,这里是线性调整。
- network_settings:神经网络设置,包括以下几个:
- normalize:是否对输入数据进行归一化处理。
- hidden_units:每个隐藏层中神经元的数量。
- num_layers:隐藏层数量。
- vis_encode_type:可视化编码类型,这里是simple。
- reward_signals:奖励信号设置,包括以下几个:
- extrinsic:外部奖励信号,包括以下两个参数:
- gamma:折扣率。
- strength:奖励信号权重。
- keep_checkpoints:保存检查点的数量。
- max_steps:最大训练步数。
- time_horizon:每个训练步长包含的最大时间步数。
- summary_freq:训练日志的记录频率。
batch_size是指在一次参数更新时所使用的样本数。在深度学习中,通常将训练数据划分为若干个batch,每次从一个batch中选取batch_size个样本进行训练,直到使用完所有的batch。在训练中,batch_size的大小通常会对训练结果产生影响。较小的batch_size可以提高训练速度,但可能会使模型更容易过拟合;而较大的batch_size则可能会使模型更稳定,但训练速度较慢。
buffer_size
指的是智能体的经验回放缓冲区的大小,即可以存储的经验元组数量。经验回放缓冲区是在训练智能体时用来随机采样经验的,这样可以避免样本的相关性,提高训练效率。较大的 buffer_size
可以带来更好的样本效率和更稳定的训练,但同时也会增加计算和内存消耗。
学习率是深度学习中的一个超参数,用于控制权重更新的速率。它决定了每次迭代中权重更新的幅度,通常会对训练结果产生重大的影响。如果学习率太小,训练速度会很慢;如果学习率太大,可能会导致训练不稳定,甚至发生梯度爆炸或梯度消失的问题。因此,选择适当的学习率对于获得良好的训练效果非常重要。在ML-Agents中,学习率是训练中需要调整的超参数之一。
beta参数在强化学习中用于控制策略熵的惩罚力度,从而鼓励智能体探索更多的动作,以更好地探索环境并提高训练效果。在PPO算法中,熵正则化被用于改进策略梯度的计算,从而使得策略的更新更加稳定。beta值越大,熵正则化的惩罚力度越大,智能体探索新的动作的可能性越高。beta值越小,探索性越低,智能体更可能采取已知的高回报策略。
epsilon是PPO算法中控制策略更新步长的一个超参数,用来平衡新旧策略之间的相对重要性。在PPO算法中,新的策略更新一定程度后,需要与旧的策略进行比较和衡量。而epsilon控制着新旧策略之间的相对重要性,较小的epsilon意味着更加保守的更新,更大的epsilon意味着更加大胆的更新。通常情况下,epsilon取值在0.1到0.3之间。
在RL中,GAE(Generalized Advantage Estimation)是一种计算优势估计的技术。λ(lambda)是一个超参数,用于控制GAE计算中当前估计和下一个估计的相对重要性。lambda=0时,使用TD-error,lambda=1时,完全使用MC-return,0 < lambda < 1时,则权衡二者的优势。因此,在上述代码中,lambd是GAE算法中的超参数,用于权衡TD-error和MC-return。
TD-error和MC-return都是强化学习中用于估计价值函数的方法。
TD-error(Temporal Difference error)是通过比较当前估计值和下一个状态的估计值来更新价值函数的。在TD学习中,代理会在状态s下执行一个动作a,观察到环境转移到下一个状态s',并收到立即的奖励r。代理会使用当前的估计值V(s)来计算一个TD目标,即r + γV(s'),其中γ是折扣因子。TD-error就是TD目标与当前的估计值V(s)之差,即δ = r + γV(s') - V(s)。代理使用δ来更新V(s)。这种方法的好处是可以在线更新,不需要等待整个回合结束才能更新。
MC-return(Monte Carlo return)是在完成一个回合之后,将回合中的所有奖励累加起来作为估计值来更新价值函数的。代理在每个时间步t都执行一个动作a,观察到环境转移到下一个状态s',并收到立即的奖励r。当代理到达终止状态或者达到最大时间步时,MC-return就是回合中所有奖励的累加值G。代理使用G来更新V(s)。这种方法的好处是可以更好地处理延迟奖励,但需要等待整个回合结束才能更新。
num_epoch指的是在每次更新策略时要循环的迭代次数,PPO算法会多次循环更新策略来利用样本数据。每次循环迭代可以理解为是一个epoch,这个参数控制了在每次策略更新中要循环的迭代次数。
learning_rate_schedule指的是学习率的调整策略,这里使用的是线性调整。
常见的学习率调整策略包括:
①固定学习率:在训练过程中保持不变的学习率。
②学习率衰减:训练初期使用较大的学习率,训练后期逐渐减小学习率的大小。
③周期性调整:在训练过程中周期性地调整学习率大小,通常会先使用较大的学习率,再逐渐减小。
④自适应调整:根据模型训练情况自动调整学习率的大小。常见的自适应方法包括Adagrad、RMSprop、Adam等。
⑤余弦退火:学习率在训练过程中按照余弦函数的形式逐渐减小。
不同的调整策略适用于不同的场景和模型,需要根据实际情况进行选择。
normalize:是否对输入数据进行归一化处理。如果设置为True,将对连续输入进行归一化处理,使其具有0均值和1标准差。
归一化(Normalization)是一种数据预处理技术,通常用于将数据缩放到相似的范围,以提高算法的性能和精度。在机器学习中,归一化可以使特征值在同一数量级上,防止某些特征对结果的影响过大。通常采用最小-最大归一化(Min-Max Normalization)或者标准化(Standardization)进行归一化处理。
hidden_units
指的是神经网络中每个隐藏层中神经元的数量。隐藏层是指在输入层和输出层之间的一层或多层神经元层,用于学习输入数据的特征表示。每个隐藏层中的神经元数量越多,模型的表达能力也越强,但也会增加训练的复杂度和计算时间。因此,hidden_units
的选择需要根据具体任务和数据的特点来进行调整。
num_layers
表示神经网络中隐藏层的数量。隐藏层是指除了输入和输出层之外的神经网络层,其作用是将输入数据进行非线性转换,提取特征并将其映射到输出层。隐藏层的数量和大小都是可以调整的,不同的网络结构对应不同的复杂度和表达能力,需要根据具体任务进行选择。一般来说,层数和神经元的数量越多,网络的表达能力就越强,但是训练的时间和计算成本也会相应增加,需要在表达能力和效率之间进行权衡。
vis_encode_type
参数用于指定使用何种可视化编码类型。在本例中,使用了simple
编码类型。具体来说,这种编码方式将每个可视化观测映射到一个256
维的向量中,然后通过一个全连接层将这些向量拼接在一起,作为策略网络的输入。这种编码方式相对简单,适用于观测空间较小的情况。对于观测空间较大的情况,可能需要使用更加复杂的编码方式,以提高模型的表现力。
在ML-Agents中,可视化编码类型包括:
①Simple:将观测值的每个维度进行归一化处理,然后直接作为输入。
②Nature:将观测值进行二值化处理。
③Pixels:将观测值作为像素值,即将观测值作为图像进行处理。
④Depth:将观测值作为深度图像进行处理。
⑤Graph:将游戏中的场景映射为一个图,节点代表游戏中的对象,边代表它们之间的关系。适用于需要考虑场景中物体间关系的场景,例如社交网络分析。
不同的编码类型适用于不同的场景,需要根据具体情况进行选择。例如,对于需要处理图像数据的场景,Pixels编码类型通常是最合适的选择。
在 ML-Agents 中,reward_signals 是一个用于配置奖励信号的部分。它允许开发者设置不同的奖励信号来指导智能体的学习过程。
具体来说,reward_signals 可以包括多个奖励信号,每个奖励信号都具有不同的配置参数,例如强度、折扣率等。常见的奖励信号包括:
以上仅是一些常见的奖励信号,开发者可以根据具体应用场景自由选择和配置不同的奖励信号。
外部奖励信号包括以下两个参数:gamma折扣率和strength奖励信号权重。
在ML-Agents中,外部奖励信号(extrinsic reward signal)指的是由环境外部传递给智能体的奖励信号,通常是由人类指定的任务目标,用于指导智能体学习正确的行为。在ML-Agents中,可以通过设置reward_signals参数来指定使用哪些奖励信号,并对其进行参数调整。例如,在给定的配置文件中,设置了extrinsic奖励信号的折扣率为0.99,强度为1.0,表示在训练智能体时,会根据每个智能体在环境中获得的外部奖励信号来计算其总奖励,并据此更新智能体的策略。
在强化学习中,gamma是一个重要的参数,用于衡量未来奖励的折扣因子。它的取值范围是[0,1],表示在当前时间步获得的奖励与未来奖励的重要性之间的平衡。gamma越接近1,就越强调未来的奖励;gamma越接近0,就越强调当前的奖励。
在ML-Agents中,奖励信号的strength参数用于控制该奖励信号对智能体决策的影响程度。它的取值范围通常为0到1之间,其中0表示完全不考虑该奖励信号,1表示该奖励信号对决策的影响最大化。通常情况下,strength参数会根据实际情况进行调整以提高训练效果。
keep_checkpoints
参数指定要保留的最近训练检查点的数量。在训练过程中,ML-Agents会定期保存检查点,以便在训练中断时能够恢复。默认情况下,ML-Agents会保存最近的5个检查点。如果您想要保留更多或更少的检查点,可以相应地调整此参数。
ML-Agents的检查点文件通常是以.ckpt
作为后缀名的二进制文件。这些文件包含了训练过程中神经网络的权重、优化器的状态以及其他相关的信息。在训练过程中,模型的检查点可以被定期保存以防止训练意外中断,同时也可以使用这些检查点来恢复之前的训练进度或者在训练完成后用于推理。
在ML-Agents中,检查点是以 TensorFlow checkpoint 格式进行保存的,通常以 .ckpt 文件作为后缀。这些文件包含了在训练过程中神经网络的权重和偏差等参数,以及其他信息,如训练步数、训练器类型等。这些信息可以用来恢复训练或使用训练好的模型进行推理。
max_steps
参数指定了模型训练的最大步数,达到该步数后训练会自动停止。在训练过程中,ML-Agents会周期性地保存训练的检查点,以便后续可以继续训练。
在 ML-Agents 中,训练过程中的一个时间步长(time step)通常是指代理与环境交互的一次操作。在这个操作中,代理会接收环境传递过来的状态(state)信息,并根据自身的策略(policy)选择一个动作(action)来执行,然后将这个动作的结果传递回环境,获得一个奖励(reward)并观察下一个状态。因此,时间步长的大小是由环境的物理动力学、代理的行为以及任务的要求等多方面因素综合决定的。
而 time_horizon
则指定了每个训练步长包含的最大时间步数。在 RL 中,一些任务需要代理在未来的时间步中做出正确的决策,因此需要在单个训练步长中考虑多个时间步。 time_horizon
的大小取决于任务的需求,通常需要根据具体情况进行设置,以便让代理有足够的时间来处理任务中的各种因素。
问:时间步长与训练步长的区别?
在深度强化学习中,我们通常使用时间步(time step)来衡量训练的进程,也被称为“环境步骤”(environment step)。一个时间步定义为智能体与环境进行一次交互的过程,包括观察当前状态、执行动作、接收奖励以及观察下一个状态。一个训练步长(training step)包含多个时间步,它是指模型参数每次更新的时间间隔。因此,训练步长是模型参数的更新频率。在ML-Agents中,time_horizon定义了一个训练步长中包含的时间步的最大数量。
summary_freq
指定了训练过程中记录训练日志的频率,单位为训练步数。例如,如果summary_freq
的值为60000,那么每训练60000步就会记录一次训练日志。记录的内容包括训练过程中的平均损失、策略熵、学习率等信息。可以通过这些日志了解训练的进展情况以及模型的性能表现。