开悟初赛笔记-奖励设计篇
其实对于这种走迷宫找宝箱到终点的奖励设计,前面很多的大佬都已经发过很多相关的了。
我这边的话主要说下关于初赛奖励设计需要特别注意的地方,就是extra_info不能用作特征处理,但是可以用在奖励设计!
但是官方默认的代码会导致在评估的时候也调用了奖励处理的函数,所以你在里面运用会报错,其实在模型进行评估的时候是完全不需要调用奖励设计的。
如何在奖励设计的时候利用extra_info呢?这个的话我们需要给agenet.py
里面的 observation_process函数
提供一个额外的布尔变量去进行控制何时进行评估,何时进行训练即可,具体如下。
| def observation_process(self, obs, extra_info=None, is_exploit=False):
 if is_exploit:
 feature, legal_action = self.preprocessor.process([obs, extra_info], self.last_action, is_exploit=is_exploit)
 return ObsData(
 feature=feature,
 legal_action=legal_action,
 )
 
 else:
 feature, legal_action, reward = self.preprocessor.process([obs, extra_info], self.last_action, is_exploit=is_exploit)
 return ObsData(
 feature=feature,
 legal_action=legal_action,
 reward=reward,
 )
 
 | 
然后再把exploit函数对应的部分稍微更改下即可
| @exploit_wrapperdef exploit(self, observation):
 obs_data = self.observation_process(observation["obs"], observation["extra_info"], is_exploit=True)
 feature = obs_data.feature
 legal_action = obs_data.legal_action
 probs, value = self.predict_process(feature, legal_action)
 action, prob = random_choice(probs)
 act = self.action_process(ActData(probs=probs, value=value, action=action, prob=prob))
 return act
 
 | 
对应的preprocess.py里面的也同理
|   def process(self, frame_state, last_action, is_exploit=False):self.pb2struct(frame_state, last_action)
 ...
 if is_exploit:
 return (
 feature,
 legal_action
 )
 else:
 return (
 feature,
 legal_action,
 reward_process(self._obs, self._extra_info, self.obs, self.extra_info, self.target, self.last_target, self.local_memory_map),
 )
 
 
 | 
二、奖励设计
关于奖励设计,前面有很多大佬的优质帖子告诉了如何去设计奖励了,所以可以详细参考下他们的奖励设计然后运用到本次初赛里面。
【精华贴】海选阶段性总结
- 腾讯开悟社区平台
模型是怎么练成的
- 腾讯开悟社区平台
海选训练经验总结
- 腾讯开悟社区平台
海选训练思路总结
- 腾讯开悟社区平台
然后也可以看看我学习期的帖子,里面也大概写了一点关于奖励设计的。
开悟学习期笔记
- 腾讯开悟社区平台
总之大部分的奖励设计可以通过前面的帖子找到很好的灵感,然后我这边的话说下我的奖励设计对于今年可能比较特殊的部分。
1、闪现技能默认给惩罚
我的话默认给闪现奖励是负数的惩罚,因为想引导智能体能够合理的运用闪现,闪现的频率过高会扰乱智能体的进度。
2、BUFF获取奖励衰减
因为BUFF的话相对于其他的物件重要性偏低,我这边的设计是利用了总获取BUFF次数进行衰减的
| reward_dict["buff_reward"] = buff_reward * math.pow(0.5, buff_cnt)
 | 
3、总奖励权重
其他的奖励其实没有做很多的创新,有些和我学习期的基本差不太多
| reward_dict = {
 "step_reward": -0.01,
 
 "memory_reward": [-0.3 ~ -1.0],
 
 "stop_reward": -0.5,
 
 "talent_reward": -0.5,
 
 "step_target_reward": 0.1,
 
 "treasure_collected_reward": 5,
 
 "buff_reward": 0.5 ** buff_cnt
 }
 
 | 
最终从零的PPO训练效果曲线如下:
