写点什么

深度 CTR 预估全新 ONN 模型源码阅读与调参经验

  • 2019-10-16
  • 本文字数:2281 字

    阅读完需:约 7 分钟

深度CTR预估全新ONN模型源码阅读与调参经验

本文来自“深度推荐系统”专栏,这个系列将介绍在深度学习的强力驱动下,给推荐系统工业界所带来的最前沿的变化。本文主要介绍深度 CTR 预估新积木:PNN + FFM - FM = ONN 模型[1],效果好于 DeepFM 和 PNN。

介绍

ONN 全称 Operation-aware Neural Networks,是在[1]中提出的一种新的用于点击率预测/广告推荐的深度学习网络模型,相比之前的同类模型,不同点在于丰富了 embedding 表达的处理:对于每个不同的操作(复制或内积)所使用的 embedding 方法不同,具体来说是每个特征都要在 embedding 层训练足够多的系数,产生足够多的中间结果向量,用于后面一次性的内积或其他操作。


初见这篇文章我是有点抗拒的,我第一反应判断这是灌水文,因为文章本身的影响力几乎没有,写作的方式和结构也不是很好,表达有些混乱,符号标记也不是很严谨规范,关键的是文章提出的思路我认为也不是特别精巧,也没有比较 solid 的工业级落地数据支持。不过实在扛不住它在业务数据上的表现优异,而且这几天也请假回家陪家人了难免有点不能继续工作的寂寞感,就顺带陪老人孩子聊天和洗菜做饭的时候顺带把这篇信息量不是很大的文章读完了,总结一下论文的方法和可取之处。

框架


输入为经过 one-hot encode 的



个稀疏特征



,一般的 embedding 处理会给每个



指定一个系数矩阵



,这一层的输出结果



,其中



。而 ONN 则对



特征将要参与的每个操作分开训练 embedding 的系数,如果



要参与



个操作,那么



经过 embedding 的计算结果为



个中间向量即



这些



需要在训练时分别获得。文中把第



个特征与第



个特征的内积操作,与第个



特征与第



个特征的内积,视为不同的操作,需要分配不同的





文中在 embedding 层之后只使用了对单个特征的复制,以及对于特征之间两两作内积的操作,这些结果作为 DNN 部分的输入开始 DNN 的训练。DNN 部分除了每层多加了 batch normalize,也没任何有别于传统 DNN 的地方,不再展开说明。

与其他模型的结构对比

FM 的 embedding 层并没有对特征区分不同的操作,embedding 之后即对



进行内积操作得到结果后简单的输出最终结果



FFM 相比 FM 在 embedding 层加入了文中的 operation-aware 操作,即对每次不同的内积操作,同一个特征的 embedding 方法是不同的。但相比 ONN 没有 deep 部分以及 embedding 的原始结果作为 deep 部分的输入,所以表现力还是有所欠缺。



与 ONN 最相似的还是 PNN 的结构,除了 ONN 在 embedding 层没有对后续的不同操作作出区分,而 ONN 根据后续用以不同的操作区分生成了很多不同的 embedding 向量。


源码阅读

ONN 在 DeepCTR 库[2]对应的实现为 NFFM 模型。把关键的 embedding 和 inner product 部分代码摘出来是


sparse_embedding = {fc_j.embedding_name: {fc_i.embedding_name: Embedding(fc_j.dimension, embedding_size, embeddings_initializer=RandomNormal(mean=0.0, stddev=0.0001, seed=seed), embeddings_regularizer=l2(l2_reg_embedding), mask_zero=isinstance(fc_j, VarLenSparseFeat),                                                                         name='sparse_emb_' + str(                                                                             fc_j.embedding_name) + '_' + fc_i.embedding_name)                                          for fc_i in                                          sparse_feature_columns + varlen_sparse_feature_columns} for fc_j in                    sparse_feature_columns + varlen_sparse_feature_columns}
for fc_i, fc_j in itertools.combinations(sparse_feature_columns + varlen_sparse_feature_columns, 2): i_input = features[fc_i.name] if fc_i.use_hash: i_input = Hash(fc_i.dimension)(i_input) j_input = features[fc_j.name] if fc_j.use_hash: j_input = Hash(fc_j.dimension)(j_input)
fc_i_embedding = feature_embedding(fc_i, fc_j, sparse_embedding, i_input) fc_j_embedding = feature_embedding(fc_j, fc_i, sparse_embedding, j_input)
element_wise_prod = multiply([fc_i_embedding, fc_j_embedding]) if reduce_sum: element_wise_prod = Lambda(lambda element_wise_prod: K.sum( element_wise_prod, axis=-1))(element_wise_prod) embed_list.append(element_wise_prod)
复制代码

