刷钻网站推广免费,策划方案,wordpress放音乐播放器,网页设计的特点有哪些introduction
一种多目标强化学习算法#xff0c;来自2019 Nips《A Generalized Algorithm for Multi-Objective Reinforcement Learning and Policy Adaptation》本文引用代码全部来源于论文中的链接。主要参考run_e3c_double.py文件
1 总体思想
1.将输入中加入多目标的偏…introduction
一种多目标强化学习算法来自2019 Nips《A Generalized Algorithm for Multi-Objective Reinforcement Learning and Policy Adaptation》本文引用代码全部来源于论文中的链接。主要参考run_e3c_double.py文件
1 总体思想
1.将输入中加入多目标的偏好参数。 2. 在输出中改本为标量的状态价值为向量的状态价值。 3. 实现了可以在多个目标上寻找帕累托前沿也即多目标最优解的算法。
2 算法
虽然论文中用的是Q-learning的架构但是在提供的代码中采用的是A3C的架构使用envelope 网络作为价值网络估计状态价值用于更新所以接下来以代码为准结合论文思想展示用到的输入、输出和损失函数。 2.1 输入
以多目标马里奥环境为例输入为连续四帧状态 S随机采样的偏好w。w的值均为正数且和为1每一位的值代表对该维目标的偏好大小。
2.2 输出
Actor 网络和Value网络共享同一个特征提取网络Actor网络输出维度为所有可能动作数Value网络输出维度为偏好的维度也即多目标的目标维度数。
2.3 损失函数
2.3.1 Critic loss mse nn.MSELoss()critic_loss_l1 mse(wvalue, wtarget)critic_loss_l2 mse(value.view(-1), target_batch.view(-1))loss 0.5 * (self.beta * critic_loss_l1 (1-self.beta) * critic_loss_l2)
Critic 网络的损失由critic loss1和critic loss2加权和组成critic loss2 理解为多目标损失函数即当Critic网络能够准确评估多目标状态时所有pareto前沿上的点都满足critic loss2 为零。因此用梯度下降优化CL2显得不平滑且困难因为它的解不止一个而是很多个。所以引入critic loss1 来减少这种不平滑critic loss 1 是某种偏好下critic网络的TD LOSS因为偏好确定了所以解只有一个作者认为这样的损失函数更容易优化更平滑。
操作上wvalue和wtarget的唯独都是(batch_size, 1) ; 而 value和target的维度都是batch_size,reward_size)。显然也是前者的优化更简单。
2.3.2 Actor loss
wadv_batch torch.bmm(adv_batch.unsqueeze(1), w_batch.unsqueeze(2)).squeeze()
actor_loss -m.log_prob(action_batch) * wadv_batch
actor loss形式上和带基线的policy gradient的损失函数类似只不过Critic网络输出的维度不是1而是reward_size,优势adv先与偏好权重w矩阵相乘得到维度为1的优势adv后再输入actor loss中这也说明actor loss 的优化方向是朝着使得当前偏好的期望回报最大的方向优化的。
2.4 更新方式
2.4.1 数据收集方式
论文中伪代码表示用类似Q-learning 离线更新的方式 给出的代码中使用类A3C在线更新的方式以下以代码为准。
在一个epsiode开始前随机初始化一个preference并用这个偏好贯穿这一幕直至结束。
explore_w generate_w(args.num_worker, pref_param)
每一步模型输入状态和偏好输出动作 while True:actions agent.get_action(states, explore_w)for parent_conn in parent_conns:s, r, d, rd, mor, sc parent_conn.recv()
将一幕中数据以此收齐后立即用于更新神经网络参数因为A3C是在线算法所以E3C也是在线
2.4.2 参数更新方式 value, next_value, policy agent.forward_transition(total_state, total_next_state, total_update_w)
1.将收集到的状态下一状态偏好的序列输入网络得到价值5维下一状态价值5维策略和动作维度相同 for idx in range(args.num_worker):target make_train_data(args,total_moreward[idx*args.num_stepidw*ofs : (idx1)*args.num_stepidw*ofs],total_done[idx*args.num_stepidw*ofs: (idx1)*args.num_stepidw*ofs],value[idx*args.num_stepidw*ofs : (idx1)*args.num_stepidw*ofs],next_value[idx*args.num_stepidw*ofs : (idx1)*args.num_stepidw*ofs],reward_size)
2.从最后一状态以此计算 TD-error中的tagettarget rv(s)target也是五维 (ps:一直不知道为什么在线算法要从最后一步一直迭代倒推到第一步都用rγv(s)来做代表当前状态价值导致第一个状态v(s0)r0γ*r1γ**2....γ**nV(Sn),导致方差很大。为什么不每一步直接从价值网络导出这样v(s0)r0v(s1)这样方差小的方法呢很奇怪
total_target, total_adv envelope_operator(args, update_w, total_target, value, reward_size, global_step) 3. 使用envelope operator函数对target做处理在训练初期只计算优势 adv target - value
在训练中后期用于从随机采样的多个偏好代码默认八个偏好总和维度为85中挑选出能使target最大的一种偏好。和Q-learning中取qrqmax(s)有点像。[这里的reshape我也有点看不懂此观点只做参考]
agent.train_model()
actor_loss -m.log_prob(action_batch) * wadv_batch# Entropy(for more exploration)
entropy m.entropy()# Critic lossmse nn.MSELoss()
critic_loss_l1 mse(wvalue, wtarget)
critic_loss_l2 mse(value.view(-1), target_batch.view(-1))# Total loss (dont compute tempreture)loss actor_loss.mean()loss 0.5 * (self.beta * critic_loss_l1 (1-self.beta) * critic_loss_l2)loss - self.entropy_coef * entropy.mean()
4.计算loss反向传播。这一部分就很明了了计算前面提到的几种loss给与不同权重后反向传播唯一特别注意的是actor loss中使用的优势adv不知出于什么理由使用了优势向量与偏好向量做内积后的偏好可能是因为解唯一优化方便
5.其他注意事项1、用于和环境交互的偏好并不被保存更新参数时会重新抽样偏好这样做有什么理论依据嘛暂时还没想明白。
2.5 损失函数中偏好和输入网络偏好的关系
从伪代码和代码中可见在进行前向推导时输入网络的preference 和在训练时使用的preference并不是同一个。并且前向时所用的preference并没有被replayer buffer记录下来。训练时actor 和 critic里用的偏好仍然是随机抽取的偏好。
3 其他bug和优化技巧
1.为达到论文所示的训练速度需要使用简化后的Mario-v3环境并且跳5帧。
2.由于A3C是异步算法有多个环境并行采样所以环境初始化的位置应在启动进程的代码之后即在multiprocess的run函数之中再reset环境否则会发生内存地址错误找不到创造的环境的错误。
对于文中的问题欢迎有不同见解的同学在评论区讨论交流学习祝你学习愉快