推薦系統在影音串流服務中扮演關鍵角色。例如:
- YouTube 推薦使用者可能喜歡的影片
- Netflix 推薦使用者可能想看的電影
- Spotify 推薦使用者可能喜歡的音樂
本章設計一個類似 YouTube 的影片推薦系統,根據使用者的個人資料與過往互動紀錄,在首頁推薦影片。

推薦系統的設計通常相當複雜,需要大量工程投入才能開發出高效且可擴展的系統。不過別擔心——在 45 分鐘的面試中,沒有人期望你打造一個完美的系統。面試官主要觀察的是你的思考過程、溝通能力、ML 系統設計能力,以及討論取捨的能力。
釐清需求#
以下是候選人與面試官之間的典型對話。
候選人: 可以假設建構影片推薦系統的商業目標是提高使用者參與度嗎?
面試官: 沒錯。
候選人: 系統是推薦與使用者目前正在觀看的影片相似的影片?還是在首頁顯示個人化的影片列表?
面試官: 這是首頁影片推薦系統,當使用者載入首頁時推薦個人化影片。
候選人: 由於 YouTube 是全球性服務,可以假設使用者遍佈全球、影片有不同語言嗎?
面試官: 這是合理的假設。
候選人: 可以假設我們能根據使用者與影片內容的互動來建構資料集嗎?
面試官: 可以,聽起來不錯。
候選人: 使用者可以建立播放清單來將影片分組嗎?播放清單對 ML 模型的學習階段很有幫助。
面試官: 為了簡化,假設播放清單功能不存在。
候選人: 平台上有多少影片?
面試官: 大約有 100 億部影片。
候選人: 系統推薦影片的速度應該多快?可以假設推薦不超過 200 毫秒嗎?
面試官: 聽起來不錯。
問題摘要如下:
- 設計一個首頁影片推薦系統
- 商業目標是提高使用者參與度
- 每次使用者載入首頁時,系統推薦最具吸引力的影片
- 使用者遍佈全球,影片可能有不同語言
- 平台上約有 100 億部影片
- 推薦需快速回應
將問題框架化為 ML 任務#
定義 ML 目標#
系統的商業目標是提高使用者參與度。以下是幾種將商業目標轉化為 ML 目標的方式及其取捨:
- 最大化使用者點擊數: 系統可設計為最大化點擊數,但主要缺點是模型可能推薦「標題黨」(clickbait)——標題和縮圖看起來很吸引人,但內容可能無聊、無關甚至具誤導性。標題黨影片會降低使用者滿意度與長期參與度。
- 最大化完整觀看影片數: 推薦使用者可能完整觀看的影片,但模型可能傾向推薦較短的影片。
- 最大化總觀看時間: 推薦使用者花更多時間觀看的影片。
- 最大化相關影片數: 推薦與使用者相關的影片。工程師或產品經理可根據規則定義「相關性」,例如:使用者明確按下「讚」按鈕,或觀看了影片至少一半。定義好相關性後,即可建構資料集並訓練模型來預測使用者與影片之間的相關性分數。
我們選擇最大化相關影片數作為 ML 目標,因為我們對使用的訊號有更多控制權,且不具備前述選項的缺點。
指定系統的輸入與輸出#
如圖 6.2 所示,影片推薦系統以使用者為輸入,輸出一份依相關性分數排序的影片列表。

選擇合適的 ML 類別#
本節探討三種常見的個人化推薦系統:
- Content-based filtering(基於內容的過濾)
- Collaborative filtering(協同過濾)
- Hybrid filtering(混合過濾)

Content-based filtering#
此技術利用影片特徵來推薦與使用者過去認為相關的影片相似的新影片。例如,若使用者之前與許多滑雪影片互動,系統會推薦更多滑雪影片。

