モデルの最適化
端末にモデルをダウンロードするので、モデルの重みを 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