上圖左上角是線上召回服務(wù)的方法卸耘。模型訓(xùn)練好后,Item Embedding就是一個(gè)Embedding table择葡,將其存儲(chǔ)到redis等數(shù)據(jù)庫中肴茄。線上召回時(shí),用戶Embedding通過調(diào)用模型計(jì)算(最后一個(gè)ReLU的輸出)偏形,實(shí)時(shí)返回用戶Embedding静袖;而Item Embedding則直接在數(shù)據(jù)庫中調(diào)取(模型訓(xùn)練完后是個(gè)靜態(tài)的embedding table)俊扭。
Embedding放到redis队橙,只是存儲(chǔ)方法。線上相似度檢索并不是直接從幾百萬Embedding中計(jì)算相似度萨惑,一般都是基于ANN檢索(近似最鄰近檢索)捐康,比如使用Facebook的向量檢索工具Faiss,離線構(gòu)建索引庸蔼,然后計(jì)算每個(gè)用戶最鄰居的K個(gè)Item解总,最后再把每個(gè)用戶最鄰近的K個(gè)Item存儲(chǔ)到redis中,線上直接查找K個(gè)結(jié)果就可以姐仅。
1花枫、文中把推薦問題轉(zhuǎn)換成多分類問題刻盐,在預(yù)測(cè)next watch的場(chǎng)景下,每一個(gè)備選video都會(huì)是一個(gè)分類劳翰,因此總共的分類有數(shù)百萬之巨敦锌,這在使用softmax訓(xùn)練時(shí)無疑是低效的,這個(gè)問題YouTube是如何解決的佳簸?
簡(jiǎn)單說就是進(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
2疯特、在candidate generation model的serving過程中哗魂,YouTube為什么不直接采用訓(xùn)練時(shí)的model進(jìn)行預(yù)測(cè),而是采用了一種最近鄰搜索的方法漓雅?
這個(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ì)又要求助場(chǎng)外觀眾了崔列,在原文中并沒有介紹得到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筐骇。按照文章的說法猜測(cè)的話债鸡,會(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作為這個(gè)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ù)測(cè)效力更接近經(jīng)驗(yàn)分布盯孙;而不引入Example Age的藍(lán)線鲁森,模型在所有時(shí)間節(jié)點(diǎn)上的預(yù)測(cè)趨近于平均,這顯然是不符合客觀實(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.
理由很簡(jiǎn)單榜晦,這是為了減少高度活躍用戶對(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這一場(chǎng)景,其實(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、在處理測(cè)試集的時(shí)候它匕,YouTube為什么不采用經(jīng)典的隨機(jī)留一法(random holdout)展融,而是一定要把用戶最近的一次觀看行為作為測(cè)試集?
這個(gè)問題比較好回答超凳,只留最后一次觀看行為做測(cè)試集主要是為了避免引入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更能反應(yīng)用戶的真實(shí)興趣驰吓,從商業(yè)模型角度出發(fā)涧尿,因?yàn)閣atch time越長(zhǎng),YouTube獲得的廣告收益越多檬贰。而且增加用戶的watch time也更符合一個(gè)視頻網(wǎng)站的長(zhǎ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í)候,為什么要直接把大量長(zhǎng)尾的video直接用0向量代替卤档?
這又是一次工程和算法的trade-off蝙泼,把大量長(zhǎng)尾的video截?cái)嗟簦饕€是為了節(jié)省online serving中寶貴的內(nèi)存資源劝枣。當(dāng)然從模型角度講,低頻video的embedding的準(zhǔn)確性不佳是另一個(gè)“截?cái)嗟粢膊荒敲纯上А钡睦碛伞?/p>
當(dāng)然织鲸,之前很多同學(xué)在評(píng)論中也提到簡(jiǎn)單用0向量代替并不是一個(gè)非常好的選擇舔腾,那么有什么其他方法,大家可以思考一下搂擦。
9稳诚、針對(duì)某些特征,比如#previous impressions瀑踢,為什么要進(jìn)行開方和平方處理后扳还,當(dāng)作三個(gè)特征輸入模型?
這是很簡(jiǎn)單有效的工程經(jīng)驗(yàn)橱夭,引入了特征的非線性氨距。從YouTube這篇文章的效果反饋來看,提升了其模型的離線準(zhǔn)確度棘劣。
10俏让、為什么ranking model不采用經(jīng)典的logistic regression當(dāng)作輸出層,而是采用了weighted logistic regression茬暇?
impression video ID embedding: 當(dāng)前要計(jì)算的video的embedding
watched video IDs average embedding: 用戶觀看過的最后N個(gè)視頻embedding的average pooling
language embedding: 用戶語言的embedding和當(dāng)前視頻語言的embedding
time since last watch: 自上次觀看同channel視頻的時(shí)間
#previous impressions: 該視頻已經(jīng)被曝光給該用戶的次數(shù)
因?yàn)樵诘?問中首昔,我們已經(jīng)知道模型采用了expected watch time per impression作為優(yōu)化目標(biāo),所以如果簡(jiǎn)單使用LR就無法引入正樣本的watch time信息糙俗。因此采用weighted LR勒奇,將watch time作為正樣本的weight,在線上serving中使用e(Wx+b)做預(yù)測(cè)可以直接得到expected watch time的近似巧骚,完美赊颠。
11、Example age這個(gè)feature的定義到底是什么网缝?
是為了體現(xiàn)新穎性巨税,上線時(shí)置0
12、本論文中粉臊,用于 candidate generation網(wǎng)絡(luò)serving部分的user embedding vector和video embedding vector是怎么生成的草添?
我們知道,user embedding的shape就是[bs,emb_size]扼仲,其中bs是一個(gè)batch中user的個(gè)數(shù)(其實(shí)user embedding就是[1,emb_size])远寸。而embedding table的shape是[emb_size,N]抄淑,N就是上面說到的11,及多分類的類別總數(shù)驰后。這個(gè)embedding table就是Item Embedding的table肆资,它的每一列都是一個(gè)Item embedding。于是我們有[bs,emb_size] * [emb_size, N]灶芝,得到[bs,N],參與到交叉熵的計(jì)算中郑原。獲取embedding的方式,和word2vec中embedding table的生成是一樣的夜涕。
13犯犁、除了用0向量embedding替代長(zhǎng)尾內(nèi)容,有沒有其他好的方法女器?
這又是一次工程和算法的trade-off酸役,把大量長(zhǎng)尾的video截?cái)嗟簦饕€是為了節(jié)省online serving中寶貴的內(nèi)存資源驾胆。當(dāng)然從模型角度講涣澡,低頻video的embedding的準(zhǔn)確性不佳是另一個(gè)“截?cái)嗟粢膊荒敲纯上А钡睦碛伞?/p>
也歡迎有相關(guān)經(jīng)驗(yàn)的同學(xué)在評(píng)論中給出更好的回答,本文參考了王喆等多位大佬的文章丧诺。