メルカリ : TensorFlow Lite で、気付きにくい便利機能をユーザーに提唱
2020年4月2日木曜日
概要
メルカリは C2C E コマースのアプリを提供しており、月間アクティブ ユーザー(MAU)1500 万人を超えるお客様にご利用いただいています。メルカリアプリでは、さまざまな機械学習を使用した機能を提供しています。本記事では、TensorFlow Lite を使用し、機械学習モデルの計算をモバイル端末上で行っている機能についてご紹介します。
図 1 メルカリロゴ
メルカリアプリでは、お客様に商品を出品していただくという特性上、出品商品のタイトルや詳細情報をお客様に記入していただく必要があります。この入力作業は、初めて出品されるお客様や多くの商品を出品されるお客様にとって、面倒に感じられることがあります。そこでメルカリでは、本や DVD などのエンタメ カテゴリやコスメカテゴリの商品に対して、バーコード出品という機能を提供しています。
これは、バーコードを読み取ることで、タイトルや商品詳細が自動で入力され、出品時の手間を大幅に軽減することができます。さらにこの機能をご利用いただくことで、お客様の出品されたアイテムと、メルカリが持つカタログデータと紐づくことで、検索などを改善することができます。
バーコード出品は、すでに多くのお客様にご利用いただいていますが、さらに多くのお客様にご利用いただきたいと考えています。特に新規のお客様や、バーコード出品をご存じないお客様にも、自然にバーコード出品をご利用いただくために、メルカリの AI チームでは、バーコード出品をサジェストする機能を開発しました。これは、お客様が商品を撮影した際に、その商品が、本や DVD と判断されたら、すぐさまバーコード出品のサジェストをする、というものです。
この機能の中では、TensorFlow を使用して構築した Deep Learning モデルを組み込み、TensorFlow lite によって、モバイル端末上で推論しています。
モデルの構築
今回実装する機能は、撮影された画像が本かどうかを推定する画像分類タスクとなるので、CNN を使用したモデルを利用しました。モデルの評価基準として、分類精度はもちろんですが、モバイル端末に組み込むため、モデルサイズと UX を損なわないために、推論速度も重要となります。これらの条件を最も満たす Mobilenet v3 を選択しました。データセットとして、メルカリの出品画像数 100 万枚をラベル付けしたデータセットを使用します。学習は、ImageNet で学習したモデルをベースに、メルカリのデータで FineTuning をします。
TensorFlow を使用してモデルを構築し、GCP 上の TPU を利用することで、大きなバッチサイズで高速に学習することが可能になり、多くの検証をすることができました。TensorFlow では、Estimator を使うことで CPU/GPU/TPU の切り替えを容易に行うことができます。
モデルの最適化
端末にモデルをダウンロードするので、モデルの重みを int8 に量子化することで、モデルのファイル サイズを削減することを考えます。その際、通常通り学習したモデルを量子化すると 32bit の float の重みを無理に 8bit に落とし込むため、精度が下がってしまうことがあります。Mobilenet v3 を、通常通りメルカリのデータセットで学習したモデルを量子化した場合、Accuracy が、5% ポイントほど下がってしまいました。
そのため、モデル構造をチューニングするとともに、量子化されることを前提にモデルを学習する quantization-aware training をします。さらに ExponentialMovingAverage の導入、MobileNetv3 のモデルに depthwise convolution を追加するといったモデルのチューニングを行いました。ただし、モデルをチューニングする際に、モデルのファイル サイズと推論速度が目標値に収まるように注意しなくてはいけません。
最終的には、モデルのチューニングの結果精度が 6% ポイントほど向上し、quantization-aware training を導入することで、量子化後も精度を落とすことなく、モデルのサイズを 75% 以上削減することができました。
図 2 モデルチューニング結果
モバイルアプリへの組み込み
メルカリアプリは Android、iOS 両方で提供されているため、クロス プラットフォームのサポートが必要になります。TensorFlow Lite の C++ API を使い、抽象化レイヤを作ることで、Android、iOS の両方で簡単にモデルの推論を呼び出すことができます。作成した画像分類モデルを組み込んで、バーコード出品のサジェスト機能を作成しました。最初に作成したデザインを図 3 に示します。
バーコード出品機能を利用せずに本や DVD を撮影した場合、動画のようにバーコード出品をサジェストするポップアップが表示されます。このポップアップをタップすることで、バーコード出品の画面に移動することができるようになっています。
この画面は、ユーザーが出品商品の撮影をしている画面であり、ユーザーは続けて写真をとったりタイトルの入力など、次の動作を考えているはずです。そのため、この写真の撮影途中で数秒間待たされたりすると、UX を大きく損なうことが予想されます。画像をサーバーに送信して推論結果を取得すると、通信状況にもよりますが、1 秒以上かかることも少なくありません。それに対し、TensorFlow Lite を使用して端末上で推論すると、安定して 30ms 程度で推論することができます。そのため、動画のように UX を損なわなず、自然なサジェストをすることができます。
図 3 初期デザイン
結果分析と改善
昨年 12 月にこちらの機能をリリースしましたが、実際には機能からバーコード出品につながったお客様は、想定より少ない結果となっていました。そのため、我々はユーザーのログからいくつか仮説をたて、UI の改善を行いました。
例えば、ポップアップが表示されたユーザーがタップをした割合が低いことなどから、以下の仮説が考えられます。
- モデルの精度が十分でなく、本以外のものにも反応してしまっている
- ユーザーとのインタラクションが不十分である
今回モデルの Precision は 90% 近くあるため、まずはモデルの精度以上に、ユーザーとのインタラクションに問題があると考えました。
複数の AB テストをし、以下のようにデザインを改善しました。改善点は次のポイントです。
- ポップアップの時間を長くする
- バーコード出品の利点が伝わるように、メッセージを変更する
- タップ可能なことが伝わるように、ボタン風のデザインに変更する
図 4 改善後デザイン
この結果、ポップアップ表示後、タップしてくれるお客様の割合は倍以上になり、バーコード出品の新規利用割合を、6% 以上増加することができました。
このように、AI 機能をアプリに組み込む際には、モデルの精度以外という、他の要因によっても意図しない結果になることが多く起こるため、機能をリリースした後にも継続的に分析をし、さまざまな観点から改善を行う必要があります。
このように、メルカリでは、Edge-AI を含めた AI を使った機能開発を加速させていくとともに、お客様の UX を継続的に改善していく取り組みをしています。
Posted by Khanh LeViet - Developer Relations Team