本文介绍FM(Factorization Machines)二分类器使用FTRL优化的算法原理,以及如何结合softmax改造成一个多分类器。我自己实现了该算法工具,取名为alphaFM,已经开源。

最近公司内部举办了一届数据挖掘大赛,题目是根据用户的一些属性和行为数据来预测性别和年龄区间,属于一个二分类问题(性别预测男女)和一个多分类问题(年龄分为7个区间),评判标准为logloss。共有五六十支队伍提交,我们组的三名小伙伴最终取得第三名的好成绩,跟前两名只有千分之一二的差距。

赛后总结,发现前6名全部使用了DNN模型,而我们团队比较特别的是,不只使用了DNN,还有FM,最终方案是六七个DNN模型和一个FM模型的ensembling。

其实比赛刚开始,他们使用的是XGBoost,因为XGBoost的名头实在太响。但这次比赛的数据量规模较大,训练样本数达到千万,XGBoost跑起来异常的慢,一个模型要跑一两天。于是我把几个月前写的FM工具给他们用,效果非常好,二分类只需十几分钟,多分类也就半个多小时,logloss和XGBoost基本持平,甚至更低。最终他们抛弃了XGBoost,使用FM在快速验证特征和模型融合方面都起到了很好的作用。此外,我们组另外两名实习生仅使用此FM工具就取得了第七名的成绩。

最初写此FM代码时正值alphaGo完虐人类,因此随手给这个工具起了个名字叫alphaFM,今天我就来分享一下这个工具是如何实现的。

alphaFM介绍


代码地址在:

  • https://github.com/CastellanZhang/alphaFM
  • https://github.com/CastellanZhang/alphaFM_softmax

alphaFM是Factorization Machines的一个单机多线程版本实现,用于解决二分类问题,比如CTR预估,优化算法采用了FTRL。我其实把sgd和adagrad的方法也实现了,但最终发现还是FTRL的效果最好。

实现alphaFM的初衷是解决大规模数据的FM训练,在我们真实的业务数据中,训练样本数常常是千万到亿级别,特征维度是百万到千万级别甚至上亿,这样规模的数据完全加载到内存训练已经不太现实,甚至下载到本地硬盘都很困难,一般都是经过spark生成样本直接存储在hdfs上。

alphaFM用于解决这样的问题特别适合,一边从hdfs下载,一边计算,一个典型的使用方法是这样:

训练:10个线程计算,factorization的维度是8,最后得到模型文件fm_model.txt

hadoop fs -cat train_data_hdfs_path | ./fm_train -core 10 -dim 1,1,8 -m fm_model.txt

测试:10个线程计算,factorization的维度是8,加载模型文件fm_model.txt,最后输出预测结果文件fm_pre.txt

hadoop fs -cat test_data_hdfs_path | ./fm_predict -core 10 -dim 8 -m fm_model.txt -out fm_pre.txt

当然,如果样本文件不大,也可以先下载到本地,然后再运行alphaFM。

由于采用了FTRL,调好参数后,训练样本只需过一遍即可收敛,无需多次迭代,因此alphaFM读取训练样本采用了管道的方式,这样的好处除了节省内存,还可以通过管道对输入数据做各种中间过程的转换,比如采样、格式变换等,无需重新生成训练样本,方便灵活做实验。

alphaFM还支持加载上次的模型,继续在新数据上训练,理论上可以一直这样增量式进行下去。

FTRL的好处之一是可以得到稀疏解,在LR上非常有效,但对于FM,模型参数v是个向量,对于每一个特征,必须w为0且v的每一维都为0才算稀疏解, 但这通常很难满足,所以加了一个force_v_sparse的参数,在训练过程中,每当w变成0时,就强制将对应的v变成0向量。这样就可以得到很好的稀疏效果,且在我的实验中发现最终对test样本的logloss没有什么影响。

当将dim参数设置为1,1,0时,alphaFM就退化成标准的LR的FTRL训练工具。不禁想起我们最早的LR的FTRL代码还是勇保同学写的,我现在的代码基本上还是沿用了当初的多线程思路,感慨一下。

