菜鸟网络2022KDD论文:Graph2Route: A Dynamic Spatial-Temporal Graph Neural Network for Pick-up and Delivery Route Prediction
前文(2021KDD论文解读:外卖配送服务中路径规划与时间预测的深度学习方法)曾说明,骑手的路径预测与规划路径推荐之间存在比较大的差距(前者的目标是预测骑手行为,后者的目标是给骑手推荐最佳路径),直接使用运筹优化等算法求解最优路径作为预测骑手未来访问路径的结果,是一种非常不合理的方式。因此,并不适合下游任务继续使用(e.g.送达时间预测和订单指派)。
本文与前文目标类似,解决PDRP(Pick-up and Delivery Route Prediction task)问题,创新点在于将图网络引入到路径预测中。
1.介绍
[3] A Deep Learning Method for Route and Time Prediction in Food Delivery Service.2021.
[17] Package Pick-up Route Prediction via Modeling Couriers’ Spatial-Temporal Behaviors.2021.
[20] Route prediction for instant delivery.2019.
截止目前,解决PDRP问题的论文主要有4篇(含本文)。
- OSquare是解决PDRP问题的鼻祖,它将该问题看做next-location prediction问题,使用传统机器学习方法依次预测下一个location。
- FDNET提供一种深度学习解决方法,将LSTM作为decoder,Pointer作为decoder,一次性预测出整个访问序列。(2021KDD论文解读:外卖配送服务中路径规划与时间预测的深度学习方法)
- DeepRoute使用Transfermer作为encoder,包含attention的RNN作为decoder,预测pickup问题的访问路径
以上方法各有可取之处,但都存在以下问题(figure1 left所示):
- 仅将未完成任务的PDRP看做序列预测,进而使用一些序列预测算法(e.g.BiLSTM),缺少利用时空关系的能力;
- 不可避免的解码出明显不合理的route(figure1 t2,D是最远的任务,不应该出现在该预测结果)
- 仅使用当前时刻信息,忽略了不同时间步问题的相关性
为了解决以上问题,提出动态时空图网络模型Graph2Route(Figure1 right所示):
- 将已完成、未完成任务及其关系展示在图中,以图的视角对问题进行建模,利用节点、边的特征及网络结构提高预测精度(解决问题1)。
- 将图结构加入到decoder中,利用mask机制过滤不合理解,缩小解空间。(解决问题2)
- 利用动态图结构对不断变化的图关系进行建模,充分获取决策上下文,e.g.前几个step的决策环境。(解决问题3)
详细内容如下。
2.准备工作:Graph视角
2.1.ST-Graph输入
将每个任务看做graph上的一个node(一个订单被分为取餐任务、配送任务两个node),针对骑手w在t时刻的时空图可以描述为 ,其中V表示node的集合,e表示边的集合,X表示节点的特征(\( n*d_v \)),E表示边的特征(\( n*n*d_e \)),其中,\( d_v、d_e \)分别表示节点和边的特征维度。
graph中有两种类型的节点,已完成节点(\( V^F \))和未完成节点(\( V^U \)),在模型构建中会充分利用这两类节点,这也是区别于其他模型的地方。
2.2.Route 约束
实际的配送问题常常包含多种约束,用C表示约束集合。例如
- 取送先后顺序约束
- 载具容积约束
2.3.问题定义
可以简单描述为:基于时空图预测unfinished node的骑手访问顺序。
如figure2所示。其中,π_i表示预测第i次访问节点的编号。
3.Graph2Route模型
模型结构如图所示,主要包括两部分:动态时空图encoder,基于图的个性化decoder,前者将t时刻图中节点、边的特征转为node embedding,获取时空关系、决策上下文等信息,后者基于node embedding信息,在考虑骑手个性化信息、图结构的情况下,预测出对应路径。
3.1.时空图输入
[16] DeepRoute+: Modeling Couriers’ Spatial-Temporal Behaviors and Decision Preferences for Package Pick-up Route Prediction. 2022.
与[16](作者另外一篇paper)将已完成任务、未完成任务分开编码不同,这里将两种任务编码到同一个图结构中,因此也不需要设计两个不同的处理模块,两种任务之间的关系也能够更好的被捕获。
3.1.1.临近关系
假设在t时刻,给定一个包含完成任务集合、未完成任务集合的问题,我们将其构建成图形式: 。\( V_t \)由\( V^F_t、V^U_t \)组成,边集合。其中,\( a_{ij} \)表示临近矩阵中i、j两个对象之间的时空临近关系。临近关系主要用于指导decoding环节,加速学习过程(因为,实际中发现在route中的node通常具有时空相关性)。空间k临近关系根据节点之间的距离计算,时间临近关系根据节点的承诺送达时间计算(如果承诺送达时间接近,则认为在时间维度是临近的)。用-1表示自身关系,0表示其他情况。
3.1.2.节点与边的特征
节点特征表示如下:
其中,Co表示地理坐标,AT表示接单时间,PT表示承诺时间,FT表示实际完成时间,Dis表示当前任务距离骑手的距离。
边特征表示如下:其中,\( d_{ij} \)表示任务之间的距离,\( a_{ij} \)表示临近关系。
最终,节点、边均被转为d_h大小的向量,转换形式如下:
其中,激活函数σ为Relu,\( W_v \)的大小为\( d_v*d_h \),\( b_v \)大小为\( d_h \);\( W_e \)的大小为\( d_e*d_h \),\( b_e \)大小为\( d_h \)。
3.2.动态时空图encoder
[8] Semi-supervisedclassificationwithgraph convolutional networks.2017.
[19] A comprehensive survey on graph neural networks.2020.
由两部分组成:
- Spatial-Correlation encoding:利用一个GCN结构捕获不同节点之间的空间关系。与标准GCN只使用节点特征来执行信息融合过程[8,19]不同,该文还引入了边特征来共同生成的embedding。
- Temporal-Correlation encoding:利用一个RNN结构对决策上下文变化建模,在不同step中持续对embedding进行校正,进而捕获其历史信息。
3.2.1.Spatial-Correlation encoding
使用一个L层的GCN,对节点embedding、边embedding进行编码。用\( h^l_i \)表示node i在l层的embedding,\( z^l_{ij} \)表示表示边<i,j>在l层的embedding。初始阶段,对底层embedding进行初始化,e.g.。如下所示,GCN的计算过程同时考虑节点embedding和边embedding。
其中,N_i表示node i的临近节点的集合,Agg()表示聚合方法,更新算法f、g为非线性变换函数,如下所示:
其中,
- W1...W5均为训练参数矩阵,大小为\( d_h*d_h \)
- σ为relu函数
- ,W6均为训练参数矩阵,大小为\( d_h*1 \)
经过L层计算,最终得到节点、边的编码\( H_t \)和\( Z_t \),维度大小均为\( d_h \)。
3.2.2.Temporal-Correlation encoding
根据菜鸟物流平台的总结,配送员通常具有其习惯性的路线,因此,这里提出时间相关性编码模块,试图捕获这种习惯。通常,t时刻配送员的路径安排,与之前时刻的路径安排具有相关性,特别的,距离t时刻越近,相关性越大。例如,在t1和t2之间并没有新增已完成订单,那么这两个时刻具有相同的决策。为了连接不同step之间的时间相关性,我们尝试使用历史node信息更新当前node embedding。
这里采用GRU结构,利用图网络、t-1时刻多个节点的embeddings计算t时刻多个节点的embeddings。注意,此时\( H_t \)为矩阵形式,需要将矩阵转为向量形式(e.g.通过行拼接的形式)。
3.3.基于图的个性化路径decoder
该部分包括两部分:
- mask机制,解决route约束问题
- 个性化解码,输出每一轮任务选择
3.3.1.mask机制
mask机制主要用来“遮盖”轮次j内的不可用任务,我们用\( N_i \)表示i节点的临近节点,\( R_j \)表示j轮次之前已经输出的节点,\( v^o_d、v^o_p \)分别表示一个订单的配送任务和取餐任务。
mask机制包含4种规则:
1)遮盖已经完成的任务
2)遮盖已经输出的任务,即,\( R_j \)
3)如果订单o的取餐任务(\( v^o_p \))还未完成,则遮盖其配送任务
4)遮盖上一轮输出节点的非临近任务(因为,现实当中配送员倾向于连续完成临近任务)
通过以上规则,可以降低算法的求解空间。所有被遮盖的节点用\( V^j_{mask} \)表示。
随着解码过程的推进,\( V^j_{mask} \)应该每个轮次都需要重新计算。
3.3.2.个性化解码
每一个轮次解码器都需要计算每个候选node的概率,并选择最大概率的node输出。整个路径预测过程可以看做不同节点分配概率乘积的过程。
其中,s表示问题实例,θ表示训练参数。f()表示编码器,\( θ_e \)为编码器可训练参数,\( θ_d \)表示解码器可训练参数,\( π_{1:j-1} \)表示前j-1轮输出结果,w表示骑手相关信息。
值得注意的是,传统路径规划方法采用统一的目标函数,e.g.距离最短。在路径预测中,不同骑手有不同的目标函数,当然这种目标函数难以被系统识别,因此,非常有必要将骑手信息加入到decoder中。
这里使用RNN对已经输出的路径\( π_{1:j-1} \)进行编码,f()的输出结果为H矩阵。公式(9)可以转为如下形式:
其中,W为已输出路径embedding、骑手特征的拼接向量。
解码过程中,每一步输出的结果需要不重复的从graph中选择。在本文中,设计成如上基于graph的循环decode形式。即,解码过程循环执行,每次选择上一轮node临近集合中最大概率的候选节点,然后将结果输入到RNN以更新当前状态,方便下一轮decode。
需要特别注意的是,这里使用了attention机制:将\( m_{j-1} \)和w拼接作为attention query,将候选节点的embedding作为attention key,得到候选节点的attention score。
其中,
然后,通过softmax变化,得到最终概率。
[3] A Deep Learning Method for Route and Time Prediction in Food Delivery Service.2021.
[16] DeepRoute+: Modeling Couriers’ Spatial-Temporal Behaviors and Decision Preferences for Package Pick-up Route Prediction. 2022.
另外,与之前直接在encoder阶段把骑手特征、任务特征的工作[3]、[16]不同,这里将骑手相关的特征放在了decoder中,避免编码过程中信息丢失,更有助于预测准确性。
3.4.模型训练与预测
3.4.1.样本构建
当任务完成或有新任务分配给骑手时,则创建一条新样本。
在时刻t,我们将已完成任务、未完成任务同时加入到graph中。
使用t与t'之间的完成任务作为label,其中t'表示新任务插入的时间。
以figure3为例,在t1时刻输入包含了任务{1,2,3},label为\( π_{t_1:t'}=π_{t_1:t_2}=[2] \)
3.4.2.训练
看作是多分类问题,用交叉熵损失函数:
其中,W为骑手集合,T为采样时间步。
3.4.3.预测
预测阶段,对所有未完成任务进行预测。
最终,Graph2Route算法如下所示。
4.实验
离线实验
分别使用了饿了么和菜鸟物流的数据。
对比实验基线算法有以下几类:
- DisGreedy,距离排序
- TimeRank,剩余时长排序
- 基于ortools,以最短行驶距离为目标的启发式搜索
- OSquare,利于LightGBM做step by step的节点预测
- DeepRoute,Transformer encoder、attention-based decoder,由于其不支持pickup,所以对其做了改进,在decoder环节加入了mask机制
- DeepRoute+,在encoder中加入了骑手最新的pickup路径信息
- FDNET,利用LSTM和指针算法做路径预测(2021KDD论文解读:外卖配送服务中路径规划与时间预测的深度学习方法)
其中后三者为深度学习模型,使用验证集确定超参数。
评估指标包括:
- KRC: Kendall Rank Correlation
- ED: Edit Distance
- LSD and LMD: The Location Square Deviation (LSD) ,the Location Mean Deviation (LMD)
- HR@K
- ACC@K
不同算法效果如table3所示:
可以看出,Graph2Route在各项指标均优于其他算法。
模块重要性试验:
- 可以看出,GCN模块最为重要,说明了图结构捕获时空关系的能力。
- temporal-correlation encoding(GRU)作用次之,证明了利用时序结构的能力。
- worker info则证明了骑手信息的重要性。
线上AB实验
略
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。