使用总结

文章里面的数据很好,当然不好是不可能发的,所以讨论这个意义不大。


我自己在业务数据上使用的效果也非常好,比其他 deep based 的准确率高出很多,所以我特地去把文章读了一遍,感觉有点失望,因为原理上它确实没有太惊艳的地方,所以一开始我也怀疑是不是内置的 BN 起了作用,于是把 BN 关了发现效果也没降低太多。


随着后来观察到这个模型训练起来几乎是不可接受的慢,以及模型的参数数量远超其他模型,我大概能理解到底发生了什么,这就是简单粗暴的拓宽了假设空间,计算资源足够的情况下确实会更有可能学到更多的模式。而我的测试数据量也不大,所以用起来劣势没那么明显,真正在工业级场景落地则会对算力要求极高,所以……



文章给我最大的启发就是这种细致入微的系数分配和简单粗暴的增加模型复杂度的思路,



级矩阵参数的设置吊打



说明我们目前连训练集上的精度都还有很大的提升空间,就不要想着怎样在模型大小和效率上优化了。


参考


1. Operation-aware Neural Networks for User Response Prediction


2. https://github.com/shenweichen/DeepCTR


本文授权转载自知乎专栏“深度推荐系统”。原文链接:https://zhuanlan.zhihu.com/p/80830028


2019-10-16 07:081758

评论

发布
暂无评论
发现更多内容

Serverless Frist 的渐进式应用开发框架 Malagu

木香丘

开源 Serverless 云原生 Malagu Framework

Architecture Phase1 Week4:HomeWork

phylony-lu

极客大学架构师训练营

如何开一场高效的会议?

boshi

高效工作 开会

一个草根的日常杂碎(10月3日)

刘新吾

随笔杂谈 生活记录 社会百态

小伙伴问我:如何搭建Maven私服?我连夜肝了这篇实战文章!!

冰河

maven 私服 仓库

区块链与分布式存储构建数据要素市场基础设施

CECBC

区块链 分布式

LeetCode题解:49. 字母异位词分组,数组计数+哈希表,JavaScript,详细注释

Lee Chen

大前端 LeetCode

架构师训练营第 1 期 - 第 3 周 - 学习总结

wgl

极客大学架构师训练营

架构师训练营第三周心得

CmHuang

架构师训练营第四周学习总结

邓昀垚

极客大学架构师训练营

一个草根的日常杂碎(10月2日)

刘新吾

随笔杂谈 生活记录 社会百态

BigDecimal是如何搞定精度缺失的

hasWhere

理想的程序员

极客思享

Serverless与传统Web框架的迁移

刘宇

Serverless

Web Storage API的介绍和使用

程序那些事

web tech web storage web storage api storage api

Architecture Phase1 Week4:Summarize

phylony-lu

极客大学架构师训练营

架构师训练营 - 命题作业 - 第三周

徐时良

极客大学架构师训练营

架构师训练营 - 学习笔记 - 第三周

徐时良

极客大学架构师训练营

第二节课后作业

happy

【知识分享】区块链常用术语

CECBC

区块链 货币 网络节点

区块链带来第四次技术革命 融入生产大幅提高企业收入

CECBC

区块链 数字资产 技术革命

Appium之「元素定位和UiAutomator表达式」

清菡软件测试

架构师训练营 Week4 - 课后作业

缓存 自动化 异步 集群 冗余

spring-boot-route(五)整合Swagger生成接口文档

Java旅途

Java springboot swagger

CECBC区块链专委会副主任吴桐主讲光大证券法定数字货币讲座

CECBC

区块链 数字货币

让人一夜暴富的区块链,新时代革命的开始

CECBC

区块链 时代革命

区块链--凌驾于政治之上的存在

CECBC

区块链 信息技术

小伙伴想学Jenkins自动构建发布项目,我:安排上了!!

冰河

项目管理 jenkins 灰度发布 自动构建 及时发布

一个草根的日常杂碎(10月4日)

刘新吾

随笔杂谈 生活记录 社会百态

VUE第一个项目怎么读懂

MySQL从删库到跑路

Java html5 Vue 大前端 vux

架构师训练营第 1 期 - 第 3 周 - 作业

wgl

极客大学架构师训练营

深度CTR预估全新ONN模型源码阅读与调参经验_AI&大模型_李欣宜_InfoQ精选文章