专栏首页数据魔术师转载 | 仓储库存选品问题的商品向量化解决方案

转载 | 仓储库存选品问题的商品向量化解决方案

想象一下,你在网上订购了一台咖啡机和一袋咖啡,咖啡机第二天到了,但咖啡在三天后才到。一次下单同时购买多个商品,最后却被拆分成多个订单包裹陆续收货,这样的情况不知道您是否遇见过。

图1 门前堆放的因拆单导致的多个包裹

在这篇文章中,我们将结合在京东的实践经验,分享我们是如何通过算法优化在仓配网络中的不同节点的商品库存分配,来减少以上这样给客户带来困扰的情况。

作为中国最大的B2C自营线上零售商,相对于行业 ,京东的履约服务为消费者带来极致的体验,当日达和次日达的订单履约比例超过90%。

为了实现更快的交付速度和更好的客户购物体验,京东建立了一个多级仓配网络(图2),覆盖中国大陆99%的人口:包括区域配送中心(RDC),前置配送中心(FDC),以及我们称之为TDC的更低一级配送中心,以及其他类型的仓库等。 京东使用较低级别的配送中心,如FDC和TDC,以尽快满足中小城市的客户需求。从这样较低级别的配送中心发货的订单还可以节省额外的履约成本。

图2 京东仓配网络

然而,FDC和TDC不能像RDC这样的大型配送中心拥有近乎全量的SKU(Stock Keeping Units)。 FDC的库存选品问题,是确定在FDC中存储哪些SKU,以更多的实现可完全从FDC履约的订单数量。如果客户下订单只包含一个SKU,则最近的FDC在有库存的情况下可以直接履约订单。如果订单中包含多个SKU,则有可能发生订单拆分。也就是说,因为最近FDC没有包含该订单所需的所有SKU,所以某些SKU需要由更高级别的配送中心(如RDC)来发出,从而导致订单拆分和可能不一致的货物送达时间(如图3所示)。

图3 由于订单拆分导致的不一致的收货时间

数学模型

让我们举例说明如何为单个FDC进行库存选品决策

基于在一段时间内下达的订单历史数据,我们希望最大化仅由FDC本地库存即可满足的订单数量。假设一个订单中的所有SKU都在本地FDC中有现货库存,我们履约这样一个订单将获得1分奖励; 否则,因为订单将由多个配送中心拆分和履行,我们只能得到0分。对于在FDC内任意一种确定的库存选品组合,我们可以计算每个订单的奖励,计算出来奖励的总和即是不需要拆分履约的订单总数。然后问题变为找到最大化奖励的选品组合。然而,这种问题非常困难,因为可选的库存选品组合数量会非常大。从1000个候选SKU池中选择100个SKU形成组合可以产生6.38x10^139种可能性。而京东线上销售有数百万件商品,从中找到所有的选品组合,更是一件不可能的事。

在数学上,问题可以表述如下。我们将 I 定义为候选SKU的集合, J 定义为(唯一)订单类型的集合。每个订单类型 j∈J 与权重 v_j 相关联,权重 v_j 是它在订单集中出现的次数。我们将二元决策变量定义为 X_i ,如果在FDC商品库存中选择SKU i ,则 X_i , i∈I 为1;如果订单类型j可以仅由FDC分类满足,则 Y_j , j∈J 为1。注意到,我们假设在FDC中存放的SKU都是有足够库存的。这个决策问题的数学表达是:

其中K是可以存储在FDC中的SKU种类的总数量。

商品向量化

由于组合性质和问题的量级,完全解决上述优化问题是不切实际的。该问题在实际情况中可以包含超过1000万个决策变量,对于常规数学求解器(如CPLEX),加载如此规模的决策问题都是一件困难的事。