alphaFM能够处理的特征维度取决于内存大小,训练样本基本不占内存,理论上可以处理任意多的数量。后续可以考虑基于ps框架把alphaFM改造成分布式版本,这样就可以支持更大的特征维度。

alphaFM_softmax是alphaFM的多分类版本。两个工具的具体使用方法和参数说明见代码的readme,这里不再详述。

接下来请各位打起精神,我们来推一推公式。诗云,万丈高楼平地起,牛不牛逼靠地基。公式就是算法工具的地基,公式整明白了,像我们这种”精通”C++的(谁简历里不是呢:-P),实现就是分分钟的事(装B中,勿扰:-)。

二分类问题


对于二分类,最常见的模型是LR,搭配FTRL优化算法。LR的输出会用到sigmoid函数,定义为:

LR预测输入是正样本的概率:

可以看到,函数的参数部分是一个线性函数,这也就是LR被称作线性模型的原因,模型参数只有一个向量,相对简单。如果我们把这部分弄复杂呢?比如这样:

其中,,这其实就是一个2阶FM,模型参数。如果直接将做输出,采用平方损失函数便可解决回归问题。而对于二分类问题,外面套一个sigmoid函数即可:

对于,可统一成形式:

模型参数估计采用最大似然的方法,对于训练数据,最优化问题为:

即样本的损失函数为:

此损失函数对求偏导会得到一个优雅简单的形式:

再配合上对模型参数的偏导:

便可得到损失函数对所有模型参数的偏导,即:

此时,我们能够很自然的想到用SGD的方法来求解模型参数,但我这里采用了更加高效的FTRL优化算法。

让我们来简单回顾一下FTRL,Google在2013年放出这个优化方法,迅速火遍大江南北,原始论文里只是用来解决LR问题,论文截图如下:

但其实FTRL是一个online learning的框架,能解决的问题绝不仅仅是LR,已经成了一个通用的优化算子,比如TensorFlow的optimizer中都包含了FTRL。我们只要把截图中的伪代码修改,的计算改为,对于每一轮的特征向量的每一维非0特征,都要相应的更新模型参数,更新公式不变和截图一致,梯度的计算即为损失函数对每个参数的偏导,前面已经给出。的更新公式不变。伪代码如下:


多分类问题


Softmax模型是LR在多分类上的推广,具体介绍戳这里。大致就是如果有个类别,则模型参数为个向量:,其中任意

样本属于类别的概率:

FM解决多分类的方法同样是将线性部分替换成复杂的,不过不再是一个,而是每一类别对应一个,共个:

样本属于类别的概率也变成:

模型参数一共组,,其中类别对应一组参数

我们定义一个示性函数,大括号中表达式为真则值为1,表达式为假则值为0。这样就可以写出最优化问题:

每条样本的损失函数:

梯度:

所以有

即求中所有参数的偏导,这在二分类中我们已经给出。

最后,仍然是套用FTRL的框架,只是每条样本更新的参数更多,不再细说,详见代码。

本文作者:张卫,8年多码农生涯,先后在腾讯、搜狗混过些时日,目前在小米负责广告算法。无甚特别,唯好数学物理,正所谓推公式无敌手,推妹子无得手的中二汉子。

