上一篇,我們談到實驗課排程時,先把注意力放在一件很重要的事情上:
先找到一個符合所有條件的可行解
例如實驗課表必須滿足:
只要其中一條限制條件被違反,這份實驗課表就不能使用。
但很多現實問題不只是在問:
有沒有可行答案?
而是:
這麼多可行答案裡,哪一個比較好?
問題到了這裡,你發現 慣老闆的思維漏洞 又跑出來了:
「最好」到底是什麼?
推薦系統就是一個很典型的例子。
打開 Netflix,首頁會出現一排一排電影與影集。
打開 YouTube,首頁會推薦你可能想看的影片。
進入購物網站,也可能看到你可能也喜歡的推薦專區。
直覺上,推薦系統好像只需要解一個問題:
找出使用者最可能喜歡的東西
假設系統替每部影片計算一個分數:
Video A → 0.95
Video B → 0.91
Video C → 0.87
Video D → 0.72
那是不是只要按照分數排序 A > B > C > D 就完成了?
如果我們唯一的目標真的是:
預測你最可能喜歡什麼?
那這樣也許合理。
但現實中的推薦系統通常沒這麼簡單,因為平台真正想最佳化的,往往不只一件事情。
假設你最近看了一部料理影片。
系統發現你非常喜歡義大利麵相關內容,於是首頁變成:
這些影片可能全部都有很高的相關性。
也就是:
它們都很符合你目前的興趣
可是推薦結果如果全部非常相似,使用體驗未必最好。
也許我們還希望首頁同時出現:
這時候,系統開始多了一個新的目標:
多樣性
也就是推薦內容不要全部集中在同一種類型。
推薦系統最容易理解的最佳化目標是相關性 Relevance,就是說:
這個內容有多符合目前這位使用者的興趣?
例如你最近:
看了很多 JavaScript
搜尋 React
收藏 TypeScript 影片
那麼推薦 React Server Components 可能就比推薦 判斷大盤低點買入飆股 更相關。
如果我們只考慮相關性,問題可以簡化成:
找出相關性分數最高的內容
甚至直接按照相關性排序。
但實際系統通常還需要考慮更多東西。
假設平台要推薦五部電影。
根據相關性,最高的五部全部都是科幻電影。
從單部電影來看,它們可能都很適合你。
但把五個推薦一起看時,就可能顯得非常單調。
因此推薦系統可能會考慮:
多樣性 Diversity
希望結果包含:
就是平台讓你保留一點多元化選擇的考量。
假設:
科幻電影 A
相關性 = 0.95
紀錄片 B
相關性 = 0.82
如果只看相關性:
A > B
當然應該選 A。
但如果目前推薦列表裡已經有四部科幻電影,那加入 B 可能讓整體結果更好。
因此:
單一項目的最高分,不一定會形成最好的整體組合
推薦系統還可能考慮新穎性 Novelty,意思是:
這個推薦對使用者來說有多新鮮?
假設你非常喜歡某個歌手。
推薦系統一直推這位歌手最熱門的歌曲,相關性可能非常高。
可是問題是:
你可能早就聽過了
另一首你從沒聽過、但風格相近的小眾歌曲,相關性也許稍微低一些,卻可能帶來更好的探索體驗。
因此推薦系統可能故意保留一些位置:
不是最確定你會喜歡
但值得讓你試試看的內容
這也是推薦系統裡很重要的一種 trade-off:
已知興趣 vs. 探索新內容
推薦平台通常也不只是想知道:
你喜不喜歡這一部影片?
它可能更在意:
這些都可以被視為不同形式的:
使用者投入程度 Engagement
例如兩部影片:
A:
你很喜歡
看完 5 分鐘就離開平台
B:
你也滿喜歡
看完後繼續看了三部相關影片
如果平台的最佳化目標是:延長單次使用時間。
那 B 可能比 A 更有價值。
但如果最佳化目標改成:提高使用者滿意度。
結果又可能不同。
這也是推薦系統困難的地方:
「使用者喜歡」和「使用者停留更久」並不一定完全相同
如果場景換成電商,問題還可能再多一層。
假設兩個商品:
商品 A
使用者購買機率:20%
平台利潤:10 元
商品 B
使用者購買機率:15%
平台利潤:100 元
如果只看 購買機率 會推薦 A。
但如果看 預期營收,我們可以粗略算:
A:
0.20 × 10 = 2
B:
0.15 × 100 = 15
那麼從營收的角度,B 反而更有吸引力。
這時推薦系統就不再只是:
猜你最喜歡什麼
它還可能同時考慮:
而且這些目標彼此不一定一致。
例如我們可能希望提高相關性。
但提高多樣性時,有時必須放棄一些相關性。
我們可能希望:提高新穎性。
但越新的內容,系統通常越不確定使用者會不會喜歡。
我們可能希望:提高使用者投入程度。
可是最容易讓人一直點擊的內容,不一定最符合使用者長期利益。
我們也可能希望:提高營收。
但如果推薦大量高利潤、卻不相關的商品,使用者可能很快失去信任。
所以這些最佳化目標之間常常存在:
取捨 trade-off
例如:
相關性 ↑
多樣性 ↓
或:
新穎性 ↑
預測信心 ↓
甚至:
短期投入程度 ↑
長期滿意度 ↓
這表示推薦系統真正要回答的問題,不只是:
哪個 item 分數最高?
還要考量:
我們願意用多少
A,換多少B?
前面幾篇其實已經出現過最佳化目標。
到了推薦系統,我們仍然需要一個方法描述:
到底什麼叫做比較好的結果?
這就是:
目標函數 Objective Function
假設先用非常簡化的形式表示:score = 相關性。
那麼演算法只需要讓相關性越高越好。
但如果我們同時考慮多個目標,也許會變成:
score =
相關性
+ 多樣性
+ 新穎性
+ 使用者投入程度
當然,現實不會這麼簡單。
因為這些數值的尺度可能完全不同。
因此更常見的概念會像:
score =
0.5 × 相關性
+ 0.2 × 多樣性
+ 0.1 × 新穎性
+ 0.2 × 使用者投入程度
這些係數代表:
我們認為每一個目標有多重要
這時演算法做的事情,其實只是在我們定義好的最佳化目標下,尋找分數更高的答案。
這是一個很容易被忽略的地方。
我們常常會說:
演算法推薦了這個影片
聽起來好像演算法自己做出了價值判斷。
但更精確地說:
演算法只是按照我們提供的最佳化目標,尋找比較符合這個目標的結果
如果最佳化目標是:
maximize click-through rate
系統可能變得很擅長讓人點擊。
如果最佳化目標是:
maximize watch time
系統可能變得很擅長讓人一直看下去。
如果最佳化目標改成:
maximize long-term satisfaction
推薦策略又可能完全不同。
演算法沒有突然變聰明或變笨。
真正改變的是:
我們怎麼定義問題
當一個問題同時存在多個最佳化目標時,我們可以把它理解成:
多目標最佳化 Multi-objective Optimization
也就是:
最大化相關性
最大化多樣性
最大化新穎性
最大化使用者投入程度
最大化營收
問題在於:
這些目標很可能無法同時全部最大化
例如推薦五部電影。
方案 A:
相關性:非常高
多樣性:很低
方案 B:
相關性:稍低
多樣性:很高
方案 C:
相關性:中等
多樣性:中等
新穎性:很高
我們不能單純說:
A 一定最好
也不能說:
C 一定最好
因為答案取決於:
我們更在意哪一個最佳化目標
想像一個購物推薦。
對使用者來說 相關、便宜、品質好,可能比較重要。
對商家來說 庫存、毛利、新品曝光,可能也很重要。
對平台來說 轉換率、留存率、廣告收入,又可能是另一組最佳化目標。
因此同一組商品,在不同目標函數下,最佳排序可能完全不同。
例如:
目標 A:
最大化使用者購買機率
A → B → C
但換成:
目標 B:
最大化預期營收
C → A → B
又或者:
目標 C:
提高新品曝光,同時維持基本相關性
B → C → A
資料沒有改、商品沒有改、使用者也沒有改。
改變的只是:
「什麼叫好」的定義
回頭看前面的問題就會發現,幾乎每個最佳化問題都有同樣的情況。
導航可以問:
排班可以問:
外送系統可以問:
因此,真正開始最佳化之前,第一個問題往往不是:
要用什麼演算法?
而是:
我們到底想最佳化什麼?
這裡也可以回頭和上一篇做一個重要區分。
限制條件是:
不能違反的條件
例如:
只要違反其中一項,這個答案就是不可行解。
最佳化目標則是:
在合法答案之間,我們希望越多越好的東西
例如:
所以整個問題可以整理成:
先滿足限制條件,再依最佳化目標比較答案
也就是:
可行解
↓
最佳化
↓
較佳解
上一篇我們關心的是第一步,今天則開始處理第二步。
這也是最佳化問題很重要的一個觀念。
現實世界通常不會自己附帶一個:
best = ...
是我們必須先決定:
定義完成之後,演算法才有可能開始尋找答案。
所以:
「最好」不是演算法決定的,而是我們如何定義目標
這也是為什麼同一份資料、同一組候選答案,換一個目標函數,就可能得到完全不同的結果。
假設現在我們已經非常清楚地定義:
score =
0.5 × 相關性
+ 0.2 × 多樣性
+ 0.1 × 新穎性
+ 0.2 × 使用者投入程度
而且所有限制條件也都確認好了。
看起來問題終於完整了:
找出 score 最高的推薦組合
但接下來還有一個新的麻煩。
假設只有 10 個候選影片,要選 3 個。
我們也許還能把很多組合試過一次。
可是如果候選內容變成:
100 個
1,000 個
1,000,000 個
而且我們不是選一個,而是要決定:
可能答案的數量就會快速增加。
這時問題考量開始變成:
就算目標已經定義清楚,當可能組合隨資料量快速增加時,我們真的有足夠時間把每個答案都算過一次嗎?