使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

选自Sentiance

机器之心编译

参与:Panda

数据科学公司 Sentiance 近日刊文介绍了新机器学习算法平台,该平台能以自监督的方式学习位置数据并从中提取见解。机器之心对该文章进行了编译介绍。

引言

我们 Sentiance 开发了一款能接收加速度计、陀螺仪和位置信息等智能手机传感器数据并从中提取出行为见解的平台。我们的人工智能平台能学习用户的模式,并能预测和解释事情发生的原因和时间,这让我们的客户能够在正确的时间以合适的方式指导他们的用户。

场地映射算法(venue mapping algorithm)是我们的平台的一个重要组件。场地映射算法的目标是根据来自智能手机位置子系统的往往不准确的位置测量数据,搞清楚你将要到达的场地。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 1:左图:场地映射的意思是估计用户实际正在前往的临近场地;右图:人类直觉能帮助我们快速排除不太可能的场地,比如一位用户正去往海滩时不太可能去救生站。

尽管场地映射总体上是一大难题,而且也是我们未来一篇博客文章的主要内容,但基于该地区周围地理情况的人类直觉却能轻松简单地处理。如图 1 所示,假设一位用户正前往圣莫尼卡海滩。只需看一眼周围的地理情况,我们就知道该用户实际正前往求生站的概率可能相当小。

事实上,只需要看一眼这个区域的地图,人类往往就能快速排除不太可能的场地并构建一个实际情况的预先信念。这个场地位于工业区、公园、靠近海滩、市中心还是公路旁边?

为了让我们的场地映射算法具备同样的直觉意识,我们开发了一种基于深度学习的解决方案,其可训练用于编码地理空间关系和描述位置周围情况的语义相似度的模型。图 2 是这一概念的图示。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 2:给定位置周围的区域会被栅格化(rasterized),然后被传递给一个深度神经网络。这个网络用作编码器,输出一个能获取输入位置的高层语义的嵌入。

编码器会将位置转换成分布式的表征,这类似于 Word2Vec [1] 对自然语言所做的工作。这些嵌入位于一个度量空间中,因此遵循代数规则。比如,我们可以使用词嵌入推理词的相似度和类比关系。我们甚至可以直接在嵌入空间中执行「国王-男人+女人=女王」这样的算术运算。

在接下来的几段中,我们将会讨论我们如何设计了一种解决方案,可学习将位置坐标映射到度量空间中,这让我们可以执行一些类似于词嵌入的操作,如图 3 所示。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 3:我们提出的解决方案可直接优化度量空间,这样就能使用基本的算术运算探索该嵌入空间了。

图像瓦片生成

栅格化 GIS 数据

给定一个位置坐标和一个半径,我们可以查询我们的 GIS 数据库以获取大量地理信息。我们的 GIS 数据库是一个存储在一个 PostGis 数据库中的 OpenStreetMap 的本地副本。PostGis 是一个很方便的 PostgreSQL 扩展,增加了对空间运算符、类型和索引的支持。

比如,我们可以使用一组查询轻松检查一个定位附近是否有河流、这里离最近的火车站有多远,这个位置附近是否存在道路。此外,实际道路本身可以以折线的形式被提取出来,同时火车站建筑的外形轮廓可被提取成一个多边形对象。

但是,我们不清楚如何将这样大量的非结构化数据有效地提供给神经网络进一步处理。考虑到我们训练神经网络的目标是理解距离、包含、遮挡和相离等形状和空间关系,所以我们决定在将位置的周边情况送入编码器之前首先将其栅格化处理成固定尺寸的图像。

幸运的是,我们正好有能做到这一点的有效工具。我们将 Mapnik 及其 Python 捆绑包与一个定制版本的 OpenStreetmap-Carto 样式表组合到了一起,得到了一个快速栅格化器(rasterizer),我们可以将其用于生成图像瓦片(image tile),如图 4 所示。

  • Mapnik:https://github.com/mapnik/mapnik
  • OpenStreetmap-Carto:https://github.com/gravitystorm/openstreetmap-carto

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 4:Mapnik 被用于将从 PostGis 取出的 GIS 数据栅格化处理成图像

