Minecraft是强化学习研究的重要环境,其本身仅提供稀疏的二进制值奖励函数,这使得在这类环境进行高效探索充满挑战性,智能体难以学习复杂任务。
为了解决这一问题,我们提出了 Auto MC-Reward 方法,利用大型语言模型(LLMs)自动设计稠密奖励函数,从而提高学习效率。Auto MC-Reward 包括三个组成部分:奖励设计模块、奖励评估模块和轨迹分析模块。首先,奖励设计模块根据环境信息和任务描述编写可执行Python代码形式的奖励函数。然后,奖励评估模块评估代码是否自洽且无语法和语义错误。生成的奖励函数用于训练智能体,轨迹分析模块根据智能体在实际游戏环境中的轨迹,总结可能的失败原因并提供改进建议。在下一轮中,奖励设计模块将根据反馈进一步优化和迭代稠密奖励函数。
实验表明,该方法相比于比原始稀缺奖励和现有的稠密奖励方法,在 Minecraft 中复杂任务的成功率和学习效率显著提高,例如在地下高效寻找钻石并躲避岩浆、在平原上高效地寻找稀疏的树木和动物等。此外,Auto MC-Reward 在仅有游戏原始信息的情况下实现了较高的钻石获取成功率(36.5%),展示了其解决长程任务的能力。
论文链接:https://arxiv.org/abs/2312.09238
1 动机
Minecraft已成为研究高效强化学习(RL)的重要环境,对于研究开放世界智能体有着重要意义,其奖励的稀缺性和决策空间的巨大复杂性为 RL 带来了重大挑战。已有的稠密奖励函数方法在Minecraft中复杂且长程的任务(例如在地下寻找钻石)上的效果较为有限,突显了Minecraft的难度和现有稠密奖励方法的局限性。
值得注意的是,Minecraft对于人类玩家是一个较简单的游戏。人类的优势在于他们能够基于实践进行总结,例如从岩浆导致的死亡中学会躲避岩浆。大多数现有的 RL 方法忽视了这种能力。另一方面,大型语言模型(LLMs)展示了类似人类的常识和推理能力。我们发现,利用 LLMs 可以帮助 RL 智能体模拟人类的实践总结能力。基于智能体的历史行动轨迹,LLMs 可以自动设计和完善相应的奖励函数,有效克服Minecraft中的稀疏奖励的挑战。
2 方法
Auto MC-Reward 由三个组成部分构成:奖励设计模块(Reward Designer)、奖励评估模块(Reward Critic)和轨迹分析模块(Trajectory Analyzer)。在获得环境信息和任务描述后,奖励设计模块通过编写带有预定义observation输入的可执行 Python 函数作为奖励函数。奖励评估模块负责验证所提出的奖励函数是否自洽,并检查是否存在语法和语义错误。经奖励评估模块评估通过的奖励函数用于在环境中训练智能体。轨迹分析模块根据智能体与环境的实际交互轨迹总结可能的失败原因,并提出奖励函数的修改建议。然后,奖励设计模块根据轨迹分析模块的反馈修改奖励函数。
下图展示了一个寻找钻石的例子:i) 轨迹分析模块发现在轨迹中智能体因岩浆死亡,并建议遇到岩浆时应给予惩罚;ii) 奖励设计模块根据建议更新奖励函数;iii) 经奖励评估模块评估通过的新版奖励函数,最终使智能体通过向左转避开了岩浆。
2.1 奖励设计模块
奖励设计模块接受任务描述、游戏信息和奖励函数要求作为输入,生成可执行代码形式的奖励函数。更新奖励函数时,输入中还包括智能体与游戏环境交互时的分析和修改建议(由轨迹分析模块提供)。我们不提供潜在失败原因、游戏策略信息等,以保证方法的泛用性。
奖励函数使用预定义的obseravetion格式作为输入参数。这包括当前和前一步骤中每种方块类型的最近距离、相邻步骤之间的物品变化、生命值以及智能体的历史位置信息。这些参数可以提供有关智能体当前和历史状态的信息,帮助奖励函数适应各种情况。
奖励设计模块包含以下考量:
多步记忆机制:在开始时提供一个空的字典,奖励函数可以将必要的数据保存到记忆中,供未来的步骤使用,例如在寻找树的任务中,将每一步与树的距离存储于多步记忆,从而鼓励与前一步比更接近树。
思维链:要求LLM在编写代码前首先以注释形式描述潜在失败原因和设计思路,此外在代码实现中穿插必要的注释。这有助于生成逻辑自洽的代码,也能帮助奖励评估模块理解当前奖励函数。
数值范围约束:我们令 LLM 生成两个子函数:dense和sparse。sparse代表达到最终目标的奖励或重大惩罚(如死亡),而dense代表任务完成过程中的稠密中间信号。最终奖励计算为 R = sgn(sparse)∗1+sgn(dense)∗0.1,即最终的奖励值为 {±1.1, ±1.0, ±0.9, ±0.1, 0} 中的一个值。这是为了保持奖励值在合理的范围内,使 LLM 重点关注在奖励函数中需要考虑的各种情况,而非调整具体奖励数值等琐事。
2.2 奖励评估模块
在实践中,LLM 初始难以生成相对完整的奖励函数,可能存在对参数格式和数据类型(语法错误)的理解错误、未能考虑到特定游戏信息、对任务的误解(语义错误)等问题。为此我们设计了奖励评估模块来自动评估奖励函数。如果评估未通过,评估模块将提供修改意见,然后奖励设计模块将据此修改奖励函数并再次提交评估。上述过程可重复最多3次,否则不再进行额外的评估操作。某些运行时错误只会在代码实际执行期间(与环境交互的过程中)出现,此时Python 的traceback错误消息将被反馈给奖励设计模块进行修改。
2.3 轨迹分析模块
基于环境信息和基本任务指令生成的奖励函数可能并未考虑到某些实际游戏情况,例如寻找钻石的过程中遇到岩浆。为了对设计的稠密奖励进行经验改进,我们提出轨迹分析模块,对智能体与环境交互的轨迹进行总结,指导奖励函数的修改。奖励设计模块和轨迹分析模块的分工使得前者无需分析复杂的轨迹数据,后者无需了解奖励函数细节。我们将基于当前奖励函数训练的智能体与环境互动获得若干条轨迹,将每条失败轨迹最后连续若干帧的observation结果整理为json格式,输入至LLM推断失败原因、提出下一轮奖励函数修改建议,例如未考虑的失败场景等。
3 实验
我们首先使用GITM模型收集了共计153小时的钻石获取任务的数据,进行模仿学习训练,之后使用PPO算法进行强化学习训练。我们使用MineDojo环境进行Minecraft评测,设定了三个任务以评估算法性能:在地下寻找钻石、在平原寻找树木、在平原寻找特定动物(牛、羊等)。与目标的距离小于一定阈值视为成功,超过预先设定的步数限制或死亡视为失败。实验结果表明,我们的方法在三个任务上超越了现有的稀疏奖励和稠密奖励的方法,取得了更高成功率和效率。
我们在获取钻石上评估了Auto MC-Reward的性能。对于下图中的完整过程,我们的方法将优化其中绿色背景的步骤,即寻找树木、寻找圆石、寻找铁矿、寻找钻石。
实验结果表明,我们的方法在不使用Lidar、Voxel等非游戏本身信息的情况下,取得了较高的钻石获取成功率。
消融实验中,去除每个模块均会导致成功率的下降,证明了所提出的三个模块的有效性。
下图给出了我们的方法对于地下寻找钻石任务生成的奖励函数的示例。