乐趣区

关于机器学习:强化学习调参技巧二DDPGTD3SAC算法为例

1. 训练环境如何正确编写

强化学习里的 env.reset() env.step() 就是训练环境。其编写流程如下:

1.1 初始阶段:

先写一个简化版的训练环境。把工作难度降到最低,确保肯定能失常训练。记录失常训练的智能体的分数,与随机动作、传统算法失去的分数做比拟。
DRL 算法的分数应该显著高于随机动作(随机执行动作)。DRL 算法不应该低于传统算法的分数。如果没有传统算法,那么也须要本人写一个部分最优的算法

评估策略的性能: 大部分状况下,能够间接是对 Reward Function 给出的 reward 进行求和失去的每轮收益 episode return 作为策略评分。有时候能够须要间接拿策略的理论分数作为评分
须要保障这个简化版的代码:高效、简洁、可拓展

1.2 改良阶段:

让工作难度逐步提高,对训练环境 env 进行迟缓的批改,时刻保留旧版本的代码同步微调 Reward Function,能够间接代入本人的人类视角,为某些行为增加正负处分。留神处分的均衡(有正有负)。留神不要为 Reward Function 增加太多额定规定,时常回过头勾销一些规定,防止适度改正。
同步微调 DRL 算法,只倡议微调超参数,但不倡议对算法外围进行批改。因为工作变艰难了,所以须要调整超参数让训练变快。同时摸清楚在这个训练环境下,算法对 哪几个超参数是敏感的 。有时候为了节省时间,甚至能够为 off-policy 算法保留一些典型的 trajectory(不倡议在最终验证阶段应用)。
每一次批改,都须要跑一下记录不同办法的分数,确保:随机动作 < 传统办法 < DRL 算法。这样能力及时发现代码逻辑上的谬误。要竭力防止代码中呈现复数个的谬误,因为极难排查。

1.3 收尾阶段:

尝试缓缓删掉 Reward Function 中一些比较复杂的货色,删不掉就算了。
抉择 <font color=”red”>高下两组超参数</font> 再跑一次,确认没有优化空间。

2. 超参数解释剖析

2.1 off-policy 算法中常见的超参数

  • 网络宽度: network dimension number。DRL 全连贯层的宽度(特色数量)
  • 网络层数: network layer number。一个输出张量到输入须要乘上 w 的次数
  • 随机失活: dropout
  • 批归一化:batch normalization
  • 记忆容量: 教训回放缓存 experimence replay buffer 的最大容量 max capacity
  • 批次大小: batch size。应用优化器更新时,每次更新应用的数据数量
  • 更新次数:update times。应用梯度降落更新网络的次数
  • 折扣因子: discount factor、gamma
  • 【网络宽度、网络层数】 越简单的函数就须要越大容量的神经网络去拟合。在须要训练 1e6 步的工作中,我个别抉择 宽度128、256,层数小于 8 的网络(请留神,乘以一个 w 算一层,一层 LSTM 等于 2 层)。应用 ResNet 等构造会有很小的晋升。个别抉择一个稍微冗余的网络容量即可,把调整超参数的精力用在这下面不划算,我倡议这些超参数都粗略地抉择 2 的 N 次方,
因为:避免适度调参,超参数抉择 x +1 与 x- 1 并没有什么区别,然而 x 与 2x 肯定会有显著区别
2 的 N 次方大小的数据,刚好能残缺地放进 CPU 或 GPU 的硬件中进行计算,如 Tensor Core
过大、过深的神经网络不适宜 DRL,
因为:深度学习能够在整个训练完结后再应用训练好的模型。而强化学习须要在几秒钟的训练后马上应用刚训好的模型。这导致 DRL 只能用比拟浅的网络来保障疾速拟合(10 层以下)并且强化学习的训练数据不如有监督学习那么稳固,无奈划分出训练集测试集去防止过拟合,因而 DRL 也不能用太宽的网络(超过 1024),防止参数适度冗余导致过拟合

【dropout、批归一化】 她们在 DL 中失去宽泛地应用,惋惜不适宜 DRL。如果非要用,那么也要抉择十分小的 dropout rate(0~0.2),而且要留神在应用的时候关掉 dropout。我不必 dropout。

