基于域的分解机(FFM)理论介绍及libFFM源码解析
来源:互联网 发布:深圳淘宝开店培训 编辑:程序博客网 时间:2024/06/01 08:21
符号说明:
x表示样本特征数据 y表示样本目标数据 第i个训练样本为(xi,yi),为了方便也可以用x=xi表示第i个样本
1 基于域的分解机模型(FFM)
1.1 线性模型
1.2 二次多项式模型
1.3 分解机模型
1.4 域分解机模型
因为线性项
1.5 基于FFM的逻辑回归模型
1.5.1 -1,1损失的逻辑回归模型
其中
令
其为每个样本的损失函数。
在式(8)的导数计算公式中,
1.5.2 ∅(w,xp) 的求导过程$
为了便于理解首先对
假设有如下的例子,五个特征,两个域
图1
在模型学习时,需要迭代公式
方式1:
方式2:
在学习过程中是采用方式1还是方式2哪。答案是方式2。因为在计算实际问题时可能特征分布在多个域中,如果按照方式1则需要把每个域中的信息累加起来,结果是编程上非常麻烦,如果按照方式2,非常符合SGD的思想,把
2 libFFM介绍
2.1 使用介绍
1)编译
下载libffm-1.13.tar.gz,解压,在libffm-1.13下直接make,会产生两个可执行的文件ffm-train和ffm-predict分别用于训练和预测结果。
2)输入数据格式
<label>\t<field1>:<index1>:<value1>\t<field2>:<index2>:<value2>\t...fieldi表示域的id,indexi表示特征的id,它们都是非负值。0 1:7759:0.3651 2:7921:0.3651 3:8661:0.3651 4:9619:0.36511 1:7633:0.3651 2:8195:0.3651 3:9952:0.3651 4:9619:0.3651**注意:**libFFM中使用的是“-1,1”损失函数,所以label只能取-1或者1,而这里的样例数据中目标是0、1。因为在libFFM中读取数据时将大于0的目标当成1,小于等于0的当成-1。所以数据中的0、1并不表示损失是0,1。 |
3)命令行调用方式
训练:ffm-train [options] training_set_file [model_file]
options控制参数如下表
说明:
- –no-norm:缺省状态时用每个样本向量的2范数对样本中的每个元素进行归一化,如果设置了这个参数,则不进行归一化处理。
- –no-rand:缺省状态训练时随机从数据中选取训练样本,如果不想随机的抽取训练样本,而是想按照数据集中的样本顺序训练,则可以使用此参数,同时还要配合参数”-s
1”使用。 - –on-disk:如果训练数据较大内存无法加载全量数据,则可以使用此参数。需要注意的是,这种训练模式下不支持随机的抽取训练数据,所以此时需要设置参数“—no-rand”,同时这种模式下不支持交叉验证。同时还会在磁盘上产生临时的二进制文件[training_set_file].bin。
“`
预测:
ffm-predict test_file model_file output_file
作者给的几个例子
使用缺省参数训练模型
- ffm-train bigdata.tr.txt model
使用如下参数训练模型
- regularization cost = 0.001
- latent factors = 16
- iterations = 30
- learning rate = 0.05
- threads = 4
- ffm-train -l 0.001 -k 16 -t 30 -r 0.05 -s 4 bigdata.tr.txt model
- 使用bigdata.te.txt作为validation数据
- ffm-train -p bigdata.te.txt bigdata.tr.txt model
- 使用5折交叉验证
- ffm-train -v 5 bigdata.tr.txt
- 用–quiet参数训练时不打印训练信息
- ffm-train –quiet bigdata.tr.txt
预测
-ffm-predict bigdata.te.txt model output基于磁盘的训练
ffm-train –no-rand –on-disk bigdata.tr.txt
- 使用–auto-stop参数,当达到最优的validation损失时停止训练
ffm-train -p bigdata.te.txt -t 100 bigdata.tr.txt
2.2 源码分析
2.2.1 存储模型用到的数据结构
- 存储特征的结构体如下
f表示域id,j表示特征id,v表示特征的值
图2
- 存储整个训练数据集的结构体如下
m表示特征个数;l表示样本可是,即训练数据的行数;m表示域的个数;X存储训练数据中非零特征;P用来记录X中每个样本数据的起始位置和结束位置;Y存储样本数据的标签值
图3 下面介绍X和Y的存储格式
图4
- 存储模型结构体如下:下面会主要介绍W的结构
图5
W的存储格式如下
图6
2.2.2 训练
- 主要的训练方法为
shared_ptr train(ffm_problem *tr,vector &order, ffm_parameter param, ffm_problem *va=nullptr)
在该方法中采用AdaGrad对每个样本进行训练。值得一提的是该方法中采用OpenMP和SSE进行加速,为了理解加速的位置,下面将伪码写出
for i = 0:l //l为特征个数
ffm_float t = wTx(xi, model);
ffm_float expnyt = exp(-y*t);
tr_loss += log(1+expnyt);
ffm_float kappa = -y*expnyt/(1+expnyt);
wTx(begin, end, r, *model, kappa, param.eta, param.lambda, true);
end
- 下面两条获得进程数
ffm_int old_nr_threads = omp_get_num_threads();
omp_set_num_threads(param.nr_threads);
下面的指令使多线程中的ffm_float t = wTx(xi, model);
ffm_float expnyt = exp(-y*t);结果,在tr_loss += log(1+expnyt);出合并然后继续下面的过线程
#pragma omp parallel for schedule(static) reduction(+: tr_loss)
- libFFM中加速技术概述
图7
OpenMP
代码被多个线程并行执行
图8
for循环被发送到多个线程执行
图9
for循环先被发送到多个线程,接着合并,然后再次被分发
图10
对比加速图
图11
SSE
SSE(Streaming SIMD Extensions)/AVX(Advanced Vector Extensions)是Intel公司设计,对其X86体系的SIMD扩展指令集,它基于SIMD向量化技术,增强X86多核处理器的图像和视频处理能力
常用指令如下
_mm_load_ps 从数组中读取向量到寄存器
_mm_store_ps 将寄存器中的向量存储到数组
_mm_add_ps 寄存器中的向量相加
_mm_sub_ps 寄存器中的向量相减
_mm_mul_ps 寄存器中的向量相乘
_mm_rsqrt_ps 寄存器中的向量开方倒数
图12
- 基于域的分解机(FFM)理论介绍及libFFM源码解析
- 基于域的分解机(FFM)理论介绍及libFFM源码解析
- 基于域的分解机(FFM)理论介绍及libFFM源码解析
- Glide介绍及源码解析
- C++ 调用FFMPEG命令及 FFM常用的命令
- 公钥体系基于大整数的素因子难以分解的理论
- Glide介绍及源码解析二
- 推荐系统学习笔记之四 Factorization Machines 因子分解机 + Field-aware Factorization Machine(FFM) 场感知分解机
- ffm
- 再读SIFT理论及源码
- 数据库设计的模式分解理论
- Spring基于注解形式的 AOP的原理流程及源码解析(一)
- Spring基于注解形式的 AOP的原理流程及源码解析(二)
- Spring基于注解形式的 AOP的原理流程及源码解析(三)
- Spring基于注解形式的 AOP的原理流程及源码解析(四)
- libffm的基本使用--mac为例子
- 热的解析理论
- PowerfulEditText的介绍和源码解析
- 网络安全-数据加密算法详解
- ReactNative组件生命周期
- Android应对进程被杀死--Service(二)
- 【Android】不同App之间通过SharedPreference共享数据
- htop使用文摘
- 基于域的分解机(FFM)理论介绍及libFFM源码解析
- pyinstaller的库导入和多进程打包问题
- 剑指offer-面试题19-二叉树的镜像
- 微服务的优势与不足
- stl算法_foreach和transform基本使用,算法比较以及源码追踪
- 记一次坑爹的三方sdk问题的编译错误
- Macho文件浏览器---MachOView
- WPF的ScrollViewer鼠标的滚动
- 本地存贮-文件系统