出前館とは何か

曽弘博氏:では「出前館におけるサービス向上のための機械学習」というタイトルで、Data Scienceセンターの曽が発表します。

この発表は次のような流れで進めていきたいと思います。まず背景として、出前館のサービスに関して説明し、そこに導入する5種類の機械学習コンポーネントに関して概要を説明していきます。続く2つのセクションでは、うち2種類の機械学習コンポーネントに関して、より詳しく見ていきます。

ではさっそく出前館のサービスを紹介に入りましょう。まず「出前館とは何ぞや」という話なのですが、恐らくこの中にも「使ったことあるよ」「聞いたことあるよ」という方もいるかと思うんですが、フードデリバリーサービスです。

サービスの開始は実はもう20年ほど前でして、2000年です。サービス開始から歴史は長いのですが、現在もサービス規模は成長を続けていまして、今年(2021年)8月の時点で、おおよそ8万店以上の加盟店さま、700万人以上のユーザーさまにご利用いただいています。

このサービスの規模拡大に伴って、現在出前館では、サービス刷新のための大規模なシステム改修を行っています。そしてその一環として、機械学習技術を用いて、出前館を利用するすべての方々にとってのサービス体験向上の取り組みを進めています。本発表では、この取り組みに関して説明いたします。

出前館のサービスはどうやって動いているか

ではどういう取り組みをしているかですが、その話に入る前に、まず出前館のサービスがどうやって動いているかを簡単に説明したいと思います。

出前館のサービスには複数の形態があるのですが、ここではシェアリングデリバリーと呼ばれるサービス形態に関してお話をします。というのも、今回の機械学習技術を用いた取り組みの主な対象が、このシェアリングデリバリーだからです。

シェアリングデリバリーには、出前館以外に3種類の登場人物が現れます。ユーザー、加盟店、そしてドライバーです。

シェアリングデリバリーでは、次のように注文された品物が配達されます。まずユーザーが出前館のアプリやサイトで注文し、その情報が加盟店とドライバーに通知されます。加盟店はこの情報を受け取って調理を開始します。ドライバーはこの情報を受け取って、自分がその注文を配達するかどうかを選びます。ドライバーが「注文を配達する」を選んだ場合は店舗に向かい、加盟店で料理を受け取り、そしてユーザーの元にお届けする、という流れです。

以上の流れを踏まえて、このプロセスの中のどこで機械学習技術を用いるのかを検討し、今回は5種類の機械学習コンポーネントを提供することにしました。ここではこの後それらの概要をお話ししていき、続く後半ではそのうち2つに関してより詳しく見ていきます。

推薦システム

では、5種類の機械学習コンポーネントの概要を説明していきます。5種類それぞれについて、そもそもどういった課題を解決したいのかタスクを定義し、各タスクにどのような難しさがあるのか、その難しさに対してどのようなアプローチを試みているのかを、順に説明していきます。

まずは、ユーザーが注文するところに関わる機械学習コンポーネントについてです。現在出前館では、非常に多くの加盟店に注文が可能になっています。ですが、ユーザーの方が、すべての店舗を見て、注文をどれにするか決めようということは、おそらくないかなと思います。さっき見てみたのですが、私の自宅の周りも、だいたい数百件の店舗に注文が可能でした。

では、新しい店舗を試してみたい時にはどうするか。地域の人気店のランキングを見るというのも、良い方法です。ですがこれは、地域全体のランキングになってしまうので、ユーザー個々人の好みに合ったものには必ずしもなっていません。

そこで、ここでは最初の機械学習タスクとして、「それぞれのユーザーの好みに合わせて個別化した店舗の推薦リストを提供する」というタスクを考えました。

こちらの推薦問題ですが、LINEのマンガやLINEスタンプなどと違って、同じアイテムを何回も注文できます。ですので、精度のみを追求したモデルのチューニングを行うと、ユーザーが過去に注文した店舗が毎回出てくる、といったことになりかねません。でも、過去に注文した店舗は過去の注文履歴を見たらわかるので、推薦に出してもあまりうれしくありません。

同様に、これは推薦問題でよくある話ですが、精度を追求すると人気店ばかり推薦されてしまいます。人気店はランキングを見ればいいので、これもあまりうれしいことではありません。

ということで、推薦の精度とユーザーにとっての発見や多様性、これらのバランスを取る必要があります。そこで、このタスクに取り組むに当たっては、nDCGのような精度の指標だけではなくて、エントロピーのような多様性を表す指標など、複数の指標を用いてチューニングを行いました。