益处:在数据有余的状况下缓解过拟合;像 Noisy DQN 那样去促成策略网络摸索
害处:影响 DRL 疾速拟合的能力;稍微减少训练工夫

【批归一化】 通过大量试验,DRL 相对不能间接应用批归一化,如果非要用,那么就要批改 Batch Normalization 的动量项超参数。

【记忆容量】 教训回放缓存 experimence replay buffer 的最大容量 max capacity,如果超过容量限度,它就会删掉最早的记忆。在简略的工作中(训练步数小于 1e6),对于摸索能力强的 DRL 算法,通常在缓存被放满前就训练到收敛了,不须要删除任何记忆。然而,过大的记忆也会拖慢训练速度,我个别会先从默认值 2 17 ~ 2 20 开始尝试,如果环境的随机因素大,我会同步减少记忆容量 与 batch size、网络更新次数,直到迫近服务器的内存、显存下限(放在显存训练更快)

【批次大小、更新次数】 个别我会抉择与网络宽度雷同、或略大的批次大小 batch size。我个别从128、256 开始尝试这些 2 的 N 次方。在 off-policy 中,每往 Replay 更新几个数据,就对应地更新几次网络,这样做简略,但成果个别。(深度学习里)更优良的更新办法是:依据 Replay 中数据数量,成比例地批改更新次数。Don’t Decay the Learning Rate, Increase the Batch Size. ICLR. 2018。,通过验证,DRL 也实用。

【折扣因子】 discount factor、discount-rate parameter 或者叫 gamma。0.99

2.2 on-policy 算法中常见的超参数

同策略(A3C、PPO、PPO+GAE)与异策略(DQN、DDPG、TD3、SAC)的次要差别是:

  • 异策略 off-policy:ReplayBuffer 内能够寄存“由不同策略”收集失去的数据用于更新网络
  • 同策略 on-policy:ReplayBuffer 内只能寄存“由雷同策略”收集失去的数据用于更新网络
    因而以下超参数有不同的抉择办法:
  • 记忆容量:教训回放缓存 experimence replay buffer 的最大容量 max capacity
  • 批次大小:batch size。应用优化器更新时,每次更新应用的数据数量
  • 更新次数:update times。应用梯度降落更新网络的次数

【记忆容量】 on-policy 算法每轮更新后都须要删除“用过的数据”,所以 on-policy 的记忆容量应该大于等于【单轮更新的采样步数】,随机因素更多的工作须要更大的单层采样步数能力取得更多的 轨迹 trajectory,能力有足够的数据去表白环境与策略的互动关系。详见上面 PPO 算法的【单轮更新的采样步数】

【批次大小】 on-policy 算法比 off-policy 更像深度学习,它能够采纳稍大一点的学习率(2e-4)。因为【单轮更新的采样步数】更大,所以它也须要搭配更大的 batch size(29 ~ 212)。如果内存显存足够,我倡议应用更大的 batch size,我发现一些很难调的工作,在很大的 batch size(2 ** 14)背后更容易取得枯燥回升的学习曲线(训练慢然而及其稳固,多 GPU 分布式)。请自行取舍。

【更新次数】 个别咱们不间接设置更新次数,而是通过【单轮更新的采样步数】、【批次大小】和【数据重用次数】一起算出【更新次数】,详见上面 PPO 算法的【数据重用次数】

3. TD3 特有的超参数

  • 摸索噪声方差 exploration noise std
  • 策略噪声方差 policy noise std
  • 提早更新频率 delay update frequency

如果你善于调参,那么能够能够思考 TD3 算法。如果你的算法的 最优策略通常是边界值 ,那么你首选的算法就是 TD3—-<font color=”red”> 最佳策略总在动作边界</font>

【TD3 的摸索形式】 让其很容易在摸索「边界动作」:

  • 策略网络输入张量,通过激活函数 tanh 调整到 (-1, +1)
  • 为动作增加一个 clip 过的高斯噪声,噪声大小由人类指定
  • 对动作再进行一次 clip 操作,调整到 (-1,+1)

