深層学習を用いた強力なレコメンデーションシステムの構築

Building powerful recommendation systems using deep learning.

著者によるイラスト

PyTorchライブラリTorchRecを使用したステップバイステップの実装

顧客に適切な商品を適切な時に推薦することは、あらゆる業界での共通の課題です。たとえば、銀行家は常に既存の顧客や潜在的な顧客に対して非常に関連性の高いサービスを提案しようとしています。小売業者は、顧客の好みに合った魅力的な商品を推奨しようと努めています。同様に、ソーシャルネットワークは、ユーザーの採用を促進するための魅力的なフィードを構築しようとしています。

広く探求されているユースケースであるにもかかわらず、満足のいくパフォーマンス結果を得ることは困難です。その主な理由は、豊富なカテゴリデータの存在による希少性の問題と、スケーラビリティの問題としてのユースケースの計算的な側面です。最近まで、推薦モデルはニューラルネットワークを活用しています。

この文脈において、Metaは深層学習推薦モデル(DRLM)を開発し、オープンに提供しています。このモデルは、協調フィルタリングと予測分析の原則を組み合わせ、大規模なプロダクションに適したもので特に注目に値します。

目的

この記事の目的は、PyTorchライブラリTorchRecを使用したステップバイステップの実装を通じて、自分自身の推薦ユースケースに効果的に対応できるようにすることです。

この記事を読むことで、以下のことが理解できるようになります:

  1. DLRMモデルはどのように機能するのか?
  2. DLRMモデルはどのように優れており、強力でスケーラブルなのか?
  3. エンドツーエンドで独自の推薦システムを実装する方法は?

この記事では、レコメンドシステムの問題に関する一般的な知識と、pytorchライブラリの習熟度が必要です。記事で説明されている実験は、TorchRecとPyTorchのライブラリを使用して行われました。GitHubでコードを見つけることができます。

GitHub – linafaik08/recommender_systems_dlrm

GitHubでlinafaik08/recommender_systems_dlrmの開発に貢献するには、GitHubでアカウントを作成してください。

github.co

1. DLRMモデルの解読

まず、DLRMモデルの複雑さについて詳しく見て、その基本原理とメカニズムを探求しましょう。

1.1. モデル設計の概要

具体的なイメージを提供するために、ウェブサイトを訪れるすべての顧客に対して個別のフィードを作成しようとしているオンライン小売業者のシナリオを考えてみましょう。

これを実現するために、小売業者は、顧客が特定の商品を購入する確率を予測するモデルをトレーニングできます。このモデルは、各個別の顧客に対して各商品にスコアを割り当て、さまざまな要因に基づいています。フィードはスコアに基づいてランキングされます。

この場合、モデルは、顧客と商品それぞれについてさまざまな情報を含む過去のデータから学習することができます。これには、顧客の年齢や商品価格などの数値変数、および商品の種類、色などのカテゴリ特性が含まれます。

DLRMモデルの優れた点は、数値変数とカテゴリ変数の両方を活用する驚くべき能力を持っていることです。これにより、モデルは特徴量間の複雑な関係を包括的に分析し理解することができます。なぜなら、図1のアーキテクチャモデルを見てみましょう。

図1 - DLRMモデルのアーキテクチャ、著者によるイラスト、[5]からインスピレーションを受けた

カテゴリ特徴量

DLRMは、各カテゴリ特徴量に対して埋め込みテーブルを学習し、これらの変数を密な表現にマッピングするためにそれらを使用します。したがって、各カテゴリ特徴量は同じ長さのベクトルとして表されます。

数値特徴

DLRMは数値特徴をボトムMLPと呼ばれるMLPを介して処理します。このMLPの出力は前の埋め込みベクトルと同じ次元です。

ペアワイズ相互作用

DLRMは、すべての埋め込みベクトルと処理された数値特徴のすべてのペアの内積を計算します。これにより、モデルは2次の特徴相互作用を含めることができます。

