FTRL工程实现
per-coordinate
per-coordinate指FTRL是对w每一维分开训练更新的,每一维使用的是不同的学习速率,也是上面代码中lamda2之前的那一项。与w所有特征维度使用统一的学习速率相比,这种方法考虑了训练样本本身在不同特征上分布的不均匀性,如果包含w某一个维度特征的训练样本很少,每一个样本都很珍贵,那么该特征维度对应的训练速率可以独自保持比较大的值,每来一个包含该特征的样本,就可以在该样本的梯度上前进一大步,而不需要与其他特征维度的前进步调强行保持一致。
参考:
后记
今天(17年8月)参照着上述公式,自己实现了spark版本的ftrl,后续弄成参数服务器版本的。
调用接口
以下代码为旧版本,新版本增加了treeAggregate:
var count = 0
// 注意要collect,否则有问题,血的教训
dataTrain.collect.foreach{ case lp: LabeledPoint =>
ftrlModel.update(lp.features.toSparse, lp.label.toInt)
count += 1
if (count % 100 == 0) {
saveMetric(sparkContext, dataTest, ftrlModel.ws, modelMetricPath + "/" + count.toString, count.toString)
}
}