深入探讨推荐算法:Netflix 案例研究及 NVIDIA 深度学习技术

推荐算法是什么?

推荐引擎是互联网交易的秘诀,无论是亚马逊、网飞、Flipkart、YouTube、TikTok,甚至是领英、脸书、X(推特)、Snapchat、Medium、Substack、HackerNoon等网站,几乎所有内容策划或产品市场网站都通过推荐算法赚取了大量收入。

简单来说,推荐算法构建了你的喜好、厌恶、收藏、偏好事物、偏好类型和偏好商品的模型,当在网站上进行一次交易时,它们几乎可以读懂你的心思,预测你接下来最有可能购买的产品。YouTube和TikTok上的一些推荐算法如此精确,以至于它们可以将用户吸引数小时。如果有一个读者没有报告过仅仅通过滚动和点击/轻触十分钟就陷入YouTube狂欢的经历,我会感到惊讶。

这导致了更好的客户参与度、更好的客户体验、增加的收入以及平台本身更多的利润。这些高度优化的算法的准确性和惊人的表现是建立上瘾的基础。

这些巨头就是通过这种方式建立他们的观众群体的。

YouTube、TikTok、Instagram和Facebook的每月访问者数量(来源):

  • Facebook:29亿
  • YouTube:22亿
  • Instagram:14亿
  • TikTok:10亿

他们成功的秘诀:出色的推荐算法。

推荐算法类型

协同过滤(基于用户)

基于用户的协同过滤是一种推荐技术,它假定具有相似偏好的用户会有相似的品味。它利用用户与物品的交互数据来识别用户之间的相似性,通常采用余弦相似度或皮尔逊相关系数等度量方法。该方法基于相似用户的评分来预测用户的评分或偏好。

然而,它可能面临一些挑战,比如对新用户来说的冷启动问题,这些用户还没有与系统交互;在处理大量用户时可能会出现可扩展性问题。

Python

 

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

def user_based_cf(ratings_matrix, user_id, k=5):
    similarities = cosine_similarity(ratings_matrix)
    user_similarities = similarities[user_id]
    similar_users = np.argsort(user_similarities)[::-1][1:k+1]
    
    recommendations = np.zeros(ratings_matrix.shape[1])
    for similar_user in similar_users:
        recommendations += ratings_matrix[similar_user]
    
    return recommendations / k

  • 使用余弦相似度来计算用户相似性
  • 找到与目标用户最相似的k个用户
  • 聚合相似用户的评分以生成推荐
  • 返回相似用户对每个物品的平均评分
  • 实现简单,易于修改或扩展

协同过滤(基于物品)

基于项目的协同过滤假定用户会偏好与他们过去喜欢的项目相似的项目。它根据用户的评分或互动来计算项目之间的相似度。这种方法通常比基于用户的协同过滤更具可扩展性,尤其是在用户多而项目少的情况下。它允许预先计算项目的相似性,从而使实时推荐更快。

虽然与基于用户的方法相比,它能更好地处理新用户,但在处理缺乏足够评分的新项目时可能会遇到困难。此外,它受用户偏好随时间变化的影响较小。

Python

 

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

def item_based_cf(ratings_matrix, item_id, k=5):
    similarities = cosine_similarity(ratings_matrix.T)
    item_similarities = similarities[item_id]
    similar_items = np.argsort(item_similarities)[::-1][1:k+1]
    
    recommendations = np.zeros(ratings_matrix.shape[0])
    for similar_item in similar_items:
        recommendations += ratings_matrix[:, similar_item]
    
    return recommendations / k

  • 利用评分矩阵来计算项目与项目之间的项目的相似性
  • 找到与目标项目最相似的 k 项目
  • 汇总用户对相似项目的评分
  • 根据相似项目返回每个用户的平均评分
  • 对于用户多于项目的系统有效

矩阵因式分解

矩阵因式分解将用户-项目交互矩阵分解为更低维度的矩阵。项目交互矩阵分解为低维矩阵、假设用户偏好和项目特征可以用潜在因子来表示。奇异值分解(SVD)或交替最小二乘法(ALS)等技术通常用于此目的。

这种方法可以有效地处理大型稀疏数据集,与基于记忆的协同过滤方法相比,通常具有更高的准确性。此外,它还可以结合正则化技术来防止过拟合,从而增强模型对未见数据的泛化能力。

Python

 

import numpy as np

