为什么a*算法采用哈密尔顿距离作为启发函数比不在位数为启发函数的性能要好?_KDD2019: 使用神经网络为A*搜索算法赋能 --以个性化路径推荐为例...

本文系 KDD2019 论文的解读:
Wang, Jingyuan, Ning Wu, Wayne Xin Zhao, Fanzhang Peng, and Xin Lin. "Empowering A* Search Algorithms with Neural Networks for Personalized Route Recommendation." InProceedings of the 25th ACM SIGKDD International Conference on Knowledge Discovery & Data Mining, pp. 539-547. ACM, 2019.

作者:吴宁

研究动机

A* 算法因为它的高效和准确而被广泛应用于路径发现和图遍历等任务上。斯坦福的 Peter Hart, Nils Nilsson and Bertram Raphael(Nils Nilsson 老先生于 2019 年 4 月 23 日去世,哀悼)于 1968 年首次提出了 A* 算法。A* 算法在寻找最优路径的过程中,使用 f(n) 来评价所有候选节点的得分,每次要扩展结点的时候都会选择那个 f(n) 最小的节点:

fca8dedcd32eeed14eb883c16cb13ad6.png

g(n) 是从出发点到 n 节点的费用值,而 h(n) 是一个被估计的从 n 到终点的费用值。不同于Dijkstra算法,A* 算法需要多考虑一个启发值 h(n),通过启发值的帮助,A* 算法可以大大减小搜索空间。

e7552f5823ac3a32e10796bd71982022.png
此图引用于:https://www.redblobgames.com/pathfinding/a-star/introduction.html

上图是三种搜索算法的对比,Dijkstra 算法只使用 g(n), 虽然可以找到最优路径,但是搜索空间巨大。贪心的最佳优先(Greedy Best-First)算法只使用 h(n),虽然减小了搜索空间,但是不能保证得到最优的结果。而 A* 算法可以保证得到最优路径,并且大大减小了搜索空间。

传统的 A* 算法使用一些比较简单的指标作为 g(n) 和 h(n),比如欧氏距离,用以解决最短路径等比较简单的问题,因此对于一些复杂的非线性问题的搜索求解并不适用。

在智能交通领域,一个非常典型的例子就是个性化的路径推荐。传统的 A* 算法对于“最短路径”、“最快路径”的搜索非常有效,但是对于“最喜欢的路径”搜索就很难发挥作用。

因为用户的偏好是一个非常复杂的非线性过程,无法用简单的欧氏距离进行度量。面对这样的问题,我们提出使用深度神经网络来学习 A* 算法的 g(n) 和 h(n) 值,以此来帮助 A* 算法解决更为复杂的问题。

研究思路

我们以个性化出行路径推荐为例子介绍神经网络是怎样与 A* 算法结合的。出行路径推荐是一个和我们平时生活息息相关的问题,也一直是各大地图应用的核心算法之一。一个好的路径推荐算法,可以提升人们的出行体验,为经济社会的发展带来价值。

出行路径推荐受到了学术界和工业界的广泛关注,最初的路径规划算法讨论的是怎样在路网上找到一条最短路径。随着时代的发展,基于历史轨迹数据的个性化的路径推荐任务也开始受到研究者们的关注。

过去的路径推荐方案大多以 A* 搜索为框架不同的费用函数对应于不同的搜索任务,比如说以移动距离为费用,那么搜索的便是最短路径,以用时为费用,那么搜索的便是最快路径,以用户的偏好为费用,那么便是个性化的路径推荐。

在现有工作中,大家往往以简单的统计或者浅层的模型来作为搜索的费用函数,但是用户的喜好往往是难以被如此简单地建模的,因此,我们提出用神经网络来学习 A* 搜索算法中的费用函数,以此为基础结合 A* 搜索算法来完成个性化的路径推荐。本文 Empowering A ∗ Search Algorithms with Neural Networks for Personalized Route Recommendation 已经被 KDD 2019 收录,可以通过https://arxiv.org/pdf/1907.08489.pdf 下载。

模型介绍

任务定义

路径推荐任务中,我们的模型接受一个历史轨迹数据集D,起点 ls,终点 ld,出发时间 b 和用户 u 作为输入,然后基于输入推荐个性化的轨迹 。形式化地来讲,我们需要找到一条条件概率最高的最优路径:

23e524d68e9dfe4f1b04ea3879c56958.png

基于A*算法的解决方案

首先我们讨论传统 A* 算法在路径推荐上的应用。A* 算法是 Dijkstra 算法的扩展,在寻找最优路径的过程中,它每次扩展一个结点 n,然后使用 f(n) 来评价这个节点的得分:

