AEGLOSLAB 로봇공학 전서(全書)

제1부 수학적 기초

1.12 최적화 I: 비선형 최소제곱 — 가우스-뉴턴·레벤버그-마콰트·강건 손실

1.12.1 이 장에서 배우는 것 / 선수 지식 / 특히 중요한 독자

이 장은 로봇공학의 추정·보정·정합 문제 대부분의 공통 형식인 비선형 최소제곱 $\min_x\tfrac12\sum_i\rho(\lVert r_i(x)\rVert^2)$를 푸는 방법을 다룬다. 잔차 $r_i$를 현재 점에서 선형화해 선형 최소제곱(1.2)을 반복하는 것이 가우스-뉴턴이고, 단계에 감쇠를 더해 수렴을 보장하는 것이 레벤버그-마콰트이며, $\rho$로 이상치의 영향을 줄이는 것이 강건 손실이다. 접공간에서의 갱신(1.8)을 사용하면 같은 알고리즘이 회전·변환의 다양체 위에서 작동한다. 다룰 질문은 다섯 가지다. 가우스-뉴턴은 어떤 근사이며 언제 빠르고 언제 실패하는가, 감쇠는 단계 크기를 어떻게 제어하는가, 강건 손실은 어떤 가중 최소제곱으로 구현되는가, 포즈 문제에서 야코비안은 어떻게 얻는가, 라이브러리(Ceres·SciPy)의 기본 설정과 결과는 이 장의 구현과 어떻게 대응하는가.

배우는 것:

  • 일차 근사와 가우스-뉴턴 — $g=J^\top r$, $H\approx J^\top J$, 수렴 차수와 잔차 크기.
  • 레벤버그-마콰트 — 감쇠 정규방정식, 이득비, 신뢰 영역 해석.
  • 강건 손실 — 허버·코시·투키, IRLS 가중치, 비볼록성과 초기값.
  • 다양체 위의 갱신 — $SE(3)$ 정합의 야코비안 $[-R[p]_\times,\ R]$.
  • 라이브러리 — Ceres의 기본 설정, SciPy least_squares와의 비교.

선수 지식: 1.2(최소제곱·정규방정식), 1.6(정합), 1.8(섭동), 1.10(스크루 변환). 표기는 BK-05와 A.2을 따른다.

특히 중요한 독자: 추정·보정·SLAM 구현자, 최적화 라이브러리 설정을 바꾸는 엔지니어, 이상치가 있는 정합을 다루는 연구자.

출처 방침. 서지는 Crossref 응답으로 확인했다(목록은 이 장 끝). 직접 읽은 자료: ① Ceres Solver의 loss_function.h(손실 정의)·solver.h(기본 옵션)·LICENSE(master), ② SciPy least_squares.py(손실 정의). 직접 실행한 것: SciPy 1.18.1(NumPy 2.5.4)의 least_squares. 읽지 못한 것: 인용한 교과서·논문의 본문(정리 번호는 (확인 필요)), Ceres의 실행과 문서, g2o·GTSAM. 이 장의 수치는 모두 순수 파이썬 구현으로 계산했으며 1.1의 LU 풀이, 1.6의 정합 닫힌 해, 1.10의 스크루 변환을 불러와 사용했다.

1.12.2 개념 — 선형화와 단계 제어

비선형 문제 $\min_x\tfrac12\lVert r(x)\rVert^2$는 현재 점 $x$ 둘레에서 $r(x+\delta)\approx r(x)+J\delta$로 선형화하면 선형 최소제곱 $\min_\delta\tfrac12\lVert r+J\delta\rVert^2$가 된다. 이 선형 문제의 해를 더해 점을 갱신하는 것이 가우스-뉴턴이다. 선형화는 $\delta$가 작을 때에만 맞으므로, 초기값이 해에서 멀면 선형 모형이 틀려 단계가 목적 함수를 오히려 키운다. 이를 막는 방법은 단계의 길이를 줄이는 직선 탐색과, 선형 모형을 신뢰하는 범위를 정하는 신뢰 영역(레벤버그-마콰트·도그레그)이다.

이상치가 있으면 제곱 손실은 큰 잔차 하나가 해를 끌어당긴다. 손실을 $\rho$로 바꾸면 큰 잔차의 영향이 줄지만 문제가 볼록하지 않을 수 있다. 이 장의 예제는 방위각만 측정하는 위치추정(초기값 민감도)과 이상치 20%가 있는 $SE(3)$ 정합(강건성)이다.

