Apache spark 优化器LBFGS OWLQN实现

Apache spark 优化器LBFGS OWLQN实现,apache-spark,apache-spark-mllib,apache-spark-ml,Apache Spark,Apache Spark Mllib,Apache Spark Ml,我正在寻找有关Spark 1.6 ML库中并行LBFGS和OWLQN算法实现的文档 我在1.6版中找到了这个页面:但没有关于并行化的内容 对于2.0:但仍然没有关于并行化的内容 最后,我阅读了代码[link1]。方法 def train(dataset: DataFrame): LogisticRegressionModel 似乎使用Breeze优化了模型,但我没有找到spark函数的调用位置(map、flatMap、reduce等等) 在代码[link2]中,map用于计算次梯度,次梯度被简

我正在寻找有关Spark 1.6 ML库中并行LBFGS和OWLQN算法实现的文档

我在1.6版中找到了这个页面:但没有关于并行化的内容

对于2.0:但仍然没有关于并行化的内容

最后,我阅读了代码[link1]。方法

def train(dataset: DataFrame): LogisticRegressionModel
似乎使用Breeze优化了模型,但我没有找到spark函数的调用位置(map、flatMap、reduce等等)

在代码[link2]中,map用于计算次梯度,次梯度被简化为计算梯度


总之,Spark使用Breeze LBFGS和OWLQN优化算法,并为它们提供了在每次迭代中计算成本函数梯度的方法

例如,Spark的
LogisticRegression
类利用了一个
LogisticCostFun
类,该类扩展了Breeze的
DiffFunction
特性。此成本函数类实现了
计算
抽象方法,该方法具有以下签名:

覆盖def计算(系数:BDV[Double]):(Double,BDV[Double])
计算方法使用了一个
LogisticAggregator
类,这是完成实际工作的地方。聚合类定义了两个重要的方法:

def add(instance:instance):this.type//gradient更新公式在这里是硬编码的
def merge(other:LogisticAggregator):this.type//只是将other的渐变添加到当前渐变中
add方法定义了在添加单个数据点后更新渐变的方法,merge方法定义了组合两个单独聚合器的方法。这个类被发送给执行器,用于聚合每个数据分区,然后用于将所有分区聚合器合并到一个聚合器中。最后的聚合器实例保存当前迭代的累积梯度,并用于更新驱动程序节点上的系数。此过程由调用
logisticscostfun
类中的
treeAgregate
控制:

val物流集成商={
val seqOp=(c:LogisticAggregator,实例:instance)=>c.add(实例)
val combOp=(c1:LogisticAggregator,c2:LogisticAggregator)=>c1.merge(c2)
instances.treeAgregate(
新物流集成商(Coefs、numClasses、fitIntercept、featuresStd、featuresMean)
)(seqOp,combOp)
}

您可以更简单地这样想:Breeze实现了几种不同的优化方法(例如LBFGS、OWLQN),只需要您告诉优化方法如何计算梯度。Spark告诉Breeze算法如何通过
LogisticCostFun
类计算梯度
LogisticCostFun
只是说将一个
LogisticAggregator
实例发送到每个分区,收集梯度更新,然后将它们发送回驱动程序以进行组合

非常感谢你。这正是我想要的。