def matrix_factorization(R, P, Q, K, steps=5000, alpha=0.0002, beta=0.02):
    Q = Q.T
    for step in range(steps):
        for i in range(len(R)):
            for j in range(len(R[i])):
                if R[i][j] > 0:
                    eij = R[i][j] - np.dot(P[i,:], Q[:,j])
                    for k in range(K):
                        P[i][k] += alpha * (2 * eij * Q[k][j] - beta * P[i][k])
                        Q[k][j] += alpha * (2 * eij * P[i][k] - beta * Q[k][j])
        
        e = 0
        for i in range(len(R)):
            for j in range(len(R[i])):
                if R[i][j] > 0:
                    e += pow(R[i][j] - np.dot(P[i,:], Q[:,j]), 2)
                    for k in range(K):
                        e += (beta/2) * (pow(P[i][k], 2) + pow(Q[k][j], 2))
        if e < 0.001:
            break
    return P, Q.T

  • 实现基本的矩阵分解算法
  • 使用梯度下降最小化预测评分与实际评分之间的误差
  • 引入正则化以防止过拟合
  • 迭代更新用户和项目的潜在因素
  • 当误差低于阈值或达到最大步骤时停止

基于内容的过滤

基于内容的过滤根据项目的特征和用户偏好推荐项目。它根据用户和项目的特点为每个用户和项目建立档案。

常采用TF-IDF(词频-逆文档频率)文本分析和余弦相似度匹配等技术。这种方法有效地解决了新项目的问题,因为它不依赖于先前的用户交互。

然而,它可能过于专业化,导致推荐缺乏多样性。此外,有效的实现需要良好的特征工程,以确保准确捕捉到项目的相关特征。

Python

 

import numpy as np
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import cosine_similarity

def content_based_filtering(item_descriptions, user_profile, k=5):
    vectorizer = TfidfVectorizer()
    item_vectors = vectorizer.fit_transform(item_descriptions)
    user_vector = vectorizer.transform([user_profile])
    
    similarities = cosine_similarity(user_vector, item_vectors)
    top_items = np.argsort(similarities[0])[::-1][:k]
    
    return top_items

  • 使用TF-IDF将文本描述转换为数值向量
  • 计算用户档案与项目描述之间的余弦相似度
  • 返回与用户档案最相似的顶部个项目
  • 对于具有明确定义项目特征的系统效率较高
  • 可以容易地扩展以包含多种特征类型

混合推荐系统

混合推荐系统结合了两项或多项推荐技术,以利用它们各自的优势。通过集成多种方法,混合系统可以缓解单一技术手段的局限,比如冷启动问题。常见的组合包括协同过滤和基于内容过滤。混合这些技术的方法有很多,比如加权、切换、混合或元级别方法。

与单一方法相比,混合系统通常能提供更稳健、更准确的推荐。然而,要实现有效的实施,需要仔细调整以平衡不同的组件,确保最佳性能。

Python

 

import numpy as np
from sklearn.metrics.pairwise import cosine_similarity

def hybrid_recommender(ratings_matrix, content_matrix, user_id, alpha=0.5, k=5):
    cf_similarities = cosine_similarity(ratings_matrix)
    content_similarities = cosine_similarity(content_matrix)
    
    hybrid_similarities = alpha * cf_similarities + (1 - alpha) * content_similarities
    user_similarities = hybrid_similarities[user_id]
    
    similar_users = np.argsort(user_similarities)[::-1][1:k+1]
    
    recommendations = np.zeros(ratings_matrix.shape[1])
    for similar_user in similar_users:
        recommendations += ratings_matrix[similar_user]
    
    return recommendations / k

  • 结合了协同过滤和基于内容的相似性
  • 使用带有参数alpha的加权求和方法
  • 基于混合相似性找到相似用户
  • 从相似用户的评分中生成推荐
  • 允许轻松调整CF和基于内容方法之间的平衡

奇异值分解(SVD)

奇异值分解(SVD)是一种矩阵分解技术,将一个矩阵分解为三个组件:U、Σ 和 V^T。在这项分解中,U 和 V 分别代表左奇异向量和右奇异向量,而 Σ 包含奇异值。

SVD通过只保留前 k 个奇异值来降低维度,这有助于揭示用户-项目交互中的潜在因子。

这种方法对于推荐系统中常见的大型稀疏矩阵处理非常有效。此外,奇异值分解(SVD)在准确性和计算效率之间提供了良好的平衡,使其成为生成推荐的热门选择。

Python

 

import numpy as np
from scipy.sparse.linalg import svds

