Представьте, что вы разместили онлайн-заказ на кофеварку с пакетом кофе, и кофеварка прибыла на следующий день, а ваш кофе прибыл через три дня после этого. Вы когда-нибудь сталкивались с такими ситуациями, когда разные товары, заказанные онлайн одновременно, попадали в несколько коробок и в разное время?

В этом посте мы опишем один из наших лучших методов на JD.com, чтобы уменьшить такие запутанные ситуации для клиентов, тщательно выбирая ассортимент инвентаря для распределения на каждом узле в нашей сети выполнения и складирования.

JD, как интернет-магазин, предлагающий более высокую скорость доставки по сравнению с конкурентами, доставляет более 90% товаров в тот же день и на следующий день.

Для достижения более высокой скорости доставки и улучшения качества покупок у клиентов JD построила многоуровневую распределительную сеть (рис. 2), состоящую из региональных распределительных центров (RDC), фронтальных распределительных центров (FDC), распределительных центров нижнего уровня, которые мы назвали TDC, и другие местные склады для охвата 99% населения материкового Китая. JD использует распределительные центры нижнего уровня, такие как FDC и TDC, чтобы максимально быстро удовлетворить потребности клиентов из средних или малых городов. Заказы, отправленные из распределительных центров нижнего уровня, также обеспечивают дополнительную экономию средств при выполнении.

Однако FDC и TDC не могут содержать столько складских единиц (SKU), сколько крупные распределительные центры, такие как RDC. Задача инвентарного ассортимента в FDC состоит в том, чтобы определить, какие артикулы должны храниться в FDC, чтобы максимизировать количество заказов, которые могут быть выполнены полностью из FDC. Если клиент размещает заказ, содержащий только один SKU, то заказ может быть выполнен ближайшим FDC, если SKU хранится как часть запасов в FDC. Если в заказе содержится несколько артикулов, то заказ может быть разделен. То есть некоторые артикулы должны быть выполнены распределительным центром более высокого уровня, таким как RDC, потому что FDC не хранит эти артикулы в своем инвентаре, что приводит к разделению заказов и потенциально непостоянным срокам доставки (показано на рисунке 3).

Математическая формулировка

Давайте рассмотрим наглядный пример того, как принять решение об ассортименте запасов для одного КПД.

Учитывая набор заказов, размещенных в течение определенного периода времени, мы хотели бы максимизировать количество заказов, которые могут быть удовлетворены исключительно за счет местных запасов FDC. Если все SKU в заказе присутствуют в FDC, мы получаем вознаграждение в размере 1 за выполнение такого заказа; в противном случае мы получим 0 вознаграждений, поскольку заказ будет разделен и выполнен несколькими распределительными центрами. Для любого фиксированного ассортимента инвентаря в FDC мы можем вычислить вознаграждение за каждый заказ, а сумма вознаграждений - это общее количество заказов, которые не нужно разделять. Тогда проблема заключается в том, чтобы определить ассортимент инвентаря, который максимизирует вознаграждение. Однако такая задача крайне сложна, так как ассортимент может быть очень большим. Выбор 100 SKU из пула 1000 возможных SKU может дать 6,38x10¹³⁹ возможных вариантов. JD.com предлагает миллионы товаров, продаваемых на веб-сайте, чтобы сформировать ассортимент.

Математически задачу можно сформулировать следующим образом. Мы определяем I как набор возможных SKU, J как набор (уникальных) типов заказов. Каждый тип заказа j J связан с весом v_j, который представляет собой количество раз, которое он встречается в наборе порядка.

Мы определяем бинарные переменные решения как X_j, i ∈ I равным 1, если SKU i выбран в ассортименте FDC; j J равно 1, если тип заказа j может быть удовлетворен только ассортиментом FDC. Мы отмечаем, что мы предполагаем, что у нас всегда есть достаточно запасов в FDC для артикулов, принадлежащих к ассортименту. Математическая постановка задачи:

где K - количество уникальных SKU, которые могут храниться в FDC.

Встраивание продукта

Точное решение указанной выше задачи оптимизации нецелесообразно из-за комбинаторного характера и большого масштаба проблемы. Задача может содержать более 10 миллионов переменных, что позволяет выгружать ее даже в обычные математические решатели, такие как CPLEX.

Самый простой способ получить качественное решение - использовать эвристические методы. Самая простая эвристика, которую можно придумать, - это ранжирование SKU по их популярности (в статье мы будем называть алгоритм жадным ранжированием). Логика заключается в том, что мы можем отправлять больше заказов из FDC, поскольку популярные артикулы составляют большинство заказов. Однако рейтинг Greedy Ranking не является достаточно хорошим решением, так как не учитывает, какие SKU с большей вероятностью будут приобретены вместе.

Что нам действительно нужно, чтобы получить лучшее решение, так это популярность на уровне заказов, то есть какие наборы продуктов наиболее популярны? С большей вероятностью покупатель, покупающий детские подгузники, одновременно купит пиво? или какие-нибудь детские закуски определенных брендов?

Если мы сможем определить, какие продукты в популярных заказах с большей вероятностью будут куплены вместе, и сохраним их в качестве запасов в FDC, тогда мы будем уверены, что большая часть заказов может быть выполнена исключительно за счет местных запасов. Однако чрезвычайно сложно предсказать популярность шаблона заказа (или пакетов продуктов) по сравнению с прогнозом популярности уровня продукта, поскольку количество комбинаций продуктов почти бесконечно велико.