FM, FTRL, Softmax相关推荐

  1. 人工智能AI:TensorFlow Keras PyTorch MXNet PaddlePaddle 深度学习实战 part1

    日萌社 人工智能AI:TensorFlow Keras PyTorch MXNet PaddlePaddle 深度学习实战 part1 人工智能AI:TensorFlow Keras PyTorch ...

  2. xgboost参数_珍藏版 | 20道XGBoost面试题,你会几个?(下篇)

    XGBoost的威名想必大家都有所耳闻,它不仅是数据科学竞赛神器,在工业界中也被广泛地使用.本文给大家分享珍藏许久的XGBoost高频面试题,希望能够加深大家对XGBoost的理解,更重要的是能够在找 ...

  3. 4种语义分割数据集Cityscapes上SOTA方法总结

    本文分享自华为云社区<语义分割数据集Cityscapes上SOTA方法总结>,原文作者:fdafad. 1 Cityscapes数据集介绍 Cityscapes评测数据集即城市景观数据集, ...

  4. 张俊林:推荐系统的下一步

    作者 | Clara Deng采访嘉宾 | 张俊林编辑 | NatalieAI 前线导读:NLP 是人工智能中最难的问题之一,对它的研究与落地充满了挑战性.预训练模型 BERT  的出现给自然语言处理 ...

  5. 深度学习在省钱快报推荐排序中的应用与实践

    导读:省钱快报是一家中小型综合类电商APP,近2年平台规模有了较大增长,AI在平台业务发展中发挥了巨大作用.本文以推荐场景优化在省钱快报的发展为脉络,对于中小型电商公司在资源有限的客观条件下,对机器学 ...

  6. 【推荐实践】深度学习在省钱快报推荐排序中的应用与实践

    文章作者:省钱快报算法团队 编辑整理:Hoh Xil 内容来源:作者授权 出品平台:DataFun 导读:省钱快报是一家中小型综合类电商APP,近2年平台规模有了较大增长,AI在平台业务发展中发挥了巨 ...

  7. 排序模型进阶-FMFTRL

    日萌社 人工智能AI:Keras PyTorch MXNet TensorFlow PaddlePaddle 深度学习实战(不定时更新) 5.8 排序模型进阶-FM&FTRL 学习目标 目标 ...

  8. NLP与推荐系统的比较、联系与未来

    1.NLP与推荐的联系与比较 ①联系 NLP的产出常常是推荐系统的输入:NLP所做的其实很单纯,效果也相对好验证:比如说文本的情感识别,输入是文本序列,输出是对应的情感,是有准确的评价指标的.NLP的 ...

  9. 深度长文 | 从FM推演各深度CTR预估模型(附开源代码)

    作者丨龙心尘 & 寒小阳 研究方向丨机器学习,数据挖掘 题记:多年以后,当资深算法专家们看着无缝对接用户需求的广告收入节节攀升时,他们可能会想起自己之前痛苦推导 FM 与深度学习公式的某个夜晚 ...

最新文章

  1. 在python中可以使用for作为变量名对吗,在Python中使用循环来命名变量
  2. 开启ntp服务_Linux入门:Linux自有服务及软件包
  3. caffe学习笔记--跑个SampleCode
  4. TIOBE 2月编程语言排行榜新鲜出炉!C# 获3.08%增长率!
  5. 【QGIS入门实战精品教程】4.4:QGIS如何将点自动连成线、线生成多边形?
  6. JDK的目录结构及结构图
  7. 数据自治开放的加密技术挑战
  8. python接口在哪里_在Python中实现接口?
  9. 5G+AIoT“零碳”解决方案 | 模组助力“4S” 融合的新一代智能汽车驶入快车道
  10. 操作系统课程设计-文件管理系统(JAVA)
  11. 一个美观的gridview样式
  12. 金蝶应收应付模块流程_金蝶财务软件里的应收应付模块核算哪些会生
  13. 深度卷积神经网络(CNN)特征层的可视化
  14. 快速获取InputBox选中区域的单个单元格引用地址
  15. php清理浏览器缓存文件在哪里,php如何清除浏览器缓存?
  16. 【redis集群:2. 集群伸缩】
  17. 计算机加密技术图片,基于Henon映射的图像加密技术
  18. go (golang) DNS域名解析实现
  19. html ckplayer.swf,让KindEditor支持MP4视频(使用ckplayer播放器)
  20. autocad 2014 闪退的一种解决办法: 点击菜单栏即闪退报错

热门文章

  1. [docker]使用quaaga实现(rip ospf)实现主机间容器互通
  2. 织梦如何添html5播放器,dedecms编织梦ckplayer视频播放器插件详细安装教程
  3. 263企业网盘海外版跨国公司的存储好伙伴
  4. android18lazuli,Android 18
  5. cocos2dx lua 日志系统
  6. 微软大佬带你深入解析websocket丨tcp自定义协议的设计丨服务器高并发场景的优化
  7. Python实现定时备份数据库-mysql篇
  8. Windows命令行工具cmder配置 1
  9. linux下上传照片和视频
  10. 网站包含哪几个模块?