DeepCtr是一个简易的CTR模型框架,集成了深度学习流行的所有模型,适合学推荐系统模型的人参考。
我在参加比赛中用到了这个框架,但是效果一般,为了搞清楚原因从算法和框架两方面入手。在读代码的过程中遇到一些不理解的问题,所以记录在这里。
- dense_embedding和sparse_embedding的区别?
处理dense, 是将dense接全连接层变成embedding size的一个list,然后和sparse一样的操作 - concat_fun 这里是concat什么?fm的输入为什么需要concat?
原来是list,每一行是一个tensor,concat之后是tensor,每一行是tensor - tf.keras.layers.Flatten()(fm_input)
原先的embedding输入是[d,f,k],deep embedding是[d,f*k] - 这里的实现和我的实现不一样:
我的linear+interact+deep接入全连接层,将所有的特征接入全连接层, 但是根据根据论文和多家的博客来看,我之前理解的是错误的,正确的应该是 fm logit+deep logit,最后接全连接层。 同时AFM等多个模型都是这么处理的。
运行模型,每次结果不一样:
这个属于正常现象,尤其是数据不够充分的情况下,
主要原因是由于Tensorflow底层的多线程运行机制以及一些具有随机性的op和random seed导致的。
如果想让每次运行的结果尽量一致,可以考虑使用CPU运行程序,并且指定单线程运行,同时固定random seed,包括python自身的,Numpy的还有tensorflow的
总结这个框架:
- 整体结构清晰灵活,linear返回logit,FM层返回logit,deep包含中间层结果,在每一种模型中打包deep的最后一层,判断linear,fm和deep是否需要,最后接入全连接层。
- 主要用到的模块和架构: keras的Concatenate(list转tensor),Dense(最后的全连接层和dense),Embedding(sparse,dense,sequence),Input(sparse,dense,sequce)还有常规操作:优化器,正则化项
- 复用了重载了Layer层,重写了build,call,compute_output_shape,compute_mask,get_config
缺点:
- 给定的参数都是论文提供的参数,实际使用存在问题,都需要自己修改!
- 好多参数没有留接口,比如回归问题的loss 是mean_squared_error,只能通过硬写来修改参数
- 如果想实现自己的模型,复用这个框架,需要了解keras,同时改很多接口,时间代价较大。