mxnet实战Bytedance短视频推荐比赛
此文仅用于学习记录,主要考虑mxnet的使用者较少,自己在实践过程中也是遇到了很多的困难,可以参考的资料却比较少,一直在看mxnet 的API和官方文档,不能保证完全正确,仅作学习参考,如果有错误的地方,烦请指出。
比赛链接:头条短视频推荐比赛
参加的是track2,成绩仅仅达到baseline的水平,综合在0.75左右。
用到的工具:python+mxnet
比赛的代码之后会贴出
比赛的思路主要是参考FM模型,DeepFM模型和xDeepFM模型。
因考虑到FM模型所需要的特征工程,以及转换one-hot编码所造成的稀疏大矩阵的问题,在内存计算方面是个难题,主要参考deepctr源码中xDeepFM模型的实现思路,利用神经网络中的embedding层来解决one-hot编码的问题,但是在实际操作中发现,linear的部分用raw features作为输入导致linear层的结果比较大,相比linear的数据结果,embedding部分和dnn部分的输出对结果产生的效果微乎其微,这里也需要提醒,在模型搭建好之后,简单用数据测试打印输出一下中间结果,以验证模型的每一部分是不是都是有效的。
先看下FM的公式
对于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维度的向量进行运算,比如,是由做运算得到的,的第一个样本的第一个embedding向量(field_num,1)和的第一个样本的第一个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进行concat(4-c),再经过dense输出。
将embedding部分,dnn部分和cin网络部分的数据相加,经过sigmoid映射到0-1之间作为预测概率作为模型的输出。
后续代码贴出时再更新代码地址。