算法模型工程化小觑

痞子三分冷 提交于 2020-01-27 01:02:52

前言:

    此文算是我过去一年的工作总结,作为一个萌新算法工程师,尽自己所能把一个算法模型的工程化实现介绍明白。从最原始的数据出发,到最后模型的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:支持报表平台的频繁查询操作

整体流程:

  1. 数据准备
  2. 特征抽取
  3. 特征统计/分析
  4. 生成特征字典
  5. 特征编码
  6. 训练数据采样
  7. 样本binary
  8. 训练模型
  9. 模型预测

一:数据准备

以广告为例,最原始的数据其实就是广告的检索日志,排序日志,曝光点击日志,我们在这些日志的基础之上,会进行日志之间的关联处理,其中主要就是曝光和点击的处理,在这一步我们会与用户画像进行关联,这一步产出的数据基本就是特征数据的雏形了。

二:特征抽取

特征抽取就是根据配置文件进行需要的特征的抽取工作,在抽取过程中,会对特征做一些处理,比如空值舍弃,离散化,组合特征检查等等,这一步最重要的操作是根据特征进行分类,以便适用于不同的模型。

三:特征统计/分析

广告的ctr预估最关注的就是点击曝光行为,每个特征对应的点击曝光的统计信息是非常有帮助的,我们可以针对统计信息做很多的策略优化,比如频次过滤,熔断等处理。

每个特征我们需要知道它的重要度是多少,以便做特征筛选,我们在这一步会进行特征的gini,熵,id3,cart这样子的计算

四:生成特征字典

我们之所生成特征字典的目的就是标识特征,为了后边的特征编码,我们特征字典的生成方式就是遍历特征,递增赋值,为了后续的统计大类特征的数量,会添加内特征id。

五:特征编码

特征编码就是根据特征字典将相应的明文特征转换为特征索引,这里会根据模型类型以及梯度下降算法的特点等等做一下处理。

六:训练数据采样

我们的负样本过多需要进行负样本的采样,其实这里可以有两个策略,一个是直接丢弃,另一个是在计算资源允许的情况下可以做的尝试,权重打压

七:样本binary

我们在读取训练数据的时候,如果数据是以文本形式存储的,会造成存储资源的浪费以及难以建立索引支持SGD算法,所以我们会将样本binary化,这样以来每个样本由结构体统一定义,方便快速检索。

八:模型训练

将样本分为训练数据与测试数据进行训练,注意模型参数

九:模型预测

加载模型,喂样本得到predict结果。

数据流控制以及规范:

整个数据流其实是最繁琐的,我们在处理数据流的时候要形成“单位”的概念,比如一个样本是一个单位,一个特征是一个单位,一个字典是一个单位,更重要的是一种处理方式是一个单位。具体而言就是根据配置文件建立对应的类,以配置文件为中心做处理。

分布式训练:

参数服务器,类似于git的原理,push和pull操作

常用模型源码解读:

目前各大互联网公司在ctr预估时fm类模型为主流,以ffm模型的源码为例可以真正理解模型的运作过程:

https://blog.csdn.net/qq_30331643/article/details/103633528

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!