前言:
此文算是我过去一年的工作总结,作为一个萌新算法工程师,尽自己所能把一个算法模型的工程化实现介绍明白。从最原始的数据出发,到最后模型的predict结果。我围绕着计算广告中的ctr预估模型来进行一步步介绍。
技术框架:
整体广告系统的技术框架比较复杂,在我们算法组这边主要是redis,kafka,spark,hadoop,hive,hbase,clickhouse等
redis:主要用来特征缓存,比如用户的一些频次特征会在adx检索时进行关联,频次特征写入redis缓存我们的解决方案是重写mapreduce的OutputFormat函数,将map结果直接写入到redis,采用多进程,一小时可以将3亿用户的频次特征入库完成,理论上可以7分钟完成,但进程数多了之后会不会发生互斥没去细究,一个小时可以满足需求。
kafka:目前的kafka主要是日志落地,后边我们会考虑hdfs+kafka做分布式训练
spark:主要是lr模型
hadoop:mapreduce支撑整个数据流的基础
hive:今年完成了数据流的sql化,主要是以UDF函数的形式简化操作,更方便管理
hbase:之前是五分钟级别的离线特征存储,现已弃用了似乎
clickhouse:支持报表平台的频繁查询操作
整体流程:
- 数据准备
- 特征抽取
- 特征统计/分析
- 生成特征字典
- 特征编码
- 训练数据采样
- 样本binary
- 训练模型
- 模型预测
一:数据准备
以广告为例,最原始的数据其实就是广告的检索日志,排序日志,曝光点击日志,我们在这些日志的基础之上,会进行日志之间的关联处理,其中主要就是曝光和点击的处理,在这一步我们会与用户画像进行关联,这一步产出的数据基本就是特征数据的雏形了。
二:特征抽取
特征抽取就是根据配置文件进行需要的特征的抽取工作,在抽取过程中,会对特征做一些处理,比如空值舍弃,离散化,组合特征检查等等,这一步最重要的操作是根据特征进行分类,以便适用于不同的模型。
三:特征统计/分析
广告的ctr预估最关注的就是点击曝光行为,每个特征对应的点击曝光的统计信息是非常有帮助的,我们可以针对统计信息做很多的策略优化,比如频次过滤,熔断等处理。
每个特征我们需要知道它的重要度是多少,以便做特征筛选,我们在这一步会进行特征的gini,熵,id3,cart这样子的计算
四:生成特征字典
我们之所生成特征字典的目的就是标识特征,为了后边的特征编码,我们特征字典的生成方式就是遍历特征,递增赋值,为了后续的统计大类特征的数量,会添加内特征id。
五:特征编码
特征编码就是根据特征字典将相应的明文特征转换为特征索引,这里会根据模型类型以及梯度下降算法的特点等等做一下处理。
六:训练数据采样
我们的负样本过多需要进行负样本的采样,其实这里可以有两个策略,一个是直接丢弃,另一个是在计算资源允许的情况下可以做的尝试,权重打压
七:样本binary
我们在读取训练数据的时候,如果数据是以文本形式存储的,会造成存储资源的浪费以及难以建立索引支持SGD算法,所以我们会将样本binary化,这样以来每个样本由结构体统一定义,方便快速检索。
八:模型训练
将样本分为训练数据与测试数据进行训练,注意模型参数
九:模型预测
加载模型,喂样本得到predict结果。
数据流控制以及规范:
整个数据流其实是最繁琐的,我们在处理数据流的时候要形成“单位”的概念,比如一个样本是一个单位,一个特征是一个单位,一个字典是一个单位,更重要的是一种处理方式是一个单位。具体而言就是根据配置文件建立对应的类,以配置文件为中心做处理。
分布式训练:
参数服务器,类似于git的原理,push和pull操作
常用模型源码解读:
目前各大互联网公司在ctr预估时fm类模型为主流,以ffm模型的源码为例可以真正理解模型的运作过程:
https://blog.csdn.net/qq_30331643/article/details/103633528
来源:CSDN
作者:greatcoti
链接:https://blog.csdn.net/qq_30331643/article/details/103731520