推薦システムはどのように機能するのか?
レコメンデーションシステムは、人間が不要な電子メールをふるいにかけるのに役立つ、質素な始まりのアルゴリズムによって動いている。1990年、発明者のダグ・テリーは、協調フィルタリングアルゴリズムを使って、迷惑メールから望ましいメールを選別した。同じような内容のメールに対して同じことをする他の人たちと協力して、メールを「好き」または「嫌い」にするだけで、ユーザーは、何をユーザーの受信トレイに送り、何を迷惑メールフォルダに隔離すべきかを判断するよう、コンピュータを素早く訓練することができた。
一般的な意味で、レコメンデーション・システムとは、ユーザーに適切な提案をするアルゴリズムのことである。サジェスチョンとは、見るべき映画、読むべき本、買うべき商品など、シナリオや業界によって様々なものがある。このようなアルゴリズムは私たちの身の回りに存在し、Youtube、Amazon、Netflixなどの大手テクノロジー企業から、私たちが消費するコンテンツや購入する商品に影響を与えている。
うまく設計されたレコメンデーションシステムは、不可欠な収益源、コスト削減、競争上の差別化要因となり得る。オープンソースの技術と計算コストの低下のおかげで、カスタマイズされたレコメンデーションシステムはかつてないほど身近なものとなった。この記事では、オープンソースのベクトル・データベースであるMilvus、グラフ畳み込みニューラルネットワーク(GCN)であるPinSage、グラフ上でのディープラーニングのためのスケーラブルなPythonパッケージであるディープグラフ・ライブラリ(DGL)、そしてMovieLensデータセットを使用して、グラフベースのレコメンデーションシステムを構築する方法を説明する。
戻る
推薦システムはどのように機能するのか?
推薦システムの構築には、協調フィルタリングとコンテンツベースフィルタリングという2つの一般的なアプローチがあります。ほとんどの開発者は、どちらか、あるいは両方の方法を利用しており、推薦システムは複雑さと構築において様々ですが、一般的に3つの核となる要素を含んでいます:
- ユーザーモデル:ユーザーモデル:推薦システムはユーザーの特性、好み、ニーズをモデル化する必要がある。多くの推薦システムは、ユーザーからの暗黙的または明示的なアイテムレベルの入力に基づいて提案を行います。
- オブジェクトモデル:レコメンダーシステムはまた、ユーザーのポートレートに基づいてアイテムの推薦を行うために、アイテムをモデル化する。
- 推薦アルゴリズム:推薦システムの核となるのは、推薦を行うアルゴリズムである。よく使われるアルゴリズムには、協調フィルタリング、暗黙的セマンティックモデリング、グラフベースモデリング、複合レコメンデーションなどがある。
高度なレベルでは、協調フィルタリングに依存する推薦システムは、ユーザーが興味を持ちそうなものを予測するために、過去のユーザー行動(類似ユーザーからの行動入力を含む)からモデルを構築します。コンテンツベースのフィルタリングに依存するシステムは、アイテムの特徴に基づいた個別の定義済みタグを使用して、類似のアイテムを推薦する。
協調フィルタリングの例は、Spotifyのパーソナライズされたラジオステーションで、ユーザーのリスニング履歴、興味、音楽ライブラリなどに基づいている。このステーションは、ユーザーが保存していない、あるいは興味を示していないが、同じような趣味を持つ他のユーザーがよく聴いている音楽を流す。コンテンツベースのフィルタリングの例としては、特定の曲やアーティストに基づいたラジオ局があり、入力の属性を利用して類似の音楽を推薦する。
推薦システムを構築するツール
この例では、グラフベースのレコメンデーションシステムをゼロから構築する場合、以下のツールに依存する:
Pinsage:グラフ畳み込みネットワーク
PinSageはランダムウォークのグラフ畳み込みネットワークで、何十億ものオブジェクトを含むウェブスケールのグラフのノードの埋め込みを学習することができる。このネットワークは、オンライン・ピンボードの会社であるPinterestによって開発された。
Pinterestのユーザーは、興味のあるコンテンツを「ボード」に「ピン」することができる。4億7,800万人以上の月間アクティブユーザー(MAU)と2,400億以上のオブジェクトが保存されているため、同社は膨大な量のユーザーデータを保有しており、それに対応するために新しいテクノロジーを構築しなければならない。
1.png
PinSageは、ピン-ボード二部グラフを使用して、ユーザーに視覚的に類似したコンテンツを推薦するために使用されるピンから高品質の埋め込みを生成する。特徴行列と完全なグラフに対して畳み込みを行う従来のGCNアルゴリズムとは異なり、PinSageは近傍のノード/ピンをサンプリングし、計算グラフを動的に構築することで、より効率的な局所畳み込みを行う。
ノードの近傍全体に対して畳み込みを実行すると、膨大な計算グラフになる。リソース要件を削減するために、従来のGCNアルゴリズムはkホップ近傍の情報を集約してノードの表現を更新する。PinSageはランダムウォークをシミュレートし、頻繁に訪問されるコンテンツをキーとなる近傍として設定し、それに基づいて畳み込みを構築する。
kホップ近傍は重複していることが多いため、ノードのローカル畳み込みは計算の繰り返しになる。これを回避するため、PinSageは各集計ステップにおいて、計算を繰り返すことなくすべてのノードをマップし、対応する上位ノードにリンクし、最後に上位ノードの埋め込みを取得する。
ディープグラフライブラリ:グラフ上のディープラーニングのためのスケーラブルなPythonパッケージ
dgl-framework-building-graph-based-recommender-milvus.png
Deep Graph Library(DGL)は、既存のディープラーニングフレームワーク(PyTorch、MXNet、Gluonなど)の上にグラフベースのニューラルネットワークモデルを構築するために設計されたPythonパッケージです。DGLはユーザーフレンドリーなバックエンドインターフェースを備えており、テンソルに基づくフレームワークや自動生成をサポートするフレームワークへの組み込みが容易である。前述のPinSageアルゴリズムは、DGLとPyTorchでの使用に最適化されている。
Milvus: AIと類似検索のために作られたオープンソースのベクトルデータベース
milvusの仕組み.png
Milvusは、ベクトル類似性検索と人工知能(AI)アプリケーションのために構築されたオープンソースのベクトルデータベースです。Milvusを類似検索に使用すると、次のように動作します:
- ディープラーニングモデルを使って非構造化データを特徴ベクトルに変換し、Milvusにインポートする。
- Milvusは特徴ベクトルを保存し、インデックスを作成する。
- Milvusは、リクエストに応じて、入力ベクトルに最も類似したベクトルを検索して返す。
Milvusによるグラフベースの推薦システムの構築
beike-intelligent-house-プラットフォーム-ダイアグラム.jpg
3-グラフベース推薦システムの構築.png
Milvusを用いたグラフベース推薦システムの構築は以下のステップで行われる:
ステップ1:データの前処理
データの前処理とは、生データをより理解しやすい形式に変えることである。この例では、6,000人のユーザーによって投稿された4,000本の映画に対する1,000,000の評価を含むオープンデータセットMovieLens[5] (m1-1m)を使用しています。このデータはGroupLensによって収集され、映画の説明、映画の評価、ユーザーの特徴が含まれています。
この例で使用したMovieLensデータセットは、データのクリーニングや整理を最小限に抑える必要があることに注意してください。しかし、異なるデータセットを使用する場合、あなたのマイレージは異なるかもしれません。
レコメンデーションシステムの構築を開始するには、MovieLensデータセットから過去のユーザー-映画データを使用して、分類目的のためのユーザー-映画二部グラフを構築します。
graph_builder = PandasGraphBuilder()
graph_builder.add_entities(users, 'user_id', 'user')
graph_builder.add_entities(movies_categorical, 'movie_id', 'movie')
graph_builder.add_binary_relations(ratings, 'user_id', 'movie_id', 'watched')
graph_builder.add_binary_relations(ratings, 'movie_id', 'user_id', 'watched-by')
g = graph_builder.build()
ステップ 2: PinSageでモデルをトレーニングする
PinSageモデルを使用して生成されたピンの埋め込みベクトルは、取得した映画情報の特徴ベクトルです。二部グラフgとカスタマイズされた映画特徴ベクトルの次元(デフォルトでは256-d)に基づいてPinSageモデルを作成する。次に、PyTorchでモデルを学習し、4,000本の映画のh_item embeddingsを取得する。
# Define the model
model = PinSAGEModel(g, item_ntype, textset, args.hidden_dims, args.num_layers).to(device)
opt = torch.optim.Adam(model.parameters(), lr=args.lr)
# Get the item embeddings
for blocks in dataloader_test:
for i in range(len(blocks)):
blocks[i] = blocks[i].to(device)
h_item_batches.append(model.get_repr(blocks))
h_item = torch.cat(h_item_batches, 0)
ステップ3:データのロード
MilvusにPinSageモデルによって生成されたムービー埋め込みh_itemを読み込み、対応するIDを返します。そのIDと対応する映画情報をMySQLにインポートする。
# Load data to Milvus and MySQL
status, ids = milvus.insert(milvus_table, h_item)
load_movies_to_mysql(milvus_table, ids_info)
ステップ4:ベクトル類似度検索の実行
映画IDからMilvusで対応する埋め込みベクトルを取得し、Milvusで類似度検索を行う。次に、MySQLデータベース内の対応する映画情報を特定する。
# Get embeddings that users like
_, user_like_vectors = milvus.get_entity_by_id(milvus_table, ids)
# Get the information with similar movies
_, ids = milvus.search(param = {milvus_table, user_like_vectors, top_k})
sql = "select * from " + movies_table + " where milvus_id=" + ids + ";"
results = cursor.execute(sql).fetchall()
ステップ5:レコメンデーション
システムはユーザーの検索クエリに最も類似した映画を推薦する。これが推薦システム構築の一般的なワークフローである。レコメンデーション・システムやその他のAIアプリケーションを素早くテストして導入するには、Milvusブートキャンプをお試しください。
Milvusはレコメンダーシステム以外にも力を発揮します。
Milvusは、人工知能やベクトル類似性検索アプリケーションの膨大な数に力を与えることができる強力なツールです。プロジェクトの詳細については、以下のリソースをご覧ください:
Try Managed Milvus for Free
Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.
Get StartedLike the article? Spread the word