圖示說明:
- 使用者 A 過去與影片 $\mathrm{X}$ 和 $\mathrm{Y}$ 互動
- 影片 $\mathrm{Z}$ 與影片 $\mathrm{X}$ 和 $\mathrm{Y}$ 相似
- 系統向使用者 $\mathrm{A}$ 推薦影片 $\mathrm{Z}$
優點:
- 能推薦新影片: 不需等待使用者互動資料即可為新影片建立特徵檔案
- 能捕捉使用者的獨特興趣: 推薦基於使用者過去的互動行為
缺點:
- 難以發現使用者的新興趣
- 需要領域知識,通常須手動工程化影片特徵
Collaborative filtering (CF)#
CF 利用使用者之間的相似性(user-based CF)或影片之間的相似性(item-based CF)來推薦新影片。其核心概念是:相似的使用者對相似的影片感興趣。

圖示說明(目標是向使用者 A 推薦新影片):
- 根據過去互動找到與使用者 $\mathrm{A}$ 相似的使用者 $\mathrm{B}$
- 找到使用者 B 互動過但使用者 A 尚未看過的影片 $\mathrm{Z}$
- 向使用者 $\mathrm{A}$ 推薦影片 $\mathrm{Z}$
Content-based filtering 與 CF 的主要差異在於:CF 不使用影片特徵,完全依賴使用者的歷史互動來進行推薦。
優點:
- 不需領域知識: 不依賴影片特徵
- 容易發現使用者的新興趣領域: 可推薦其他相似使用者曾互動的新主題影片
- 高效率: CF 模型通常比 content-based filtering 更快、計算量更少
缺點:
- 冷啟動問題(Cold-start problem): 當新影片或新使用者的資料有限時,系統無法做出準確推薦。CF 因缺乏歷史互動資料而嚴重受此影響。
- 難以處理小眾興趣: CF 依賴相似使用者,但可能難以找到有小眾興趣的相似使用者。
| Content-based filtering | Collaborative filtering | |
|---|---|---|
| 處理新影片 | ✓ | ✘ |
| 發現新興趣領域 | ✘ | ✓ |
| 不需領域知識 | ✘ | ✓ |
| 效率 | ✘ | ✓ |
如表 6.1 所示,兩種方法具有互補性。
Hybrid filtering#
Hybrid filtering 結合 CF 與 content-based filtering。如圖 6.6 所示,可以依序或並行結合兩種推薦器。實務上,企業通常使用依序式混合過濾。

此方法能產生更好的推薦,因為使用了兩種資料來源:
- 使用者歷史互動:透過 CF 幫助使用者發現新興趣領域
- 影片特徵:推薦與使用者過去互動過的影片相關的內容
該選擇哪種方法?#
許多企業採用 hybrid filtering 以獲得更好的推薦效果。例如,Google 發表的論文 描述 YouTube 如何以 CF 模型作為第一階段(候選生成),再以 content-based 模型作為第二階段來推薦影片。基於 hybrid filtering 的優勢,我們選擇此方案。
資料準備#
資料工程#
我們有以下可用資料:
- 影片資料
- 使用者資料
- 使用者-影片互動資料
影片資料#
影片資料包含原始影片檔案及其相關的 metadata,例如影片 ID、影片長度、影片標題等。部分屬性由上傳者明確提供,其他則由系統隱式判定(如影片長度)。
| Video ID | Length | Manual tags | Manual title | Likes | Views | Language |
|---|---|---|---|---|---|---|
| 1 | 28 | Dog, Family | Our lovely dog playing! | 138 | 5300 | English |
| 2 | 300 | Car, Oil | How to change your car oil? | 5 | 250 | Spanish |
| 3 | 3600 | Ouli, Vlog | Honeymoon to Bali | 2200 | 255K | Arabic |
使用者資料#
以下為使用者資料的簡單 schema:
| ID | Username | Age | Gender | City | Country | Language | Time zone |
|---|
使用者-影片互動資料#
使用者-影片互動資料包含使用者對影片的各種互動,包括按讚、點擊、曝光與過往搜尋。互動會連同上下文資訊(如位置與時間戳記)一起記錄。
| User ID | Video ID | Interaction type | Interaction value | Location (lat, long) | Timestamp |
|---|---|---|---|---|---|
| 4 | 18 | Like | - | 38.8951 -77.0364 | 1658451361 |
| 2 | 18 | Impression | 8 seconds | 38.8951 -77.0364 | 1658451841 |
| 2 | 6 | Watch | 46 minutes | 41.9241 -89.0389 | 1658822820 |
| 6 | 9 | Click | - | 22.7531 47.9642 | 1658832118 |
| 9 | - | Search | Basics of clustering | 22.7531 47.9642 | 1659259402 |
| 8 | 6 | Comment | Amazing video. Thanks | 37.5189 122.6405 | 1659244197 |
特徵工程#
ML 系統需要預測與使用者相關的影片。以下工程化有助於系統做出準確預測的特徵。
影片特徵#
重要的影片特徵包括:
- Video ID: 類別型資料,使用 embedding layer 將其映射為數值向量,embedding 在模型訓練過程中學習。
- Duration(時長): 定義影片從頭到尾的大致長度。此資訊很重要,因為有些使用者偏好短影片,有些偏好長影片。
- Language(語言): 影片使用的語言是重要特徵,因為使用者自然偏好特定語言。語言為類別變數,使用 embedding layer 表示。
- Titles and tags(標題與標籤): 用於描述影片,由上傳者手動提供或由獨立 ML 模型隱式預測。
- 標籤: 使用輕量級預訓練模型(如 CBOW)映射為特徵向量
- 標題: 使用上下文感知的 word embedding 模型(如預訓練 BERT)映射為特徵向量