益处: 一些工作的最优策略本就存在存在大量边界动作,TD3 能够很快学得很快。
害处: 边界动作都是 - 1 或 +1,这会升高策略的多样性,网络须要在多样性好数据上训练才不容易过拟合。对于 clip 到正负 1 之间的 action,过大的噪声方差会产生大量边界动作。

【摸索噪声方差 exploration noise std】 就是上图中的 s。须要先尝试小的噪声方差(如 0.05),而后逐步加大。大的噪声方差刻意多摸索边界值,特定工作下能让摸索更快。且高噪声下训练进去的智能体更 robust(持重、耐操)
请留神:过大的噪声方差(大于上图蓝线的 0.5)并不会让摸索动作靠近随机动作,而是让摸索动作更靠近繁多的边界动作。此外,过大的噪声会影响智能体性能,导致她不容易摸索到某些 state。

因而,适合的摸索噪声方差只能缓缓试出来,TD3 适宜违心调参的人应用。在做出谬误动作后容易挽回的环境,能够间接尝试较大的噪声。
咱们也能够模拟 epslion-Greedy,设置一个应用随机动作的概率,或者每距离几步摸索就不增加噪声,甚至也在 TD3 中应用摸索衰减。这些操作都会减少超参数的数量,慎用。

【策略噪声方差 policy noise std】 确定了摸索噪声后,策略噪声只须要比摸索噪声稍大(1~2 倍)。TD3 对策略噪声的解释是“计算 Q 值时,因为类似的动作的 Q 值也是类似的,所以 TD3 也为动作加一个噪声,这能使 Q 值函数更加润滑,进步训练稳定性 咱们还能多应用几个增加噪声的动作,甚至应用加权重要性采样去算出更稳固的 Q 值冀望。在确定策略梯度算法里的这种“在计算 Q 值时,为动作加 noise 的操作”,让 TD3 变得有点像随机策略梯度。无论是否有 clip,策略噪声方差最大也不该超过 0.5。

【提早更新频率 delay update frequency】 TD3 认为:引入指标网络进行 soft update 就是为了进步训练稳定性,那么既然 network 不够稳固,那么咱们应该提早更新指标网络 target network,即多更新几次 network,而后再更新一次 target network。从这个想法再拓展进来,咱们甚至能够模拟 TTUR 的思维做得更粗疏一点,针对双层优化问题咱们能做:

环境随机因素多,则须要尝试更大的提早更新频率,可尝试的值有 1~8,默认值为 2
提供策略梯度的 critic 能够多更新几次,再更新一次 actor,可尝试的值有 1~4<

提供策略梯度的 critic 能够设计更大的学习率,例如让 critic 的学习率是 actor 的 1~10 倍

因为 critic 须要解决比 actor 更多的数据,因而倡议让 critic 网络的宽度略大于 actor

4. SAC 特有的超参数

只管上面列举了 4 个超参数,然而后三个超参数能够间接应用默认值(默认值只会无限地影响训练速度),第一个超参数甚至能够间接通过计算抉择进去,不须要调整。

  • reward scale 按比例调整处分
  • alpha 温度系数 或 target entropy 指标 策略熵
  • learning rate of alpha 温度系数 alpha 的学习率
  • initialization of alpha 温度系数 alpha 的初始值
    SAC 有极少的超参数,甚至这些超参数能够在训练开始前就凭教训确定。
    任何存在多个 loss 相加的指标函数,肯定须要调整系数 lambda,例如 SAC 算法、共享了 actor critic 网络的 A3C 或 PPO,应用了辅助工作的 PPG。咱们须要确定好各个 lambda 的比例。SAC 的第二篇论文退出了主动调整 温度系数 alpha 的机制,处于 lambda2 地位的温度 alpha 曾经用于主动调整策略熵了,所以咱们只能批改 lambda1。