잔차 r·야코비안 J 감쇠 정규방정식 풀이 이득비 ρ 계산 (J⊤J + λD) δ = −J⊤r 마콰트 척도 D = diag(J⊤J) ρ > 0: 수락, λ 감소 ρ ≤ 0: 거절, λ 증가
레벤버그-마콰트의 한 번 반복. 잔차와 야코비안으로 감쇠 정규방정식을 풀고 이득비를 계산해, 단계를 수락하면 감쇠를 줄이고 거절하면 감쇠를 늘린다.

1.12.3 원리

1.12.3.1 일차 근사와 가우스-뉴턴

결론: 가우스-뉴턴은 뉴턴법의 헤시안에서 잔차의 이차 미분 항을 버린 근사이며, 해에서 잔차가 작으면 2차 수렴하고 잔차가 크면 1차(선형) 수렴한다.

$f(x)=\tfrac12\lVert r(x)\rVert^2$의 기울기와 헤시안은

$$g=J^\top r,\qquad \nabla^2f=J^\top J+\sum_ir_i\nabla^2r_i$$

이다. 가우스-뉴턴은 둘째 항을 버려 정규방정식 $(J^\top J)\,\delta=-J^\top r$를 푼다. $J$가 열 풀랭크이면 $\delta$는 하강 방향($g^\top\delta=-\lVert J\delta\rVert^2<0$)이다. 해에서 $r\approx0$이면 버린 항이 작아 뉴턴법에 가까운 2차 수렴이 되고, 잔차가 크면 버린 항 때문에 수렴이 선형이다. $J^\top J$의 조건수는 $J$의 조건수의 제곱이므로(1.2) 조건이 나쁜 문제에서는 QR을 사용한다. 이 장의 구현은 작은 문제여서 정규방정식을 LU로 푼다.

1.12.3.2 레벤버그-마콰트

결론: 감쇠 항 $\lambda D$를 더하면 단계가 가우스-뉴턴($\lambda\to0$)과 경사 하강($\lambda\to\infty$) 사이에서 연속적으로 바뀌며, 이득비로 $\lambda$를 조절하면 초기값이 멀어도 수렴한다.

$$(J^\top J+\lambda D)\,\delta=-J^\top r,\qquad D=\mathrm{diag}(J^\top J)\ \text{(Marquardt)}\ \text{또는}\ I\ \text{(Levenberg)}$$

$\lambda$가 크면 $\delta\approx-g/(\lambda D)$로 짧은 경사 방향 단계이다. 이 식은 반경이 $\lambda$에 따라 정해지는 신뢰 영역 부문제 $\min_\delta\tfrac12\lVert r+J\delta\rVert^2$ s.t. $\lVert D^{1/2}\delta\rVert\le\Delta$의 라그랑주 승수 형태이다(Moré 1978이 다룬다 (확인 필요: 정리 번호)). 단계 후 이득비

$$\rho=\frac{f(x)-f(x+\delta)}{\tfrac12\,\delta^\top(\lambda D\delta-g)}$$

(실제 감소 대 모형이 예측한 감소)를 계산해 $\rho>0$이면 수락하고 $\lambda\leftarrow\lambda\max\bigl(\tfrac13,\,1-(2\rho-1)^3\bigr)$로 줄이며, $\rho\le0$이면 거절하고 $\lambda\leftarrow\nu\lambda$, $\nu\leftarrow2\nu$로 늘린다. 이 갱신은 Nielsen의 방식으로 알려져 있으며 원 출처는 (확인 필요)이다. 원 논문은 Levenberg(1944)와 Marquardt(1963), 구현과 이론은 Moré(1978)가 다룬다. 도그레그 신뢰 영역은 이 장이 구현하지 않았으며 Powell의 방법으로 알려져 있다 (확인 필요: 원 출처).

1.12.3.3 강건 손실과 IRLS

결론: 비용 $\tfrac12\rho(s)$($s=\lVert r\rVert^2$)의 가우스-뉴턴 단계는 잔차마다 가중치 $\rho'(s)$를 곱한 가중 최소제곱이며(IRLS), 허버는 볼록이지만 코시·투키는 볼록하지 않아 초기값이 중요하다.

