基于Transformer的路径规划-探索
附赠自动驾驶最全的学习资料和量产经验:链接
路径规划(Path Planning)问题,过去通常使用RRT、A*、Dijkstra、强化学习等算法来解决。随着Transformer以及LLM技术的发展,我给出以下猜测:大模型也是可以解决路径规划问题的。该猜测可能是不成立的,无论如何,我觉得值得尝试一下,本文将记录探索过程。
首先对问题进行简化,定义一个16×16的网格,黑色表示障碍物、红色表示起始点、蓝色表示目标点。下图是一个简单的示例:
路径规划问题示例
智能体每次只能执行以下4个动作之一:
-
向左移动一格
-
向右移动一格
-
向上移动一格
-
向下移动一格
我们期望模型可以输出一条从起始点到目标点的路径,满足:无碰撞、尽可能短。这个问题对人来说可以轻松解决,我很好奇大模型LLM在这类问题上的表现。
先将输入转换成文本的形式,定义:
"0":FREE SPACE, 无障碍区域
"1":OBSTACLE, 有障碍区域
"+":START, 起始点
"x":GOAL, 目标点
于是上图所示的例子可表达为:
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 + 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 1 1 1 1 1 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 1 0 0 0 0 0 0 1 0 0 0 0 0
0 0 0 1 0 0 1 1 1 1 1 0 0 0 0 0
0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 1 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 1 1 1 1 1 1 1 1
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 x 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 1 0 0 0 0 0 0 0 0 0
为了简便,将输入序列的长度设为256,序列中每个元素的值只能是以下几个值中的一个:“0”、“1”、“+”、“x”,对应的编号为:0、1、2、3。
确定了模型的输入形式后,接下来要解决的问题是我们该如何获取足够多的训练样本呢?也就是给定很多很多个输入,需要通过算法或人工标注的方式获取每个输入对应的最优路径(在最优路径难以获取的情况下,次优路径也行),这里的最优路径有一条或多条,次优路径有很多条。我丝毫不怀疑:在样本数量足够多且质量足够高的情况下模型是能够学会路径规划的。因为在更复杂的自动驾驶场景,已经有真实的案例证明了基于Transformer的模型是可以解决路径规划问题的。
在自动驾驶场景,通过收集司机驾驶真车时的数据,相当于是通过人工标注的方式获取到了足够多的训练样本,然而通过这种方式获取训练样本的成本相当高。
在更一般的场景,如果训练样本的获取成本太高,那技术落地就很难。我们需要尽可能地减少对人工标注样本的依赖。
让我们先来看看OpenAI是如何训练对话模型的:
阶段一
先训练一个基本可用的对话模型,发布给用户使用
阶段二
让用户对模型生成的回答进行评价,根据用户的反馈持续优化模型
受此启发,我将路径规划问题分成两个阶段:
初级阶段
在初级阶段**,只要求模型输出从起始点到目标点的路径,满足:无碰撞
高级阶段
在高级阶段,除了“无碰撞”外,还要求路径“尽可能短”**
在初级阶段,由于不要求路径“尽可能短**”**,因此可以借助传统的路径规划算法(例如RRT、A*、Dijkstra等等)大量合成训练样本。利用这些合成样本,我们先训练一个初级模型。
在高级阶段,按以下步骤优化初级模型
1、构造输入,让模型生成多条路径,选择其中最短的一条路径,与输入组成新的训练样本
2、重复步骤1,直到得到足够多的训练样本
3、用步骤2中得到的训练样本再对模型进行训练
4、重复步骤1~3,直到生成的路径符合要求