また、先ほどとは似て非なる話なのですが、ナイーブに推薦を行うと、推薦リストの中身のジャンルが偏ってしまうことが知られています。例えばカレーばっかりであったり、寿司ばっかりだったり、ですね。これはユーザーの気分の変化に合わせたジャンルの提示ができないので、あまり望ましいものではありません。この課題に対しては、複数のモデルを組み合わせたTwo−stageモデルを使って、対処を試みています。これは後のセクションで詳しくお話ししたいと思います。以上が推薦の話でした。

配達時間の予測

では次に、配達時間に関わる2つの機械学習コンポーネントに関して、同時に見ていきましょう。こちらも、主にユーザーに関わる部分です。

先ほどは「どの店舗に注文するか、どんな料理を頼むのか」という話だったのですが、フードデリバリーサービスでは、「料理がいつ届くか」というのも、極めて重要になってきます。今お腹が空いているのに、配達が2時間後になる料理を頼もうという方は、たぶんあまりいないかなと思います。

また、今のは注文前の話ですが、例えば「担当するドライバーさんが決まりましたよ」「ドライバーがどこにいますよ」といった情報を用いて、「料理があと何分で届くか」という情報を更新してくれると、より便利かと思います。

こういった予測をしようとすると、「注文が決まっていますか/決まっていませんか」「担当ドライバーが決まりました/決まっていません」といったさまざまな条件で予測を行う必要があります。これを1つの機械学習モデルで対処するのは困難と考え、我々はこの予測タスクを複数のタスクに分割しました。

その分割の仕方を見るために、まず配達までにかかる時間がどう分解できるかを考えてみましょう。下の図で、一番長い矢印が、ユーザーが注文してから料理が届くまでの配達時間です。

これを分解して考えると、まず料理が準備できるまで、時間がかかります。これを料理の準備時間としましょう。また、配達するためにはドライバーが店舗に着く必要があるので、ドライバーの店舗到着まで時間がかかります。これをドライバーの店舗到着時間と呼ぶことにしましょう。

今この図では、先に料理ができて、ドライバーが後に着くと描いてしまっていますが、当然逆になることもあり得て、その場合はドライバーが店舗に先に着いて、そこで料理ができるのを待つことになります。

最後に、ドライバーが店舗から配達先に移動する時間がかかります。これら3つの時間を組み合わせると、配達時間は、ドライバーの店舗到着時間と料理の準備時間のどちらか大きいほうに、最後の移動時間を足したものになる、ということがわかります。

そしてこのうち最初の2つ、ドライバーの店舗到着時間と料理の準備時間を機械学習を用いて予測することにしました。「最後の移動時間はなんで機械学習を使わないの?」と思う方がいるかもしれないですが、ここでは出発地の店舗と行き先の配達先の場所はもう決まっているので、地図や経路の情報だけから移動時間を算出できます。ですので、機械学習を使う必要はないということですね。

ドライバーの店舗到着時間も、一見地図から求まるように思えるのですが、こちらは担当するドライバーが決まる前に予測を行う必要があるので、予測時には担当ドライバーがどこにいるか決まっていませんし、担当するドライバーが決まるまでの時間も予測する必要があります。ですので、地図や経路だけからは求めることができません。

さて、これらのタスクなのですが、共通の課題として、予測する対象が、現在の状況に応じて大きく変わる、というものがあります。

例えば、今店舗が混雑しているのであれば、料理の準備に時間がかかるかもしれませんし、今手が空いたドライバーがたまたま少なければ、新しい注文の配達を担当するドライバーがなかなか現れなくて、待ち時間が長くなってしまうかもしれません。

この課題に対しては、ストリーミング処理を用いて、リアルタイムで特徴量を集計し、これをモデルに渡して予測することで対処しています。

また、準備時間に固有の課題なのですが、実は「何時何分に料理ができましたよ」といったログが、正確には取れていません。これをどうするかは話が長くなってしまうので、また後のセクションで詳しく見たいと思います。以上が配達時間に関わる2つの機械学習コンポーネントでした。

ドライバー向けの注文数予測

ここまでは主にユーザーの目線で、ユーザーに関わる機械学習コンポーネントを見てきました。次はちょっと視点を変えまして、ドライバーに関わる機械学習コンポーネントを紹介しましょう。

ドライバーは注文の通知を受ける前、どこかで待機している必要がありますが、ではどこに待機しているのがいいでしょうか。これは、直感的に考えるとわかるかと思うのですが、基本的には注文が多い店舗がたくさんあるエリアで待機しているのが、ドライバーにとって望ましいと考えられます。

というのも、こうすることによって、注文の通知を受けた後に店舗に移動する時の距離が短くなるからです。これは、全体の配達時間の短縮や、ドライバーの時間の余裕にもつながります。

