MATLAB强化学习实战(十三) 使用强化学习智能体训练Biped机器人行走


这个例子展示了如何使用深度确定性策略梯度(DDPG) agent和双延迟深度确定性策略梯度(TD3) agent训练双足机器人行走,并比较了这些训练过的agent的性能。本例中的机器人采用Simscape多体建模。

有关这些智能体的更多信息,请参见深度确定性策略梯度智能体双延迟深度确定性策略梯度智能体

为了在本例中进行比较,两种agent都在具有相同模型参数的两足机器人环境中进行训练。智能体也被配置为具有以下共同设置。

  1. 两足机器人的初始状态策略
  2. 行动者和评论者的网络结构,受到[2]的启发
  3. 行动者和评论者表示的选项
  4. 训练选项(采样时间,折扣因子,小批量尺寸,经验缓冲长度,探索噪声)

代码下载

两足机器人模型

本例中的强化学习环境是一个两足机器人。训练目标是用最小的控制努力使机器人在直线上行走
在这里插入图片描述
将模型参数加载到MATLAB工作空间中。

robotParametersRL

打开Simulink模型。

mdl = 'rlWalkingBipedRobot';
open_system(mdl)

在这里插入图片描述
机器人模型使用Simscape Multibody。
在这里插入图片描述
对于这个模型:

  1. 在中立的0弧度体位,两个腿是伸直的,脚踝平。
  2. 使用Simscape Multibody中的 Spatial Contact Force(Simscape Multibody)块建模足部接触。
  3. agent可以通过施加从-3到3 N·m的扭矩信号来控制机器人两条腿上的3个独立关节(踝关节、膝关节和髋关节)。实际计算的动作信号在-1到1之间归一化。

环境向智能体提供了29个观察值,这些观察值是:

  1. 躯干中心的 y (侧向)和 z (垂直)平移。z 方向的平移被归一化为与其他观测值相似的范围。
  2. x (向前)、 y (横向)和 z (垂直)平移速度。
  3. 躯干的偏航、倾斜和滚转角度。
  4. 躯干的偏航、俯仰和侧滚角速度。
  5. 双腿3个关节(踝关节、膝关节、髋关节)的角位置和速度。
  6. 上一个时间步骤的操作值。

如果出现以下任何一种情况,则该事件终止。

  1. 机器人躯干重心在 z 方向(下落)小于0.1米,在 y 方向(横向运动)大于1米。
  2. 滚转、俯仰或偏航的绝对值大于0.7854 rad。

下面的奖励函数 r t r_t rt,在每个时间步提供的灵感来自于[1]。这个奖励函数通过为积极的前进速度提供积极的奖励来鼓励智能体前进。它也鼓励智能体避免episode 终止,通过在每一个时间步骤提供一个恒定的奖励(25 Ts Tf)。奖励函数中的其他条款是对横向和纵向转变的重大变化的惩罚,以及对过度控制作用的使用。
在这里插入图片描述

扫描二维码关注公众号,回复: 12845614 查看本文章

这里:

  1. v x v_x vx是机器人在 x 方向(向目标前进)的平移速度。
  2. y 是机器人从目标直线轨迹的横向移动位移。
  3. z ^ \hat{z} z^ 是机器人质心的归一化垂直平移位移。
  4. U t − 1 i U^i_{t-1} Ut1i是上一个时间步长的关节 i 的扭矩。
  5. Ts 是环境的采样时间。
  6. Tf 是环境的最终模拟时间。

创建环境接口

创建观察规范。

numObs = 29;
obsInfo = rlNumericSpec([numObs 1]);
obsInfo.Name = 'observations';

创建动作规范。

numAct = 6;
actInfo = rlNumericSpec([numAct 1],'LowerLimit',-1,'UpperLimit',1);
actInfo.Name = 'foot_torque';

为步行机器人模型创建环境接口。

blk = [mdl,'/RL Agent'];
env = rlSimulinkEnv(mdl,blk,obsInfo,actInfo);
env.ResetFcn = @(in) walkerResetFcn(in,upper_leg_length/100,lower_leg_length/100,h/100);

选择和创建训练智能体

这个示例提供了使用 DDPG 或 TD3智能体来训练机器人的选项。要使用您选择的智能体仿真机器人,请相应地设置 AgentSelection 标志。