d56be94d71ee3ad468f5bfc212958858.png

g(n) 是从出发点到 n 节点的费用值,而 h(n) 是一个被估计的从 n 到终点的费用值。我们算法的关键部分就是 h(n) 的设计,它会大大影响算法的效果和性能。

前面已经说过了,我们的任务目标是最大化 Pr(p|q,u,D),它等同于最小化负对数 -logPr(p|q,u,D)。给出一条可能的路径

,我们可以将路径的概率分解为各个项之和。

ba1942e344943faace4bbb203bddd317.png

因此,对于一条路径

,我们可以计算已知费用

0878e5b21f0a970e453b727b9b7391bb.png

为了方便计算条件转移概率,在传统 A* 算法费用函数的计算中,一阶马尔可夫假设经常被使用,因此我们有

。然而在个性化路径推荐的任务中,这样简单的假设并不能很好地建模用户对于每个位置的选择,因此我们需要引入深度学习来建模用户和位置之间的复杂依赖关系。

NASR模型结构

a3346c73c476f1868d10001a54885dae.png

本文的网络主要分为两部分:g() 和 h(),分别对应于 A* 搜索算法中的两个 Cost:g 和 h。g() 学习的是从起点到候选位置的费用,我们称之为可观测费用,而 h() 学习的是从候选位置到终点的费用,我们称之为估计费用。在设计这两个网络的时候,需要满足一些要求:

1. 如何衡量已知路径的费用:怎样捕获用户的个性化偏好,时空特征以及路网限制呢? 用户的每一次的选择都会带来费用,这个费用跟用户的历史信息有关,跟时空信息也有关,并且还受到了路网邻接关系的影响。

2. 如何去衡量未来的费用:给定候选位置和终点,如何衡量这两个位置之间的费用呢? 类似于衡量路网上两个点的距离,在考虑用户偏好的前提下,怎样建模路网上两个位置之间潜在的费用是一个很重要的问题。

特征嵌入:

首先我们介绍多源输入信息的嵌入。通过词嵌入技术,我们将离散的用户信息嵌入到一个低维向量中,用 Vu 来表示。对于每一个位置,我们也使用相似的方法将这个位置嵌入到一个低维向量中,用 Vl 来表示。另外,我们又引入了时间信息,用 Vdi(b) 来表示天的向量,Vhi(b) 来表示小时的向量。最后这四者会被拼接起来成为循环神经网络的输入:

5429e63523f66448ed0bca27774d3dff.png

g网络的设计:

我们采用 GRU(门控循环单元)来建模轨迹:

60a0b7b39ca2236cb6cb6bc77f423928.png

是 GRU 在第i时刻的隐状态,它包含了该用户当前的移动状态,
是第 i 时刻的上下文向量。在引入了 GRU 之后,我们进一步引入了内部注意力机制来改进建模效果:

50637fd375e5078d818711cb4a567a46.png

在这里

是通过内部注意力机制改进了之后的状态向量,att() 是注意力函数:

c0054a089a7a5405825df4926f3e2283.png

上式中

是需要学习的参数。在内部注意力机制的基础上,我们又进一步提出了外部注意力机制,将用户的历史轨迹数据也考虑了进来:

6292a3ee81c8e3e8b8eba9851c3aa3ae.png

上式中

是用户 u 的历史轨迹集合。在实现了两个注意力机制之后,我们开始以下式计算可观察的花费函数,在这个式子中,我们考虑了:

76ace9935a21879ee113ae6a4fd8c794.png

上式中

为 li-1 的邻居集合,在上式的基础上我们可以用负对数和来计算 g 函数。

b2373955860c991198de5c011b45e12d.png

最后我们采用交叉熵来进行优化:

3755d6754bd6f44e604eb172699a92de.png

h网络的设计:

对于 h 函数,我们使用图神经网络来建模。

b8869d573888f91c0422c9029d996b61.png

上式中

是一个矩阵,这个矩阵每一行都是一个节点的表示, z 是第 z 次迭代。接着,在图神经网络的基础上,我们引入了图注意力神经网络,并在计算注意力机制的时候考虑了移动的状态
信息和位置之间的距离信息

551c5ca8297dcbfdd955715478c5f838.png

在这里

都是可学习的参数。既然我们融入了这么多信息,因此我们使用了多头的注意力机制来稳定训练过程。

87ad4be1a52e9ecdfa507365e5873b38.png

我们将 A 个参数不同的注意力机制计算的结果拼接起来,

是不同的注意力机制的参数。最后,我们使用了一个多层感知机 MLP() 来融合所有信息。

bc33c114c9bc1a975d2fe432803b7af4.png

