iT邦幫忙

2022 iThome 鐵人賽

DAY 11
1
AI & Data

那些在科技公司和 app 背後的資料科學系列 第 11

[Day 11] Spotify 怎麼知道「每週新發現」中要推薦什麼歌給你?(上)Multi-Armed Bandit

  • 分享至 

  • xImage
  •  

今天 Skylar 在出差的路上,一邊開著車,一邊聽著歌。在遙遙無期的路途中,他突然想到今天是禮拜一,Spotify 會推薦「每週新發現」的歌單,因此他滿懷期待地點開,不知道 Spotify 今天又會推薦什麼好聽的歌給他,為他平淡的路途增添一點色彩。

你們會不會好奇,Spotify 怎麼知道要推薦什麼歌呢?從歌單內容來看,其實也不是最新、最熱門的歌,而且常常意外地被打中。

在討論 Spotify 的推薦演算法之前,免不了又要來聊聊統計(身為一個資料科學家,滿口統計也是合情合理的)。
但是!請不要看到統計就害怕,我會用簡單的小故事來介紹 Spotify 推薦演算法後的統計概念。

今天要聊的主題是 Multi-Armed Bandit,讓我們開始吧!


Multi-Armed Bandit

Multi-Armed Bandit 最主要的概念是,在做決策時,每次都有兩種選擇:Exploration 和 Exploitation。

  • Exploration:忽略之前經驗,每次做新的決策,過往經歷當作沒發生。
  • Exploitation:參考之前的經驗以下決策。

以 Spotify 為例,在建立新的推薦歌單時,如何決定當前要 explore 或 exploit?要如何平衡這兩個選項,哪一個選項多做一點,會對建立推薦歌單更有幫助呢?

這個權衡問題就是 multi-armed bandit 在研究的事情,讓我們來看一個小故事以了解細節吧!


用一個小故事說明 Multi-Armed Bandit

今天 Skylar 要去一個小城鎮出差九十天,這間小鎮有三間餐廳(A 義大利麵店、B 壽司店、C 拉麵店),每間美味程度的分布都不同,要如何決定每天要吃哪間餐廳,才能夠讓 Skylar 的利益最大化呢?

每間餐廳的美味程度分佈為:A ~ N(8, 2), B ~ N(5,3), C ~ N(10, 5)。
以美味的平均分數排名:C > A > B。不過值得注意的是,因為美味程度是一個分布,不是每次去都會達到平均值,可能會有高有低。

Skylar 每天兩種選擇

  • Exploration:不管之前的經驗,每天都是新的一天,到處探索。
  • Exploitation:根據之前的經驗以下決策。

因此整體而言,Skylar 有三種行動方式:

1. 純粹 exploration

行為
不管之前吃過哪間餐廳、評價為何,每天都隨機選擇一間餐廳。
長期而言,reward 的期望值為 30 x 8 + 30 x 5 + 30 x 10 = 690。

問題
某間特別難吃的餐廳,還是花了三分之一的時間去吃他。
和 optimal (which is 90 x 10 = 900) 的差距為 900 - 690 = 210。

2. 純粹 exploitation

行為
前三天先各去一間餐廳嘗試,後面的每一天都去前三天吃到最好吃的那間餐廳用餐。

問題
不過前三天去餐廳吃飯時,出餐品質不一定會到平均值,因為還是有一個分布在。
假設 Skylar 品嘗到的品質為:A = 10, B = 4, C = 7。結果 Skylar 反而覺得 A 餐廳才是最好吃的,
Reward 的期望值為 (10+4+7) + 10 * 87 = 891。

但是只吃每間餐廳一次,不一定能夠搜集到足夠的資訊。

3. exploration + exploitation (i.e., epsilon-greedy)

行為
設定 ε = 0.1 or 0.05,代表每天有 ε 的機會,可能會想要去 explore 其他餐廳,其他時間就吃之前覺得最好吃的餐廳。