AgentSelection = 'TD3';
switch AgentSelection
    case 'DDPG'
        agent = createDDPGAgent(numObs,obsInfo,numAct,actInfo,Ts);
    case 'TD3'
        agent = createTD3Agent(numObs,obsInfo,numAct,actInfo,Ts);
    otherwise
        disp('Enter DDPG or TD3 for AgentSelection')
end

createDDPGAgent 和 createTD3Agent 帮助函数执行以下操作。

  1. 创建行动者和评论者网络。
  2. 为行动者和评论者表示指定选项。
  3. 使用创建的网络和指定的选项创建行动者和评论者表示。
  4. 配置特定于智能体的选项。
  5. 创建智能体。

DDPG Agent

一个 DDPG 智能体使用评论值函数表示来近似给予观察和行动的长期奖励。DDPG 智能体通过使用行动者表示来决定采取给定的观察值的动作。这个例子的行动者和评论者网络的灵感来自于[2]。

有关创建 DDPG 智能体的详细信息,请参阅 createDDPGAgent 帮助函数。有关配置 DDPG 智能体选项的信息,请参见 rddpgagentoptions。

有关创建深层神经网络值函数表示的详细信息,请参阅创建策略和值函数表示。有关为 DDPG 智能体创建神经网络的示例,请参阅 trainddpg 智能体控制双积分器系统

TD3 Agent

TD3智能体使用两个评价函数表示近似给定的观察和行为的长期奖励。TD3智能体使用行动者表示决定采取给定的观察值的操作。该智能体使用的行动者和评论者网络的结构与 DDPG 智能体使用的结构相同。

一个 DDPG 代理可能会高估 q 值。由于这个 q 值用于更新智能体的策略(行动者) ,所以结果策略可能是次优的,累积训练错误可能导致不同的行为。TD3算法是 DDPG 的扩展,通过防止对 q 值的过高估计,使其更加鲁棒。

  1. TD3智能体分别独立学习两个评论网络,并利用最小值函数估计更新行动者(策略)。这样做可以防止后续步骤中的错误积累和对 q 值的过高估计。
  2. 加入目标策略噪声ーー在目标动作中加入夹持噪声,以平滑 q 函数值。这样做可以防止学习一个不正确的尖峰噪声值估计。
  3. 延迟策略和目标更新ー对于 TD3智能体,建议延迟行动者的网络更新,因为它允许 q 函数在更新策略之前有更多的时间来减少错误(接近所需的目标)。这样做可以防止价值估计的差异,并导致更高质量的策略更新。

有关创建 TD3智能体的详细信息,请参阅 createTD3Agent helper 函数。有关配置 TD3智能体选项的信息,请参见 rlTD3AgentOptions。

指定训练选项和训练智能体

对于本例,DDPG 和 TD3智能体的训练选项是相同的。这些选项基于以下要求。

  1. 每个训练部分有2000episode ,每个episode 持续最多的 maxSteps 时间步骤。
  2. 在“episode 管理器”对话框中显示训练进度(设置“Plots ”选项) ,并禁用命令行显示(设置“Verbose ”选项)。
  3. 只有当训练达到最大系列长度时才终止训练。这样做可以比较多个智能体在整个训练过程中的学习曲线。
maxEpisodes = 2000;
maxSteps = floor(Tf/Ts);
trainOpts = rlTrainingOptions(...
    'MaxEpisodes',maxEpisodes,...
    'MaxStepsPerEpisode',maxSteps,...
    'ScoreAveragingWindowLength',250,...
    'Verbose',false,...
    'Plots','training-progress',...
    'StopTrainingCriteria','EpisodeCount',...
    'StopTrainingValue',maxEpisodes,...
    'SaveAgentCriteria','EpisodeCount',...
    'SaveAgentValue',maxEpisodes);

若要并行训练智能体,请指定以下训练选项。并行训练需要并行计算 ToolboxTM。如果没有安装并行计算工具箱软件,请将 Parallel 设置为 false

  1. 将 useballow 选项设置为 true。
  2. 异步并行地训练智能体。
  3. 每32个步骤之后,让每个worker向主机发送经验。DDPG 和 TD3智能体要求worker向主机发送经验。
trainOpts.UseParallel = true;
trainOpts.ParallelizationOptions.Mode = 'async';
trainOpts.ParallelizationOptions.StepsUntilDataIsSent = 32;
trainOpts.ParallelizationOptions.DataToSendFromWorkers = 'Experiences';

