Ceres Solver 공식 튜 토리 얼 학습 노트 (2)

8590 단어 학습 노트
이 절의 내용 은 주로 공식 지침 서 Derivatives 부분 에서 번역 된다.
대부분의 최적화 소프트웨어 패키지 처럼 Ceres 구 해기 의 구 해 는 임의의 매개 변수 값 에서 목표 함수 의 각 항목 의 값 과 도 수 를 평가 할 수 있 기 때문이다.정확 하고 효율적으로 이 점 을 실현 하 는 것 은 우수한 연산 결 과 를 얻 는 데 매우 중요 하 다.Ceres 는 일련의 해결 방안 을 제 공 했 는데 그 중 하 나 는 Hello World 에서 사용 하 는 Automatic Differentiation (자동 미분 알고리즘) 이다.이 부분 에서 우 리 는 해석 법 (Analytic) 과 수치 법 (Numeric) 의 구 도 를 연구 할 것 이다.
수치 법 가이드 (Numeric Derivatives)
어떤 경우 에는 Hello World 에서 처럼 대가 함 수 를 정의 하 는 것 은 불가능 하 다.예 를 들 어 잔 차 값 (residual) 을 풀 때 라 이브 러 리 함 수 를 호출 했 는데 이 라 이브 러 리 함수 의 내부 알고리즘 은 관여 할 수 없습니다.이런 상황 에서 수치 미분 알고리즘 이 도움 이 된다.사용 자 는 CostFunctor 를 정의 하여 잔 차 값 을 계산 하고 NumericDiffCostFunction 수치 미분 대가 함 수 를 구축 합 니 다.예 를 들 어 f (x) = 10 − x f (x) = 10 − x 대응 함수 체 는 다음 과 같다.
struct NumericDiffCostFunctor {
  bool operator()(const double* const x, double* residual) const {
    residual[0] = 10.0 - x[0];
    return true;
  }
};

Hello World 에 있 는 Functor 의 정 의 를 다시 한 번 삽입 해도 됩 니 다.
struct CostFunctor {
   template <typename T>
   bool operator()(const T* const x, T* residual) const {
     residual[0] = T(10.0) - x[0];
     return true;
   }
};

이번 에는 템 플 릿 류 를 사용 하지 않 았 음 을 알 수 있다.
그리고 계속 추가 Problem
CostFunction* cost_function =
  new NumericDiffCostFunction<NumericDiffCostFunctor, ceres::CENTRAL, 1, 1>(
      new NumericDiffCostFunctor);
problem.AddResidualBlock(cost_function, NULL, &x);

Hello World 에서 automatic 알고리즘 을 사용 할 때의 코드 를 도입 하여 비교 합 니 다.
CostFunction* cost_function =
    new AutoDiffCostFunction1, 1>(new CostFunctor);
problem.AddResidualBlock(cost_function, NULL, &x);

