docs/algo/sona/sparselr_ftrl.md
目前很多CTR预估的业务场景中,不仅训练样本规模达到10亿级别,而且特征的规模也达到十亿、百亿级别。 Google在2013年发表了FTRL(Follow-the-regularized-Leader)算法工程实现方法,FTRL在处理带非光滑正则项(如L1正则)的凸优化问题上表现非常出色, 不仅可以通过L1正则控制模型的稀疏度,而且收敛速度快;超大规模的训练集上有非常强的优势。
FTRL的理论基础请参考, FTRL理论篇
论文[1]中给出了FTRL-Proximal实现的伪代码:
原始的FTRL是针对于online learning的算法优化,属于Stochastic gradient descent(SGD), 每次只用一个样本的梯度来更新模型。而离线全量规模的模型训练,若每次更新只用一个样本更新模型,会频繁地更新模型。 Spark on Angel中的模型向量是保存在Angel PS上,如频繁地更新PS会导致PS的流量压力。 Spark on Angel中的FTRL用mini-batch的方式更新模型,减少模型的更新次数;同时每个batch之间是异步的, 因此这是Async mini-batch FTRL。
核心代码如下:
for ( epochId <- 0 until epoch) {
val tempRDD = trainSet.mapPartitions { iter =>
iter.toArray.sliding(batchSize, batchSize)
.map { batch =>
// ftrl.optimize会更新模型参数 Z 和 N
ftrl.optimize(batch, calcGradientLoss)
}
}
tempRDD.count()
}
一次RDD的mapPartitions操作完成一个epoch的更新;RDD mapPartitions内部分别划分成多个mini-batch同时更新。
因此一个epoch内的不同mini-batch是完全异步的。
Async mini-batch FTRL的优点
训练数据说明
算法参数
性能评测
数据集规
设置参数:
资源参数:
收敛性
model nnz是指训练得到模型向量的非零值数目(nnz = number of non-zero),作为评估模型的稀疏度的一个重要指标,
modelNnz(epoch=1) = 22 million, modelNnz(epoch=2) = 69 million。
综合上述所有模型指标,模型训练一个epoch时,模型就达到一个可用的状态。
耗时
[1] H. Brendan McMahan, Gary Holt, D. Sculley, Michael Young, Dietmar Ebner, Julian Grady, Lan Nie, Todd Phillips, Eugene Davydov, Daniel Golovin, Sharat Chikkerur, Dan Liu, Martin Wattenberg, Arnar Mar Hrafnkelsson, Tom Boulos, Jeremy Kubica, Ad Click Prediction: a View from the Trenches, Proceedings of the 19th ACM SIGKDD International Conference on Knowledge Discovery and Data Mining (KDD) (2013)