結合と最終出力

DLRMは、これらの内積を処理された数値特徴と結合し、その結果を別のMLPであるトップMLPにフィードします。最終確率は、このMLPの出力をシグモイド関数に通すことで得られます。

1.2. モデルの実装

モデルの潜在能力は理論的には有望ですが、その実装は計算上の障壁を抱えています。

通常、推薦のユースケースでは大量のデータを扱う必要があります。特にDLRMモデルを使用する場合、一般的なディープラーニングモデルよりも多くのパラメータが必要となります。そのため、これは実装に関連する計算要件を増大させます。

  1. DLRMのパラメータの大部分は埋め込みに帰属できます。埋め込みは複数のテーブルで構成され、各テーブルは大きなメモリを要求します。これにより、DLRMはメモリ容量と帯域幅の両方で計算上の要求が高くなります。
  2. MLPのパラメータのメモリフットプリントは小さいですが、それでも相当な計算リソースを必要とします。

メモリのボトルネックを緩和するために、DLRMは埋め込みのためのモデル並列処理とMLPのためのデータ並列処理のユニークな組み合わせに依存しています。

2. コンセプトから実装へ: カスタム推薦システムの構築についてのステップバイステップガイド

このセクションでは、推薦システムを最初から最後まで実装するための詳細なステップバイステップガイドを提供します。

2.1. データ変換とバッチ構築

最初のステップは、データをテンソルに変換し、モデルへの入力用にバッチに整理することです。

このプロセスを説明するために、このデータフレームを例に考えてみましょう。

疎な特徴の場合、値を1つのベクトルに連結し、長さを計算する必要があります。これはKeyedJaggedTensor.from_lengths_sync関数を使用して実現できます。この関数は両方の要素を入力として受け取ります。以下にPythonスクリプトの例を示します。

values = sample[cols_sparse].sum(axis=0).sum(axis=0)values = torch.tensor(values).to(device)# values = tensor([1, 0, 2, 0, 2, 2, 0, 2, 0, 1, 0, 1, 2, 0], device='cuda:0')lengths = torch.tensor(    pd.concat([sample[feat].apply(lambda x: len(x)) for feat in cols_sparse],              axis=0).values,    dtype=torch.int32).to(self.device)# lengths = tensor([1, 1, 1, 1, 1, 2, 3, 2, 2, 0], device='cuda:0', dtype=torch.int32)sparse_features = KeyedJaggedTensor.from_lengths_sync(  keys=cols_sparse,  values=values,  lengths=lengths)

密な特徴とラベルの場合、プロセスはより簡単です。以下にPythonスクリプトの例を示します。

dense_features = torch.tensor(sample[cols_dense].values, dtype=torch.float32).to(device)labels = torch.tensor(sample[col_label].values, dtype=torch.int32).to(device)

前のステップの出力を使用することで、バッチを構築することが可能になります。以下にPythonスクリプトの例を示します。

batch = Batch(  dense_features=dense_features,  sparse_features=sparse_features,  labels=labels,).to(device)

より包括的な実装については、対応するGitHubリポジトリのbatch.pyファイルを参照してください。

2.2. モデルの初期化と最適化の設定

次のステップでは、モデルの初期化を行います。以下のPythonコードで示されています。