def svd_recommender(ratings_matrix, k=5):
    U, s, Vt = svds(ratings_matrix, k=k)
    
    sigma = np.diag(s)
    predicted_ratings = np.dot(np.dot(U, sigma), Vt)
    
    return predicted_ratings

  • 使用scipy的svd函数执行截断奇异值分解
  • 只使用前k个奇异值来重构评分矩阵
  • 返回一个密集矩阵,其中包含所有用户-项目对的可预测评分
  • 对于大型稀疏评分矩阵来说非常高效
  • 可以轻松集成到更大的推荐系统中

张量分解

张量分解技术将传统矩阵分解扩展到多维数据,允许将时间、位置等上下文信息融入推荐中。它使用如CP分解等方法,将张量分解为多个组件张量的和,捕捉多个因素之间的复杂相互作用。与二维方法相比,这种方法需要更多的数据和计算资源,因为它处理的是更高维度的数组。 

然而,通过利用额外数据维度,它可以提供高度个性化和上下文感知的推荐。数据结构的复杂性允许更细致地了解用户在各种上下文中的偏好,从而提高整体推荐准确性。

Python

 

import numpy as np
import tensorly as tl
from tensorly.decomposition import parafac

def tensor_factorization_recommender(tensor, rank=10):
    factors = parafac(tensor, rank=rank)
    reconstructed_tensor = tl.kruskal_to_tensor(factors)
    return reconstructed_tensor

  • 使用TensorLy库进行张量操作和分解
  • 对输入张量应用PARAFAC分解
  • 从分解的因子中重建张量
  • 将重建的张量返回为推荐
  • 可处理多维数据(如用户-项目-上下文)

神经协同过滤

基于深度学习的推荐系统将协同过滤技术与神经网络相结合。这种方法允许学习非线性的用户-项目交互,而传统的矩阵因式分解方法可能很难做到这一点。深度学习推荐器通常使用嵌入层来表示密集、低维空间中的用户和项目。这样就可以轻松集成额外的特征或侧面信息,如用户人口统计或物品描述,从而提高推荐性能。

在大型数据集上进行训练时,基于深度学习的系统在准确性方面往往优于传统的矩阵因式分解方法。但是,这一优势的代价是计算复杂性的增加和对大量数据的需求。

深度学习推荐器还需要仔细调整超参数才能获得最佳结果,因此与更简单的协同过滤方法相比,深度学习推荐器的实施和维护更具挑战性。

Python

 

import tensorflow as tf
from tensorflow.keras.layers import Input, Embedding, Flatten, Dense, Concatenate
from tensorflow.keras.models import Model

def neural_collaborative_filtering(num_users, num_items, embedding_size=100):
    user_input = Input(shape=(1,), dtype='int32', name='user_input')
    item_input = Input(shape=(1,), dtype='int32', name='item_input')

    user_embedding = Embedding(num_users, embedding_size, name='user_embedding')(user_input)
    item_embedding = Embedding(num_items, embedding_size, name='item_embedding')(item_input)

    user_vecs = Flatten()(user_embedding)
    item_vecs = Flatten()(item_embedding)

    concat = Concatenate()([user_vecs, item_vecs])
    dense1 = Dense(128, activation='relu')(concat)
    dense2 = Dense(64, activation='relu')(dense1)
    output = Dense(1, activation='sigmoid')(dense2)

    model = Model(inputs=[user_input, item_input], outputs=output)
    model.compile(optimizer='adam', loss='binary_crossentropy')

    return model

  • 使用 TensorFlow 和 Keras 构建神经网络模型
  • 为用户和项目创建嵌入层
  • 合并用户和项目嵌入
  • 添加用于学习非线性交互的密集层
  • 返回一个准备好训练的编译模型

Netflix案例研究

Netflix推荐算法的旅程始于2000年的CineMatch,这是一个使用成员评分来估计用户会多么享受一部电影的协作过滤算法。2006年,为挑战数据科学家创建一个能比CineMatch高10%的模型的100万美元的Netflix大奖诞生了。获胜算法随后被实施到Netflix的内部数据中。

Netflix很快就积累了大量的用户,并在2007年转向流数据。观众接触到强化学习算法和聚类算法,这些算法实时生成建议。随着算法的改进,越来越多的用户开始转向Netflix,仅仅是因为推荐算法的有效性。几乎80%的Netflix上观看的内容都是由推荐算法建议的。

公司估计,每年因为它推荐算法的有效性,从流失的用户那里节省了10亿美元。

Netflix使用先进的机器学习技术和基于用户观看的电影元数据的1300多个集群的聚类系统。这使得他们能够向用户提供高度优化的建议。但Netflix很快就遇到了一个问题:规模。随着每月用户数达到数亿,总用户数超过2亿,Netflix在云计算上全力以赴。