使用 Train 函数训练智能体。这个过程是计算密集型的,需要几个小时来完成每个智能体。若要在运行此示例时节省时间,请通过将 doTraining 设置为 false 来加载预训练的智能体。要自己训练智能体,请将 doTraining 设置为 true。由于在并行训练的随机性,你可以从下面的情节得到不同的训练结果。这些经过训练的智能体由4个worker并行训练。

doTraining = false;
if doTraining    
    % Train the agent.
    trainingStats = train(agent,env,trainOpts);
else
    % Load a pretrained agent for the selected agent type.
    if strcmp(AgentSelection,'DDPG')
       load('rlWalkingBipedRobotDDPG.mat','agent')
    else
       load('rlWalkingBipedRobotTD3.mat','agent')
    end  
end

在这里插入图片描述
在这里插入图片描述

对于前面的示例训练曲线,DDPG 和 TD3智能体每个训练步骤的平均时间分别为0.11和0.12秒。TD3智能体每步需要更多的训练时间,因为它更新两个评论者网络,而 DDPG 只需更新一个评论者网络。

仿真训练过的智能体

固定随机生成器种子的再现性。

rng(0)

为了验证训练过的智能体的性能,在双足机器人环境下进行仿真。有关智能体仿真的更多信息,请参见 rlSimulationOptionssim

simOptions = rlSimulationOptions('MaxSteps',maxSteps);
experience = sim(env,agent,simOptions);

在这里插入图片描述

比较智能体性能

在下面的智能体比较中,每个智能体被训练五次,每次使用不同的随机种子。由于并行训练中随机性和随机性的影响,每次训练的学习曲线是不同的。由于对智能体进行多次运行的训练需要几天的时间来完成,所以这种比较使用了经过训练的智能体。

comparePerformance('DDPGAgent','TD3Agent')

在这里插入图片描述
在这里插入图片描述

根据 Learning curve comparison 比较图:

  1. DDPG 似乎学得更快了(平均600 episode 左右) ,但是达到了局部极小值。TD3启动较慢,但最终比 DDPG 获得更高的回报,因为它避免了对 q 值的过高估计。
  2. TD3智能体的学习曲线稳步改善,表明与 DDPG 智能体相比,其稳定性有所提高。

根据Episode Q0 comparison的比较情节:

  1. 对于 TD3智能体,折扣长期报酬(2000 episode )的评论者估计低于 DDPG 智能体。这是因为 TD3算法在更新目标时采用了保守的方法,使用了两个最小 q 函数。由于对目标的延迟更新,这种行为得到了进一步的增强。
  2. 虽然 TD3对这2000 episode 的估计是低的,但是 TD3智能体在 Q0值上有稳定的增加,这与 DDPG 的智能体不同。

在这个例子中,训练被停止在2000 episode 。对于一个较大的训练周期,TD3智能体的估计值稳步增加,显示了收敛到真正折现的长期报酬的潜力。

有关如何训练DDPG智能体走路以Simscape™Multibody™建模的人形机器人的另一个示例,请参阅训练人形机器人Walker(Simscape Multibody)。 有关如何训练DDPG智能体行走四足机器人的示例,请参阅使用DDPG智能体的四足机器人运动

References

[1] Heess, Nicolas, Dhruva TB, Srinivasan Sriram, Jay Lemmon, Josh Merel, Greg Wayne, Yuval Tassa, et al. ‘Emergence of Locomotion Behaviours in Rich Environments’. ArXiv:1707.02286 [Cs], 10 July 2017. https://arxiv.org/abs/1707.02286.

[2] Lillicrap, Timothy P., Jonathan J. Hunt, Alexander Pritzel, Nicolas Heess, Tom Erez, Yuval Tassa, David Silver, and Daan Wierstra. ‘Continuous Control with Deep Reinforcement Learning’. ArXiv:1509.02971 [Cs, Stat], 5 July 2019. https://arxiv.org/abs/1509.02971.

[3] Fujimoto, Scott, Herke van Hoof, and David Meger. ‘Addressing Function Approximation Error in Actor-Critic Methods’. ArXiv:1802.09477 [Cs, Stat], 22 October 2018. https://arxiv.org/abs/1802.09477.

猜你喜欢

转载自blog.csdn.net/wangyifan123456zz/article/details/109675162