そこで、「いつ・どこで・どの程度の数の注文があるのか」を予測する、注文数予測というタスクを考えることにしました。

こちらのタスクでは、「どのあたりに行けば良いのか」をわかりやすく伝えるために、予測対象のエリアをある程度きめ細やかに、小さい単位で区切りたい、というニーズがあります。ただそうすると、1つのエリア当たりのデータ数は少なくなってしまいます。ですので、個々のエリアに対して別々のモデルを使って予測すると、学習が進みにくくなってしまいます。

そこで今回は1つのモデルを用意して、全エリアのデータを用いて、このモデルを学習しました。エリアごとの違いに関しては、各エリアの過去の注文数やその統計値を特徴量として利用することで、対処しています。

また、これは先ほどの配達時間に近い話ですが、こちらのタスクもリアルタイムな状況に強く依存します。例えば「夕飯時でお買い物に行かなきゃいけないんだけど、雨が降り始めたな。買い物に行くの大変だな。出前館利用しようかな」ということで、注文数が増えるかもしれません。

この課題に対しても、リアルタイムで集計した特徴量をモデルに渡すことで、対応を試みています。以上、注文数予測タスクについてでした。

ドライバーと注文をどう組み合わせるか

最後に、これが一番大事かもしれません。ドライバーと注文をどう組み合わせるかを考えたいと思います。

ここでやりたいことはシンプルで、注文とドライバーの組み合わせをうまく決めることによって、全体として効率のいい配達を実現したいということです。ただしこれは言うは易しで、実際に行うまでは多くの課題があります。

まずこの問題、複数ある注文をたくさんいるドライバーの誰かに配達してもらうという意味では、最適割り当て問題と呼ばれるクラスの問題に帰着します。

が、この形式にきれいに乗るわけではありません。まず、ドライバーへの注文の割当は強制ではありません。ですので、ドライバーは「この注文を配達しない」を選ぶこともできます。その場合は、別のドライバーにその注文を提示する必要があります。

こうやって提示を繰り返し行うと時間がかかるので、例えば同時に複数のドライバーにまとめてその注文を提示することも、考える必要があるかもしれません。

また、今はさもドライバーと注文の割り当ての組が決まってしまえば、その割り当ての良さがすぐわかるかのように話してしまったのですが、実際はそんなに単純ではありません。ここでは、例えば料理準備時間のようなフードデリバリーサービス特有の事情を考慮・予測する必要があります。

どういうことかを、次の図で説明しましょう。今ユーザーA、B、Cが、それぞれ店舗A、B、Cに注文したとします。そしてドライバー1とドライバー2がいるとしましょう。

一見すると、ドライバー2は店舗Aに近いので、ドライバー2が店舗Aに行くほうが全体として効率がいいように見えるかもしれません。しかし、ここで仮に注文Aの料理が準備に時間かかるものだったとしましょう。

そうすると、ドライバー2は店舗Aに早く着いたとしても、結局そこで料理ができるのを待たなければいけないため、せっかく早く着いても無駄になってしまうことがあります。

であれば、いっそのこと下の図のように、ドライバー2は店舗Cに行ってもらって、ちょうど良い距離にいるドライバー1が店舗Aに行くといった割り当てにしたほうが、全体の効率が良くなるかもしれません。

また言うまでもありませんが、以上の割り当ては、ほぼリアルタイムで計算する必要があります。割り当ての計算に5分も10分も20分もかかっているようでは、ユーザーを待たせてしまいます。

さて、このタスクに関しては、まず実際の店舗やドライバーや注文のデータを用いて、1日の全国の注文と配達をシミュレートするシミュレーターを作りました。このシミュレーターを用いて、割り当ての良し悪しの評価を行っています。

また、図では3つの注文を1回割り当てて終わりと話してしまいましたが、実際は時事刻々と注文が入ってくるわけで、これらの注文を何回も何回も割り当てる必要があります。

ですので、1回の割り当ての良し悪しだけではなく、何回も割り当てを行った時の長期的な良し悪しを考慮する必要があるかもしれません。このような長期的な良し悪しを考慮するために、強化学習の活用も現在検討しています。

以上、5種類の機械学習コンポーネントを概観してきました。ユーザーに関わるものとして、ユーザーが店舗を選ぶ時のサポートをするための推薦システム。また、料理の配達時間を予測するための、準備時間の予測とドライバーの店舗到着時間の予測。ドライバーのための注文数予測。そして最後に注文とドライバーの割り当て問題でした。

続く後半では、このうち2つ、「推薦」と「料理の準備時間予測」に関して、より詳しく見ていきます。

後編につづく