简而言之,他们从2008年开始将所有数据迁移到亚马逊网络服务(AWS)。完整的转型过程持续了数年,最终在2015年完成。据报道,Netflix每年通过使用AWS节省了10亿美元。AWS还内置了机器学习支持,Netflix充分利用了这一点。截至2022年,Netflix据说使用了超过100,000台AWS服务器和1,000个Kinesis分片为其全球观众服务。

从2015年开始,Netflix也开始提供自己的原创作品,包括多种格式的数千部电影和电视节目。Netflix的推荐算法非常自动化,每天为用户进行数千次A/B测试。截至今天,Netflix的用户订阅量已超过2.8亿。

尽管Netflix现在面临激烈的竞争,尤其是来自迪士尼+,后者收购了漫威和星球大战系列,但该公司希望到2025年能达到5亿订阅用户。

去年,Netflix的收入高达310亿美元。

其当前推荐系统的主要部分包括:

  1. 强化学习:根据用户行为,Netflix实时更改屏幕上的内容。因此,该系统始终处于不断变化的状态,并根据用户的互动而变化。
  2. 深度神经网络:由于数据规模巨大(超过15,000档节目和近3亿用户),标准的机器学习技术难以应用。深度学习被广泛使用,采用了NVIDIA的技术。(本文末尾有一个使用NVIDIA最新Merlin深度学习技术的程序)。
  3. 矩阵分解:通过有效地对高稀疏性和高广度矩阵进行奇异值分解(SVD),Netflix估算出每位用户对某些类型和节目的重要性和吸引力。
  4. 集成学习:以上列出的算法的巧妙组合可以实时调整推荐内容,确保没有两位用户看到相同的界面。这种个性化是Netflix盈利丰厚并保持在所有OTT平台之首的关键。

而且,所有这些模型和优化每天都要为数十万用户运行数百万次。

现代深度学习技术

在这样的大规模下,单台计算机无法运行这些机器学习模型。这就是为什么AWS要在数千台机器上分布式地运行机器学习算法的原因。

英伟达™(NVIDIA®)公司最近发布了几款产品,以支持大规模推荐系统。英伟达™(NVIDIA®)的 GPU 集群在 ML 算法的执行过程中也发挥了重要作用。英伟达™(NVIDIA®)最近发布了 Merlin,这是一种经过优化的高性能推荐算法,可在数千台机器上运行,并提供卓越的结果。这或许只是时间问题,因为数据集的规模远远超出了单台计算机的处理能力。

现代推荐系统广泛使用深度学习。作为深度学习的一部分,GPU/TPU 计算系统被广泛用于加快计算速度。

NVIDIA 最近为 Merlin 提供的一些产品包括:

NVIDIA 推荐系统