一种可以获得高质量答案的简易方法是使用启发式算法。最容易想到的方法,是可以通过受欢迎程度对SKU进行排名(我们在本文中将此算法称为为“贪婪排序算法”),然后按排名选择库存组合。背后的逻辑是,大部分的订单都包含热门SKU,如果库存大部分由热门SKU组成,就可以从该FDC履约更多订单。但是,因为贪婪排序算法并没有考虑哪些SKU更有可能被一起购买,所以不是足够好的解决方案。

为了获得更好的解决方案,我们真正需要的是订单级别的受欢迎程度,即最受欢迎的商品关联组合是什么?比如购买婴儿尿布的顾客是否更有可能同时购买啤酒?或某些特定品牌的婴儿小吃?

如果我们能够确定热门订单中哪些商品更有可能一起购买,并将其存放在FDC中,那么我们就有信心使得大部分订单可以由本地库存单独履约。然而,与单个商品的受欢迎度预测相比,订单模式(或商品组合)的流行度是极难预测的,因为产品之间组合的数量几乎无限大。

为了克服这一挑战,我们使用了一种名为SKU2Vec的技术来计算每个SKU的隐空间向量表示(latent vector representation)。这个想法是受Google的Word2Vec论文启发而来。该论文提出了一种无监督学习的方法,通过研究不同单词出现在一起的句子,来学习单词所表示的含义。在我们的例子中,SKU就像句子中的单词,包含多个SKU的订单,类似于包含许多单词的句子。

使用SKU2Vec,订单所隐含的背景信息被嵌入SKU隐空间向量中。如果两个SKU隐空间向量“距离”接近,我们知道它们更可能被一起购买,因此应该考虑一起存放在FDC中。

图4 商品向量化的实现方法

SKU2Vec方法遵循以下几个步骤。我们首先将某个包含N个商品的订单,通过把每个商品轮流从原始订单中剔除,人为转换为N-1个生成订单。其中,剔除的商品将作为该生成订单在监督模型的输入(标签)。该模型通过将生成订单中的N-1个商品作为输入,来尝试预测原始订单(N个商品)中被剔除的的商品是什么。作为输入的生成订单中的每个商品由低维向量表示,并且通过求取均值来获得这个生成订单的向量表示 – 称为订单意图向量。然后基于订单意图向量,模型会给出被剔除商品的预测。从这个意义上说,频繁出现在同一类订单中的商品应具有相似的向量表示,表明它们在订单背后所隐含信息的接近程度。

以下将某一阶段的订单交易数据作为输入进行训练后,利用TSNE,把商品的隐空间向量投影到2D空间进行可视化的示例图:

图5 商品向量在二维空间上的投影

在图5中,蓝色圆点表示一堆婴儿尿布产品,右下方的红点包含几种零食产品,例如被视为产妇营养品的大枣。由于尿布是京东商城上最受欢迎的商品品种之一,几乎肯定会存放在FDC中。而通过这个可视化示例中尿布和大枣之间的密切关系表明,大枣(不是啤酒) 也应存放在该FDC,尽管大枣并不是最畅销的产品。

图6 消费者正在下单购买尿布和大枣

端到端神经网络框架

我们设计了一个端到端的神经网络框架,通过直接捕获商品之间的关联购买关系来制定库存选品策略。我们的主要创新点包括:

- 通过使用嵌入层将品类信息、SKU id等与商品相关的高维分类信息映射到可用作输入的潜在空间。

- 我们将订单拆分比率直接建模为损失函数,缩小预测和优化之间的差距。

网络架构如下所示:

图7 端到端神经网络框架

首先,我们获取所有商品层面的特征信息,如最近的销售,订单数量,页面浏览量等连续和离散特征。离散特征通过嵌入层映射到矢量,并与连续数量类信息结合。基于输入特征向量,计算每个商品属于该仓库库存选品的概率。最后,我们将原始订单中每个SKU的属于该仓选品的概率相乘,计算出该订单不被拆分的概率(整单履约率Z),即在FDC库存选品中覆盖订单中所有SKU的概率。

