印象深いのはMetric Learningを使った「遊戯王カード」のプロジェクト

里洋平氏(以下、里):では、次の質問にいきたいと思います。実際に今はメルカリでいろいろやられていると思いますが、メルカリでの機械学習の取り組みについて教えていただけますか?

松岡玲音氏(以下、松岡):はい。メルカリに入った時からけっこうずっとモデリングはしていて、最初にやったのは価格推定でした。メルカリはCtoCなので、出品者も一般のお客さま。自分で売るものや、その値段を決めないといけないのはけっこう大変なので。

:そうですよね。

松岡:適切な値段を決めないと。安すぎると損するし、高すぎると売れないしみたいな。なので、値段を推定するモデルを作って、本番デプロイまで持っていったのが最初の仕事でした。商品の名前とか詳細みたいなテキストデータもあるし、いわゆるカテゴリであったり、テーブルデータっぽいデータに加えて、商品の写真があるんですよね。

だから写真を活用させるプロジェクトもいくつかやりました。個人的に印象深いのは、Metric Learningをちょっと勉強して使ってみたいなと思った矢先のプロジェクトで、「遊戯王カード」。

:はい。

松岡:メルカリは遊戯王カードがメチャクチャ売れるんですよ。

:そうなんですね。

松岡:日本ではトレーディングカードの中で一番売り上げが高いのが遊戯王。確かメンズカテゴリのトップ10ぐらいに入っていたんじゃないかな。トップ3ぐらいには入っていたような。

:人気があるんですね。

松岡:遊戯王カードを出品する時もやはりいろいろ情報を埋めなきゃいけないのが面倒くさい……写真を撮ったらそのまま出てほしいじゃないですか。

:確かに確かに。

松岡:ブルーアイズを撮ったら「ブルーアイズホワイトドラゴン」と出てほしい、みたいな。

:そうですね。

松岡:そういうのをやっていました。要はクラシフィケーションの大量クラス版みたいな感じです。遊戯王はだいたい9,000クラスぐらいあって、それの分類。ただ、分類は簡単じゃない。要はどんどんクラスが増えていくので。遊戯王は3ヶ月か半年に1回新しいパックが出るんです。

:えー!?

松岡:新しいパックに大量の新しいカードが入っていて、毎回それを学習して反映するのは大変なので、いわゆる普通の教師あり学習でその分類を解くのはそこそこ難しい。そこで、未知のクラスにも対応しやすいMetric Learningを使ったりしていましたね。

スクレイピングしてマスターデータを取ってきて、過去のメルカリの出品を学習データにして画像の分散表現を学習させて、あとはマスターデータのDBに近傍探索をかけて取れてくるやつをサジェストするみたいな感じです。それをやると画像の潜在表現をけっこう学習します。クラスを学習するわけじゃないのでクラスが増えてもマスターDBだけを拡張していけばいい。

:なるほど。かなりおもしろい取り組みですよね。

取り組みで工夫をしたこと

:速度の面とか、工夫されたことはあるんですか?

松岡:(速度は)けっこう気にしていましたね。

:ですよね。どんどん大量になりますしね。画像もすごいことになりますし(笑)。

松岡:そうなんですよ。ただ、マスターデータ自体は高々1万件ぐらいなので、近傍探索は今時のANNのライブラリを使えばそんなに時間はかかりません。あとは特徴抽出の部分だけが速ければいいので、ここもけっこう気を遣っていました。そこで最終的に「やっぱりONNX Runtimeは素晴らしいね」という結論に至りました。

:なるほど。ちなみに何も考えずに実装したものと、工夫してやったものではどれぐらい変わるんですか?。

松岡:以前に仕事の関係で比較をしたんですよね。TensorFlowサービングと、PyTorchの生で書いたやつと、あとはONNX Runtimeでサービングしたやつ。それぞれで同じモデル・同じかたちのインプットで負荷試験をしてどれぐらいスループットがあるか。

それで一番ONNX Runtimeが速かったというか、サーバーが死ななかった。PyTorchを生でやるのはぜんぜんダメだし、TensorFlowはがんばれば速いんですよ。TensorFlowをビルドする時はいろいろと最適化のオプションが付けられて、いろいろがんばると速くなるけど逆にそれをやらないと速くならない。

ONNX Runtimeは、何も考えずに速くなるというのは確定していたので。私は個人的にPythonで機械学習のモデルをサーブしたい。深層学習系だったらONNX Runtimeを使ったらいいんじゃないかと思っています。

:なるほど。

メルカリUSではリコメンドまわりを対応

