[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。满意度:喜欢,不喜欢等。

整体的网络结构如下:
[CTR预估] Recommending What Video to Watch Next_第1张图片
具体可以分为以下两块个块:
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.

你可能感兴趣的:(推荐系统,深度学习)