使用者特徵#
使用者特徵分為以下類別:
- 使用者人口統計資料
- 上下文資訊
- 使用者歷史互動
使用者人口統計資料

上下文資訊
幾個重要的上下文資訊特徵:
- 一天中的時段: 使用者在不同時段可能觀看不同影片。例如,軟體工程師可能在晚間觀看更多教育類影片。
- 裝置: 在行動裝置上,使用者可能偏好較短的影片。
- 星期幾: 使用者在不同日子可能有不同的影片偏好。

使用者歷史互動
使用者歷史互動在了解使用者興趣方面扮演重要角色。相關特徵包括:
- 搜尋歷史
- 重要性: 過去的搜尋紀錄表明使用者曾尋找什麼,過去的行為通常是未來行為的指標
- 準備方式: 使用預訓練 word embedding 模型(如 BERT)將每個搜尋查詢映射為 embedding 向量。由於使用者的搜尋歷史是可變長度的文字查詢列表,透過平均查詢 embedding 來產生固定大小的特徵向量
- 按讚影片
- 重要性: 使用者過去按讚的影片有助於判斷其感興趣的內容類型
- 準備方式: 使用 embedding layer 將影片 ID 映射為 embedding 向量,同樣透過平均 embedding 取得固定大小的向量
- 觀看影片與曝光
- 特徵工程流程與按讚影片非常相似,不再重複說明

模型開發#
本節探討兩種常用於 CF 或 content-based 推薦器的 embedding 模型:
- Matrix factorization(矩陣分解)
- Two-tower neural network(雙塔神經網路)
Matrix factorization#
要理解 matrix factorization 模型,首先需了解 feedback matrix。
Feedback matrix#
又稱 utility matrix,是一個表示使用者對影片意見的矩陣。圖 6.11 為二元使用者-影片 feedback matrix,每一列代表一位使用者,每一欄代表一部影片。矩陣中的數值 1 表示「已觀察」或「正面」。

如何判斷使用者是否認為推薦影片相關?有三種選擇:
- Explicit feedback(顯式回饋): 基於明確表達使用者意見的互動(如按讚、分享)建構矩陣。能準確反映使用者意見,但主要缺點是矩陣稀疏——只有少數使用者提供顯式回饋,稀疏性使 ML 模型難以訓練。
- Implicit feedback(隱式回饋): 使用隱含使用者意見的互動(如點擊、觀看時間)。可獲得更多資料點,訓練效果更好。缺點是不直接反映使用者意見,可能有雜訊。
- 結合顯式與隱式回饋: 使用啟發式方法結合兩者。
我們該選擇哪種方式?
模型需學習 feedback matrix 的數值,因此矩陣應與我們選擇的 ML 目標一致。我們的 ML 目標是最大化相關性,而相關性定義為顯式與隱式回饋的組合。因此,結合顯式與隱式回饋是最佳選擇。
Matrix factorization 模型#
Matrix factorization 是一種簡單的 embedding 模型。演算法將使用者-影片 feedback matrix 分解為兩個低維矩陣的乘積:一個代表使用者 embedding,另一個代表影片 embedding。模型學習將每個使用者映射為 embedding 向量、每部影片映射為 embedding 向量,使它們之間的距離代表相關性。

