Skip to content

强化学习

规划

首先是深度强化学习 然后是扩散模型的运动控制,缺点是速度慢,需要数秒去决策 虚拟墙:一个虚拟臂和一个虚拟墙对比真实墙的训练。

有人解释说Transformer不适合做强化学习。但后面任务分离了。

DQN(Deep Reinforcement Learning)

学习任务按基础和高阶进行分级,分别训练。

DDPG

DDPG深度确定性策略梯度

(i)策略梯度方法 ,以Asynchronous Advantage Actor-Critic(A3C)(Mnih et al 2016)是一个代表性的例子,

(ii)Q值学习方法 ,一个代表性的例子是Deep Q-Networks(DQN)(Mnih等,2015)。

分类

Offline RL :不和环境交互,从轨迹中学习经验知识。

环境

Gym和Gymnasium https://gymnasium.farama.org/
IsaacGym :

  • IsaacGym 是一个通过端到端GPU加速提供强化学习计算的平台,NVIDIA的
  • Ubuntu 18.04, or 20.04. Python 3.6, 3.7, or 3.8 Minimum recommended NVIDIA driver version: 470.74 (470 or above required) Minimum required hardware: NVIDIA Pascal or later GPU with at least 8gb of VRAM

确定策略梯度↑ ↓ 随机策略梯度

  • DPG(Deterministic Policy Gradient 确定策略梯度),确定策略网络只输出一个确定的action,然后加上一个人为指定的noise 去完成探索。

  • TD3(TDDD,Twin Delay DDPG),擅长调参的人才建议用,因为它影响训练的敏感超参数很多。它从Double DQN那里继承了Twin Critic,用来降低高估误差;它用来和随机策略梯度很像的方法:计算用于更新TD-error的Q值时,给action加上了噪声,用于让Critic拟合更平滑的Q值估计函数。TD3建议 延迟更新目标网络,即多更新几次网络后,再使用 soft update 将网络更新到target network上,我认为这没有多大用,后来的其他算法也不用这个技巧。TD3还建议在计算Q值时,为动作添加一个噪声,用于平滑Critic函数,在确定策略中,TD3这么用很像“随机策略”。

  • A3C(Asynchronous Advantage Actor-Critic),Asynchronous 指开启多个actor 在环境中探索,并异步更新。适合新手入门。

  • PPO(Proximal PO 近端策略搜索),训练稳定,调参简单,robust(稳健)。

  • PPG(Proximal Policy Gradient),A3C、PPO 都是同策略 On-policy,为了让PPO也能用 off-policy 的数据来训练,PPG诞生了。

  • SAC(Soft Actor-Critic with maximum entropy 最大熵),训练很快,探索能力好,但是很依赖Reward Function,不像PPO那样随便整一个Reward function 也能训练。

产生连续空间的探索动作有以下3类方式:

TD3:动作→tanh→添加噪声(方差由人类指定)→clip PPO:动作→添加噪声(所有state共用同个噪声方差)→tanh SAC:动作→添加噪声(不同state对应不同噪声方差)→tanh

算法介绍

Nature DQN

1、将环境信息s输入到eval网络, 输出为action的Q值,选择最大Q值对应的action, 或者随机生成一个action,将action输入环境, 得到奖励r和下一个环境信息s_, 存储当前环境s, 选择的action, 得到的奖励r这4个信息。 循环步骤1, 直到存储了一定量的[(s, a, r, s_), …], 注意这个过程中eval网络没有更新。

2、从存储的[(s, a, r, s_), …]中sample出一部分(s, a, r, s_) ,将sample出来的多个s做为batch输入到eval 网络, 得到batch的action的Q值q_eval, 然后根据sample出来的action选出其在q_eval中对应的Q值q_action_eval(对应gather过程)。评估网络

3、将sample出来的多个s_做为batch输入到target网络(eval与target有相同的网络结构), 得到batch的action的Q值q_next, 取q_next中最大的Q值(dim=1)并乘以一个系数gamma, 然后再加上sample出来的奖励r, 得到q_target。目标网络