reward scaling 是指间接让 reward 乘以一个常数 k (reward scale),在不毁坏 reward function 的前提下调整 reward 值,从而间接调整 Q 值到适合的大小。批改 reward scale,相当于批改 lambda1,从而让能够让 reward 项 和 entropy 项 它们传递的梯度大小靠近。与其余超参数不同,只有咱们通晓训练环境的累计收益范畴,咱们就能在训练前,间接随便地选定一个 reward scaling 的值,让累计收益的范畴落在 -1000~1000 以内即可,不须要精密调整:

【温度系数、指标策略熵】 Temperature parameters (alpha)、target ‘policy entropy’。SAC 的第二篇论文退出了主动调整 温度系数 alpha 的机制:通过主动调整温度系数,做到让策略的熵维持在指标熵的左近(不让 alpha 过大而影响优化,也不让 alpha 过小而影响摸索)

策略熵的默认值是 动作的个数 的负 log,详见 SAC 的第二篇论文 section 5 Automating Entropy Adjustment for Maximum Entropy。SAC 对这个超参数不敏感,个别不须要批改。有时候策略的熵太大将导致智能体无奈摸索到某些有劣势的 state,此时须要将指标熵调小。

【温度系数 alpha 的学习率】 learning rate of alpha 温度系数 alpha 最好应用 log 模式进行优化,因为 alpha 是示意倍数的负数。个别地,温度系数的学习率和网络参数的学习率保持一致(个别都是 1e-4)。当环境随机因素过大,导致每个 batch 算进去的策略熵 log_prob 不够稳固时,咱们须要调小温度系数的学习率。

【温度系数 alpha 的初始值】 initialization of alpha 温度系数的初始值能够轻易设置,只有初始值不过于离奇,它都能够被主动调整为适合的值。个别偷懒地将初始值设置为 log(0) 其实过大了,这会缩短 SAC 的预热工夫,我个别设置成更小的数值,详见 The alpha loss calculating of SAC is different from other repo · Issue #10 · Yonv1943/ElegantRL。

5. 本人模型训练调参记录(TD3)

5.1 模型环境参数

惯例参数:

无人机初始地位 用户初始地位 无人机笼罩半径(米) 最大关联数 UAV 航行间隔
【20,180】 【20,180】 【75,100】 【20,30】 【0,30】

时延记录:

前景(MB) 0.125 0.5 1 1.25 1.5
背景(MB) 0.5 2 4 5 6
local(ms) 13 52 105 150
UAV(ms) 47 29.4 39.7 50.6
coop(ms) 44 29.6 38.2 —- 47

超参数:

ACTOR_LR CRITIC_LR BATCH_SIZE GAMMA TAU
【1e-4,1e-5】 【1e-3,1e-4】 【256,512】 0.99】 0.005
EXPL_NOISE policy_noise noise_clip policy_freq hid_size
0.1、0.05 0.2、0.1 0.5 【1,8】默认:2 【128,512】

目前采纳组合有如下:

  • ACTOR_LR = 1e-4 # Actor 网络的 learning rate 学习率 1e-3
  • CRITIC_LR = 1e-3 # Critic 网络的 learning rate 1e-3
  • EXPL_NOISE = 0.05 # 动作噪声方差
  • self.hid_size=256
  • self.hid1_size=128

    • policy_noise=0.1,
  • noise_clip=0.5,
  • policy_freq=2

5.2 调参成果:

能够看到模型训练的稳定性和收敛成果越来越好,调多了你也就晓得哪些超参数影响的大了

5.3 造成稳定的起因,而后采纳对应的解决方案:

  • 如果在策略网络没有更新的状况下,Agent 在环境中失去的分数差别过大。那么这是环境产生扭转造成的:
    -1. 每一轮训练都须要 env.reset(),然而,有时候重置环境会扭转难度,这种状况下造成的稳定无奈打消。
    -2. 有时候是因为 DRL 算法的泛化性不够好。此时咱们须要调大相干参数减少摸索,以训练出泛化性更好的策略。
  • 如果在策略网络没有更新的状况下,Agent 在环境中失去的分数差别较小。等到更新后,相邻两次的分数差别很大。那么这是环境产生扭转造成的:1. 把 learning rate 调小一点。2. 有时候是因为算法适度激励摸索而导致的,调小相干参数即可。
退出移动版