Matrix factorization 訓練#
訓練目標是產生使用者與影片 embedding 矩陣,使其乘積能良好近似 feedback matrix(圖 6.13)。

Matrix factorization 先隨機初始化兩個 embedding 矩陣,然後迭代優化以降低「預測分數矩陣」與「feedback matrix」之間的損失。損失函數的選擇是重要考量,以下探討幾種選項:
選項一:已觀察的 $\langle$ user, video $\rangle$ 配對之平方距離
此損失函數計算 feedback matrix 中所有已觀察(非零值)項的平方距離總和。

$A_{i j}$ 是 feedback matrix 中第 $i$ 列第 $j$ 欄的數值,$U_i$ 是使用者 $i$ 的 embedding,$V_j$ 是影片 $j$ 的 embedding,求和僅對已觀察的配對進行。
僅對已觀察配對求和會導致不良 embedding,因為損失函數不會對未觀察配對的錯誤預測進行懲罰。例如,全為 1 的 embedding 矩陣在訓練資料上的損失為零,但對未見的 $\langle$ user, video $\rangle$ 配對效果可能很差。
選項二:已觀察與未觀察的 $\langle$ user, video $\rangle$ 配對之平方距離
此函數將未觀察配對視為負面資料點,在 feedback matrix 中賦予零值。損失計算所有項的平方距離總和。

此函數解決了前述問題,但有一個主要缺點:feedback matrix 通常稀疏(大量未觀察配對),未觀察配對在訓練中主導已觀察配對,導致預測值大多接近零,泛化能力差。
選項三:已觀察與未觀察配對之加權平方距離組合
為克服前述損失函數的缺點,我們選用兩者的加權組合。

損失公式中,第一個求和計算已觀察配對的損失,第二個計算未觀察配對的損失。$W$ 是超參數,用於權衡兩個求和項,確保訓練時不會有一方主導另一方。經過適當調整 $W$ 後,此損失函數在實務中表現良好。
Matrix factorization 優化#
訓練 ML 模型需要優化演算法。兩種常用的優化演算法:
- Stochastic Gradient Descent (SGD): 用於最小化損失的優化演算法
- Weighted Alternating Least Squares (WALS): 專門用於 matrix factorization 的優化演算法,流程如下:
- 固定一個 embedding 矩陣 (U),優化另一個 (V)
- 固定另一個 embedding 矩陣 (V),優化 embedding 矩陣 (U)
- 重複上述步驟
WALS 通常收斂更快且可並行化。詳情參見。我們選用 WALS 因為它收斂更快。
Matrix factorization 推論#
預測任意使用者與候選影片之間的相關性時,使用相似度度量(如 dot product)計算其 embedding 之間的相似度。例如,圖 6.17 顯示使用者 2 與影片 5 之間的相關性分數為 $0.32$。

圖 6.18 顯示所有 $\langle$ user, video $\rangle$ 配對的預測分數。系統根據相關性分數返回推薦影片。

由於 matrix factorization 僅使用使用者-影片互動,通常用於 collaborative filtering。
Matrix factorization 的優缺點:
優點:
- 訓練速度快: 僅需學習兩個 embedding 矩陣,訓練效率高
- 服務速度快: 學習到的 embedding 是靜態的,一旦學習完成即可重複使用,查詢時不需轉換輸入
缺點:
- 僅依賴使用者-影片互動,不使用其他特徵(如使用者年齡或語言),限制了模型的預測能力
- 難以處理新使用者: 新使用者的互動不足,模型無法產生有意義的 embedding
Two-tower neural network#
Two-tower neural network 由兩個 encoder tower 組成:
- 使用者塔(user tower): 接收使用者特徵作為輸入,映射為 embedding 向量
- 影片塔(video tower): 接收影片特徵作為輸入,映射為 embedding 向量
兩者在共享 embedding 空間中的距離代表其相關性。

