读书笔记

mxnet实战Bytedance短视频推荐比赛

2019-03-30  本文已影响0人  SoldierCall

此文仅用于学习记录,主要考虑mxnet的使用者较少,自己在实践过程中也是遇到了很多的困难,可以参考的资料却比较少,一直在看mxnet 的API和官方文档,不能保证完全正确,仅作学习参考,如果有错误的地方,烦请指出。

比赛链接:头条短视频推荐比赛

参加的是track2,成绩仅仅达到baseline的水平,综合在0.75左右。

用到的工具:python+mxnet

比赛的代码之后会贴出 

比赛的思路主要是参考FM模型,DeepFM模型和xDeepFM模型。

FM因子分解机模型

DeepFM模型

因考虑到FM模型所需要的特征工程,以及转换one-hot编码所造成的稀疏大矩阵的问题,在内存计算方面是个难题,主要参考deepctr源码中xDeepFM模型的实现思路,利用神经网络中的embedding层来解决one-hot编码的问题,但是在实际操作中发现,linear的部分用raw features作为输入导致linear层的结果比较大,相比linear的数据结果,embedding部分和dnn部分的输出对结果产生的效果微乎其微,这里也需要提醒,在模型搭建好之后,简单用数据测试打印输出一下中间结果,以验证模型的每一部分是不是都是有效的。

先看下FM的公式

y(x) = w_{0} + \sum_{i=1}^nw_{i}x_{i}+\frac{1}{2} \sum_{f=1}^k((\sum_{i=1}^nv_{i,f}x_{i})^2-\sum_{i=1}^nv_{i,f}^2x_{i}^2)

对于order-1的输入x是raw features,而order-2部分的输入是embedding之后的特征。embedding处理特征的步骤是这样的:

首先,对于连续性特征,输入到dense层,dense的输出神经元个数设置为embedding_size的大小比如某个连续型特征维度是(batch_size,1)输出维度为(batch_size,embedding_size)再进行reshape成(batch_size,1,embedding_size),对于离散型特征,输入到embedding层,embedding层的离散输入个数是对应离散型特征的离散值个数,输出神经元个数为embedding_size的大小,对某个离散型特征输出维度为(batch_size,1,embedding_size)

然后对于连续性和离散型数据处理后的特征对第2个维度进行concat,形成(batch_size,field_num,embedding_size)维度的数据。将该数据当作order-2部分的数据执行第2部分的计算,同时也作为DNN部分的输入/

而对于DNN部分,首先将处理后的数据flatten成维度是(batch_size,field_num * embedding_size)的矩阵。

DNN部分的设计就是凭感觉了,Dense\BatchNorm\Activation\dropout,凭感觉加,DeepFM的论文中所给出的实验结论是,层数一般不超过3,一层的节点设置在200以内,Activation一般用“relu”比较好,dropout一般看模型是否有过拟合来设计丢弃的概率。比赛的数据集上没有什么特别好的调参体验,具体的调参设计就不说了,简单记录一下看过的经验帖,和一些优化算法的选择。

1. 测试集的loss降低,验证机的loss仍然比较大或者上升,模型过拟合,可以用adam优化算法设置weight_decay参数,或者增加dropout

2.当多次调参对结果的影响微乎其微的时候考虑一下模型的有效性,多打印一下模型的中间输出。

xDeepFM模型的CIN网络部分目前还没有经过验证,

大体的思路是对于每一个样本的每一个embedding维度的向量进行\otimes 运算,比如,x_{1}是由x_{0}\otimes 运算得到的,x_{0}的第一个样本的第一个embedding向量(field_num,1)和x_{0}的第一个样本的第一个embedding向量的转置(1,field_num)做运算(4-a),得到一个(field_num,field_num)维度的矩阵,最后得到的矩阵维度是(embedding_size,batch_size,field_num,field_num),经过reshape和transpose之后得到(batch_size,field_num*field_num,embedding_size)维度的向量,输入到conv1d中(4-b)进行卷积运算,通道是field_num*field_num,kernel是1,最后输出的矩阵大小为(batch_size,layer_size,embedding_size)即为x_{1},同样地,x_{1}  x_{0}进行同样的运算得到x_{2},将这些x进行concat(4-c),再经过dense输出。

将embedding部分,dnn部分和cin网络部分的数据相加,经过sigmoid映射到0-1之间作为预测概率作为模型的输出。

后续代码贴出时再更新代码地址。

上一篇 下一篇

猜你喜欢

热点阅读