두 가지 알고리즘 이 Problem 을 구축 할 때 기본적으로 차이 가 많 지 않다 는 것 을 알 수 있다.그러나 Nummeric 알고리즘 을 사용 할 때 매개 변수 ceres::CENTRAL 를 추가 로 지정 해 야 합 니 다.이 매개 변 수 는 컴퓨터 에 도 수 를 어떻게 계산 하 는 지 알려 준다.NumericDiffCostFunction 을 참조 할 수 있 는 Doc 문 서 를 더 구체 적 으로 소개 합 니 다.
Ceres 공식 적 으로 는 자동 미분 알고리즘 을 더욱 추천 합 니 다. C + 템 플 릿 류 는 자동 알고리즘 을 더욱 효율 적 으로 하기 때 문 입 니 다.수치 미분 산법 은 일반적으로 계산 이 더욱 복잡 하고 수렴 이 더 느리다.
해석 법 가이드 (Analytic Derivatives)
어떤 때 는 자동 구 해 알고리즘 을 응용 할 때 불가능 하 다.예 를 들 어 어떤 경우 에 도 도 수 를 계산 할 때 폐쇄 해 (closed form, 해석 해 라 고도 함) 를 사용 하 는 것 이 자동 미분 알고리즘 중의 체인 법칙 (chain rule) 을 사용 하 는 것 보다 효율 적 이다.여기 서 해석 과 수치 해석 을 분석 합 니 다.
구성 요소 특성 과 관련 된 방정식 을 풀 때 대부분 편 미분 이나 적분 식 을 풀 어야 정확 한 해 를 구 할 수 있 습 니 다.구 해 방법 에 따라 다음 과 같은 두 가지 로 나 눌 수 있다. 해석 해 와 수치 해.해석 해 (analytical solution): 엄격 한 공식 입 니 다. 임의의 독립 변 수 를 제시 하면 그 원인 변 수 를 구 할 수 있 습 니 다. 즉, 문제 의 해 입 니 다.다른 사람 은 이런 공식 을 이용 하여 각자 의 문 제 를 계산 할 수 있다.이른바 해석 해 는 분식, 삼각함수, 지수, 대수 심지어 무한 급수 등 기본 함수 의 해 를 포함 하 는 형식 이다.해석 을 구 하 는 방법 을 해석 법 인 이 라 고 하 는데 해석 법 은 흔히 볼 수 있 는 미적분 기법 이다. 예 를 들 어 분리 변수 법 등 이다.폐쇄 적 인 형식 인 의 함수 로 해석 되 기 때문에 모든 독립 변수 에 대해 우 리 는 이 를 해석 함수 에 가 져 와 정확 한 의존 변 수 를 구 할 수 있다.따라서 해석 해 는 폐 식 해 (closed - form solution) 라 고도 부른다.수치 해 (numerical solution): 유한 원 의 방법, 수치 접근, 삽입 값 의 방법 등 어떤 계산 방법 을 사용 하여 얻 은 해 입 니 다.다른 사람 은 수치 로 계산 한 결과 만 을 이용 할 수 있 을 뿐, 함부로 변수 에서 나 와 계산 치 를 구 해 서 는 안 된다.미적분 기법 으로 해석 해 를 구 할 수 없 을 때 이 때 는 수치 분석 방식 으로 그 수치 해 를 구 할 수 밖 에 없다.수치 방법 은 구 해 과정의 중요 한 매개체 가 되 었 다.수치 분석 과정 에서 먼저 원 방정식 을 간소화 하여 나중에 수치 분석 을 할 것 이다.예 를 들 어 미분 기호 (연속) 를 차분 기호 (이산) 로 바 꾸 는 등 이다.그 다음 에 전통 적 인 대수 방법 으로 원 방정식 을 다른 편리 한 풀이 형식 으로 바 꾸 었 다.이때 의 구 해 절 차 는 독립 변 수 를 가 져 와 서로 의존 하 는 변수의 유사 해 를 구 하 는 것 이다.따라서 이 방법 을 이용 하여 구 하 는 상호 의존 변 수 는 하나의 분 리 된 수치 인 'discrete values' 로 연속 적 인 분포 로 해석 하 는 것 과 같 지 않 고 상기 간단 한 동작 을 통 해 정확성 이 해석 법 보다 좋 지 않다 는 것 을 알 수 있다.인용: closed - form solution (폐 합 해 / 해석 해) 과 수치 해 의 이해
체인 법칙 은 위 키 백과 의 소개 와 예 를 참고 할 수 있다.여기 서 간략하게 아래 와 같이 발췌 하 다.
체인 법칙 이나 체인 규칙 (영어: chain rule) 은 복합 함수 도 수 를 구 하 는 법칙 이다.f f 와 g 를 x x 유도 함수 에 관 한 두 개의 함수 로 설정 하면 복합 함수 (f * 8728 ° g) (x) (f * 8728 ° g) (x) 의 도체 (f * 8728 ° g) 좋 을 것 같 아 (x) (f * 8728 ° g) 좋 을 것 같 아 (x):
(f∘g)′(x)=f′(g(x))g′(x). ( f ∘ g ) ′ ( x ) = f ′ ( g ( x ) ) g ′ ( x ) .
예 를 들 면:
함수
f (x) = (x2 + 1) 3 f (x) = (x 2 + 1) 3 의 도체.설치 하 다.
g(x)=x2+1 g ( x ) = x 2 + 1 ,
h (g) = g3 h (g) = g 3 이면
f(x)=h(g(x)) f ( x ) = h ( g ( x ) )
f′(x)=h′(g(x))g′(x)=3(g(x))2(2x)=3(x2+1)2(2x)=6x(x2+1)2. f ′ ( x ) = h ′ ( g ( x ) ) g ′ ( x ) = 3 ( g ( x ) ) 2 ( 2 x ) = 3 ( x 2 + 1 ) 2 ( 2 x ) = 6 x ( x 2 + 1 ) 2 .
이런 상황 에서 당신 은 스스로 잔 차 계산 코드 와 아크 비 행렬식 계산 코드 를 작성 할 수 있 습 니 다.아니면 Hello world 의 f (x) = 10 − x f (x) = 10 − x 를 예 로 들 면:
class QuadraticCostFunction : public ceres::SizedCostFunction<1, 1> { 
//     CostFunction  SizedCostFunction(               )   。
 public:
  virtual ~QuadraticCostFunction() {}
  virtual bool Evaluate(double const* const* parameters, 
                 //      
                        double* residuals,   
                         //      
                        double** jacobians) const {
                            //        
    const double x = parameters[0][0];
    residuals[0] = 10 - x;

    // Compute the Jacobian if asked for.
    if (jacobians != NULL && jacobians[0] != NULL) {
      jacobians[0][0] = -1;
    }
    return true;
  }
};
Evaluate 함 수 는 0 이 아 닌 지 검사 하 는 데 사 용 됩 니 다.그렇다면 잔 차 방정식 의 도 수 치 를 부여 하 라.
(이 문장 은 좀 헷 갈 려 서 번역 이 잘못 되 었 을 수 있 습 니 다: The jacobians array is optional, Evaluate is expected to check when it is non - null, and if it is the case then fill it with the values of the derivative of the residual function.)
이곳 의 잔 차 방정식 은 선형 방정식 이기 때문에 야 커 비 행렬식 은 상수 이다.
위 코드 세 션 을 통 해 알 수 있 듯 이 "CostFunction" 을 실현 하 는 것 은 좀 지루 합 니 다. 따라서 어떤 특별한 이유 가 있 으 면 스스로 야 커 비의 계산 을 구축 해 야 합 니 다. 그렇지 않 으 면 자동 미분 법 이나 수치 미분 법 을 사용 하여 잔 차 블록 을 만 드 는 것 이 좋 습 니 다.
기타 도체 계산 방법
지금까지 계산 도 수 는 Ceres 의 가장 복잡 한 부분 이 었 습 니 다. 필요 에 따라 사용 자 는 더 복잡 한 도체 계산 알고리즘 이 필요 할 때 가 있 습 니 다. 이 절 은 Ceres 를 어떻게 사용 하여 도체 계산 을 하 는 지 가장 쉬 운 부분 에 불과 합 니 다. Numeric 과 Auto 방법 에 대해 잘 알 고 있 으 면 jacobians, DynamicAutoDiffCostFunction, CostFunctionToFunctorNumericDiffFunctor 도 깊이 연구 할 수 있 습 니 다.ConditionedCostFunction 더 높 은 대가 함수 의 계산 방법 을 실현 한다.

좋은 웹페이지 즐겨찾기