$$(J^\top W J)\,\delta=-J^\top Wr,\qquad W=\mathrm{diag}\bigl(\rho'(s_i)\bigr)$$

Ceres의 정의(loss_function.h에서 읽음)는 $s=\lVert r\rVert^2$에 대해 비용이 $\tfrac12\rho(s)$이고 척도 $a$에 대해 $a^2\rho(s/a^2)$로 바꾼다. 세 손실과 가중치는 다음과 같다.

손실$\rho(s)$ (척도 $a$)IRLS 가중치 $\rho'(s)$성질
제곱$s$1이상치에 약함
허버$s\ (s\le a^2)$, $2a\sqrt s-a^2\ (s>a^2)$$1\ (s\le a^2)$, $a/\sqrt s\ (s>a^2)$볼록, 큰 잔차의 영향이 선형
코시$a^2\log(1+s/a^2)$$1/(1+s/a^2)$비볼록, 큰 잔차의 영향이 완만히 감소
투키$\tfrac{a^2}{3}\bigl(1-(1-s/a^2)^3\bigr)\ (s\le a^2)$, $\tfrac{a^2}{3}\ (s>a^2)$$(1-s/a^2)^2\ (s<a^2)$, 0비볼록, $a$ 밖의 잔차를 완전히 무시

투키는 $a$ 밖의 잔차 가중치가 0이어서 모든 점이 $a$ 밖이면 정규방정식이 특이해진다. 그래서 비볼록 손실은 강건한 초기값에서 시작하는 것이 일반적이다(1.12.5). 이 장은 코시의 비볼록성을 이론으로 증명하지 않았으며 경험적 관찰만 보고한다. Huber(1964)가 허버 손실의 원 논문이고 Barron(2019)이 손실의 연속 족을 다룬다(서지 확인, 본문 미확인).

1.12.3.4 다양체 위의 갱신과 $SE(3)$ 정합의 야코비안

회전·변환 변수에는 접공간의 오른쪽 섭동(1.8)으로 갱신한다: $T\leftarrow T\,\mathrm{Exp}(\delta)$, $\delta=(\delta\omega,\delta v)$. 정합 잔차 $e_i=Rp_i+t-q_i$는 섭동 아래에서 1차 근사로 $Rp_i+t-q_i+R(\delta\omega\times p_i)+R\,\delta v$가 되므로 점마다 야코비안은

$$\frac{\partial e_i}{\partial(\delta\omega,\delta v)}=\bigl[\,-R[p_i]_\times\ \ \ R\,\bigr]\ \in\mathbb R^{3\times6}$$

이다. 점마다 $s_i=\lVert e_i\rVert^2$에 손실을 적용하고 세 행에 같은 가중치를 준다. 정합의 닫힌 해(1.6, SVD)는 제곱 손실의 해와 같으며 강건 손실의 해는 닫힌 형식이 없어 IRLS로 구한다. 추정 문제로 확장한 팩터 그래프 최적화는 9.8, 라이브러리는 9.9이 다룬다.

1.12.3.5 정지 기준과 라이브러리 설정

Ceres의 기본 옵션을 solver.h에서 읽었다.

옵션기본값의미
trust_region_strategy_typeLEVENBERG_MARQUARDT신뢰 영역 전략(도그레그도 지원)
initial_trust_region_radius$10^4$처음 반경
max_num_iterations50최대 반복
function_tolerance$10^{-6}$$\Delta f<$ 허용오차 $\times f$
gradient_tolerance$10^{-10}$투영 기울기의 최대 성분
parameter_tolerance$10^{-8}$단계 크기의 상대 값
min_lm_diagonal·max_lm_diagonal$10^{-6}$·$10^{32}$$D$의 대각 한계

SciPy의 least_squares는 method로 'trf'(신뢰 영역 반사)·'dogbox'·'lm'(MINPACK)을, loss로 'linear'·'huber'·'soft_l1'·'cauchy'·'arctan'을 받으며 $\rho(z)$는 $z=f^2$에 대해 정의되고 척도는 $C^2\rho(f^2/C^2)$이다(소스·문서 읽음). 이 장의 허버·코시 정의와 같은 $z$ 기준이다.

1.12.4 알고리즘

가우스-뉴턴, 레벤버그-마콰트, IRLS

가우스-뉴턴(x):  반복:  r ← res(x), J ← jac(x)
                  A ← JᵀJ, g ← Jᵀr ;  ‖g‖ < tol이면 종료
                  A δ = −g ;  (직선 탐색: a ← 1, f(x+aδ) < f(x)일 때까지 a ← a/2)
                  x ← x + aδ
레벤버그-마콰트(x, λ): 반복:  A, g 계산 ;  ‖g‖ < tol이면 종료
    반복(수락될 때까지):  (A + λ diag A) δ = −g ;  ρ ← (f(x) − f(x+δ)) / (½ δᵀ(λ diag(A) δ − g))
        ρ > 0이면 x ← x + δ ;  λ ← λ·max(1/3, 1 − (2ρ−1)³) ;  ν ← 2 ; 탈출
        아니면 λ ← νλ ;  ν ← 2ν
IRLS(x):  반복:  w_i ← ρ'(r_i²) ;  (JᵀWJ) δ = −JᵀW r ;  x ← x + δ
SE(3) 정합: T ← T Exp(δ) ;  J_i = [−R[p_i]×  R], 점마다 3개 행에 같은 w_i

구현은 1.12.5의 코드에 있다.

1.12.5 풀이 예제 — 초기값 민감도·수렴 차수·강건 정합과 SciPy 비교

방위각만 측정하는 2차원 위치추정에서 가우스-뉴턴·직선 탐색 가우스-뉴턴·레벤버그-마콰트의 수렴 비율을 측정하고, 잔차 크기에 따른 수렴 차수를 확인하며, 이상치 20%가 있는 $SE(3)$ 정합에서 제곱·허버·코시·투키 손실의 오차를 비교하고, SciPy와 같은 문제로 대조한다. 결론부터 적으면 다음과 같다. ① 초기값을 $[-30,40]^2$에서 무작위로 뽑으면 가우스-뉴턴은 5.0%만 수렴하고, 직선 탐색을 더하면 100%, 레벤버그-마콰트는 100%이다. ② 잔차가 0인 문제에서 가우스-뉴턴은 3번 반복에 $1.2\times10^{-9}$, 4번 반복에 $1.6\times10^{-15}$까지 2차로 수렴하고 잔차가 큰 문제에서는 반복당 약 0.19배인 1차 수렴이다. ③ 정합에서 제곱 손실의 회전 오차 중앙값은 $9.70^\circ$이고 허버 $0.116^\circ$·코시 $0.084^\circ$·투키 $0.084^\circ$이다. ④ SciPy의 trf·lm·dogbox는 같은 문제에서 100% 수렴하고 허버·코시 강건 해는 이 장의 IRLS와 $3\times10^{-9}$ 안에서 일치한다.

구현. normal_eq·gauss_newton·levenberg_marquardt·huber_w·cauchy_w·tukey_w. 1.1의 solve_lu, 1.6의 rigid_fit, 1.10의 twist_exp·compose

항목값
입력 1표지 4개 $(0,0),(10,0),(10,8),(0,8)$ m, 참 위치 $(4,3)$ m, 방위각 잡음 $\sigma=0.05$ rad, 시작점 500개($[-30,40]^2$ 균일, 시드 3)
입력 2같은 문제, 잡음 0 대 $\sigma=0.3$ rad, 시작 $(5.5,4.0)$
입력 3정합: 점 60개($[-1,1]^3$ m), 잡음 $\sigma=5$ mm, 이상치 20%($[-2,2]^3$ 균일), 100회(시드 21), 시작은 Kabsch 해
입력 4거리 측정 위치추정: 같은 표지, $\sigma=0.05$ m, 한 표지의 거리에 +5 m 편향
import math

def normal_eq(J, r, w=None):
    """A = J^T W J, g = J^T W r"""
    n = len(J[0])
    A = [[0.0] * n for _ in range(n)]
    g = [0.0] * n
    for k, (row, rk) in enumerate(zip(J, r)):
        wk = 1.0 if w is None else w[k]
        for i in range(n):
            g[i] += wk * row[i] * rk
            for j in range(n):
                A[i][j] += wk * row[i] * row[j]
    return A, g

def half_sq(r):
    return 0.5 * sum(x * x for x in r)

def gauss_newton(res, jac, x, it=50, tol=1e-10, ls=False):
    """(J^T J) d = -J^T r; ls면 후퇴 직선탐색"""
    for k in range(it):
        r, J = res(x), jac(x)
        A, g = normal_eq(J, r)
        if math.sqrt(sum(v * v for v in g)) < tol:
            return x, k
        d = solve_lu(A, [-v for v in g])[0]
        a = 1.0
        while ls and a > 1e-8:
            xn = [p + a * q for p, q in zip(x, d)]
            if half_sq(res(xn)) < half_sq(r):
                break
            a /= 2
        x = [p + a * q for p, q in zip(x, d)]
    return x, it

def levenberg_marquardt(res, jac, x, it=100, tol=1e-10,
                        lam=1e-3):
    """(A + lam diag A) d = -g, 이득비로 lam 갱신"""
    r, nu, n = res(x), 2.0, len(x)
    for k in range(it):
        A, g = normal_eq(jac(x), r)
        if math.sqrt(sum(v * v for v in g)) < tol:
            return x, k
        while True:
            M = [[A[i][j] + (lam * A[i][i] if i == j else 0.0)
                  for j in range(n)] for i in range(n)]
            d = solve_lu(M, [-v for v in g])[0]
            xn = [p + q for p, q in zip(x, d)]
            rn = res(xn)
            pred = 0.5 * sum(q * (lam * A[i][i] * q - g[i])
                             for i, q in enumerate(d))
            rho = (half_sq(r) - half_sq(rn)) / pred
            if rho > 0:
                x, r, nu = xn, rn, 2.0
                lam *= max(1 / 3, 1 - (2 * rho - 1) ** 3)
                break
            lam, nu = lam * nu, nu * 2
            if lam > 1e16:
                return x, k
    return x, it

def huber_w(s, a):
    """IRLS 가중치 rho'(s), s = ||r||^2"""
    return 1.0 if s <= a * a else a / math.sqrt(s)

def cauchy_w(s, a):
    return 1.0 / (1.0 + s / (a * a))

def tukey_w(s, a):
    return (1.0 - s / (a * a)) ** 2 if s < a * a else 0.0

① 초기값 민감도.

방법수렴 비율수렴한 경우의 평균 반복 수
GN5.0%7.3
GN+LS100.0%18.0
LM100.0%11.6

방위각의 야코비안은 점까지의 거리에 반비례($1/d$)하므로 초기값이 멀면 가우스-뉴턴의 전체 단계가 해를 크게 지나친다. 직선 탐색과 감쇠는 이를 막는다. 해석 야코비안과 중심차분의 차이는 아래와 같다.

항목값
참값에 가까운 해 $\hat x$$(4.127167,\ 2.705037)$
해석 야코비안 대 중심차분 최대 차이2.2e-09

② 수렴 차수. 같은 문제에서 해와의 거리를 반복마다 기록했다.

반복잔차 0 (오차)잔차 큼 (오차)
01.80e+002.66e+00
15.23e-023.34e-01
21.51e-042.63e-02
31.16e-092.55e-03
41.60e-155.11e-04
50.00e+009.13e-05
60.00e+001.77e-05
80.00e+006.43e-07
100.00e+002.34e-08
120.00e+008.52e-10
0 2 4 6 8 10 12 14 10−15 10−10 10−5 100 반복 해와의 거리 잔차 0 잔차 큼
가우스-뉴턴의 해와의 거리 대 반복(계산값). 잔차가 0이면 2차 수렴으로 5회 안에 기계 정밀도에 이르고, 잔차가 크면 반복당 약 0.19배인 1차 수렴이다.

잔차가 0이면 오차가 $5\times10^{-2}\to1.5\times10^{-4}\to1.2\times10^{-9}\to1.6\times10^{-15}$로 줄어 오차의 지수가 단계마다 2배 안팎으로 커지는 2차 수렴이다. 잔차가 크면 마지막 반복들에서 오차의 비가 일정(약 0.19)해 1차 수렴이다(관찰).

③ 강건 손실과 $SE(3)$ 정합. 100회 시행에서 참 포즈와의 오차이다.

방법회전 오차 중앙값 (°)회전 오차 최대 (°)이동 오차 중앙값 (mm)이동 오차 최대 (mm)
최소제곱(Kabsch)9.697523.751223.59419.9
허버 $a=0.02$0.11620.2952.285.3
코시 $a=0.02$0.08420.2071.122.7
투키 $a=0.05$(코시 해에서 시작)0.08430.2061.142.7
−4 −2 0 2 4 0 2 4 6 잔차 r 비용 ρ(r2)/2 제곱 허버 코시 투키
손실 함수의 비용 ρ(r²)/2(척도 1, 계산값). 제곱은 이차로 커지고 허버는 선형, 코시는 로그로 커지며 투키는 상한에서 일정하다.

제곱 손실(닫힌 해)은 이상치 20%에서 회전 오차가 $9.7^\circ$, 이동 오차가 224 mm이다. 허버는 이를 $0.12^\circ$·2.3 mm로, 코시는 $0.084^\circ$·1.1 mm로 줄인다. 투키는 코시 해에서 시작해 거의 같은 값에 이른다. 허버·코시는 Kabsch 해에서 시작했다. 투키를 Kabsch 해에서 바로 시작했을 때 정규방정식이 특이해져(LU의 영 피벗) 코시 해에서 시작하도록 바꿨다(가중치가 0인 점이 많은 것이 원인으로 보이나 (추정)).

④ 거리 측정의 편향 하나. 4개 거리 중 하나에 +5 m 편향이 있을 때의 위치추정이다.

방법위치 $(x,\,y)$참값 $(4,3)$과의 거리
최소제곱$(1.7327,\ 4.1956)$2.5632
허버 $a=0.2$$(3.7931,\ 3.1010)$0.2303
코시 $a=0.2$$(3.9346,\ 2.9904)$0.0661

측정이 4개뿐이어서 이상치 하나가 해를 크게 끌며 허버는 0.23 m, 코시는 0.066 m 벗어난다. 측정 수가 적으면 강건 손실의 효과가 제한된다.

⑤ SciPy 호출 결과(실행 2026-11-03). 스크립트는 robotics/fig-src/1.12-libcheck.py, 출력은 robotics/fig-src/data/1.12-libcheck-output.txt에 있다. 방위각 문제를 같은 시작점 500개로 least_squares(해석 야코비안)로 풀었다.

방법수렴 비율(해와 $10^{-6}$ 이내)평균 함수 평가 수
lm(MINPACK)100.0%14.4
trf100.0%11.5
dogbox100.0%14.0

강건 손실의 해를 같은 입력(1.12.5 입력 4, 척도 $a=0.2$)에서 비교했다.

손실이 장의 IRLSSciPy trf거리
허버$(3.793085,\ 3.101015)$$(3.793085,\ 3.101015)$$2.6\times10^{-9}$
코시$(3.934578,\ 2.990431)$$(3.934578,\ 2.990431)$$4.8\times10^{-10}$

⑥ 라이브러리 저장소(GitHub API, 조회 2026-11-03).

라이브러리저장소라이선스최신 릴리스마지막 푸시
Ceres Solverceres-solver/ceres-solverGitHub 필드는 NOASSERTION, LICENSE 본문은 BSD 계열 조항("Redistribution and use…")GitHub 릴리스 없음2026-11-02
SciPyscipy/scipyBSD-3-Clausev1.18.1·2026-08-212026-11-02

푸시 날짜는 유지의 대리 지표일 뿐이다(0.18). Ceres는 소스 헤더만 읽었고 실행하지 않았다.

한계. 수치는 합성 입력(시드 고정)이다. 방위각 문제의 수렴 비율은 이 표지 배치·시작점 분포에서의 값이며 5.0%는 일반 값이 아니다. 강건 정합은 이상치가 균일 분포인 경우이고 구조적 이상치(대응 오류가 한 방향으로 치우친 경우)는 다루지 않았다. 도그레그와 코시 이상의 다양한 강건 손실(아크탄젠트 등), 이득비 외의 신뢰 영역 갱신, 희소 구조 이용(9.8·9.9)은 구현하지 않았다. 수렴 차수 관찰은 한 문제의 값이다.

견해: 이 책은 비선형 최소제곱의 기본 해법으로 레벤버그-마콰트(또는 신뢰 영역)를 사용하고, 이상치가 있으면 허버로 시작해 필요할 때 코시 같은 비볼록 손실로 정제하는 순서를 기본으로 둔다고 본다. 근거는 위 예제에서 가우스-뉴턴이 5.0%만 수렴하는 데 비해 감쇠·직선 탐색을 더하면 100%이고, 투키를 Kabsch 해에서 시작했을 때 정규방정식이 특이해진 경우가 있었다는 점이다. 이 근거는 작은 합성 문제이다.

1.12.6 설계 트레이드오프 — 단계 제어와 손실의 선택

공개 문헌에서 확인되는 선택지는 세 가지다.

  • ① 가우스-뉴턴(직선 탐색 없음). 구현이 가장 단순하고 초기값이 좋으면 가장 빠르다.
  • ② 직선 탐색·신뢰 영역(레벤버그-마콰트·도그레그). 초기값에 강건하다. 감쇠 갱신이 필요하다.
  • ③ 강건 손실(IRLS)을 더한 위 방법. 이상치에 강하나 비볼록 손실은 초기값에 의존한다.
방식장점한계알맞은 경우
① 가우스-뉴턴단순, 2차 수렴(잔차 0)초기값 민감(5.0% 수렴)좋은 초기값, 실시간 증분
② 레벤버그-마콰트초기값에 강건(100%)반복당 비용, 파라미터일반 추정·보정
③ 강건 손실이상치 감쇠비볼록, 척도 $a$ 선택대응 오류·측정 이상치

견해: 척도 $a$는 이 장의 예제처럼 잡음 표준편차의 몇 배로 정하고 잔차 분포를 확인하는 것이 손실 선택보다 중요하다고 본다. 이 장은 허버 $a=0.02$와 투키 $a=0.05$를 잡음 5 mm의 4~10배로 정했고 척도를 바꿔 측정하지 않았으므로 이는 검증하지 않은 가설이다 (추정).

1.12.7 응용 축 비교

응용 축비선형 최소제곱이 맡는 일요구관련 장
산업·제조기구·카메라 보정, 손-눈 보정정확도1.6, 1.10
물류·이동포즈 그래프·정합의 반복 갱신규모, 강건성9.8, 9.39
도로 주행센서 융합과 지도 정합실시간, 이상치10.20
서비스경량 자세·위치추정연산량—
의료·헬스케어영상·수술 정합정밀도, 검증32.7
휴머노이드·범용전신 상태 추정수치 안정9.9
필드장시간 위치추정과 루프 클로징이상치9.39
국방·안보원리 수준에서 해당하는 고유 요구 없음——

이 표는 이 책의 정리이며 장별 요구는 다르다.

1.12.8 관련 규격·프로토콜

문서발행무엇을 정하나상세 장
Ceres SolverGitHub ceres-solver/ceres-solver비선형 최소제곱 라이브러리(손실·신뢰 영역 전략)9.9
SciPy least_squaresGitHub scipy/scipy(BSD-3-Clause)trf·dogbox·lm과 손실 함수—
「A method for the solution of certain non-linear problems in least squares」Levenberg, Q. Appl. Math. 2(2), 1944감쇠 최소제곱—
「An Algorithm for Least-Squares Estimation of Nonlinear Parameters」Marquardt, J. SIAM 11(2), 1963척도가 있는 감쇠—
「Bundle Adjustment — A Modern Synthesis」Triggs 외, LNCS 1883, 2000번들 조정의 최적화와 강건 손실10.2
수학 표기·기호표이 책잔차·야코비안 표기A.2

최적화 알고리즘의 표기에 국제 표준은 없다. 옵션의 기본값은 라이브러리마다 달라 소스를 읽는 것이 상호운용의 기준이다.

1.12.9 관련 규제·인증 요구와의 연결

직접 적용되는 규제는 없다. 보정·정합·추정의 수렴 실패(예: 가우스-뉴턴의 발산)는 안전 기능의 입력 오류로 이어질 수 있으므로 정지 기준과 실패 감지가 안전 관련 소프트웨어의 검증 항목이 될 수 있다. 소프트웨어 안전과 품질 표준은 26.20이 다룬다.

1.12.10 한계·유의점·미해결

  • 정리의 출처. 가우스-뉴턴의 수렴 차수·Nielsen 갱신·도그레그의 원 출처와 교과서 장 번호(Nocedal & Wright)는 확인하지 않았다 (확인 필요).
  • Ceres. 소스 헤더만 읽었고 실행하지 않았다. 손실에 대한 2차 보정(corrector)의 구현 세부는 읽지 않았다 (확인 필요).
  • 수렴 비율. 방위각 문제의 5.0%는 이 문제의 값이며 일반화하지 않는다.
  • 강건 손실. 구조적 이상치와 대응 오류의 비균일 분포는 다루지 않았다. 코시의 비볼록성은 증명하지 않았다.
  • 희소·대규모. 희소 정규방정식과 슈어 보수(9.8·9.9)는 다루지 않았다.

1.12.11 체크포인트·연구 질문

체크포인트:

  1. 비선형 최소제곱의 기울기와 헤시안에서 가우스-뉴턴이 버리는 항을 적고 그 결과를 설명할 수 있는가.
  2. 잔차의 크기가 수렴 차수에 주는 영향을 예제의 표에서 읽을 수 있는가.
  3. 레벤버그-마콰트의 감쇠 항이 단계에 주는 효과와 이득비로 $\lambda$를 조절하는 방법을 설명할 수 있는가.
  4. 허버·코시·투키의 $\rho$와 IRLS 가중치를 유도할 수 있는가.
  5. $SE(3)$ 정합 잔차의 야코비안 $[-R[p]_\times,\ R]$를 유도하고 갱신식 $T\leftarrow T\mathrm{Exp}(\delta)$를 쓸 수 있는가.
  6. 비볼록 손실에서 초기값이 중요한 이유와 투키의 특이를 설명할 수 있는가.
  7. Ceres·SciPy의 기본 정지 기준과 손실 정의를 소스에서 확인하는 방법을 말할 수 있는가.

연구 질문(47.12에 수록한다):

  • 대응 오류가 구조적인 정합(예: 같은 평면에 몰린 이상치)에서 허버·코시·투키의 오차는 어떻게 달라지는가.
  • 이득비 갱신과 도그레그의 수렴 비율·반복당 비용은 로봇 보정 문제에서 어떻게 비교되는가.
  • 강건 손실의 척도 $a$를 잔차 분포에서 자동으로 정하는 방법(예: 적응 손실)은 SLAM 후단 최적화에서 얼마나 효과적인가.

1차 출처

  • K. Levenberg, 「A method for the solution of certain non-linear problems in least squares」, Quarterly of Applied Mathematics 2(2), 164–168, 1944(doi:10.1090/qam/10666).
  • D. W. Marquardt, 「An Algorithm for Least-Squares Estimation of Nonlinear Parameters」, Journal of the Society for Industrial and Applied Mathematics 11(2), 431–441, 1963(doi:10.1137/0111030).
  • J. J. Moré, 「The Levenberg-Marquardt algorithm: Implementation and theory」, Lecture Notes in Mathematics 630, 105–116, 1978(doi:10.1007/bfb0067700).
  • J. Nocedal, S. J. Wright, 『Numerical Optimization』, 2판, Springer, 2006(doi:10.1007/978-0-387-40065-5) (확인 필요: 장 번호).
  • B. Triggs, P. F. McLauchlan, R. I. Hartley, A. W. Fitzgibbon, 「Bundle Adjustment — A Modern Synthesis」, Lecture Notes in Computer Science 1883, 298–372, 2000(doi:10.1007/3-540-44480-7_21) — 서지만 확인.
  • P. J. Huber, 「Robust Estimation of a Location Parameter」, Annals of Mathematical Statistics 35(1), 73–101, 1964(doi:10.1214/aoms/1177703732) — 서지만 확인.
  • J. T. Barron, 「A General and Adaptive Robust Loss Function」, CVPR 2019, 4326–4334(doi:10.1109/cvpr.2019.00446) — 서지만 확인.
  • GitHub API·소스(조회·실행 2026-11-03): ceres-solver/ceres-solver(loss_function.h·solver.h·LICENSE), scipy/scipy(least_squares.py; SciPy 1.18.1 실행).

다음 장. 1.13은 최적화 II로, 볼록 최적화와 이차 계획법(QP)을 다룬다. 비선형 최소제곱의 반복 단계를 부등식 제약이 있는 볼록 부문제로 확장하고 활성 집합법·내점법·ADMM의 구조와 OSQP·qpOASES·ProxQP의 설계를 정리한다.