是 GRU 输出的状态向量,
是 li 的表示向量,
是 ld 的表示向量,
之间距离的表示向量。最后,为了对 h() 网络进行训练,我们采用了时间差分的方法。首先我们将用户运动的过程定义为一个马尔可夫决策过程,对于每一次位置的转移,都会得到一个奖励,我们将奖励定义为如下形式。

08f75b7cd20f8842f04ca7d5ec2995c8.png

因此,h() 函数可以被以下式子近似,这个式子代表了未来奖励之和:

dc0994601ac8463fea71cfec76feedd6.png

上式中,γ 是折扣因子,T 是到达终点时的时间步骤数,距离当前时间点越远,那么这个奖励就需要被打的折扣越多。进一步,通过时间差分法,我们可以将时间差分学习的标签写成如下形式。

8b0aec8148a9826439b15f9baa201594.png

预测误差可以被写成如下形式:

a1bdc4123c78b1d8c21992af24c8d9c8.png

最终对于所有用户,所有轨迹的损失函数可以被定义成如下形式:

884a2695d43ac4dfb9e9432c29b54acd.png

实验结果

5d2929ac2301cea29694958ee0eb8bc7.png

b11b212024abb39e73607557e80dce8a.png

表 2 是模型的性能,对比的都是经典或者最新的算法,可以看出本文的模型表现最佳。图 2 展示了注意力机制,图注意力神经网络以及时序差分学习对于性能的帮助。

5c178d94163eecb60f786e52b5679461.png

06fdfeb79b9fa0e6bd823fca3184c47b.png

图 3 展示了图注意力机制的有效性,我们可视化了路网上每个节点与起点和终点的相似度之和,可以发现,通过图注意力机制,我们的模型可以更多地关注那些可能经过的路网上的节点。而图 4 则展示了我们 h 网络的有效性,通过 h 网络,算法的搜索空间被大大减小了,避免了很多无谓的搜索。

总结

作者提出使用神经网络来学习 A* 搜索中的费用函数,并专门设计了两个网络。这两个网络建模了用户的偏好并充分利用了路网的结构信息,取得了非常好的效果。

按照本文的思路,未来可以尝试设计不同的神经网络来适应不同的路径规划任务,从而满足用户不同的需求。更多关于大数据与城市计算的论文以及相关代码数据请访问:https://www.bigscity.com/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/472725.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java socket tomcat_在Tomcat环境下使用socket通信

最近在做一个APP的服务器端,但是APP和服务器端使用的是HTTP的通信协议,而另一方与服务器端通信却使用的是自定义的通信协议。具体的系统拓扑如下:为了完成以上的需求,一般的解决方案有两种:自己实现服务器端程序&#…

产品设计 产品经理 喜欢的网站

1 Markman http://www.zi-han.net/tools/319.html 下载地址1: 链接: http://pan.baidu.com/s/1jGKdofO 密码: 8lbh 下载地址2: 提示:安装前需要先安装AIR(官方下载) MarkMan下载:官方下载 2 在线原型制作 http://cdn…

安卓手机主题软件_类似主题软件下载-类似主题安卓官方版下载v2.6.6.3

类似主题app,介绍给大家,是一款可以让我们在线进行主题变幻,拥有更多特色主题风格的服务平台。有了它用户就可以体验不同机型的主题风格,不论苹果还是安卓都是支持的,喜欢的不妨来下载看看!【类似主题应用功…

python接单业余赚钱的门路_程序员业余时间怎么快速一年赚200万

阅读:2515348791​分享到有几个比较好的朋友,都是搞程序出身,典型的IT男,编程的能力相当不错,但是随着年龄的增大,家庭责任的到来,很希望搞点赚钱的外快,但是不知道做什么&#xff1…

Java 文件 IO 操作

文章目录1. File类2. RandomAccessFile类3. 流类3.1 字节流3.2 字符流3.3 管道流3.4 ByteArrayInputStream、ByteArrayOutputStream3.5 System.in、System.out3.6 打印流 PrintStream3.7 DataInputStream、DataOutputStream3.8 合并流3.9 字节流与字符流的转换3.10 IO包类层次关…

java dsp_GitHub - Onemeaning/JavaDsp: 数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。...

JavaDsp数字信号处理(DSP)方面的Java封装,包含常用的一些处理方法,如滤波、信号变换等等。该类库是我本科毕业设计中的一部分,绝大部分都是我自己写实现的,很少部分算法有我另外几个朋友参与讨论和实现,在此表示感谢。…

简单banner制作