我们将我们的栅格化服务进行了参数化,以便在生成图像瓦片之前轻松地通过旋转和平移地图来执行数据增强。如图 5 所示,其中的图像块展示了同一个位置,只是有不同方向角和水平及垂直偏移值。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 5:我们的图像瓦片生成器允许在生成图像瓦片之前通过旋转和平移地图来轻松执行数据增强

从图像到张量

尽管这些栅格化得到的图像瓦片让我们的编码器可以轻松学习获取空间结构和关系,但仍有大量信息在栅格化过程中丢失。事实上,栅格化会将道路、建筑、公园轮廓、河流等所有的多边形和折线段融合到一起。因为我们的 GIS 数据库包含每个结构单独的信息,所以让神经网络编码器来学习分割它们实在就没有必要了。

因此,我们不是将数据栅格化成三通道的 RGB 图像,而是如上图所示对该栅格化器进行了修改,让其生成一个 12 通道的张量,其中每个通道都包含了一种不同类型的栅格化后的信息。图 6 展示了这样一个 12 通道的张量,其坐标与图 5 的一样。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 6:一个 12 通道张量被用于表示该区域。每个通道都包含一种特定信息,比如道路网络、土地(包含绿地、水域等)、便利设施等

为便于人眼观察,本文的后续内容基本都展示 RGB 栅格化版本,而非 12 通道的张量。

表征学习

空间相似度

我们的目标是学习一个度量空间,其中语义相似的图像块对应于该空间中互相接近的嵌入向量。然后问题就变成了如何定义「语义相似」。

一种简单直接的获取相似度空间的方法是使用直方图表示每个图像块,使用 k-均值聚类,再使用一个词袋模型建模该空间。但是,我们仍然不清楚每个通道应该具有怎样的权重。比如,如果道路相似,但建筑不相似,那么两个图像块是否语义相似?

此外,即使两个图像块有相似的直方图,这也不能为我们提供任何有关该位置周边情况的空间结构信息。假设一个图像块中一半都被海洋覆盖,那么这个图像块是否与包含大量小池塘、湖泊或喷泉的图像块语义相似?图 7 给出了两个能得到几乎完全一样的直方图的图像块:

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 7:基于直方图的聚类不足以得到语义相似度和空间关系。这两张图像有几乎完全一样的直方图,但它们的语义含义差别相当大。

但是,这些图像块的语义并不一样。第一个图像块是一个交叉路口区域,第二个图像块则是某些可能通向居民房屋的小型道路。实际上在我们的嵌入空间中,我们发现这两个图像块的嵌入之间的欧几里德距离其实相当大,即使它们的直方图之间的卡方距离(Chi-Square distance)接近于零。

除了使用直方图,每个通道都可以通过一组特征来归纳总结以获取空间关系,比如有向梯度直方图(HoG)或者更传统的 SIFT 或 SURF 描述符。但是,我们没有试图人工指定哪些特征定义了语义相似度,我们决定使用深度学习的力量来学习自动检测有意义的特征。

为了做到这一点,我们将这种 12 通道张量输入到了一个用作我们的编码器的卷积神经网络中。该网络使用一个三重损失函数(triplet loss function)以自监督的形式进行训练,这意味着在训练过程中无需人工标注的数据。

自监督学习:三重网络

三重损失概念的灵感源自孪生网络(siamese network)架构,这是 Ailon et al. [2] 为无监督特征学习执行深度度量学习而提出的一种方法。

三重网络是一种使用三元组 进行训练的神经网络架构,其中包括:

  • 一个锚实例 x
  • 一个与 x 语义近似的正实例 x+
  • 一个与 x 语义不同的负实例 x-

然后训练该网络,使其学习一个嵌入函数 f(.),使得,从而直接优化度量空间。如图 8 所示。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 8:三重网络是使用一个三重损失训练的,这样在学习到的度量空间中,相似的实例彼此更为接近,不相似的实例则相距更远。

使用三重网络的度量学习因谷歌的 FaceNet [3] 而变得更为流行,其中使用了三重损失来学习人脸图像的嵌入空间,这样相似人脸的嵌入就更为接近,不同人脸的嵌入则距离更远。