从这个意义上说,每当一对商品总是出现在频繁购买的相同类型的订单中时,该组合两种商品属于该仓库选品的概率应该以同步的方式接近1或0。否则,将任何一个商品包含在仓库中的好处就会消失(考虑一个产品的概率为1而另一个产品为0的情况,这导致不拆单的概率为0)。

算法表现评估

我们在三个主要区域仓库测试了SKU2Vec算法。我们如下所述以滚动的方式评估算法,其中2周的数据用作训练集,并且使用下周的订单对结果进行基准测试。

图8 训练和测试样本选择

总体而言,与基准算法(“贪婪排序“算法的改进版本)相比,我们实现了约2%的订单拆分比率降低。订单拆分比率的降低意味着,原本每年需要履约的包裹数量减少200万件。这进一步意味着我们的仓库员工和送货快递员工作量的减少,以及更多的客户可以享受在同一包裹中收到咖啡机和咖啡的快乐。

目前,我们正在努力在我们的一些仓库中试用该算法并在生产系统中实施该算法。

在这篇文章中,我们展示了如何使用最先进的方法,如通过神经网络的商品嵌入算法来解决同时具有预测和优化性质的问题。这篇文章是关于存货布局问题的两个系列博客文章中的第一篇。在第二篇文章中,我们将重点关注更多以运筹优化方式,实现进一步的改进! (深度学习并不总是最好的方法,我们需要根据实际情况灵活处理。)

** 本文转载自公众号[大数据与智能供应链事业部],转载请注明出处。**

---The End---

本文分享自微信公众号 - 数据魔术师(data-magician),作者:京东智能供应链

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2018-11-30

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 产品|智能仓储AGV调度仿真优化平台

    随着我国社会主义市场经济的不断发展,以及互联网技术的普及,我国电子商务等产业迎来了新的发展高峰。为减少订单履行成本,满足客户多样化需求,增强核心竞争力,主流电商...

    用户1621951
  • 论文算法复现 | 推荐系统之基于Item Co-occurrence矩阵分解的原理及实现

    传统的推荐系统使用用户-项目匹配矩阵来预测用户对项目的兴趣程度,矩阵如上图所示,推荐算法的实现过程可以看作是填补矩阵中缺失值的过程。

    用户1621951
  • Python AI 教学 | 矩阵补全(matrix completion)的实现及应用

    假设你现在手头上有一个用户的观影历史数据矩阵,这个矩阵的行表示用户,列表示电影,矩阵中的元素为观众给电影的星级,1-5代表着用户对电影的喜爱程度递增。矩阵局部见...

    用户1621951
  • SpringMVC知识点梳理—够你面试掰活的(超详细)

    Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进...

    本人秃顶程序员
  • SpringMVC常见面试题总结(超详细回答)

    Spring MVC是一个基于Java的实现了MVC设计模式的请求驱动类型的轻量级Web框架,通过把Model,View,Controller分离,将web层进...

    程序员小强
  • Caffe实践 - 基于VGG16 多标签分类的训练与部署

    假定每张图片具有 N 个标签(本文N=3),分别为 label1,label2,label3,...,labelNlabel1,label2,label3,.....

    AIHGF
  • HoloLens汇聚最优医疗资源,助医生出色完成肠癌手术

    VRPinea
  • PHP 使用协同程序实现合作多任务(二)

    waitingForRead 及 waitingForWrite 属性是两个承载等待的socket 及等待它们的任务的数组。有趣的部分在于下面的方法,它将检查 ...

    后端技术探索
  • 人工智能的未来在于数据

    据美国著名杂志《连线》(WIRED)网站2015年11月报道,Google开源机器学习系统TensorFlow表明人工智能的未来依赖于数据,而不是软件。 Goo...

    人工智能快报
  • 对于Ext.data.Store 介紹 与总结,以及对以前代码的重构与优化

         对于Ext.data.Store 一直不是很了解,不知道他到底是干嘛的有哪些用处,在实际开发中也由于不了解也走了不少弯路, store是一个为Ext器...

    hbbliyong

扫码关注云+社区

领取腾讯云代金券