與 matrix factorization 相比,two-tower 架構靈活到足以納入各種特徵,以更好地捕捉使用者的特定興趣。
建構資料集#
從不同的 $\langle$ user, video $\rangle$ 配對中提取特徵,並根據使用者回饋標記為正面或負面。例如:使用者明確按讚或觀看了影片至少一半,則標記為「正面」。
負面資料點的建構方式:選擇不相關的隨機影片,或使用者明確按下「不喜歡」的影片。

使用者通常只對少數影片感興趣,因此建構的訓練資料會是不平衡資料集(負面配對遠多於正面配對)。在不平衡資料集上訓練模型會有問題,可使用第一章介紹的技術來解決。
選擇損失函數#
Two-tower neural network 訓練目標為預測二元標籤,因此可歸類為分類任務。使用典型的分類損失函數(如 cross-entropy)來優化 encoder。

Two-tower neural network 推論#
推論時,系統使用 embedding 為給定使用者找出最相關的影片。這是經典的最近鄰問題,使用 approximate nearest neighbor 方法高效找出前 $\mathrm{k}$ 個最相似的影片 embedding。
Two-tower neural network 可用於 content-based filtering 和 collaborative filtering。用於 collaborative filtering 時(如圖 6.22),影片 encoder 僅為一個將影片 ID 轉換為 embedding 向量的 embedding layer,不依賴其他影片特徵。

優點:
- 利用使用者特徵: 接受年齡、性別等使用者特徵作為輸入,有助於做出更好的推薦
- 處理新使用者: 依賴使用者特徵,能輕鬆處理新使用者
缺點:
- 服務速度較慢: 需在查詢時計算使用者 embedding。若用於 content-based filtering,還需將影片特徵轉換為 embedding,進一步增加推論時間
- 訓練成本較高: 學習參數多於 matrix factorization,計算量更大
Matrix factorization vs. Two-tower neural network#
| Matrix factorization | Two-tower neural network | |
|---|---|---|
| 訓練成本 | ✓ 訓練更高效 | ✘ 訓練成本更高 |
| 推論速度 | ✓ 更快,embedding 為靜態可預計算 | ✘ 需在查詢時將使用者特徵轉換為 embedding |
| 冷啟動問題 | ✘ 難以處理新使用者 | ✓ 依賴使用者特徵可處理新使用者 |
| 推薦品質 | ✘ 不使用使用者/影片特徵,品質受限 | ✓ 依賴更多特徵,推薦品質更好 |
評估#
系統效能可透過離線與線上指標進行評估。
離線指標#
以下為推薦系統常用的離線指標:
- Precision@k: 衡量前 $\mathrm{k}$ 個推薦影片中相關影片的比例。可使用多個 $\mathrm{k}$ 值(例如 $1, 5, 10$)。
- mAP: 衡量推薦影片的排序品質。由於我們系統的相關性分數為二元值,此指標非常適合。
- Diversity(多樣性): 衡量推薦影片彼此之間的差異程度。計算方式為推薦列表中影片之間的平均成對相似度(如 cosine similarity 或 dot product)。低平均成對相似度表示列表具多樣性。
若僅以 diversity 作為品質指標可能導致誤導性結果。例如,推薦影片多樣但與使用者不相關,則推薦無用。應結合其他離線指標使用,確保相關性與多樣性兼顧。
線上指標#
實務中,企業在線上評估時追蹤許多指標。以下為幾個最重要的指標:
CTR(Click-through rate,點擊率): 被點擊影片與推薦影片總數的比率。
$C T R=\frac{\text { number of clicked videos }}{\text { total number of recommended videos }}$
CTR 能有效追蹤使用者參與度,但缺點是無法捕捉或衡量標題黨影片。
完整觀看影片數: 使用者觀看到結束的推薦影片總數。藉此了解系統推薦使用者實際觀看的影片頻率。
總觀看時間: 使用者觀看推薦影片的總時間。當推薦內容令使用者感興趣時,整體觀看時間會增加。
顯式使用者回饋: 使用者明確按讚或不喜歡的影片總數。此指標能準確反映使用者對推薦影片的意見。
服務#
服務時,系統需從數十億影片中為給定使用者推薦最相關的影片。本節提出一個兼具效率與準確性的預測管線。
面對數十億影片,若選擇需要大量特徵的重型模型,服務速度會很慢;若選擇輕量模型,推薦品質可能不佳。因此,自然的決策是在多階段設計中使用多個模型:
- 候選生成(Candidate generation): 輕量模型快速縮小影片範圍
- 評分(Scoring): 較重的模型精確評分與排序