对人脸识别而言,正例图像是来自锚图像中同一人的图像,而负例图像则是从 mini-batch 中随机选择的人的图像。但是,我们这个案例却没有能轻松选择正实例和负实例的分类。

为了定义语义相似度,我们可以使用托伯勒提出的「地理学第一定律」:「在地表空间中,所有事物是相互联系的,但是距离近的事物比距离远的事物间的联系更密切。」

下面,设 I(.) 是从位置坐标到栅格化图像块的映射。对于位置 X,给定一个在栅格化图像块之前执行的旋转和平移变换 T(.),再给定一个随机位置 Y,且 X≠Y,那么我们可以得到我们的三元组:

  • x=I(X)
  • x^+=I(T(x))
  • x^-=I(Y)

因此,我们假设两个地理上邻近且存在部分重叠的图像块在语义上比两个完全不同的图像块更相关。图 9 给出了两个三元组示例,这两个三元组的锚图像是一样的。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 9:由一张锚图像、一张正例图像和一张负例图像构成的三元组

为了防止神经网络只学习到简单的变换,我们还在训练过程中为每个正实例随机启动或禁用了 12 个通道中的某些通道。这会迫使网络认为正例图像块与锚图像是近似的,即使该信息的某个随机子集是不同的(比如没有建筑、没有道路等)。

SoftPN 三重损失函数

图 10 展示了我们的三重网络的一般结构。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 10:这个三重损失直接优化「锚嵌入和正例嵌入之间的距离」与「锚嵌入和负例嵌入之间的距离」的比

这个损失函数定义为,这样优化网络就对应于最小化向量 相比于向量 (0,1) 的均方误差(MSE)。

我们为什么这样定义损失函数?考虑到我们希望 Δ(a,p) 尽可能地接近于零,同时我们又希望 Δ(a,n) 尽可能大。为了优化这个比值,我们在这两个距离上都应用了一个 SoftMax,以得到这个域的有界相似度:

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

这种三重损失的定义往往被称为 SoftMax 比,并且最早是由 Ailon et al. [2] 提出的。

这个定义的主要问题是网络很容易快速学习到一个 d_ 接近于 1 的嵌入空间,这是因为大多数随机负例图像与锚图像有非常大的差异。因此,大多数 (a,n) 对都对优化过程中的梯度作用不大,这会导致网络很快停止学习。

有不同的方法可以解决这个问题,其中之一是高难负例挖掘(hard-negative mining)[3],即仔细选择 (a,n) 对以确保网络保持学习。但是,在我们的情况中,我们并不清楚如何有效选择高难负例,同时又不向学习过程引入偏差。使用 Balntas et al [4] 提出的 SoftPN 三重损失函数是一种更简单的解决方案。

这种 SoftPN 损失会使用 min(Δ(a,n),Δ(p,n)) 替代上述 SoftMax 计算中的 Δ(a,n)。其效果是,在优化过程中,该网络会尝试学习一个度量空间,其中锚嵌入和正例嵌入都离负例嵌入尽可能地远。相对而言,原来的 SoftMax 比值损失仅考虑了锚嵌入和负例嵌入之间的距离。图 11 展示了这两者的差异。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 11:SoftPN 损失优化这个更困难问题的方式是最大化负例嵌入与锚嵌入和正例嵌入两者之间的最小距离

神经网络架构

我们使用了一个相当传统的卷积神经网络架构作为编码器,其中包含 5 个过滤器大小为 3×3 的卷积层,之后是两层 1D 卷积和一个密集连接层。使用一维卷积的目的是通过跨通道参数池化(cross-channel parametric pooling)[5] 降低通向网络顶部的维度。

而嵌入层本身也是由另一个带有线性激活函数的密集层构成的,这样,经过其前一层的非线性之后,其输出就不会一直被局限在正例域内。图 12 给出了其完整的网络架构。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 12:这个编码器包含一个卷积神经网络,后面跟着一个全连接层。最后的嵌入层是一个带有线性激活函数的密集层

我们积极使用了 dropout 和批归一化,并使用了 Leaky ReLU 激活函数以避免在初始测试运行中观察到的 ReLU 死亡问题。