松岡:日本側にいた時にはそんな感じで、US側に移ったあとはレコメンドまわりを特に重点的にやっています。メルカリのアプリのホーム画面上でいろいろなコンテンツを出して、ユーザーのエンゲージメントを上げようというところで、どういうレコメンドをしたらユーザーがもっと長くメルカリを使ってくれるか、もっといろいろ商品を購入してくれるかというところをやっていているのが最近ですね。

:なるほど。

松岡:最近になればなるほどけっこう気づいたというか、自分が意図的にそうしているというのもあるんですけど。どんどんエンジニアリングとかデータ分析のほうが中心になって、機械学習をほとんどやらなくなってきた(笑)。

:なるほど(笑)。さっきまでゴリゴリしていましたけど(笑)。

松岡:メルカリのUSはまだ成長過程なので、どんどん伸ばしていかないといけない。それでその過程でやはりどうしても早くイテレーションをするとなるとやはり機械学習だと重い。

:まぁそうですね。

松岡:分析をして、モデルを作って、モデルのエラー分析をして、モデルをサーブするための仕組みを作ったりして。1回デプロイしてうまくいったら今度はモデルを再学習して何度もデプロイする仕組みを作らなきゃいけないじゃないですか。基本的に重い、すごくコンプレクシティが高いので。「だったら一発SQLを書いて出てきたデータでルールベースでレコメンドをして、それで数字が出れば良くない?」っていう。

:なるほど(笑)。いわゆる機械学習ではなくて、データ分析を使った意思決定みたいな感じですかね。

松岡:そうですね。やはりこっちが今のフェーズには合っていて。というのも、もしかしたらレコメンドは特にそうなのかもしれませんが、機械学習で学習させたモデルを使ってランキング付けてドーン! というよりかは、「ユーザーにとってどういう体験を提供したらいいのか」をイチから考えていく。そういう哲学がわりとすごく重要で。

今、メルカリでやっているレコメンデーションに対して、私は発見のほうを重視しているので。

:なるほど。

松岡:検索は、意図を持ってユーザーがその商品を見つけようとするもの。レコメンドはその逆で、ユーザーに気づいていなかったものを気づかせてあげるみたいなところ。これはすごく良いんですよね。というのもメルカリは出品者側もユーザーなので、埋もれてしまう出品もけっこう多い。ただやはり欲しがっている人は必ずいて、そういうものはなかなか検索では見つからないので、レコメンドでうまく出してあげると売り手にも買い手にもすごく得になります。

そういうことを実現したいと考えると、哲学を反映したロジックやルールベースから入るのが一番良い。機械学習でそういうのを実現しようとすると逆にけっこう難しいんですよね。

:そうですね。機械学習だと多いほうに引っ張られますからね。

松岡:そうなんですよ。レコメンドの分野で「ポピュラリティバイアス」と言ったりするんですが、やはり人気な商品、カテゴリ、ブランドに引っ張られがちになります。であれば、やはり意図的にルールを作ってあげたほうが意外とうまくいく。しかもルールを作ったロジックで得た成果を機械学習のモデルが遥かに上回らないとコスパが合わないんですよね。

:そうですよね(笑)。

松岡:そういうのもあって今はあまり機械学習を使わなくなってしまっていますね。

:僕は2つのアウトプットというか仕方として、意思決定と自動化の2つあって、それぞれフェーズだったりケースバイケースだったりで活用のタイミングが違うという話をしているのですが、それを両方体験している感じかなと思いました。

松岡:そうですね。

機械学習エンジニアに求められるのは“やり切る力”

:最後の質問になりますが、今後の機械学習エンジニアに求められる資質についてなにか思っているものや考えているものはありますか?

松岡:機械学習はパワフルなツールではあるけれども、「使わない意思決定もできるようになったほうがいい」というのがまず1つです。やはりすごくコストがかかるものだし、同じようなことを他のもっと軽量な方法で実現できないかみたいな。

さらにそこから先、機械学習エンジニアが本当にバリューを発揮できるのは、そういうルールベースなどで成果が出るような状況で、機械を使うことでさらに大きなゲインが得られる部分を見つけてきちんとプロジェクトに落とし込んで最後までやり切るというところで、そこは1つの持っておくべき資質じゃないかなと思うんですよね。

:なるほど。

松岡:とりあえず実装して動かしてみてちょっと成果出ましたで「やった!」じゃなくて、いろいろやって限界が見えてきた中でもっと大きなマージンが取れる部分を見つける力はすごく重要かな。

機械学習エンジニアは他のソフトウェアエンジニアとは働き方が若干違うイメージがあって、自分で利益貢献ができる領域を見出してPoCを回して最後までやり切るみたいな、わりとPdM(プロダクトマネージャー)に近いことをできないといけません。

