文 /Maciej Kula 和 James Chen,Google Brain
推薦系統(tǒng)是機器學(xué)習(xí)的一大主要應(yīng)用,能夠根據(jù)用戶偏好推送相關(guān)內(nèi)容,比如推薦電影、餐廳、搭配時裝首飾或篩選媒體信息流等。
Google 過去幾年一直在探索新的深度學(xué)習(xí)技術(shù),力求通過結(jié)合多任務(wù)學(xué)習(xí)、強化學(xué)習(xí)、提取更好的用戶表征和構(gòu)建公平性指標(biāo)提供更好的推薦。這些努力和其他方面的進(jìn)展大幅改善了我們的推薦效果。
今天,我們榮幸地推出 TensorFlow Recommenders (TFRS),這款開源 TensorFlow 軟件包可簡化構(gòu)建、評估和應(yīng)用復(fù)雜的推薦模型。
TensorFlow Recommenders (TFRS)
https://tensorflow.google.cn/recommenders
TFRS 使用 TensorFlow 2.x 構(gòu)建,有助于:
構(gòu)建和評估靈活的Candidate Nomination Model;
將條目、用戶和上下文信息自由整合到推薦模型;
訓(xùn)練可聯(lián)合優(yōu)化多個推薦目標(biāo)的多任務(wù)模型;
用 TensorFlow Serving 高效利用生成的模型。
TFRS 基于 TensorFlow 2.x 和 Keras,十分易于上手,在采用模塊化設(shè)計的同時(您可以自定義每個層和評價指標(biāo)),仍然組成了一個強有力的整體(各個組件可以良好協(xié)作)。在 TFRS 的設(shè)計過程中,我們一直強調(diào)靈活性和易用性:合理的默認(rèn)設(shè)置、直觀易行的常見任務(wù)以及更復(fù)雜或自定義的推薦任務(wù)。
TensorFlow Recommenders 現(xiàn)已在 GitHub 上開源。我們的目標(biāo)是讓其不斷發(fā)展,能夠靈活地進(jìn)行學(xué)術(shù)研究,并以高度可擴展的方式構(gòu)建全網(wǎng)推薦系統(tǒng)。我們還計劃在多任務(wù)學(xué)習(xí)、特征交叉建模、自監(jiān)督學(xué)習(xí)和最前沿 (SOTA)近似最鄰近計算方面擴展其功能。
GitHub
https://github.com/tensorflow/recommenders
示例:構(gòu)建電影推薦工具
讓我們先用一個簡單示例展現(xiàn) TensorFlow Recommenders 的使用方法。首先,使用 pip 安裝 TFRS:
!pip install tensorflow_recommenders
然后,我們可以使用 MovieLens 數(shù)據(jù)集訓(xùn)練一個簡單的電影推薦模型。數(shù)據(jù)集所含信息包括用戶觀看了哪些電影以及用戶對該電影的評分。
我們將使用這一數(shù)據(jù)集構(gòu)建模型,預(yù)測用戶已觀看和未觀看的電影。此類任務(wù)通常選擇雙塔模型:一個具有兩個子模型的神經(jīng)網(wǎng)絡(luò),分別學(xué)習(xí) query 和 candidate 的表征。給定的query-candidate 對的得分 (score) 只是這兩個塔的輸出的點積。
這個模型架構(gòu)相當(dāng)靈活。query 塔的輸入可以是:用戶 ID、搜索關(guān)鍵詞或時間戳;對于 candidate 側(cè)則有:電影片名、描述、梗概、主演名單。
在此示例中,我們在 query 塔僅使用用戶 ID,在 candidate 塔僅使用電影片名。
我們先來準(zhǔn)備數(shù)據(jù)。數(shù)據(jù)可從 TensorFlow Datasets 獲取。
import tensorflow as tf import tensorflow_datasets as tfds import tensorflow_recommenders as tfrs
# Ratings data. ratings = tfds.load("movie_lens/100k-ratings", split="train") # Features of all the available movies. movies = tfds.load("movie_lens/100k-movies", split="train")
在數(shù)據(jù)集的所有可用特征中,最實用的是用戶 ID 和電影片名。雖然 TFRS 有多種可選特征,但為簡單起見,我們只使用這兩項。
ratings = ratings.map(lambda x: { "movie_title": x["movie_title"], "user_id": x["user_id"], }) movies = movies.map(lambda x: x["movie_title"])
只使用用戶 ID 和電影片名時,我們簡單的雙塔模型與典型的矩陣分解模型非常相似。我們需要使用以下內(nèi)容進(jìn)行構(gòu)建:
一個用戶塔,將用戶 ID 轉(zhuǎn)換為用戶 embedding 向量(高維向量表示)。
一個電影塔,將電影片名轉(zhuǎn)換為電影 embedding 向量。
一個損失函數(shù),對于觀看行為,最大化預(yù)測用戶與電影的匹配度,而未觀看的行為進(jìn)行最小化。
TFRS 和 Keras 為實現(xiàn)這一目標(biāo)提供了大量基本模塊。我們可以從創(chuàng)建模型類開始。在__init__方法中,我們設(shè)置一些超參數(shù)以及模型的主要組件。
class TwoTowerMovielensModel(tfrs.Model): """MovieLens prediction model.""" def __init__(self): # The `__init__` method sets up the model architecture. super().__init__() # How large the representation vectors are for inputs: larger vectors make # for a more expressive model but may cause over-fitting. embedding_dim = 32 num_unique_users = 1000 num_unique_movies = 1700 eval_batch_size = 128
第一個主要組件是用戶模型:一組描述如何將原始用戶特征轉(zhuǎn)換為數(shù)字化用戶表征的層。我們在這里使用 Keras 預(yù)處理層將用戶 ID 轉(zhuǎn)換為整數(shù)索引,然后將其映射到學(xué)習(xí)的 embedding 向量:
# Set up user and movie representations. self.user_model = tf.keras.Sequential([ # We first turn the raw user ids into contiguous integers by looking them # up in a vocabulary. tf.keras.layers.experimental.preprocessing.StringLookup( max_tokens=num_unique_users), # We then map the result into embedding vectors. tf.keras.layers.Embedding(num_unique_users, embedding_dim) ])
電影模型看起來很相似,能夠?qū)㈦娪捌D(zhuǎn)換為 embedding 向量:
self.movie_model = tf.keras.Sequential([ tf.keras.layers.experimental.preprocessing.StringLookup( max_tokens=num_unique_movies), tf.keras.layers.Embedding(num_unique_movies, embedding_dim) ])
得到用戶和電影模型后,就需要定義我們的目標(biāo)和它的評估指標(biāo)了。在 TFRS 中,可以通過 Retrieval任務(wù)完成這一點(使用 in-batch softmax loss):
# The `Task` objects has two purposes: (1) it computes the loss and (2) # keeps track of metrics. self.task = tfrs.tasks.Retrieval( # In this case, our metrics are top-k metrics: given a user and a known # watched movie, how highly would the model rank the true movie out of # all possible movies? metrics=tfrs.metrics.FactorizedTopK( candidates=movies.batch(eval_batch_size).map(self.movie_model) ) )
我們使用 compute_loss方法查看模型的訓(xùn)練過程:
def compute_loss(self, features, training=False): # The `compute_loss` method determines how loss is computed. # Compute user and item embeddings. user_embeddings = self.user_model(features["user_id"]) movie_embeddings = self.movie_model(features["movie_title"]) # Pass them into the task to get the resulting loss. The lower the loss is, the # better the model is at telling apart true watches from watches that did # not happen in the training data. return self.task(user_embeddings, movie_embeddings)
我們可以調(diào)用 Keras 的 fit 擬合此模型:
model = MovielensModel() model.compile(optimizer=tf.keras.optimizers.Adagrad(0.1)) model.fit(ratings.batch(4096), verbose=False)
要對模型的推薦進(jìn)行 Sanity-Check(合理性檢驗),我們可以使用 TFRS BruteForce 層。BruteForce 層以預(yù)先計算好的 candidate 的表征進(jìn)行排序,允許我們對所有可能的 candidate 計算其所在 query-candidate 對的得分,并返回排名最靠前的電影 (query):
index = tfrs.layers.ann.BruteForce(model.user_model) index.index(movies.batch(100).map(model.movie_model), movies) # Get recommendations. _, titles = index(tf.constant(["42"])) print(f"Recommendations for user 42: {titles[0, :3]}")
當(dāng)然,BruteForce 層只適用于非常小的數(shù)據(jù)集。有關(guān)將 TFRS 與近似最鄰近庫 Annoy 結(jié)合使用的示例,請參閱我們的完整教程。
完整教程
https://tensorflow.google.cn/recommenders/examples/basic_retrieval#building_a_candidate_ann_index
我們希望這能讓您對 TensorFlow Recommenders 的功能有所了解。要了解更多信息,請查看我們的教程或 API 參考。如果您想?yún)⑴c,一同推動 TensorFlow 推薦系統(tǒng)發(fā)展,請考慮貢獻(xiàn)您的一份力量!我們還將在近期宣布成立 TensorFlow Recommendations 特殊興趣小組 (SIG),歡迎大家就嵌入向量學(xué)習(xí)和分布式訓(xùn)練與應(yīng)用等主題開展合作和做出貢獻(xiàn)。敬請期待!
教程
https://tensorflow.google.cn/recommenders/examples/quickstart
API 參考
https://tensorflow.google.cn/recommenders/api_docs/python/tfrs/all_symbols
貢獻(xiàn)您的一份力量
https://github.com/tensorflow/recommenders/
致謝
TensorFlow Recommenders 是 Google 以及其他組織的人員共同努力的成果。我們要感謝 Tiansheng Yao、Xinyang Yi、Ji Yang 對庫的核心貢獻(xiàn),感謝 Lichan Hong 和 Ed Chi 的領(lǐng)導(dǎo)與指導(dǎo)。我們也要感謝 Zhe Zhao、Derek Cheng、Sagar Jain、Alexandre Passos、Francois Chollet、Sandeep Gupta、Eric Ni 等人對項目的建議和支持。
責(zé)任編輯:xj
原文標(biāo)題:TensorFlow Recommenders 現(xiàn)已開源,讓推薦系統(tǒng)更上一層樓!
文章出處:【微信公眾號:TensorFlow】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
-
機器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8423瀏覽量
132744 -
推薦系統(tǒng)
+關(guān)注
關(guān)注
1文章
43瀏覽量
10085 -
tensorflow
+關(guān)注
關(guān)注
13文章
329瀏覽量
60538
原文標(biāo)題:TensorFlow Recommenders 現(xiàn)已開源,讓推薦系統(tǒng)更上一層樓!
文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論