本文主要记录一些工作中的零散总结,供自己翻阅。
alphaFM特点
alphaFM是一位腾讯同学开发的单机多线程的FM工具。GitHub地址:https://github.com/CastellanZhang/alphaFM,详细介绍可以去看下其介绍、原理和优化思路。本人在工作中也用到了这个工具,感觉非常好用,特此记录一下:
- 采用基于FTRL + Linux管道的流式训练,由于FTRL的特性,样本过一遍即可得到稀疏解。此工具不仅节省内存,还可以方便灵活的增加各种采样、格式转换等前处理操作。
- 由于采用了多线程并行训练且每个参数分配一个锁资源太费内存。所以在涉及权重更新时,为了节省内存,使用了锁池设计,也就是更新参数时,从池子中获取,用完了就还回去。
- 为了解决频繁动态申请释放小内存带来的开销,此工具采用了内存池+自定内存申请机制。
- 变长的对象不预先创建好,而是拼接到结构体之后,实际计算出内存大小时再申请然后指向结构体之后的地址。
- 特征名由string改为char*,采用动态内存分配,同时自定义hash和eq函数。
- 重写unordered_map内存申请函数,去掉不必要的空间申请,尽量减小无效无用内存。
如何让模型的离线和在线推理结果分布接近?
- 特征值与优化目标呈单调性,比如最近3天阅读总时长统计特征,其取值越大,则后验点击率越大。
- 特征可信度:比如历史点击率特征,如果曝光和点击数据量比较少,则计算出的特征偏差很大。通常使用贝叶斯平滑处理,但是更建议攒够一定数据量再使用。
- 特征正则化:模型训练时通常使用正则化防止过拟合,训练集和测试集也建议对特征使用正则化。比如对数值类特征进行减均值除方差操作。这样归一化处理后,损失函数的梯度可能会变得比较均匀。
- 分类校准:除了模型级别的校准,还可以增加更细粒度的校准,比如按照不同性别等进行校准。
Pandas优化点
- pandas.crosstab性能优化:数据排序,查找每个特征值在数据中的行号区间,多线程并行处理不同的特征值统计,单线程使用groupBy,最终结果合并。
- pandas索引选择优化:特征值排序,多线程同时处理,每个线程处理连续区间,用索引方式批量更新数据。
- 善用python多进程
CatEmbedding训练集成
- CatEmbedding生成:使用alphaFM快速训练模型,提取每个特征的一阶权重参数,导出文件保存。
- 模型集成:模型初始化时,根据使用的类别特征从文件中加载Embedding设置为常量;两两交叉生成方阵,然后取方阵上三角元素拉平成向量;最后作为普通特征与其他特征一并使用。
AutoDis实现细节
- 每个特征增加一个AutoDis层,每个AutoDis层需设置分桶数
- AutoDis的输入建议进行归一化操作
- 去掉了$\alpha$参数
模型一致性排查
特征维度
- 特征加工方式,尤其是需要在线处理的上下文特征等
- 离线特征和在线特征版本号是否一致
- 在线特征监控,比如空值率、分布、时效性、CTR/CVR分布等
- 离线特征更新时延,比如离线特征加工周期特别慢等
- 强bias特征使用方式,比如离线使用了广告位置特征,但是在线推理时获取不到广告位置或者多个广告暂时无法确定广告位置时,可以先都设置为0位置,然后按照结果排序后的编号再计算一次。
训练维度
- 训练集和测试集是否重叠导致评估结果不一致
- 离线训练集和在线流量分布是否一致
- 特征是否穿越了
- 训练是否过拟合了
- 模型更新时延
- 增加流量bias特征
线上结果不置信
- 线上指标统计时间窗口(比如转化延迟等)或在线指标波动确实比较大
- AB平台是否可信
- 模型服务状态,比如超时比例
本文永久更新地址: https://notlate.cn/p/25047ddba9c42fcf/