简单做了一个banner,效果不是很好,主要温习了蒙版知识和滤镜的使用,其中使用(图像 > 调整 > 照片滤镜, 可以让图片融合得更协调,另外图片上添加斜线做背景,这些小技巧在做banner时,能打造…

苹果11怎么录屏_苹果11怎么设置骚扰电话号码

大家好,我是时间财富网智能客服时间君,上述问题将由我为大家进行解答。系统版本为,苹果11设置拦截骚扰电话的方法如下:1、首先打开手机设置,找到【勿扰模式】;2、将勿扰模式开启后,点击下方【允…

python序列符号_初识Python(4)__Python序列

序列序列包含:字符串,列表和元组序列基本操作符索引:seq[ind] 获得下标为ind 的元素分片( [], [:], [::] ):seq[ind1:ind2] 获得下标从ind1 到ind2 间的元素集合重复操作符( * ):seq * expr 序列重复expr 次连接操作符…

BigTable的开源实现:HBase数据库

learn from 从0开始学大数据(极客时间) 文章目录1. 两种数据库2. HBase 可伸缩架构3. HBase 可扩展数据模型4. HBase高性能存储1. 两种数据库 关系数据库(RDBMS)缺点: 糟糕的 海量数据处理能力、僵硬的设计约束 从 …

java toast_Android中Toast的用法简介

Toast是Android中用来显示显示信息的一种机制,和Dialog不一样的是,Toast是没有焦点的,而且Toast显示的时间有限,过一定的时间就会自动消失。下面用一个实例来看看如何使用Toast。1.默认效果代码Toast.makeText(getApplicationCont…

erlang lists

http://blog.csdn.net/dp0304/article/details/7590233 一,带函数Pred1, all(Pred, List) -> boolean()如果List中的每个元素作为Pred函数的参数执行,结果都返回true,那么all函数返回true,否则返回false 例子: list…

流式计算的代表:Storm、Flink、Spark Streaming

learn from 从0开始学大数据(极客时间) 文章目录1. Storm2. Spark Streaming3. Flink对存储在磁盘上的数据进行大规模计算处理,大数据批处理对实时产生的大规模数据进行处理,大数据流计算 1. Storm 一些系统 业务逻辑 和 数据处…

windows7正版验证_Windows7 寿终正寝:那些一并消逝的软件你知多少?

IT服务圈儿有温度、有态度的IT自媒体平台来源:太平洋电脑网本月,一代经典操作系统微软Windows 7正式迎来了生命周期的完结。微软宣布,此后将不再为Win7提供任何形式的更新,包括安全更新、稳定性更新和功能更新;而仍在使…

python3 整除_python如何整除

Python 的除法运算符有两个:“/”表示普通除法,使用它除出来的结果与平常数学计算的结果是相同的(即除不尽时,会产生小数部分);而“//”表示整除,使用它除出来的结果只有整数部分,小数部分将会被舍弃。记住…

java implements t_Java泛型——為什么“擴展T”允許而不是“實現T”?

I wonder if there is a special reason in Java for using always "extends" rather than "implements" for defining bounds of typeparameters.我想知道在Java中是否有一個特殊的原因,因為使用總是“擴展”而不是“實現”來定義類型參數的界…

php调用webservice报错Class 'SoapClient' not found

php调用webservice报错Class SoapClient not found 原文:php调用webservice报错Class SoapClient not found php在调用webservice时,报告如下类似错误: ( ! ) Fatal error: Class SoapClient not found in E:/WebSrv/CI/system/libraries/WebService.php…

stotybord如何添加子视图_Revit软件技巧合集(建筑构件、视图处理、建筑表现、高级技巧)...

Revit软件技巧合集164套(建筑构件、视图处理、建筑表现、高级技巧)BIM技术在我国建筑行业受到了越来越多的关注,也得到了快速地发展。BIM应用软件也如雨后春笋般的涌现,随着时间的推移,revit在BIM应用中将成为设计利器,而在工程施…

ZooKeeper 保证数据一致性

learn from 从0开始学大数据(极客时间) 文章目录1. 分布式一致性原理2. Paxos 算法与 ZooKeeper 架构1. 分布式一致性原理 CAP 原理认为,一个提供数据服务的分布式系统 无法同时满足 数据一致性(Consistency)、可用性…

python使方法执行10次_Python提升程序性能的七个手段

1. 使用局部变量尽量使用局部变量代替全局变量: 便于维护, 也可以避免不必要的资源浪费使用局部变量替换模块名字空间的变量, 例如: ls os.linesep. 一方面给可以提高程序性能, 局部变量查找速度更快; 另一方面可以采用简短标识符代替冗长的模块变量, 提高可读性.2. 减少函数调…