4、计算loss:loss 为第2步的结果q_action_eval与第3步的结果q_target的MSE, 然后根据loss反向传播更新eval网络。更新评估网络

5、循环1到4步骤, 每过一定的步数后,将eval网络的权重更新到target网络上。更新目标网络,并开始下一轮评估网络训练

Dueling DQN

Dueling DQN仅仅涉及神经网络的中间结构的改进, 这里就不讲解了。

Policy Gradient

1、将环境信息s输入到NN网络, 经过softmax后输出为action的概率(经过softmax后概率之和为1),选择概率比较大的对应的action, ,将action输入环境, 得到奖励r和下一个环境信息s_, 存储当前环境s, 选择的action, 得到的奖励r这4个信息, 循环步骤1, 直到一个回合结束, 注意这个过程中NN网络没有更新。

2、回合结束后:

i. 将存储的所有s组合为一个batch输入到NN,经过softmax后输出为actions的概率actions_prob。

ii. 将存储的所有action组合为actions, 然后将actions 转化为one hot形式actions_label(当前动作的位置为1(概率), 其他位置为0, 也就相当于是label了)。

iii. 将存储的奖励r经过如下公式:

R[i] = r[i]+ σ*r[i+1]+ σ2 * r[i+2]+……+ σt-i * r[t]

得到R = [R[0], R[1],…,R[t],…,R[T]]

iv. 求loss, loss = mean(cross_entropy(actions_prob, actions_label) * R)

v. 更新NN网络。

3、循环1和2。

Actor-Critic

Actor用来选动作, critic用来评估选出来的动作作用在环境上后, 得到的状态是好是坏。

1、将环境信息s输入到actor网络NN1, 输出为action的概率action_prob,选择较大概率对应的action,将action输入环境, 得到奖励r和下一个环境信息s_。

2、将s和s_分别输入到critic网络NN2, 得到输出v和v_ (评估状态的好坏)。

3、计算td_error = r + gamma * v_ - v

4、计算actor的loss = mean(td_error * (log(第一步action对应的那个概率action_prob))), 并反向传播更新actor网络NN1。

5、 计算critic的loss=square(td_error), 并反向传播更新critic网络NN2。

6、循环1-5。

DDPG

PPO 简易版

1、将环境信息s输入到actor-new网络, 得到两个值, 一个是μ, 一个是σ, 然后将这两个值分别当作正态分布均值方差构建正态分布(意义是表示action的分布),然后通过这个正态分布sample出来一个action, 再输入到环境中得到奖励r和下一步的状态s_,然后存储[(s,a,r),…], 再将s_输入到actor-new网络。循环步骤1, 直到存储了一定量的[(s, a, r), …], 注意这个过程中actor-new网络没有更新

2、将1循环完最后一步得到的s_输入到critic-NN网络中, 得到状态的v_值, 然后计算折扣奖励:

R[t] = r[t] + γ*r[t+1] + γ2 * r[t+1] + … + γT-t+1 * r[T-1] + γT-t * v_, 得到R = [R[0], R[1],…,R[t],…,R[T]],其中T为最后一个时间步。

3、将存储的所有s组合输入到critic-NN网络中, 得到所有状态的V_值, 计算At = R – V_ (论文公式10, openai官网代码则实现的是论文公式11和12)

4、求c_loss = mean(square(At )), 然后反向传播更新critic-NN网络。

5、将存储的所有s组合输入actor-old和actor-new网络(网络结构一样), 分别得到正态分布Normal1Normal2, 将存储的所有action组合为actions输入到正态分布Normal1Normal2, 得到每个actions对应的概率prob1和prob2, 然后用prob2除以prob1得到important weight, 也就是ratio。

6、根据论文公式7计算a_loss = mean(min((ration* At, clip(ratio, 1-ξ, 1+ξ)* At))), 然后反向传播, 更新actor-new网络。

7、循环5-6步骤, 一定步后, 循环结束, 用actor-new网络权重来更新actor-old网络(莫凡代码是在循环开始前更新的, 效果是一样的)。

8、循环1-7步骤。

Released under the MIT License.