SNKRDUNKにおける機械学習への取り組みの現状と今後の展望
はじめに
株式会社SODAでバックエンドのテックリードをしている仲宗根です。
SODAは、SNKRDUNKというスニーカーやアパレル、トレーディングカード(トレカ)のフリマサービスを運営しています。
本記事では、SNKRDUNKにおける機械学習プロジェクトの一例として、ピックアップリンクのパーソナライズを紹介します。この取り組みを通して、SNKRDUNKの開発に興味を持っていただければ幸いです。
ピックアップリンクとは
ピックアップリンクとは、SNKRDUNKアプリのおすすめタブの上部に配置された特定のカテゴリーやブランドごとにまとめられた商品へのリンクのことです(図1)。リンクをタップすると、特定のカテゴリー・ブランドの商品を閲覧することができます。

図1: SNKRDUNKアプリのおすすめタブに表示されるピックアップリンク
既存のピックアップリンクの課題
これまでピックアップリンクには、SNKRDUNKのドメインに詳しいドメインエキスパートによって選定された人気商品やおすすめ商品のリンクが配置されてきました。主にスニーカーのリンクが配置されており、スニーカー好きのユーザーへのおすすめとして妥当ではあるものの、課題もありました。
SNKRDUNKはスニーカーのフリマサービスとして急成長しましたが、現在ではスニーカーのみならず、アパレルやトレカなども数多く取引されるようになってきています。こうした背景から、興味関心の異なる様々なユーザーに使いやすくするためには、ユーザーの興味に応じてパーソナライズする必要があるのではないかという仮説が生まれました。
ピックアップリンクのパーソナライズ
全体像
一部のユーザーに対して、閲覧履歴やお気に入り、購入履歴といったユーザーの行動ログを利用して、ユーザーの興味に合うピックアップリンクのリストを表示しています。
コンテンツベースフィルタリングを用いて、ユーザーごとにピックアップリンクのリストを作成しています(図2)。ユーザーがアクションを起こした商品に紐づくカテゴリーとブランドを集計し、アクションの種類に応じた重み付けでスコアリングすることで、ユーザーの特徴量ベクトルを作成しています。アイテムも同様にカテゴリーとブランドで特徴量ベクトルを作成します。ここでいうアイテムとは、ピックアップリンクのことです。
図2: コンテンツベースフィルタリングによるパーソナライズの仕組み
ユーザーとアイテムの特徴量ベクトルを作成し、ベクトル間の距離(類似度)を計算します。そして、ユーザーごとに最も距離が近いアイテムを最大20個取得し、表示します。独自のスコアリングで作成した特徴量ベクトルはノルムの大きさにも意味があるため、距離計算にはコサイン類似度ではなくユークリッド距離(L2)を使用しています。後処理として、ルールベースのロジックで特定のカテゴリーやブランドのピックアップリンクに偏りすぎないように調整を行っています。
技術選定時の意思決定
当時、社内には機械学習エンジニアがおらず(執筆時点でもいませんが)、バックエンドエンジニアの筆者が開発を担当することになっていました。そのため、推薦内容が解釈しやすく、かつ実装難易度も高くないコンテンツベースフィルタリングを採用しました。古典的手法で派手さはありませんが、今後新しい手法に挑戦する際の良いベースラインになると思っています。
データパイプラインと特徴量生成
構成
ピックアップリンクのパーソナライズのデータパイプラインは、データ取得部、特徴量ベクトル作成部、インデクサーの3つで構成されています(図3)。
データ取得部ではユーザーの行動ログをデータストアから取得します。特徴量ベクトル作成部では、ユーザーの行動ログとアイテムの情報を使用して、それぞれの特徴量ベクトルを作成します。最後に、インデクサーはユーザーとアイテムの特徴量ベクトルをベクトル検索エンジンにインデックスします。
図3: データパイプラインの構成
使用している具体的な技術としては、次の通りです。
- インフラストラクチャー
- データストア: Google BigQuery, Amazon S3
- パイプライン: AWS Step Functions
- ETL: Amazon ECS(Fargate)
- ベクトル検索エンジン: Amazon OpenSearch Service
- プログラム
- 言語: Python (3.13)
- 主なライブラリとフレームワーク: Numpy, Pandas(DataFrame), Dask(DataFrame, LocalCluster)
Step Functionsを使って各処理工程を順次実行しています。処理がどこまで進んでいるかという状態は、Step Functionsが管理しています。各工程のプログラムは冪等な処理を行うだけです。したがって、途中で一時的に何らかのエラーが発生した場合、失敗した工程を再実行するだけでパイプラインの処理を再開することができます。また、各工程のすべての中間生成物は、S3上に一定期間保存されます。何か問題が発生した場合は、各工程の入出力をトレースできるようにしています。
Out of Memoryとの闘い
特徴量生成ではOut of Memoryとの闘いがありました。初めは、ナイーブにすべてのデータをメモリに乗せてPandasのDataFrameで集計処理をしていたところ、メモリが枯渇しプロセスが異常終了してしまいました。そこで、解決策を調べ、Out-of-Core処理をするDaskにたどり着き、事なきを得ました。Daskの公式ドキュメントのベスト・プラクティス集が非常に参考になりました。
Daskは、DataFrameをチャンクに分割して並列処理を行うことができます。シングルマシンでCPUとメモリを増やして並列処理をしていたところ、ストレージ(EBS)のI/Oがスロットルするといった問題もありました。普段開発しているWeb系のアプリケーションサーバーではCPUやメモリがボトルネックになることが多く、ストレージI/Oがボトルネックになることはなかったので、新鮮な体験でした。この話はまた機会があれば書きたいと思います。
課題
今回のパイプラインの課題としては、データソースがGoogle Cloud上のBigQueryとなっており、ここからAWSにデータを転送して処理をするという非効率な部分があります。これは、もともとBIなどで利用しているデータ基盤がGoogle Cloudにある一方で、SNKRDUNKのサービスがAWSで動いているということに起因しています。ユーザーの閲覧ログの収集には、FirebaseやGA4を利用しており、BigQueryに蓄積されます。
今後は、BigQueryのデータレイクハウスとしての機能を利用して、パイプラインを簡素化できるのではないかと考えています。機械学習モデルの学習までをデータレイクハウスがあるGoogle Cloudで行い、特徴量ベクトルや学習済みモデルをAWSにデプロイして動かすといったハイブリッドな構成も考えられます。この場合、推論処理をサービスと近いところで動かすことで、ネットワークレイテンシが小さくなることが期待できます。
今後の展望
レコメンデーション・パーソナライゼーション
ピックアップリンクのパーソナライズだけではなく、商品のレコメンデーションや検索結果のパーソナライズ(リランキング)にも取り組みたいです。
協調フィルタリングやTwo Towerモデルのような手法を用いて、他のユーザーのデータも活用することで、興味のある未知の商品との出会いをユーザーに提供できるのではないかと考えています。行動ログを使ったオフライン評価やA/Bテストを通じて、継続的に改善のループを回していきたいと思っています。そのための環境も整備していきたいです。
商品画像による商品型番検索
ユーザー体験を向上させるために、商品画像による型番検索を実現したいと考えています。
SNKRDUNKはスニーカー、アパレル、トレカなど様々なカテゴリーを扱うフリマサービスです。そのため、ユーザーは大量の商品カタログの中から目的の商品を探し出す必要があります。
購入者のユースケース
商品画像を使って商品を検索することで、欲しい商品を大量のカタログから効率よく探し出すことができると考えています。
型番が分からない街で見かけた気になるアイテムや、芸能人・インフルエンサーが着用しているアイテムを探し出すことができると考えています。また、視覚的に類似する別の価格帯の商品を検索することも実現できると考えています。
出品者のユースケース
出品時に商品画像による商品型番の検索を行い、出品の手間を省くことで出品者のユーザー体験を向上させたいと考えています。
現状、出品する場合は、まず大量の商品カタログから出品対象の商品を探し出す必要があります。その後、出品商品の画像や状態、販売金額などの情報を入力する必要があります。画像検索によって、出品時の情報入力をある程度自動化することができれば、出品の体験が向上するのではないかと考えています。
真贋鑑定業務の効率化
SNKRDUNKには、自社サービスで偽造品が取引されないための仕組みがあります。
国内最大級の偽造品のデータベースを保持しており、すべての取引において商品の真贋鑑定を鑑定士が行っています。
人気ブランド商品やトレカでは偽造品が出回ることがあり、フリマサービスでの偽造品流通が社会問題となっています。SNKRDUNKでは、出品された商品が購入された場合、出品者が直接購入者に商品を送ることはありません。代わりに、SNKRDUNKの倉庫に商品を送ります。倉庫では鑑定士が商品をチェックし、正規品であれば購入者へ発送し、偽造品であれば取引を中止します。SNKRDUNKが出品者と購入者の間に入ることで、偽造品の流通を防ぐ仕組みになっています。
SNKRDUNKのデータベースには、正規品および偽造品のX線・赤外線・マイクロスコープ画像が蓄積されています。これらのデータを活用して機械学習モデルを構築し、鑑定士の業務を効率化できるのではないかと考えています。
SNKRDUNKの偽造品流通防止への取り組みは「スニダン鑑定研究所」のページをご覧ください。
おわりに: We are hiring!
SNKRDUNKを運営する株式会社SODAでは、機械学習エンジニアを募集しています!
事業貢献を目的として、ステークホルダーと協調しながら、生成AI(LLM/VLM)の活用や機械学習モデルの構築などの業務を担当していただきます。
また、本記事の執筆時点ではまだまだ環境が整備途上であることから、データパイプライン、データ基盤、A/Bテスト基盤の構築など、データエンジニアリング領域でのご活躍も期待しています。
詳細は採用情報ページをご覧ください。
株式会社SODAの開発組織がお届けするZenn Publicationです。 是非Entrance Bookもご覧ください! → recruit.soda-inc.jp/engineer
Discussion