此外,我们还在输入上直接应用了空间 dropout。这会导致一个随机选出的输入通道被完全丢弃,这能迫使网络通过关注不同的通道来学习区分图像。

完整网络是用 Keras 实现的,仅包含 305 040 个参数,并且使用 Adam 优化器在 p3.2xlarge AWS 机器上训练了两周时间。

训练数据

为了生成我们的训练数据,我们在我们的平台上取出了用户去过的 100 万个位置,并且添加了大约 50 万个用户在交通工具中的位置定位。

对于这 150 万个位置,每一个我们都栅格化得到了一个尺寸为 128x128x12 的图像瓦片,代表该位置周围半径 100 米的区域。这些张量用作锚图像。

对于每个位置,我们还栅格化了 20 张随机平移和旋转的图像瓦片,这些用作正例图像。偏移量是在 0 到 80 米之间均匀采样的,而且水平和垂直方向都有。这样,每个位置会得到 20 对(锚图像,正例图像),总共就是 3000 万张图像。

三元组在网络训练过程中生成,同时生成 mini-batch。每个 mini-batch 包含 20 个位置。对于每个位置,我们随机选出 5 对(锚图像,正例图像)来得到锚-正例距离的有意义表征。负例图像在每个 mini-batch 内随机选择,这样每个 mini-batch 的大小即为 100。

在训练过程中同时生成三元组 mini-batch 实际上就能得到近乎无限大的不同三元组数据集,这能让网络不断学习很多个 epoch。

可视化过滤器和激活

因为这个嵌入空间是以一种自监督的方式学习到的,没有标注数据,所以难以在训练过程中监控网络是否真正学到了什么东西。

可视化网络学习到的过滤器是一种不充分但仍然有用的方法。实际上,我们希望可视化最大化网络中不同层的激活的输入图像。为了做到这一点,我们可以从一张随机生成的图像开始,并且将每个像素都看作是一个有待优化的参数。然后我们使用梯度上升更新图像像素,这样它就能最大化所选择的层的输出。

根据这个卷积层的平均输出激活计算输入图像的梯度并迭代运行梯度上升几次,就能得到突出该层中最相关的结构的图像。

因为我们的输入是一个 12 通道的张量,不是 RGB 图像,所以我们只选择其中 3 个有最高平均像素幅度的通道并将它们排列成 RGB 图像。我们对每个通道应用了直方图均衡化(histogram equalization),以进一步增强视觉细节。

图 13 展示了网络的一个底层的 32 个过滤器中每一个的结果。很显然,这一层看起来关注的是道路和小块结构等低级细节。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 13:网络的底层学习的是检测道路和小块结构等低级细节

图 14 可视化了一个更高层的 64 个过滤器。这些过滤器显然会被更平滑且更复杂的结构激活,这说明网络确实可能正在学习其输入的一种分层的特征分解。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 14:网络的更上层往往能通过组合来自更低层的低级特征而学习更复杂的结构

尽管这些可视化的用途不应被高估,但它们看起来很有意思,尤其是在很多研究迭代过程中时。比如,早期的版本很快就为我们指出了正确的方向,让我们发现了我们网络中的一堆死掉的 ReLU。后面我们通过用 Leaky ReLU 激活函数来替换而解决了这个问题。

探索度量空间

可视化嵌入

在调试网络时,可视化网络学习到的过滤器确实很有意思,但在评价所学习到的嵌入空间的质量方面用处不大。

为了搞清楚嵌入空间看起来如何,图 15 展示了使用 PCA 将维度降至三维之后的嵌入空间。为便于理解,每一个位置嵌入都在图中用其栅格化图像瓦片表示。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 15:通过 PCA 得到的嵌入空间的 3D 图

这清楚地表明,即使只有前三个主成分,也能得到大量相关信息。公园等绿色区域、公路和主干道等不同道路类型、以及图中右下角的城市中心等区域有明显区别。

为了更清楚地展示这些局部结构,图 16 给出了该嵌入空间的三维 t-SNE 动画。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 16:通过 t-SNE 得到的嵌入空间的 3D 图