# モデルの初期化と最適化の設定# モデルで使用される埋め込みの次元数を定義するembedding_dim = 10# 各特徴の埋め込みの数を計算するnum_embeddings_per_feature = {c: len(v) for c, v in map_sparse.items()}# 密なアーキテクチャのレイヤーサイズを定義するdense_arch_layer_sizes = [512, 256, embedding_dim]# 全体のアーキテクチャのレイヤーサイズを定義するover_arch_layer_sizes = [512, 512, 256, 1]# AdagradオプティマイザまたはSGDオプティマイザを使用するかどうかを指定するadagrad = False# Adagradオプティマイザのイプシロン値を設定するeps = 1e-8# 最適化の学習率を設定するlearning_rate = 0.01# 各疎な特徴に対するEmbeddingBagConfigオブジェクトのリストを作成するeb_configs = [    EmbeddingBagConfig(        name=f"t_{feature_name}",        embedding_dim=embedding_dim,        num_embeddings=num_embeddings_per_feature[feature_name + '_enc'],        feature_names=[feature_name + '_enc'],    )    for feature_idx, feature_name in enumerate(cols_sparse)]# 埋め込みバッグコレクションとアーキテクチャの仕様を使用してDLRMモデルを初期化するdlrm_model = DLRM(    embedding_bag_collection=EmbeddingBagCollection(        tables=eb_configs, device=device    ),    dense_in_features=len(cols_dense),    dense_arch_layer_sizes=dense_arch_layer_sizes,    over_arch_layer_sizes=over_arch_layer_sizes,    dense_device=device,)# トレーニング操作を処理するためのDLRMTrainインスタンスを作成するtrain_model = DLRMTrain(dlrm_model).to(device)# 埋め込みパラメータに対して適切なオプティマイザクラスを選択するembedding_optimizer = torch.optim.Adagrad if adagrad else torch.optim.SGD# オプティマイザのキーワード引数を設定するoptimizer_kwargs = {"lr": learning_rate}if adagrad:    optimizer_kwargs["eps"] = eps# 疎なアーキテクチャのパラメータにオプティマイザを適用するapply_optimizer_in_backward(    optimizer_class=embedding_optimizer,    params=train_model.model.sparse_arch.parameters(),    optimizer_kwargs=optimizer_kwargs,)# 密なアーキテクチャのオプティマイザを設定するdense_optimizer = KeyedOptimizerWrapper(    dict(in_backward_optimizer_filter(train_model.named_parameters())),    optimizer_with_params(adagrad, learning_rate, eps),)# 最適化を処理するためのCombinedOptimizerインスタンスを作成するoptimizer = CombinedOptimizer([dense_optimizer])

モデルは以下のコードを使用してトレーニングおよび評価することができます:

loss, (loss2, logits, labels) = train_model(batch)

より包括的な実装については、対応するGitHubリポジトリ内のmodel.pyファイルを参照してください。

キーポイント

✔ DLRMモデルは、埋め込みを使用して数値とカテゴリ特徴を効果的に組み合わせるという魅力的なアプローチを提供し、複雑なパターンや関係を捉えることができます。

✔ そのアーキテクチャはかなりの計算リソースを必要としますが、モデルの実装にはモデル並列化とデータ並列化のユニークな組み合わせが組み込まれており、モデルを本番環境でスケーラブルにすることが可能です。

✔ ただし、データの利用可能性が限られているため、モデルのパフォーマンスは多様な実世界のデータセットで充分にテストされていません。これは実践的なシナリオでの有効性に関して不確実性を引き起こします。

✔ さらに、モデルは多数のパラメータの調整を必要とし、プロセスをさらに複雑にします。

✔ これらを考慮すると、LGBMなどのシンプルなモデルは、同じ計算オーバーヘッドなしで、より簡単な実装、調整、および長期的なメンテナンスを提供するかもしれません。

参考文献

[1] M Naumov & al、Deep Learning Recommendation Model for Personalization and Recommendation Systems、2019年5月

[2] DLRMモデルのFacebookチームの初期実装のGitHubリポジトリ(オープンソースで利用可能)

[3] DLRM:高度なオープンソースのディープラーニング推薦モデル、Meta AIブログ、2019年7月

[4] Pytorchライブラリを使用した現代の本番環境向け推薦システム、torchec

[5] Vinh Nguyen、Tomasz Grel、Mengdi Huang、NVIDIA GPU上でのDeep Learning Recommendation Modelの最適化、2020年6月

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more