0
本文作者: 汪思穎 | 2018-12-26 15:14 |
雷鋒網(wǎng) AI 科技評(píng)論按,本文作者王喆,本文首發(fā)于知乎專欄王喆的機(jī)器學(xué)習(xí)筆記,雷鋒網(wǎng) AI 科技評(píng)論獲得作者授權(quán)轉(zhuǎn)載。
這篇文章主要介紹了 YouTube 深度學(xué)習(xí)系統(tǒng)論文中的十個(gè)工程問題,為了方便進(jìn)行問題定位,我們還是簡單介紹一下背景知識(shí),簡單回顧一下 Deep Neural Networks for YouTube Recommendations 中介紹的 YouTube 深度學(xué)習(xí)推薦系統(tǒng)的框架。(更詳細(xì)的信息,請(qǐng)參見重讀 Youtube 深度學(xué)習(xí)推薦系統(tǒng)論文,字字珠璣,驚為神文)
YouTube推薦系統(tǒng)架構(gòu)
簡單講,YouTube 的同學(xué)們構(gòu)建了兩級(jí)推薦結(jié)構(gòu)從百萬級(jí)別的視頻候選集中進(jìn)行視頻推薦,第一級(jí) candidate generation model 負(fù)責(zé)“初篩”,從百萬量級(jí)的視頻庫中篩選出幾百個(gè)候選視頻,第二級(jí) ranking model 負(fù)責(zé)“精排”,引入更多的 feature 對(duì)幾百個(gè)候選視頻進(jìn)行排序。
不管是 candidate generation model 還是 ranking model,在架構(gòu)上都是 DNN 的基本結(jié)構(gòu),不同的是輸入特征和優(yōu)化目標(biāo)不同。但正如我在上一篇文章中講的,如果你僅讀懂了 YouTube 的模型架構(gòu),至多獲得了 30% 的價(jià)值,剩下 70% 的價(jià)值就在于下面的十大工程問題。廢話不多說,我們進(jìn)入問題的解答。
1. 文中把推薦問題轉(zhuǎn)換成多分類問題,在預(yù)測 next watch 的場景下,每一個(gè)備選 video 都會(huì)是一個(gè)分類,因此總共的分類有數(shù)百萬之巨,這在使用 softmax 訓(xùn)練時(shí)無疑是低效的,這個(gè)問題 YouTube 是如何解決的?
這個(gè)問題原文的回答是這樣的:
We rely on a technique to sample negative classes from the background distribution ("candidate sampling") and then correct for this sampling via importance weighting.
簡單說就是進(jìn)行了負(fù)采樣(negative sampling)并用 importance weighting 的方法對(duì)采樣進(jìn)行 calibration。文中同樣介紹了一種替代方法,hierarchical softmax,但并沒有取得更好的效果。當(dāng)然關(guān)于采樣的具體技術(shù)細(xì)節(jié)以及優(yōu)劣可能再開一篇文章都講不完,感興趣的同學(xué)可以參考 TensorFlow 中的介紹(https://www.tensorflow.org/extras/candidate_sampling.pdf)以及NLP領(lǐng)域的經(jīng)典論文 http://www.aclweb.org/anthology/P15-1001
也歡迎有相關(guān)經(jīng)驗(yàn)的同學(xué)在評(píng)論中給出簡明的回答。
2. 在 candidate generation model 的 serving 過程中,YouTube 為什么不直接采用訓(xùn)練時(shí)的 model 進(jìn)行預(yù)測,而是采用了一種最近鄰搜索的方法?
這個(gè)問題的答案是一個(gè)經(jīng)典的工程和學(xué)術(shù)做 trade-off 的結(jié)果,在 model serving 過程中對(duì)幾百萬個(gè)候選集逐一跑一遍模型的時(shí)間開銷顯然太大了,因此在通過 candidate generation model 得到 user 和 video 的 embedding 之后,通過最近鄰搜索的方法的效率高很多。我們甚至不用把任何 model inference 的過程搬上服務(wù)器,只需要把 user embedding 和 video embedding 存到 redis 或者內(nèi)存中就好了。
但這里我估計(jì)又要求助場外觀眾了,在原文中并沒有介紹得到 user embedding 和 video embedding 的具體過程,只是在架構(gòu)圖中從 softmax 朝 model serving module 那畫了個(gè)箭頭(如下圖紅圈內(nèi)的部分),到底這個(gè) user vector 和 video vector 是怎么生成的?有經(jīng)驗(yàn)的同學(xué)可以在評(píng)論中介紹一下。
Candidate Generation Model, video vector是如何生成的?
3. Youtube 的用戶對(duì)新視頻有偏好,那么在模型構(gòu)建的過程中如何引入這個(gè) feature?
為了擬合用戶對(duì) fresh content 的 bias,模型引入了“Example Age”這個(gè) feature,文中其實(shí)并沒有精確的定義什么是 example age。按照文章的說法猜測的話,會(huì)直接把 sample log 距離當(dāng)前的時(shí)間作為 example age。比如 24 小時(shí)前的日志,這個(gè) example age 就是 24。在做模型 serving 的時(shí)候,不管使用哪個(gè) video,會(huì)直接把這個(gè) feature 設(shè)成 0。大家可以仔細(xì)想一下這個(gè)做法的細(xì)節(jié)和動(dòng)機(jī),非常有意思。
當(dāng)然我最初的理解是訓(xùn)練中會(huì)把 Days since Upload 作為 example age,比如雖然是 24 小時(shí)前的 log,但是這個(gè) video 已經(jīng)上傳了 90 小時(shí)了,那這個(gè) feature value 就是 90。那么在做 inference 的時(shí)候,這個(gè) feature 就不會(huì)是 0,而是當(dāng)前時(shí)間每個(gè) video 的上傳時(shí)間了。
我不能 100% 確定文章中描述的是哪種做法,大概率是第一種。還請(qǐng)大家踴躍討論。
文章也驗(yàn)證了,example age 這個(gè) feature 能夠很好的把視頻的 freshness 的程度對(duì) popularity 的影響引入模型中。
從上圖中我們也可以看到,在引入“Example Age”這個(gè) feature 后,模型的預(yù)測效力更接近經(jīng)驗(yàn)分布;而不引入 Example Age 的藍(lán)線,模型在所有時(shí)間節(jié)點(diǎn)上的預(yù)測趨近于平均,這顯然是不符合客觀實(shí)際的。
4. 在對(duì)訓(xùn)練集的預(yù)處理過程中,YouTube 沒有采用原始的用戶日志,而是對(duì)每個(gè)用戶提取等數(shù)量的訓(xùn)練樣本,這是為什么?
原文的解答是這樣的:
Another key insight that improved live metrics was to generate a xed number of training examples per user, e ectively weighting our users equally in the loss function. This prevented a small cohort of highly active users from dominating the loss.
理由很簡單,這是為了減少高度活躍用戶對(duì)于 loss 的過度影響。
5. YouTube 為什么不采取類似 RNN 的 Sequence model,而是完全摒棄了用戶觀看歷史的時(shí)序特征,把用戶最近的瀏覽歷史等同看待,這不會(huì)損失有效信息嗎?
這個(gè)原因應(yīng)該是 YouTube 工程師的“經(jīng)驗(yàn)之談”,如果過多考慮時(shí)序的影響,用戶的推薦結(jié)果將過多受最近觀看或搜索的一個(gè)視頻的影響。YouTube 給出一個(gè)例子,如果用戶剛搜索過“tayer swift”,你就把用戶主頁的推薦結(jié)果大部分變成 tayer swift 有關(guān)的視頻,這其實(shí)是非常差的體驗(yàn)。為了綜合考慮之前多次搜索和觀看的信息,YouTube 丟掉了時(shí)序信息,將用戶近期的歷史紀(jì)錄等同看待。
但 RNN 到底適不適合 next watch 這一場景,其實(shí)還有待商榷,@嚴(yán)林 大神在上篇文章的評(píng)論中已經(jīng)提到,YouTube 已經(jīng)上線了以 RNN 為基礎(chǔ)的推薦模型, 參考論文如下:https://static.googleusercontent.com/media/research.google.com/en//pubs/archive/46488.pdf
看來時(shí)隔兩年,YouTube 對(duì)于時(shí)序信息以及 RNN 模型有了更多的掌握和利用。
6. 在處理測試集的時(shí)候,YouTube 為什么不采用經(jīng)典的隨機(jī)留一法(random holdout),而是一定要把用戶最近的一次觀看行為作為測試集?
這個(gè)問題比較好回答,只留最后一次觀看行為做測試集主要是為了避免引入 future information,產(chǎn)生與事實(shí)不符的數(shù)據(jù)穿越。
7. 在確定優(yōu)化目標(biāo)的時(shí)候,YouTube 為什么不采用經(jīng)典的 CTR,或者播放率(Play Rate),而是采用了每次曝光預(yù)期播放時(shí)間(expected watch time per impression)作為優(yōu)化目標(biāo)?
這個(gè)問題從模型角度出發(fā),是因?yàn)?watch time 更能反映用戶的真實(shí)興趣,從商業(yè)模型角度出發(fā),因?yàn)?watch time 越長,YouTube 獲得的廣告收益越多。而且增加用戶的 watch time 也更符合一個(gè)視頻網(wǎng)站的長期利益和用戶粘性。
這個(gè)問題看似很小,實(shí)則非常重要,Objective 的設(shè)定應(yīng)該是一個(gè)算法模型的根本性問題,而且是算法模型部門跟其他部門接口性的工作,從這個(gè)角度說,YouTube 的推薦模型符合其根本的商業(yè)模型,這是非常好的經(jīng)驗(yàn)。
我之前在領(lǐng)導(dǎo)一個(gè)算法小組的時(shí)候,要花大量時(shí)間與 Business 部門溝通 Objective 的設(shè)定問題,這是路線方針的問題,方向錯(cuò)了是要讓組員們很多努力打水漂的,一定要慎之又慎。
8. 在進(jìn)行 video embedding 的時(shí)候,為什么要直接把大量長尾的 video 直接用 0 向量代替?
這又是一次工程和算法的 trade-off,把大量長尾的 video 截?cái)嗟?,主要還是為了節(jié)省 online serving 中寶貴的內(nèi)存資源。當(dāng)然從模型角度講,低頻 video 的 embedding 的準(zhǔn)確性不佳是另一個(gè)“截?cái)嗟粢膊荒敲纯上А钡睦碛伞?/p>
當(dāng)然,之前很多同學(xué)在評(píng)論中也提到簡單用 0 向量代替并不是一個(gè)非常好的選擇,那么有什么其他方法,大家可以思考一下。
9. 針對(duì)某些特征,比如 #previous impressions,為什么要進(jìn)行開方和平方處理后,當(dāng)作三個(gè)特征輸入模型?
這是很簡單有效的工程經(jīng)驗(yàn),引入了特征的非線性。從 YouTube 這篇文章的效果反饋來看,提升了其模型的離線準(zhǔn)確度。
10. 為什么 ranking model 不采用經(jīng)典的 logistic regression 當(dāng)作輸出層,而是采用了 weighted logistic regression?
因?yàn)樵诘?7 問中,我們已經(jīng)知道模型采用了 expected watch time per impression 作為優(yōu)化目標(biāo),所以如果簡單使用 LR 就無法引入正樣本的 watch time 信息。因此采用 weighted LR,將 watch time 作為正樣本的 weight,在線上 serving 中使用 e(Wx+b) 做預(yù)測可以直接得到 expected watch time 的近似,完美。
十個(gè)問題全部答完,希望對(duì)大家有幫助。其實(shí)在上一篇文章拋出這十個(gè)問題的時(shí)候,已經(jīng)有諸位大神做出了很好的回答,感謝
@做最閑的咸魚
@嚴(yán)林
@吳海波
最后增加一個(gè)思考環(huán)節(jié),大家可以討論一下下面的問題:
本論文中,用于 candidate generation 網(wǎng)絡(luò) serving 部分的 user embedding vector 和 video embedding vector 是怎么生成的?
Example age 這個(gè) feature 的定義到底是什么?
除了用 0 向量 embedding 替代長尾內(nèi)容,有沒有其他好的方法?
雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。