尽管场地映射是这些嵌入的一大明显用例,但它们也可被我们交通方式分类器使用。图 17 展示了从我们的交通方式分类训练集(https://goo.gl/VhwuwS)提取出的定位的嵌入的散点图。在这个案例中,我们使用了线性判别分析(LDA:Linear Discriminant Analysis)将 16 维的嵌入空间投射成了 2 维。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 17:在乘坐交通工具期间收集的航路点的嵌入空间的 2D LDA

这张图表明不同的交通模式通常出现在不同的地区。比如,我们的嵌入得到了有关火车轨道或电车站的信息。

为了展示被编码的地理区域的差异有多大,我们使用 PCA 将这个 16 维嵌入降维到了 3 维,这在比例调整之后被直接用作了 RGB 颜色值,从而可将我们的测试数据集绘制到一张地图上。图 18 给出了结果,这是在英国伦敦。可以清楚地看到,市中心、公路、水域、旅游区和居民区的编码都不一样。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 18:在英国伦敦随机采样的位置的嵌入。这里的颜色是使用 PCA 将 16D 嵌入向量降维至 3D RGB 三元组而得到的。

我们也对英国伯明翰执行了类似的操作,可以看到伯明翰的郊区比伦敦更大,而伦敦周围的区域包含多得多的建筑。如图 19 所示。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 19:在英国伯明翰随机采样的位置的嵌入。这里的颜色是使用 PCA 将 16D 嵌入向量降维至 3D RGB 三元组而得到的。

在空间中随机游走

为了进一步检查该嵌入空间的平滑性,我们可以从一个随机种子点(seed point)开始执行随机游走。在每次跳跃时,我们都随机选择一个当前嵌入的 k-最近邻并可视化对应的图像块。

图 20 展示了几个这种随机游走的结果。注意,大多数情况下,在该嵌入空间中的最近邻在地理位置上都远离彼此数百或数千公里,但它们有很高的语义相似度。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 20:在该嵌入空间中的 6 次随机游走结果,每一次都从一个不同的种子点开始。

使用位置进行计算

尽管上述可视化结果表明所学习到的嵌入空间是平滑的且学会了获取语义相似性,但它不能证明我们实际上学习到了一个欧几里德度量空间。在一个欧几里德度量空间中,我们应该可以在嵌入之间进行插值并执行基本的算术运算,同时得到有意义的结果。

图 21 从左到右展示了在两个嵌入之间的插值结果。在插值的每一步,所得到的嵌入都被映射到了其在我们的测试数据中的最近邻嵌入;这里展示了其对应的图像瓦片。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 21:从一个嵌入(左)到另一个嵌入(右)的插值,其中展示了每个中间步骤的来自我们的测试数据的最近邻图像。

最后,图 22 展示了我们对嵌入进行加减运算所得到的结果,同样,这些图像结果是来自测试数据的对应最近邻图像。

使用三重损失网络学习位置嵌入:让位置数据也能进行算术运算

图 22:使用嵌入进行计算,并将结果映射回我们测试数据中的最近邻图像

这些结果表明我们的嵌入空间表示的度量空间中的距离实际上具有含义以及基本算术规则

因为这个度量空间是以一种自监督的方式训练的,所以可以使用大量无标注数据来强制网络学习获取有意义的关系。因此,使用这些嵌入作为我们后续分类器中的特征向量,就对应于一种形式的迁移学习,这让我们可以使用非常有限量的有标注数据训练强大的分类器。

总结

在这篇文章中,我们展示了可以如何使用三重网络来学习能获取不同地理位置坐标之间的语义相似度的度量空间。

我们训练了一个卷积神经网络来学习提取定义这个语义相似度的特征,并使用度量学习的方法得到了一个嵌入空间。

所得到的嵌入空间可被直接用于场地映射或交通方式分类等任务,并能通过迁移学习的方式帮助我们极大提升我们的分类器准确度和泛化能力。

此外,这些嵌入还能为我们的分类器增加一定的直觉,因此不正确的分类结果仍具有直觉意义。比如,场地映射器可以快速学习将白天和夜晚的活动与工业区、市中心、公园、火车站等特定区域联系起来。

如果你想了解有关我们平台的更多信息并自己动手尝试,可联系我们或下载我们的演示应用 Journeys:http://www.sentiance.com/demo

相关推荐