問題
雖然有 ε 去調整什麼時候要去 explore 其他餐廳,但是在那一天還是只會讓那間被嘗試的餐廳只有一個機會。
例如 Skylar 之前都覺得 A 義大利麵店有平均 8 分好吃,到需要探索的那天時,跑去吃 C 拉麵店,覺得拉麵店當天只有 7 分好吃,所以之後他還是都選擇去吃 A 拉麵店。


好,Skylar 總共有三種行動策略,但每個方案好像都有點問題,還有沒有別的方式呢?

我們先來思考一下,假設我們就是 Skylar 的話,會有什麼想法呢?
儘管在 #3 的策略中,有 ε 來權衡 explore 和 exploit。不過,在實際生活中,也有可能出現以下情境:

在剛到小鎮的一週內,Skylar 大多都去 A 餐廳和 B 餐廳,去 C 餐廳的次數寥寥無幾,因此他可能會想說「嗯⋯⋯去 C 餐廳的次數很少,也許我該再給 C 餐廳一次機會」。

在這個方法中,將造訪餐廳的次數也納入考量,如果這間餐廳去太少次,有可能沒有搜集到足夠資訊,因此也許會考慮再多去吃嘗試看看。

這就是我們以下要介紹的方法。


4. UCB1 (Upper Confidence Balance) Method

行為
每個時間點 t,根據 μᵣ + Hoffding's inequality 以挑選餐廳 r。

Hoffding's inequality = sqrt (2 × ln(t) / Nₜ(r))

  • μᵣ:餐廳 r 的平均分數。
  • Nₜ(r):第 N 次拜訪這間餐廳 r。放在分母,如果造訪的次數太少,分母很小,整體會變高
  • ln(t):就只是 t 的 nature log。

現在我們簡化題目,先只看 A 和 B 兩間餐廳。
假設 A 和 B 在 Skylar 心中的平均分數很接近,A 為 5,B 為 4.9,所以可以暫時忽略 μᵣ 這一項。

假設今天是來小鎮的第八天,在前幾天中,Skylar 去 A 餐廳吃了五次(N_A = 5),B 只有吃兩次(N_B = 2)。

由於 μ_A 和 μ_B 很接近,在忽略 μᵣ 的情況下,比較兩者的 Hoffding's inequality:

Hoffding's inequality 中,兩者的 ln(t) 都是 ln(8),而 N_B 較小,讓整體的變大,因此 Skylar 決定去 B 餐廳。


以上,總共介紹四種 Skylar 選擇餐廳的方式,究竟哪一種方法比較好呢?其實要取決於餐廳數量 N 和餐廳美味程度的變異數

這部影片中,他比較所有方法,結果顯示只有純 exploitation 或 UCB1 會得到最好的結果,純 exploration 或 ε-greedy 無論在哪個情境都不會有最好的結果。

  • 如果變異數越大,代表餐廳品質越不穩定:UCB1 表現較好,因為會平衡掉 exploration & exploitation
  • 當 n = 10,UCB1 的表現都比較好
  • 當 n = 100,反而純 exploitation 的表現較好:因為在影片中的例子只有三百天,即便我們使用 UCB1 去搜集資料,共有一百間餐廳,每間餐廳頂多再多吃兩次,不一定會有足夠的資料。不過,如果時間更長,也許 UCB1 會表現更好。

好的,以上就是 Skylar 選餐廳的各方法比較,這其實也是 Spotify 在建立推薦歌單時使用的統計方法。而 Spotify 實際執行的細節為何,他們又做了什麼改進呢?請待明天分曉。

eat


謝謝讀到最後的你,如果喜歡這系列,別忘了按下喜歡和訂閱,才不會錯過最新更新。
也歡迎到我的 medium 逛逛!


Reference:


上一篇
[Day 10] 做一個 A/B testing 要如何部署各種版本的 app?以 Uber 為例
下一篇
[Day 12] Spotify 怎麼知道要在「每週新發現」推薦什麼歌給你?(下)Bart Model
系列文
那些在科技公司和 app 背後的資料科學30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言