はじめに
こんにちは、データシステム部推薦基盤ブロックの棚本(@i6tsux)です。
ZOZOTOWNには1,600のショップ、9,000以上のブランド、100万点を超える商品が集まり、毎日2,700点もの新商品が追加されています。この膨大な商品の中から、1,000万人以上のユーザーそれぞれに「これだ」と思える商品を見つけてもらうーーそのためにパーソナライズは欠かせない技術です。
私たちのチームでは、単に好みに合う商品を見せるだけでなく、「新しい商品との出会い」も提供できるパーソナライズを目指しました。ホーム画面のモジュールに表示する商品をユーザーごとに最適な順番で並び替える仕組みを構築し、その結果、モジュールのクリック商品数が58.3%増加、モジュール経由の受注金額が26.3%増加という成果を達成しました。
本記事では、この取り組みの背景となった課題から技術的な解決アプローチ、システム構成、そしてA/Bテストで得られた成果まで詳しく解説します。
パーソナライズ機能や推薦システムの開発に携わる方々の参考になれば幸いです。
目次
背景・課題
モジュールとは
ZOZOTOWNのホーム画面は、ユーザーが最初に訪れる場所であり、商品との出会いを生み出す重要な接点となっています。このホーム画面は「モジュール」と呼ばれる商品表示枠で構成され、それぞれが特定のテーマで商品を紹介しています。
例えば、「20代女性向けワンピース」「注目のアウター特集」といった様々な切り口で商品を訴求しています。
現状の課題
従来のシステムでは、モジュール内の商品表示順が全ユーザー共通の人気順になっていました。例えば「20代女性向けワンピース」というモジュールでも、商品は人気順で並べられており、ユーザーの好みや過去の購買履歴に関わらず、全員が同じ商品を同じ順番で見ることになっていたのです。
今回の対象:カテゴリ推薦モジュール
この状況を改善するため、モジュール内の商品表示順をユーザーごとに最適化しました。数あるモジュールの中から、まずはホーム画面上部に3つ表示される「カテゴリ推薦モジュール」を対象に選びました。このモジュールは、直近のユーザー行動を元に興味がありそうなカテゴリ(アウター、パンツ、シャツなど)の商品を表示します。
カテゴリ推薦モジュールは2段階の仕組みで動作します。まず、ユーザーごとにパーソナライズされたカテゴリ・ブランドで絞り込み、次にその条件に合う商品を人気順で表示します。しかし、この2段階目の「人気順表示」が課題でした。カテゴリとブランドをパーソナライズしても、商品の表示順が人気順では、パーソナライズの効果が十分に発揮されません。
パーソナライズロジック
設計方針
私たち推薦基盤チームは、ZOZOTOWNのパーソナライズ機能全般を担当しています。毎年OKRという形式でチームの方向性を決めており、今年度は「新たな出会いを目指し、新規性と多様性に重きを置く」という目標を掲げました。これは、関連性だけを追い求めるパーソナライズでは、ユーザーの興味が固定化し、新たな商品との出会いが失われてしまうという考えからです。
このプロジェクトでも、チームのOKRに沿って、新たな出会いを目指して新規性と多様性を重視することにしました。ただし、まったく興味のない商品を見せても意味がないため、関連性も含めた3つの要素をバランスよく組み合わせるアプローチを採用しました。
要素 | 目指すこと |
---|---|
関連性 | ユーザーの興味に合った商品を推薦する |
新規性 | まだ見たことのない商品と出会える機会を作る |
多様性 | 偏りのない幅広い商品を提案する |
Two-Towerモデルとベクトル検索
これらの3要素を実現する最大の課題は、1,000万人のユーザーと100万点の商品という膨大な組み合わせの中から、各ユーザーとの関連性が高い商品を見つけ出すことでした。
この課題に対し、以前の記事で紹介したTwo-Towerモデルを今回も採用しました。Two-Towerモデルは、ユーザーと商品をそれぞれ独立したニューラルネットワーク(Tower)で処理し、同じ次元のベクトル空間に埋め込む手法です。関連性の高いユーザーと商品のベクトルが互いに近くなるように学習されるため、あるユーザーのベクトルから、そのユーザーに適した商品をベクトル検索(近傍探索)で取得できるようになります。
Two-Towerモデルの詳しい仕組みについては前回の記事をご参照ください。
ベクトル検索基盤の選定
ベクトル検索の基盤として、Google CloudのVertex AI Vector Searchを採用しました。事前に商品ベクトルを登録しておくことで、ユーザーベクトルと関連性の高い商品を高速に取得できます。採用理由は以下の通りです。
採用理由 | 詳細 |
---|---|
柔軟なフィルタリング機能がある | ブランドやカテゴリ、価格などで商品をフィルタリングした上でベクトル検索が可能 |
多様性確保の仕組みがある | クラウディング機能により、同じ属性値(ブランド、カテゴリなど)の商品数を制限し、検索結果の多様性を確保可能 |
将来的な拡張性がある | 今回はバッチ処理で使用する想定だが、将来的なリアルタイム化の予定があり、これに対応可能 |
2段階処理の設計
関連性・新規性・多様性を兼ね備えたパーソナライズを実現するため、以下の2段階処理を設計しました。
第1段階:近傍の商品取得(関連性×多様性) Vertex AI Vector Searchでユーザーベクトルに近い商品を検索することで、関連性の高い商品を取得します。同時に、クラウディング機能により同一ブランドを最大3件に制限することで、多様性を確保します。これにより、ユーザーの興味に合いながらも、様々なブランドの商品を候補として選出できます。
第2段階:並び順調整(新規性)
取得した商品の中から、最近ユーザーが閲覧した商品にはスコアのペナルティを加え、表示順を調整します。この調整によって、ユーザーがまだ見ていない商品が優先的に表示され、関連性を保ちながら新規性の高い商品との出会いが生まれるよう設計しています。
この2段階処理により、関連性・新規性・多様性の3要素すべてを満たしたパーソナライズを実現します。
プロトタイピングによる事前検証
設計したアプローチの妥当性を確認するため、本格的な開発の前にGradioで検証ツールを作成しました。
このツールではユーザーIDを入力するだけで、そのユーザー向けにパーソナライズされた商品リストをブラウザ上で確認できます。実際の動作を見ることで、従来の人気順表示との違いが明確になり、ステークホルダーへの説明も効果的に行えました。
プロトタイピングでアプローチの妥当性を確認できたことで、自信を持って本格的な開発に着手できました。
パーソナライズシステム
システム概要
上述のようなパーソナライズを本番環境で運用するため、各ユーザーに最適な商品リストを生成・配信するシステムを構築しました。Two-Towerモデルの学習、100万商品のベクトル生成とインデックス更新、1000万人を超えるユーザーへの推薦結果の生成まで、すべてを自動化しています。
システムの中核となるのは、ベクトル検索インデックスと2つのバッチ処理パイプラインです。
日次で実行されるパイプラインはTwo-Towerモデルを学習し、ベクトル検索インデックスを更新します。一方、1時間毎に実行されるパイプラインは、最新のユーザー行動を反映した推薦商品の生成を担当します。生成された結果はBigtableに保存され、ホーム画面表示時に低レイテンシで配信されます。
システム構成
コンポーネント | 役割 |
---|---|
training-and-indexing-pipeline (Vertex AI Pipelines) |
日次で以下の処理を行うパイプライン 1. Two-Towerモデル(User Tower、Product Tower)を訓練してModel Registryに保存 2. Product Towerを使用して全商品(約100万件)のベクトルを生成 3. 生成したベクトルでVertex AI Vector Searchのインデックスを更新 |
module-personalization-pipeline (Vertex AI Pipelines) |
1時間毎に以下の処理を行うパイプライン 1. Model RegistryからUser Towerモデルを取得 2. 最新のユーザー特徴量とUser Towerを使用してユーザーベクトルを生成 3. ユーザーベクトルの近傍商品をVertex AI Vector Searchから取得 a. クラウディング機能を使用し、同一ブランドは最大3件に制限 4. 取得した商品に対して新規性を考慮した並び替え 5. 結果をBigtableに保存 |
product-vector-index (Vertex AI Vector Search) |
全商品ベクトルが格納される高速検索インデックス |
モデルの整合性担保
User TowerとProduct Towerは必ず同じバージョンのモデルを使用する必要があります。異なるバージョンのモデルを使用すると、ユーザーベクトルと商品ベクトルが異なるベクトル空間に埋め込まれてしまい、類似度計算が意味をなさなくなります。
この問題を防ぐため、以下の仕組みを実装しました。
- training-and-indexing-pipelineが新しいモデルを訓練し、商品ベクトルの更新を完了
- 更新完了後、Model Registryの該当モデルに「現在のインデックスと同期済み」を示すエイリアスを設定
- module-personalization-pipelineは常にこのエイリアスが指すモデルを使用
この方式により、商品ベクトルを生成したモデルと同じバージョンでユーザーベクトルが生成されることを保証し、ベクトル空間の整合性を維持しています。
A/Bテストによる効果検証
テスト概要
パーソナライズの効果を定量的に評価するため、以下の設定でA/Bテストを実施しました。
項目 | 内容 |
---|---|
期間 | 28日間 |
対象ユーザー数 | 約500万人 |
対象モジュール | カテゴリ推薦モジュール(ホーム画面の3箇所) |
Control群 | 従来の人気順表示 |
Treatment群 | パーソナライズされた並び順(関連性×新規性×多様性) |
結果
「新たな出会い」を目指したパーソナライズが、優れたユーザー体験と確かなビジネス成果につながりました。
カテゴリ推薦モジュールの直接的な成果
指標 | 改善率(Treatment/Control) |
---|---|
1人当たりユニーク商品閲覧数 | +18.8% |
1人当たりユニークブランド閲覧数 | +56.3% |
1人当たりユニーク商品クリック数 | +58.3% |
1人当たりユニークブランドクリック数 | +63.3% |
1人当たりモジュール経由の受注金額 | +26.3% |
これらの結果から、「新たな出会い」を目指したパーソナライズの成功が確認できます。単に閲覧数が増えただけでなく、クリック数も大幅に増加(商品+58.3%、ブランド+63.3%)している点が重要です。表示された新しい商品・ブランドがユーザーの興味を引き、積極的にクリックされていることを示しています。そして受注金額も26.3%向上し、新たな出会いがビジネス価値にも結びつきました。
さらに、モジュール全体のカバレッジ指標(全ユーザーの行動を集計した結果)も大幅に改善しました。
指標(全ユーザー集計) | 改善率(Treatment/Control) |
---|---|
ユニーク閲覧商品数 | +387.9% |
ユニーク閲覧ブランド数 | +62.4% |
ユニーククリック商品数 | +202.2% |
ユニーククリックブランド数 | +92.2% |
これらの結果から、パーソナライズによってカテゴリ推薦モジュールで表示される商品・ブランドの種類が大幅に増加したことがわかります。従来の人気順では限られた商品・ブランドしか表示されませんでしたが、パーソナライズによって各ユーザーに合わせた多様な商品が表示されるようになりました。その結果、閲覧される商品の種類が387.9%増、クリックされる商品の種類も202.2%増という劇的な改善を実現しました。これは、埋もれていた商品が適切なユーザーに届き、実際に興味を持たれていることを意味しています。
サイト全体への影響
指標 | 改善率(Treatment/Control) |
---|---|
1人当たり受注金額 | +0.4% |
1人当たりお気に入り商品数 | +4.3% |
1人当たりお気に入りブランド数 | +1.4% |
1人当たりサイト訪問頻度 | +0.2% |
1人当たりホーム画面の訪問頻度 | +0.2% |
ホーム画面の3つのモジュールという限定的な変更でありながら、サイト全体のKPIが向上しました。お気に入り登録の増加は、パーソナライズによって見つけた商品・ブランドに、ユーザーが強い興味を持ち、今後も購入を検討したいと感じたことを示しています。訪問頻度の向上は、新たな商品との出会いへの期待感を生み出せている証拠です。
特に注目すべきは、1人当たり受注金額が0.4%向上したことです。一見小さな数字に見えますが、ZOZOTOWNの規模を考えると非常に大きなビジネスインパクトとなります。
まとめと今後の展望
私たちは「新たな出会いを目指し、新規性と多様性に重きを置く」というチームのOKRに基づき、ZOZOTOWNホーム画面のパーソナライズに取り組みました。
その結果、1人当たりクリック商品数が58.3%増加、モジュール経由の受注金額が26.3%増加という大きな成果を達成。さらに、表示される商品の種類が387.9%増加し、埋もれていた商品に光を当てることができました。
技術面では、Two-TowerモデルとVertex AI Vector Searchを組み合わせることで、新規性・多様性を意識したパーソナライズを実現できました。また、プロトタイピングによる事前検証の重要性も再認識しました。
今後は、この成功を基に以下の展開を進めていきます。
- バッチ推薦からリアルタイム推薦への移行
- ホーム画面の他モジュールへの展開
- ホーム画面以外への展開
おわりに
パーソナライズは技術だけの問題ではありません。どのような価値をユーザーに届けたいのか、その想いを形にする設計が重要です。
本記事で紹介した手法や考え方が、パーソナライズシステムの構築に取り組む皆さまの参考になれば幸いです。
ZOZOでは、一緒にサービスを作り上げてくれる方を募集中です。ご興味のある方は、以下のリンクからぜひご応募ください。