(摘自NVIDIA Merlin 发布:深度推荐系统的应用框架

可作为开源项目使用:

NVTabular

NVTabular是一个用于特征工程和预处理的库,旨在快速轻松地操作PB级别的数据集。它特别适合推荐系统,这类系统需要一种可扩展的方式来处理额外信息,例如用户和项目元数据以及上下文信息。它提供了一个高级抽象,以简化代码,并使用RAPIDS cuDF库在GPU上加速计算。使用NVTabular,仅用10-20行高级API代码,您就可以搭建一个数据工程管道,与优化后的基于CPU的方法相比,可实现高达10倍的加速,同时无需考虑GPU/CPU内存容量,体验到无数据集大小限制的优点。

HugeCTR

HugeCTR是一个高效的GPU框架,旨在进行推荐模型训练,既注重高性能也注重易用性。它支持简单的深度模型,也支持最先进的混合模型,如W&DDeep Cross NetworkDeepFM。我们还在努力使DLRM与HugeCTR兼容。模型细节和超参数可以轻松地在JSON格式中指定,允许快速从多种常见模型中选择。

TensorRT和Triton服务器用于推理

NVIDIA TensorRT 是一款用于高性能 DL 推理的 SDK。它包括一个 DL 推理优化器和运行时,可为推理应用提供低延迟和高吞吐量。TensorRT 可使用通用接口(开放式神经网络交换格式 (ONNX))接受来自所有 DL 框架的训练有素的神经网络。

NVIDIA Triton Inference Server 提供针对 NVIDIA GPU 优化的云推理解决方案。该服务器通过 HTTP 或 gRPC 端点提供推理服务,允许远程客户端请求对服务器管理的任何模型进行推理。Triton 服务器可使用多个后端为 DL 推荐模型提供服务,包括 TensorFlow、PyTorch (TorchScript)、ONNX 运行时和 TensorRT 运行时。

代码示例

以下代码示例展示了转换 1-TB Criteo Ads 数据集所需的实际预处理工作流,该工作流仅使用 NVTabular 实现了十几行代码。首先,我们指定了数字列和分类列。接下来,我们定义了一个 NVTabular 工作流,并提供了一组训练和验证文件。然后,将预处理操作添加到工作流中,并将数据持久化到磁盘上。相比之下,定制的处理代码(如 Facebook DLRM 实现中基于 NumPy 的 data util)可能需要 500-1000 行代码才能完成相同的流程。

Python

 

import nvtabular as nvt
import glob
 
cont_names = ["I"+str(x) for x in range(1, 14)] # specify continuous feature names
cat_names = ["C"+str(x) for x in range(1, 27)] # specify categorical feature names
label_names = ["label"] # specify target feature
columns = label_names + cat_names + cont_names # all feature names
 
# 初始化工作流
proc = nvt.Worfklow(cat_names=cat_names, cont_names=cont_names, label_name=label_names)
 

# 从输入文件创建数据集
train_files = glob.glob("./dataset/train/*.parquet")
valid_files = glob.glob("./dataset/valid/*.parquet")
 
train_dataset = nvt.dataset(train_files, gpu_memory_frac=0.1)
valid_dataset = nvt.dataset(valid_files, gpu_memory_frac=0.1)
 

# 向工作流添加特征工程和预处理操作
proc.add_cont_feature([nvt.ops.ZeroFill(), nvt.ops.LogOp()])
proc.add_cont_preprocess(nvt.ops.Normalize())
proc.add_cat_preprocess(nvt.ops.Categorify(use_frequency=True, freq_threshold=15))
 

# 计算统计信息,转换数据,导出到磁盘
proc.apply(train_dataset, shuffle=True, output_path="./processed_data/train", num_out_files=len(train_files))
proc.apply(valid_dataset, shuffle=False, output_path="./processed_data/valid", num_out_files=len(valid_files))

整个技术栈可以在以下GitHub仓库找到:

结论

推荐系统已经取得了长足的发展。

从简单的统计建模,基于内容的过滤,以及协同过滤,我们现在有了深度学习神经网络,高性能计算节点,矩阵分解,以及其扩展到更高维度的张量分解。

流媒体上最盈利的推荐系统是NVIDIA,他们在云上使用AWS运行整个机器学习算法。

推荐系统无处不在,从谷歌到微软到亚马逊再到Flipkart。它是现代企业的一个关键部分,没有任何一家在线公司不使用它,形式不一。

如今,有许多公司在线提供定制推荐系统。

其中一些领先的公司包括:

  1. Netflix: 以其复杂的推荐引擎著称,该引擎分析用户的观看习惯以推荐电影和电视节目
  2. Amazon: 利用强大的推荐引擎,根据用户的购买历史和浏览行为推荐产品
  3. Spotify: 采用推荐系统,根据用户的收听历史记录策划音乐播放列表和歌曲建议
  4. YouTube: 使用推荐引擎,根据用户的观看模式和偏好推荐视频
  5. LinkedIn: 根据用户资料和职业历史记录推荐工作、人脉和内容
  6. Zillow:根据用户偏好和搜索历史记录推荐房地产物业
  7. Airbnb:根据用户旅行历史记录和偏好提供住宿推荐
  8. Uber:根据用户偏好和以前的乘车经历推荐乘车选项
  9. IBM 公司:推荐引擎市场的领导者,提供各种人工智能驱动的解决方案
  10. 谷歌有限责任公司(Alphabet Inc.): 利用广泛的数据分析,在其平台上提供推荐系统

希望有一天,贵公司也能跻身这一精英行列。

无论您身处哪个行业,只要您有在线业务,就需要以某种方式使用推荐系统。

永远不要停止学习。保持热情。始终相信自己有无限的发展潜力。你的未来掌握在自己手中。

参考资料

  1. 推荐系统 – 维基百科
  2. 什么是推荐系统? – GeeksforGeeks
  3. 推荐系统的类型:它们如何工作及应用案例 – almabetter.com
  4. 推荐系统与机器学习 – itransition.com
  5. Python 101 中的推荐系统 – kaggle.com
  6. 推荐系统算法概述 – KDnuggets

Source:
https://dzone.com/articles/a-deep-dive-into-recommendation-algorithms-with-ne