Чтобы справиться с этой проблемой, мы использовали метод SKU2Vec для вычисления скрытого вектора для каждого SKU. Идея продиктована статьей Google Word2Vec, в которой предлагается неконтролируемый метод изучения представления слов путем изучения предложений, в которых они появляются вместе. В нашем случае SKU подобны словам в предложении, а порядок, содержащий несколько SKU, аналогичен предложению, содержащему много слов.

С SKU2Vec контекстная информация заказа встроена в скрытые векторы SKU. Если скрытые векторы двух SKU находятся близко «на расстоянии», мы знаем, что они, скорее всего, будут куплены вместе, и, следовательно, их следует рассматривать как хранящиеся в FDC вместе.

SKU2Vec выполняется в несколько шагов. Сначала мы переводим заказ, содержащий N продуктов, в частичные заказы, содержащие N-1 продуктов, где каждый продукт по очереди удаляется из исходного заказа. Затем оставшиеся частичные заказы служат входными данными для контролируемой модели, которая пытается предсказать, какой продукт отсутствует в исходном заказе. Каждый продукт во входном частичном порядке представлен вектором низкой размерности и усредняется для получения векторного представления частичного порядка, называемого вектором намерения порядка. Затем дается предсказание на основе вектора намерения порядка. В этом смысле продукты, которые часто появляются в заказах одного типа, должны иметь похожие векторные представления, указывающие на их близость в контекстах заказов.

Вот наглядный пример векторных представлений продуктов, спроецированных на 2D-пространство с помощью TSNE, обученных с использованием транзакционной информации:

На рисунке 5 синие точки представляют собой группу детских подгузников, а красные точки в правом нижнем углу содержат несколько закусок, таких как финики (大枣), которые считаются пищевыми добавками для только что родивших матерей. Поскольку подгузники являются одними из самых популярных продуктов, которые определенно будут храниться в КПД, близость между подгузниками и финиками предполагает, что продукты из фиников (а не пиво :) также следует хранить в КПД, хотя они не входят в число лидеров продаж.

Сквозная структура нейронной сети

Мы разработали структуру сквозной нейронной сети, чтобы принимать решения об ассортименте инвентаря, напрямую фиксируя отношения совместной закупки между продуктами. В сети мы использовали следующие новые методы:

- Мы использовали слои встраивания для отображения многомерной категориальной информации, связанной с продуктами, такой как метки категорий, в скрытое пространство, которое можно использовать в качестве входных данных.

- Мы смоделировали коэффициент разделения заказов непосредственно как функцию потерь, которая сокращает разрыв между прогнозированием и оптимизацией.

Архитектура сети показана ниже:

Во-первых, мы извлекаем все характеристики уровня продукта, такие как категориальная и количественная информация, такая как недавние продажи, количество размещенных заказов, просмотры страниц и т. Д. Категориальная информация сопоставляется с вектором слоем внедрения и объединяется с количественными характеристиками. Вероятность на уровне продукта в ассортименте рассчитывается на основе входных векторов признаков. Наконец, мы умножаем вероятности в ассортименте для каждой SKU в исходном порядке, чтобы вычислить вероятность выполнения на уровне заказа для всего пакета, то есть вероятность наличия всех SKU в инвентарном ассортименте FDC.

В этом смысле, всякий раз, когда пара продуктов всегда появляется в одном и том же типе заказа, который часто размещается, вероятности в ассортименте двух продуктов в паре должны быть либо близки к 1, либо к 0 синхронизированным способом. В противном случае преимущество включения любого из продуктов на склад исчезает (подумайте о случае, когда один продукт имеет вероятность 1, а другой 0, что приводит к 0 вероятности выполнения заказа как всей упаковки).

Оценка эффективности

Мы протестировали алгоритм SKU2Vec на трех наших основных региональных складах. Мы оценили алгоритм в режиме скользящего горизонта, как указано ниже, где данные за 2 недели используются в качестве обучающих наборов, а результат оценивается с использованием заказов на следующую неделю.

В целом мы достигли снижения коэффициента разделения заказов примерно на 2% по сравнению с эталонным алгоритмом, который является улучшенной версией алгоритма Greedy Ranked. Уменьшение коэффициента разделения заказов означает на 2 миллиона меньше посылок, которые необходимо доставлять каждый год. Это также подразумевает меньший объем работы для наших складских сотрудников и курьеров по доставке, а также более счастливых клиентов, которые будут наслаждаться своими новыми кофемашинами с кофе в той же упаковке.

В настоящее время мы работаем над пилотным запуском алгоритма на нескольких наших складах и внедряем его в производственную систему.

В этом посте мы показали, как использовать современный метод, такой как встраивание продукта через нейронные сети, для решения проблемы, которая имеет природу предсказания и оптимизации. Этот пост является первым из двух публикаций в блоге, посвященных проблеме товарного ассортимента. Во втором посте мы сосредоточимся на более ориентированном на исследование операций способе достижения дальнейших улучшений! (Глубокое обучение - не всегда лучший метод. Следите за новостями.)

Мы открыты для любого сотрудничества в академических исследованиях. Пожалуйста, свяжитесь с [email protected], если вам интересно.