預測管線的組成:
- 候選生成
- 評分
- 重新排序
候選生成#
候選生成的目標是從數十億影片縮減至數千部。此階段優先效率而非準確性,不擔心 false positive。
為保持速度,選擇不依賴影片特徵的模型,且該模型需能處理新使用者。Two-tower neural network 適合此階段。

候選生成的流程:
- 從 user encoder 取得使用者的 embedding
- 從 approximate nearest neighbor 服務中檢索最相似的影片
- 根據 embedding 空間中的相似度排序後返回
實務中,企業可能使用多個候選生成器以提升推薦效能。使用者可能因各種原因對影片感興趣(如熱門、趨勢、與所在地點相關),因此使用多個候選生成器可涵蓋更多推薦來源。

將潛在影片從數十億縮減至數千後,即可使用評分組件進行排序。
評分#
又稱 ranking,評分組件接受使用者與候選影片作為輸入,對每部影片評分,輸出排序後的影片列表。
此階段優先準確性而非效率。選擇 content-based filtering 並挑選依賴影片特徵的模型。Two-tower neural network 是常見選擇。由於評分階段僅需排序少量影片,可使用更多參數的較重模型。

重新排序#
此組件透過加入額外的準則或限制來重新排序影片。例如,可使用獨立 ML 模型判定影片是否為標題黨。建構重新排序組件時需考量:
- 區域限制影片
- 影片新鮮度
- 散播錯誤資訊的影片
- 重複或近似重複影片
- 公平性與偏見
影片推薦系統的挑戰#
在結束本章之前,讓我們看看設計如何應對影片推薦系統的典型挑戰。
服務速度#
快速推薦影片至關重要,但面對數十億影片,兼顧效率與準確性極具挑戰。我們採用兩階段設計來解決:第一階段使用輕量模型快速將候選影片從數十億縮減至數千。YouTube 和 Instagram 也採用類似的多階段設計。
精確度#
為確保精確度,我們採用評分組件,使用依賴更多特徵(包括影片特徵)的強大模型來排序影片。使用更強大的模型不影響服務速度,因為候選生成階段後僅剩少量影片。
多樣性#
多數使用者偏好在推薦中看到多樣化的影片。為此,我們採用多個候選生成器,如候選生成章節所述。
冷啟動問題#
系統如何處理冷啟動問題?
- 新使用者: 沒有任何互動資料。此時使用 two-tower neural network 基於年齡、性別、語言、位置等特徵進行預測。即使對新使用者,推薦也具有一定程度的個人化。隨著使用者與更多影片互動,系統能根據新互動做出更好的預測。
- 新影片: 新影片加入系統時,metadata 和內容可用但無互動資料。處理方式之一是使用啟發式方法:向隨機使用者展示影片並收集互動資料,收集足夠互動後,使用新互動微調 two-tower neural network。
訓練可擴展性#
在大型資料集上以經濟有效的方式訓練模型具有挑戰性。推薦系統中持續有新互動加入,模型需快速適應以做出準確推薦。我們的模型基於神經網路,設計上易於微調(fine-tune)。
其他討論主題#
若面試尚有剩餘時間,以下為額外的討論主題:
- 推薦系統中的 exploration-exploitation trade-off
- 推薦系統中可能存在的不同類型偏見
- 建構推薦系統時的倫理考量
- 考慮季節性對使用者行為的影響
- 針對多個目標而非單一目標來優化系統
- 如何利用負面回饋(如不喜歡)
- 利用使用者搜尋歷史或觀看歷史中的影片序列