스파크는 브리즈 LBFGS 및 OWLQN 최적화 알고리즘을 사용하며, 각각의 반복에서 비용 함수의 기울기를 계산하는 방법과 그 각을 제공한다.
클래스의 경우 예를 들어 Spark의 LogisticRegression
클래스는 Breeze의 DiffFunction
특성을 확장하는 LogisticCostFun
클래스를 사용합니다.
이
override def calculate(coefficients: BDV[Double]): (Double, BDV[Double])
계산 방법은 실제 작업이 완료되는 경우입니다 LogisticAggregator
클래스를 사용합니다 :이 비용 함수 클래스는 서명이있는 calculate
추상 메소드를 구현합니다. 집계 클래스는 두 가지 중요한 방법 정의 :
def add(instance: Instance): this.type // the gradient update equation is hard-coded here
def merge(other: LogisticAggregator): this.type // just adds other's gradient to the current gradient
추가 방법은 하나의 데이터 포인트를 추가 한 후 그라디언트를 업데이트하는 방법을 정의, 그리고 병합 방법은 두 개의 분리 된 어 그리 게이터를 결합하는 방법을 정의합니다. 이 클래스는 집행자에게 발송되어 각 데이터 파티션을 집계 한 다음 모든 파티션 애그리 게이터를 하나의 애그리 게이터로 결합하는 데 사용됩니다. 최종 애그리 게이터 인스턴스는 현재 반복에 대한 누적 그라데이션을 보유하고 드라이버 노드의 계수를 업데이트하는 데 사용됩니다. 브리즈는 여러 가지 최적화 방법 (예를 들어 LBFGS, OWLQN)를 구현 만에 당신이 필요합니다
val logisticAggregator = {
val seqOp = (c: LogisticAggregator, instance: Instance) => c.add(instance)
val combOp = (c1: LogisticAggregator, c2: LogisticAggregator) => c1.merge(c2)
instances.treeAggregate(
new LogisticAggregator(coeffs, numClasses, fitIntercept, featuresStd, featuresMean)
)(seqOp, combOp)
}
당신은 다음과 같이 좀 더 간단하게 생각할 수 있습니다 :이 프로세스는 LogisticCostFun
클래스 treeAggregate
호출에 의해 제어됩니다 그라데이션을 계산하는 방법을 최적화 방법에 알리십시오. Spark는 Breeze 알고리즘에 LogisticCostFun
클래스를 통해 그래디언트를 계산하는 방법을 알려줍니다. LogisticCostFun
은 각 파티션에 LogisticAggregator
인스턴스를 발송하고 그라디언트 업데이트를 수집 한 다음 다시 발송하여 드라이버에 결합하도록합니다.
링크 1 : https://github.com/apache/spark/blob/v1.6.0/mllib/src/main/scala/org/apache/spark/ml/classification/LogisticRegression.scala – DLSpark
링크 2 : HTTPS ://github.com/apache/spark/blob/master/examples/src/main/scala/org/apache/spark/examples/SparkLR.scala – DLSpark