什麼是推薦演算法?
推薦引擎是每個互聯網交易背後的秘密,無論是亞馬遜、Netflix、Flipkart、YouTube、抖音、甚至是LinkedIn、Facebook、X(推特)、Snapchat、Medium、Substack、HackerNoon……所有這些網站,以及幾乎互聯網上的每個內容策劃或產品市場網站,都是通過推薦演算法來賺大錢的。
簡單來說,推薦演算法會建立一個關於你喜好、不喜好、最愛、偏好類型和偏好物品的模型,當你在網站上完成一筆交易時,這些演算法幾乎能讀懂你的心思,並預測你最有可能購買的下一個產品。YouTube和抖音上的一些推薦演算法如此準確,以至於它們可以讓用戶長時間沉迷其中。如果有讀者沒有報告過在YouTube上因為隨便滾動和點擊/點擊了大約十分鐘而開始的狂歡,我會感到驚訝。
這導致了更好的客戶參與、更好的客戶體驗、增加的收入以及平台本身更多的收益。成癮是建立在這些超優化演算法的準確性和驚人性能之上的。
這就是這些巨頭建立他們觀眾群的方法。
YouTube、抖音、Instagram和Facebook的每月訪客數量為 (來源):
- Facebook: 29億
- YouTube: 22億
- Instagram: 1.4億
- TikTok: 1億
它們成功的秘密:出色的推薦算法。
推薦算法類型
协同過濾(基於用戶)
基於用戶的协同過濾是一種推薦技術,它假設具有相似偏好的人會有相似的口味。它使用用戶-項目互動數據來確定用戶之間的相似性,通常使用例如餘弦相似性或皮爾森相關系數等度量。該方法根據相似用戶的評分來預測用戶的評分或偏好。
然而,對於尚未與系統互動的新用戶,它可能面臨起步問題,並且當處理大量用戶時可能會出現可伸縮性问题。
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
個用戶 - 汇总相似用戶的評分以生成推薦
- 從相似用戶那裡返回每個項目的平均評分
- 簡單的實現,可以容易地修改或扩展
协同過濾(基於項目)
基于項目的协同過濾假設用戶會偏好与他们過去喜欢的相似項目。它根據用戶評分或互動來計算項目的相似度。這種方法通常比基於用戶的协同過濾更具可扩展性,特別是當有很多用戶和較少的項目時。它允許预计算项目的相似度,這可以使實時推薦更快。
與基於用戶的方法相比,它對新用戶處理得更好,但可能會苦於缺乏足夠評分的新項目。此外,隨著時間的推移,它受用戶偏好變化的影響較小。
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)等技術。
這種方法可以高效地處理大而稀疏的數據集,通常與基於記憶的协同過濾方法相比,精度更高。此外,它還可以結合正則化技術以防止過擬合,從而提高模型對未見數據的泛化能力。
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(詞頻-逆文件頻率)進行文本分析以及餘弦相似度進行匹配。這種方法有效地解決了新項目問題,因為它不依賴於之前的用戶互動。
然而,它可能會因為過度專業化而導致推薦缺乏多樣性。此外,有效的實施需要良好的特徵工程,以确保準確捕捉到項目的相關特性。
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將文字描述轉換為數值向量
- 計算用戶個人檔案與項目描述之間的餘弦相似度
- 返回與用戶個人檔案最相似的Top
k
個項目 - 對於具有明確項目特性的系統效率高
- 可以容易地擴展以包括多種特徵類型
混合推薦系統
混合推薦系統結合兩種或以上的推薦技術,以利用它們各自的優勢。通過整合多種方法,混合系統可以減輕個別方法的弱點,如冷啟動問題。常見的組合包括協同過濾和內容基於過濾。
混合系統通常比單一方法系統提供更為健壯和準確的推薦。然而,有效的實現需要謹慎調整,以平衡不同的組件並確保最佳性能。
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通過只保留頂部的
這種方法對於處理推薦系統中常見的大型稀疏矩陣效率很高。此外,SVD在準確性和計算效率之間取得了良好平衡,使其成為生成推薦的熱門選擇。
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
函數來執行截斷SVD - 僅使用前
個奇異值來重建評分矩陣 - 返回所有用戶-項目對的預測評分密集矩陣
- 對於大型稀疏評分矩陣效率高效
- 可以很容易地整合到更大的推薦系統中
張量分解
張量分解技術將傳統的矩陣分解擴展到多維數據,允許將時間和地點等情境信息融入到推薦中。它利用如CP分解的方法,將張量分解為多個組件張量的和,捕捉多個因素之間的複雜交互。這種方法與二維方法相比,需要更多的數據和計算資源,因為它處理的是更高維度的數組。
然而,它通過利用數據額外的維度,可以提供高度個性化和情境感知的推薦。數據結構的複雜性增加使得能夠更細膩地理解用戶在不同情境下的偏好,提高整體推薦的準確性。
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分解應用於輸入張量
- 重建從分解因子中得到的張量
- 將重建的張量作為推薦返回
- 能夠處理多維數據(例如,用戶-項目-上下文)
神經協同過濾
基於深度學習的推薦系統結合了協同過濾技術與神經網絡。這種方法可以學習非線性的用戶-項目互動,這是傳統矩陣分解方法可能難以處理的。深度學習推薦器通常使用嵌入層在密集的低維空間中表示用戶和項目。這使得輕鬆整合額外的特徵或附加信息,例如用戶人口統計或項目描述,以增強推薦性能。
在大型數據集上訓練時,基於深度學習的系統往往能夠在精確度上超越傳統的矩陣分解方法。然而,這種優勢是 以增加計算複雜性和對大量數據的需求為代價的。
深度學習推薦器還需要仔細調整超參數以達到最佳效果,這使得它們與更簡單的協同過濾方法相比,實現和維護起來更具挑戰性。
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年,Netflix推出了100萬美元的Netflix Prize,挑戰數據科學家創建一個能夠比CineMatch優越10%的模型。獲勝的演算法隨後被實施到Netflix的內部數據中。
隨著Netflix開始積累用戶,並於2007年轉向串流數據,觀眾接觸到了強化學習演算法和生成即時建議的分群演算法。隨著演算法的改進,越來越多的用戶開始轉向Netflix,僅僅因為推薦演算法的效果。Netflix上接近80%的觀看內容都是由推薦演算法所建議的。
該公司估計,由於推薦演算法的有效性,它每年可節省10億美元的流失用戶成本。
Netflix使用先進的機器學習技術和基於用戶觀看影片的元數據系統中的1300多個群集進行分群。這使得他們能夠為用戶提供高度優化的建議。但Netflix很快遇到了一個問題:規模。隨著每月用戶數量達到數億,總用戶數超過2億,Netflix全面投入雲端運算。
他們在2008年開始將所有數據遷移到亞馬遜網絡服務(AWS),整個轉移過程耗時數年,在2015年完成。據報導,Netflix使用AWS每年節省了10億美元。AWS內建對機器學習的支持,Netflix也充分利用了這一點。據報導,Netflix在2022年為其全球觀眾使用了超過10萬台AWS伺服器和1,000個Kinesis碎片。
自2015年以來,Netflix也開始提供自己的製作內容,超過數千部電影和各種格式的節目。Netflix的推薦演算法高度自動化,並且每天為用戶進行數千次A/B測試。如今Netflix的用戶訂閱基數超過2.8億。
雖然Netflix現在面臨激烈競爭,特別是來自擁有漫威和星際大戰品牌的迪士尼+,但公司目標是在2025年達到5億訂閱者。
去年,Netflix的收入高達310億美元。
其當前推薦系統的主要部分包括:
- 強化學習:根據用戶行為,Netflix實時更改屏幕上的內容。因此,該系統處於不斷變化的狀態,並根據用戶的互動而變化。
- 深度學習網絡:由於數據量大(超過1萬5000個節目和近3億用戶),標準機器學習技術不易應用。深度學習被廣泛使用,並採用NVIDIA的技術。 (本文末端有一個使用NVIDIA最新Merlin深度學習技術的程序)。
- 矩陣因式分解:通过对非常稀疏和非常大的矩陣有效地执行奇異值分解(SVD),Netflix估計每位用戶對某些類型和節目的重要性和吸引力。
- 集成學習:以上列出的算法巧妙地結合,讓推薦瞬時調整,從而讓每位用戶看到的推薦都不一樣。這種個人化是Netflix盈收丰厚並居於OTT平台之首的关键。
而这些模型和優化每天都要為数十萬用戶運行數百萬次。
現代深度學習技術
在這樣的面積下,單一電腦無法獨立運行這些機器學習模型。这就是為什麼AWS要以分散方式在數千台電腦上運行機器學習算法。
NVIDIA 最近推出了多款產品,以實現大规模推薦系統。NVIDIA 的 GPU 集群在 ML 算法執行中扮演了重要角色。NVIDIA 最近推出了 Merlin,一款高性能的推薦算法,優化於 thousands of machines 上運行,並提供卓越的結果。這可能只是時間問題,因為數據集大小遠遠超過單一電腦能處理的範圍。
現代推薦系統廣泛使用深度學習。作為 DL 的一部分,GPU/TPU 計算系統被廣泛用於加速計算。
NVIDIA 近期的 Merlin 產品包括:
NVIDIA 推薦系統
(出自 NVIDIA 发布 Merlin:用于深度推荐系统的应用程序框架)
作為開源項目提供:
NVTabular
NVTabular 是一個特徵工程與預處理函式庫,旨在快速且輕鬆地操作兆位元級數據集。它特別適用於推薦系統,這些系統需要一種可擴展的方式來處理額外資訊,例如用戶和項目元數據及上下文資訊。它提供了一個高階抽象來簡化代碼,並使用 RAPIDS cuDF 函式庫在 GPU 上加速運算。使用 NVTabular,只需 10-20 行高階 API 代碼,就能設置數據工程管道,與優化的基於 CPU 的方法相比,實現高達 10 倍的速度提升,並不受數據集大小的限制,無論 GPU/CPU 的記憶體容量如何。
HugeCTR
HugeCTR 是一個高效能的 GPU 框架,專為推薦模型訓練設計,它同時追求高性能與易用性。它支援簡單的深度模型以及如 W&D、Deep Cross Network 和 DeepFM 等先進的混合模型。我們也在努力使 HugeCTR 支援 DLRM。模型的細節和超參數可以很容易地以 JSON 格式指定,從而能夠從一系列常見模型中快速選擇。
TensorRT 與 Triton Server 用於推論
NVIDIA TensorRT 是一個高性能 deep learning (DL) 推理的 SDK。它包含一個 DL 推理優化器和運行時,為推理應用提供低延遲和高吞吐量。TensorRT 能夠接受來自所有 DL 框楫己經訓練的神經網絡,使用一個常見介面,即開源的神經網絡交換格式 (ONNX)。
NVIDIA Triton Inference Server 提供了為 NVIDIA GPU 優化的雲推理解決方案。該服務器通過 HTTP 或 gRPC 端點提供推理服務,允許遠程客戶端请求服務器管理的任何模型的推理。Triton Server 可以使用包括 TensorFlow、PyTorch (TorchScript)、ONNX 運行時和 TensorRT 運行時在多個後端上提供 DL 推薦模型的服務。
代碼示例
以下代碼示例顯示了實際需要的預處理工作流程,以將 1 TB Criteo Ads 數據集進行變換,僅使用不到一打的代碼行即已完成。簡言之,數值和分類列被指定。接下來,我們定義了 NVTabular 工作流程並提供一副訓練和驗證文件。然後,將預處理操作添加到工作流程中,並將數據持久化到磁盤上。相比之下,像是 Facebook DLRM 實現中基於 NumPy 的 data util 這類自定義處理代碼,可能會為同樣的管道就需要 500-1000 行代碼。
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的雲端運行他們整個機器學習算法。
推薦系統無處不在,從Google到微軟到亞馬遜到Flipkart。它是現代企業的關鍵部分,沒有線上公司不使用它,形式多種多樣。
現在有許多公司提供線上定制推薦系統。
其中一些領先的公司包括:
- Netflix: 以其先進的推薦引擎聞名,該引擎分析用戶觀看習慣以推薦電影和電視節目
- Amazon: 利用強大的推薦引擎,根據用戶購買歷史和瀏覽行為建議產品
- Spotify:運用推薦系統,根據用戶的聽歌記錄為用戶策劃音樂播放清單和歌曲建議
- YouTube:使用推薦引擎,根據用戶的觀看習慣和偏好提供建議影片
- LinkedIn:根據用戶個人資料和職業經歷推薦工作、人脈和內容
- Zillow:根據用戶偏好和搜索記錄推薦房地產物件
- Airbnb:根據用戶旅行記錄和偏好推薦住宿
- Uber:根據用戶偏好和過往乘車記錄推薦搭車選項
- IBM Corporation:推薦引擎市場的領導者,提供多種人工智能驅動的解決方案
- Google LLC (Alphabet Inc.):在其平台上提供推薦系統,利用廣泛的數據分析
希望有朝一日,您的公司能成為這份精英名單中的一員。並祝您的企業一切順利。
無論您處於哪個行業,如果您有線上業務,您都需要以某種方式使用推薦系統。持續探索這個領域,如果您擁有出色的專業知識,請放心,您將會極其受到青睞。
永遠不要停止學習。保持熱情。始終相信您有無限的成長潛力。您的未來掌握在自己手中。讓它變得非凡!
參考資料
Source:
https://dzone.com/articles/a-deep-dive-into-recommendation-algorithms-with-ne