[CTR預估] Recommending What Video to Watch Next

1.介紹

本文講解的是youtube發表在Recsys 2019的文章
“Recommending What Video to Watch Next: A Multitask Ranking System”
文章是關於推薦系排序模塊的設計,算是wide&deep model的進階,並針對Multitask Learning和Selection Bias做了模型層面的優化。

2.模型結構

文章拋出了幾個推薦系統ranking模型比較經典的問題。
1.多目標優化 推薦系統往往存在很多優化目標,甚至是互相沖突的優化目標。
2.選擇偏差或者說feedback Loop 最常見的就是位置偏差,位置靠前的item會有更高的點擊率,模型學習出了這種模式,形成一個反饋循環閉環。導致模型學習偏差或者說馬太效應越來越嚴重。

所以文章模型的構造基於這兩塊,對wide&deep model進行了改造。
1.使用一個shallow tower網絡單獨擬合選擇偏差。如位置偏差最爲經典常見。
2.使用MMOE網絡結構來解決多目標優化。如視頻推薦中的點擊,觀看,分享等。作者將目標分爲兩大類,1.參與度:點擊,觀看。2。滿意度:喜歡,不喜歡等。

整體的網絡結構如下:
在這裏插入圖片描述
具體可以分爲以下兩塊個塊:
1.shallow tower網絡 直接學習偏差的輸出,並講輸出logit和主模型相加,來緩解主模型因選擇偏差帶來的影響。
2.main tower網絡 主模型和原來的MMOE不一樣的是,這裏模型考慮到底層特徵維度過大,所以並不是底層直接上來就是到MMOE,而是還是底層共享原始特徵Embedding。然後在embedding層上加入MMOE模塊。再分別學習不同的目標。
3.網絡輸出 shallow tower的輸出作爲位置偏差信息會和engagement目標的輸出相加。因爲位置偏差帶來的影響主要還是一些點擊,觀看之類的。具體後續的一些滿意度,如分享,位置偏差的影響可能並不是很大。
4.服務 具體服務的時候,可以將位置偏差設置爲空,其他的如設備號之類的正常傳入即可。

3.代碼實現

具體的文章講解這裏不再多說了,網上很多詳細的講解。看完文章感覺還不錯,所以復現了一下,看這裏:
youtube_net 代碼實現地址

⚠️:代碼只是實現了文章的大概思想,具體的細節並沒有care,如爲了圖個簡單,代碼中的一些bias項,dropout都還沒見加,後續會慢慢加上去。我自己的測試代碼使用的兩個目標是ctr和cvr,並且這兩者都屬於engagement目標,所以都加上了shallow logit。

核心代碼如下,代碼中加了註釋:

def _model_fn(self):
        output_layers = []
        '''shallow_tower_logit是學習的選擇偏差'''
        self.shallow_tower_layer = self.get_input_layer(self.Shallow_Features)
        self.shallow_tower_logit = tf.layers.dense(self.shallow_tower_layer, units=1)

        '''embedding_layer是原始特徵的embedding輸出,直接輸入mmoe網絡結果'''
        mmoe_layers = self.mmoe_net(self.embedding_layer,units=8,experts_num=2)
        for index ,task_layer in enumerate(mmoe_layers):
            '''針對每一個任務再過一層MLP,並將shallow塔學習出來的偏差logit加入''' 
            tower_layer = tf.layers.dense(task_layer,units=5,activation='relu',kernel_initializer=tf.initializers.variance_scaling())
            output_layer = tf.layers.dense(tower_layer,units=1,name='logits_{}'.format(str(index)),kernel_initializer=tf.initializers.variance_scaling())
            logit = tf.sigmoid(tf.add(output_layer,self.shallow_tower_logit))
            output_layers.append(logit)

        return output_layers

感興趣的可以上github看看詳細的代碼。

4.參考

[1] Recommending what video to watch next: a multitask ranking system.

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章