もちろん数学をがんばったり、モデリングをがんばったり、そういうところもやったほうがいいし、エンジニアリング力を身に付けないと、結局学習させたモデルが世に出ないのでやったほうがいいんのですが、究極、やはり自分で課題を見つけて、それが解く価値があると周りを説得してプロジェクトを推進する力はやはり磨いていくといいんじゃないかなという気はしています。

:ありがとうございます。聞いていてすごく印象的だったのは「やり切る」という部分。これがけっこう大事なんじゃないかなと思いました。今日お話を聞いている中で、基本的にやり切らないと、なにも成果が出ないというのがあると思うので。

松岡:そうですね。これはけっこうあるので、最後は「腕力」で。

:そうですね。

(一同笑)

松岡:どんなに「良いモデルを作った」と言っても誰もなにもしてくれないので、結局最後まで自分でオーナーシップを持って世に出す、価値を見出すみたいな。最初に実験してうまくいかなくても何回も繰り返していくうちにいずれ成果は出ます。そこまでしないとやはり認めてもらえないところはある。

:そうですね。やりっぱなしではなくて、ということですよね。

松岡:今のレコメンドのプロジェクト、最初は1人だったんですよね。最初はレコメンドどころじゃなくて、2年以上前に開発されたきりで、オーナーが誰もいない状態でいろいろ負債を解消していくところから始めて、レイテンシーを半分以下に落としたり、技術負債をどんどん取り除いていったりしました。

ちょっと重い部分をマイクロサービスに切り出して実験を回せるようにしたり、そのへんを全部1人でやって、ようやく最初の成果が出始めたらもう少し上のプロダクトの人たちが目を付けてくれて、ようやくチームがちょっとずつできてきた感じなので。孤独というか(笑)。

:そこをやり切るのはやはりすごいことだなと思いますし、誰もができることでもないなと思いますね。

松岡:お膳立てしてくれるところがあればぜんぜん良いし、あとは機械学習がコアバリューになっている会社であればそこまで気にすることはないのかなという気はするんですけど。メルカリは別にそうではないので、自分でその価値を出せる場所を見つけていって、成果を出して認めてもらっての繰り返しなのかなという気はしています。

:なるほど。大変おもしろい、興味深いお話をありがとうございました。

松岡:ありがとうございました。

松岡氏がワイン初心者におすすめのワイン

:では今回はここまでにしたいと思いますが、最後になにかおすすめのワインを教えてもらってもいいですか?

(一同笑)

松岡:やはり「おすすめのワイン」と言われた時にすごい難しくて。というのも好みがあるんですよね。

:そうですよね。

松岡:特にワイン好きたちはみんな本当に面倒くさいから。みんな好みがあるから、適当なことを言うと怒られちゃう。ワイン初心者、これから飲みたいけれど何を買ったらいいのかわからないという人たちにけっこうおすすめなやつをいくつか。銘柄というよりかはブドウの品種で、お店で「これはありますか?」と聞くと良いのを教えてもらえると思います。

白ワインと赤ワイン1個ずつでいくと、白ワインは「軽い甘口のリースリングでいいやつはありませんか?」と聞くといいです。「リースリング」ですね。

:リースリング。

松岡:リースリングは、フランスのアルザスやドイツでけっこう中心的に栽培されているブドウで、すごく酸が強くてさっぱりしたワインなんですが、すごく甘く造ることができるんですよ。ちょっと甘さがあって良い感じに酸味があってすごくスッキリしているので、今日みたいなすごい暑い日の昼間にクッと呷ると最高に気持ちいい。わりと初心者でも楽しめるんじゃないかな。

:なるほど。

松岡:赤ワインはイタリアの「プリミティーヴォ」というブドウ。もしくは「ジンファンデル」。これはすごくフルーティなワインを造ります。「フルーティってなんだろう?」というと、ちょっと軽く甘い味わいがする。砂糖が入っているわけではないけれどちょっと甘い感じがする、柔らかい味。赤ワインはけっこう渋いから苦手な人が多いと思うんですけど。

:確かに。

松岡:これは味はけっこうしっかりした感じだけれど、ぜんぜん渋くなくておいしく飲めるはず。私はこれと焼肉を合わせるのがけっこう好きなんですよ。

:なるほど!

(一同笑)

:ありがとうございます。今度さっそく聞いて買ってみます。

松岡:ぜひ試してみてください。

:はい。ということで本日はメルカリの玲音さんにお話をお聞きました。どうもありがとうございました!

松岡:ありがとうございました。