티스토리 뷰

반응형

앞 글에서 두 가지 숙제를 남겼다. 하나는 수치 오차로 망가진 회전행렬을 가장 가까운 회전행렬로 되돌리는 일이고, 다른 하나는 앞으로 나올 삼각측량과 8점 알고리즘에서 $A\mathbf{x} = 0$ 을 푸는 일이다.

둘은 전혀 달라 보이는데 답을 주는 도구가 같다. SVD, 특이값 분해다. 이번 글은 SLAM에 필요한 만큼의 선형대수를 정리하고, SVD가 왜 이렇게 자주 등장하는지를 본다.

미리 결론부터 말하면 이렇다. 모든 행렬은 공간을 늘이고 돌리는 일을 한다. SVD는 그 동작을 "어느 방향으로 몇 배 늘어나는가"로 번역해 준다. 이 관점 하나로 위 두 문제가 동시에 풀린다.


1. 행렬은 원을 타원으로 만든다

행렬을 벡터에 곱하면 무슨 일이 벌어지는지 눈으로 보는 방법이 있다. 길이가 1인 벡터를 모든 방향으로 모으면 단위원이 된다. 이 원 위의 모든 점에 행렬 $A$ 를 곱해보면 결과는 항상 타원이다.

예를 들어 $A = \begin{bmatrix} 3 & 0 \\ 0 & 1\end{bmatrix}$ 은 가로로 3배 늘이고 세로는 그대로 둔다. 원이 가로로 길쭉한 타원이 된다. 대각선 성분이 있는 행렬은 여기에 회전까지 섞여서 기울어진 타원이 나온다.

타원이 나온다는 사실이 왜 중요할까. 타원은 가장 긴 축가장 짧은 축이 정해져 있고 그 둘은 항상 수직이기 때문이다. 즉 어떤 행렬이든 "가장 크게 늘어나는 방향"과 "가장 적게 늘어나는 방향"이 존재하고, 그 방향들은 서로 직각이다. 이 두 방향과 배율만 알면 행렬이 하는 일을 다 안 것이다.

v1 v2 단위원 두 방향은 직교 A σ1 = 3 σ2 = 1 타원 직교는 유지되고 길이만 달라진다 어떤 행렬이든 원을 타원으로 만든다
그림 1. 직교하던 두 방향은 변환 후에도 직교한다. 달라지는 건 길이뿐이고, 그 배율이 특이값이다.

2. SVD — 돌리고, 늘이고, 다시 돌리기

그림 1의 관찰을 식으로 적은 것이 특이값 분해다. 어떤 행렬이든 세 개의 행렬 곱으로 쪼갤 수 있다.

EQ-01 · 특이값 분해
$$ A = U\,\Sigma\,V^{\top} $$

오른쪽부터 읽어야 한다. $V^{\top}$ 이 먼저 돌리고, $\Sigma$ 가 축 방향으로 늘이고, $U$ 가 다시 돌린다. 늘이는 일은 $\Sigma$ 혼자 하고 나머지 둘은 방향만 바꾼다.

기호읽는 법정체성질
$V$브이 입력 쪽 방향들. 각 열이 "이 방향으로 넣으면 깔끔하게 늘어난다"는 방향 직교
$\Sigma$시그마 대각선에 배율만 있는 행렬. 나머지는 전부 0 대각
$\sigma_i$시그마 아이 특이값. 늘어나는 배율. 항상 0 이상이고 큰 순서로 정렬 $\sigma_1 \ge \sigma_2 \ge \cdots \ge 0$
$U$ 출력 쪽 방향들. 늘어난 결과가 향하는 방향 직교
$v_n$브이 엔 $V$ 의 마지막 열. 가장 적게 늘어나는 방향. 이 글의 주인공

한 문장으로 정리하면 이렇다. $V$ 의 $i$ 번째 열을 넣으면 $U$ 의 $i$ 번째 열 방향으로 $\sigma_i$ 배 만큼 늘어나서 나온다. 그림 1이 딱 이 이야기다.

EQ-02 · 한 방향씩 보면
$$ A\,\mathbf{v}_i = \sigma_i\,\mathbf{u}_i $$

3. 손으로 돌려보기

멀쩡한 행렬

$A = \begin{bmatrix} 2&1 \\ 1&2 \end{bmatrix}$ 을 쪼개 보자. 특이값을 구하려면 $A^{\top}A$ 의 고유값에 제곱근을 씌우면 된다.

EQ-03 · $A^{\top}A$ 의 고유값
$$ A^{\top}A = \begin{bmatrix} 5&4 \\ 4&5 \end{bmatrix}, \qquad \lambda = 9,\; 1 \quad\Rightarrow\quad \sigma_1 = 3,\; \sigma_2 = 1 $$

고유벡터는 $(1,1)/\sqrt{2}$ 와 $(1,-1)/\sqrt{2}$ 다. 정말 그런지 직접 곱해서 확인해보자.

EQ-04 · 검산
$$ A\begin{bmatrix}1\\1\end{bmatrix} = \begin{bmatrix}3\\3\end{bmatrix} = 3\begin{bmatrix}1\\1\end{bmatrix}, \qquad A\begin{bmatrix}1\\-1\end{bmatrix} = \begin{bmatrix}1\\-1\end{bmatrix} = 1\cdot\begin{bmatrix}1\\-1\end{bmatrix} $$

대각선 방향 $(1,1)$ 은 3배로 늘어나고, 반대 대각선 $(1,-1)$ 은 그대로다. 그림 1의 타원이 정확히 이 행렬을 그린 것이다.

망가진 행렬

이번엔 $A = \begin{bmatrix} 2&1 \\ 4&2 \end{bmatrix}$ 를 보자. 두 번째 행이 첫 번째 행의 정확히 2배다.

EQ-05 · 특이값 하나가 0이 되는 경우
$$ A^{\top}A = \begin{bmatrix} 20&10 \\ 10&5 \end{bmatrix}, \qquad \lambda = 25,\; 0 \quad\Rightarrow\quad \sigma_1 = 5,\; \sigma_2 = 0 $$

$\sigma_2 = 0$ 이다. 어떤 방향은 0배로 늘어난다, 즉 납작하게 눌려 사라진다는 뜻이다. 타원이 아니라 선분이 나온다. 눌려서 사라지는 방향은 $(1,-2)/\sqrt{5}$ 이고, 넣어보면 확인된다.

EQ-06 · 영공간
$$ A\begin{bmatrix}1\\-2\end{bmatrix} = \begin{bmatrix}2-2\\4-4\end{bmatrix} = \begin{bmatrix}0\\0\end{bmatrix} $$

이렇게 0으로 눌리는 방향들의 모임을 영공간(null space)이라고 하고, 살아남는 방향의 개수를 랭크(rank)라고 한다. 이 행렬은 랭크가 1이다.


4. SLAM에서 SVD가 하는 일 세 가지

첫째, $A\mathbf{x} = 0$ 을 푼다

삼각측량, 8점 알고리즘, 호모그래피 추정에는 공통된 형태가 있다. 미지수를 모아 $\mathbf{x}$ 로 두면 문제가 항상 $A\mathbf{x} = 0$ 이 된다.

그런데 이 식에는 $\mathbf{x} = \mathbf{0}$ 이라는 시시한 답이 항상 있다. 그리고 실제 데이터에는 잡음이 있어서 정확히 0이 되는 $\mathbf{x}$ 는 존재하지 않는다. 그래서 문제를 이렇게 고쳐 적는다.

EQ-07 · 동차 최소자승 문제
$$ \min_{\|\mathbf{x}\| = 1} \|A\mathbf{x}\| $$

"길이가 1인 벡터 중에서 $A$ 를 통과했을 때 가장 짧아지는 것을 찾아라." 그림 1로 돌아가면 답이 바로 보인다. 타원의 가장 짧은 축 방향이다. 그리고 그건 $V$ 의 마지막 열이다.

EQ-08 · 답
$$ \mathbf{x}^{*} = \mathbf{v}_n \quad (\text{가장 작은 특이값에 대응하는 } V \text{의 열}) $$
왜 마지막 열이 답인가

$A = U\Sigma V^{\top}$ 을 대입하면 $\|A\mathbf{x}\| = \|U\Sigma V^{\top}\mathbf{x}\|$ 이다. $U$ 는 회전이라 길이를 바꾸지 않으므로 지워도 된다. $\mathbf{y} = V^{\top}\mathbf{x}$ 로 두면 $V$ 도 회전이라 $\|\mathbf{y}\| = \|\mathbf{x}\| = 1$ 이 유지된다.

보조식
$$ \|A\mathbf{x}\|^2 = \|\Sigma\mathbf{y}\|^2 = \sigma_1^2 y_1^2 + \sigma_2^2 y_2^2 + \cdots + \sigma_n^2 y_n^2 $$

$y_i^2$ 의 합이 1이라는 조건에서 이 값을 최소로 만들려면, 가장 작은 계수인 $\sigma_n^2$ 에 모든 무게를 몰아주면 된다. 즉 $\mathbf{y} = (0, \ldots, 0, 1)$ 이고, 되돌리면 $\mathbf{x} = V\mathbf{y} = \mathbf{v}_n$ 이다.

둘째, 정보가 없는 방향을 찾아낸다

특이값이 0에 가깝다는 건 그 방향으로는 데이터가 아무 말도 해주지 않는다는 뜻이다. SLAM에서 이런 상황을 퇴화(degeneracy)라고 부르고, 실제로 자주 벌어진다.

상황정보가 없는 방향
특징이 없는 긴 복도복도를 따라 얼마나 왔는지
평평한 벽만 보일 때벽에 수직인 거리
제자리에서 회전만 할 때3차원 점들의 깊이
모든 특징점이 한 평면 위일반적인 자세 복원

가장 큰 특이값과 가장 작은 특이값의 비를 조건수라고 하고, 이 값이 크면 문제가 불안정하다는 신호다. 입력의 작은 잡음이 출력에서 조건수만큼 증폭되기 때문이다.

EQ-09 · 조건수
$$ \kappa(A) = \frac{\sigma_1}{\sigma_n} $$
특이값의 비가 문제의 안정성을 결정한다 κ = 1 모든 방향이 똑같이 든든하다 κ = 3 세로 방향이 상대적으로 약하다 κ = ∞ · 퇴화 한 방향은 아무 정보도 없다
그림 2. 타원이 납작해질수록 그 방향의 추정이 잡음에 취약해진다. 완전히 눌리면 답을 정할 수 없다.

셋째, 가장 가까운 회전행렬을 찾는다

앞 글에서 미뤄둔 문제다. 수치 오차로 $R^{\top}R$ 이 $I$ 에서 벗어난 행렬 $A$ 가 있을 때, $A$ 와 가장 비슷하면서 진짜 회전행렬인 것을 찾고 싶다. 답은 놀랄 만큼 간단하다.

EQ-10 · 직교화
$$ A = U\Sigma V^{\top} \quad\Rightarrow\quad R = U V^{\top} $$

늘이는 부분인 $\Sigma$ 를 통째로 버리고 회전 부분만 남기는 것이다. 실제로는 반사가 섞이지 않도록 $\det(UV^{\top}) = -1$ 인 경우에 마지막 특이값의 부호를 뒤집어주는 보정을 넣는다. 이 계산은 나중에 두 점구름을 맞추는 ICP에서 그대로 다시 등장한다.


5. 왜 이 모양인가

왜 SVD는 항상 존재하나

고유값 분해는 아무 행렬에나 되지 않는다. 정사각행렬이어야 하고, 그마저도 대각화가 안 되는 경우가 있다. 반면 SVD는 어떤 크기의 어떤 행렬이든 항상 가능하다. 이유는 $A^{\top}A$ 라는 우회로에 있다.

$A$ 가 어떻게 생겼든 $A^{\top}A$ 는 항상 정사각이고 대칭이다. 대칭행렬은 고유값이 반드시 실수이고 고유벡터를 직교하게 잡을 수 있다는 정리가 있다. 게다가 $\mathbf{x}^{\top}A^{\top}A\mathbf{x} = \|A\mathbf{x}\|^2 \ge 0$ 이므로 고유값이 음수일 수 없다. 그래서 제곱근을 씌워 $\sigma_i$ 를 정의할 수 있고, 특이값이 항상 0 이상인 이유도 여기서 나온다.

고유값 분해와 무엇이 다른가

고유값 분해SVD
대상정사각행렬만아무 행렬이나
항상 되나아니오
축의 직교성보장 안 됨항상 직교
값의 부호음수·복소수 가능항상 0 이상
입력과 출력같은 방향 ($A\mathbf{v} = \lambda\mathbf{v}$)다른 방향 ($A\mathbf{v} = \sigma\mathbf{u}$)

대칭행렬에서는 둘이 사실상 같아진다. 공분산 행렬처럼 대칭인 대상에는 어느 쪽을 써도 된다는 뜻이다.

왜 "가장 짧은 축"이 답인가

직관으로 다시 보자. $A\mathbf{x} = 0$ 은 "이 방향으로 넣으면 아무것도 안 나온다"는 조건이다. 잡음이 있어 완전히 0은 못 만드니, 최대한 0에 가깝게 만드는 방향을 찾는다. 그건 곧 가장 적게 늘어나는 방향이고, 타원에서 가장 짧은 축이다. 데이터가 그 방향에 대해 가장 할 말이 없기 때문에 역설적으로 그게 답이 된다.


6. 실무에서 걸리는 것들

정규화를 안 하면 조건수가 폭발한다

8점 알고리즘에서 픽셀 좌표를 그대로 넣으면 $A$ 의 성분에 $u^2 \approx 10^5$ 짜리와 $1$ 짜리가 섞인다. 조건수가 $10^5$ 를 넘어가 답이 잡음에 완전히 묻힌다. 좌표를 중심이 0이고 평균 거리가 $\sqrt{2}$ 가 되도록 미리 정규화하는 절차가 반드시 들어가야 하는데, 이걸 넣고 빼는 것만으로 결과가 확연히 달라진다.

특이값 임계값은 절대값으로 잡으면 안 된다

"$\sigma < 10^{-6}$ 이면 0으로 본다"는 식의 코드는 위험하다. 데이터 스케일이 바뀌면 특이값도 통째로 스케일되기 때문이다. $\sigma_i / \sigma_1$ 처럼 가장 큰 특이값 대비 비율로 판단해야 스케일에 상관없이 같은 기준이 된다.

$U$ 와 $V$ 의 부호는 정해져 있지 않다

$\mathbf{u}_i$ 와 $\mathbf{v}_i$ 를 동시에 부호 뒤집어도 EQ-02가 그대로 성립한다. 그래서 라이브러리나 버전에 따라 부호가 다르게 나올 수 있다. 결과를 부호까지 비교하는 테스트를 짜면 환경이 바뀔 때마다 실패한다.

큰 문제에는 SVD를 쓰지 않는다

SVD는 $n \times n$ 행렬에 대해 $O(n^3)$ 이다. 8×9 짜리 작은 행렬에는 아무 문제가 없지만, 나중에 다룰 번들 조정처럼 미지수가 수만 개인 문제에는 쓸 수 없다. 그런 문제는 행렬 대부분이 0인 희소 구조를 갖는데, 그 구조를 이용하는 방법은 최적화 편에서 따로 다룬다.


7. 한 장 요약

보고 싶은 것SVD에서 읽는 곳
가장 크게 늘어나는 방향$\mathbf{v}_1$, 배율은 $\sigma_1$
$A\mathbf{x}=0$ 의 답$\mathbf{v}_n$ (마지막 열)
랭크0이 아닌 $\sigma$ 의 개수
퇴화 여부$\sigma_n / \sigma_1$ 이 0에 가까운가
가장 가까운 회전행렬$UV^{\top}$

핵심은 세 가지다. 첫째, 모든 행렬은 원을 타원으로 만들고, SVD는 그 타원의 축 방향과 길이를 알려준다. 둘째, $A\mathbf{x}=0$ 형태의 문제는 앞으로 계속 나오는데 답은 항상 "가장 짧은 축", 즉 $V$ 의 마지막 열이다. 셋째, 특이값의 비를 보면 그 문제가 믿을 만한지 아닌지가 드러난다.

그런데 그림 1의 타원은 이 글에서만 나오는 게 아니다. 로봇이 자기 위치를 얼마나 확신하는지도 타원으로 그려진다. 긴 복도에서는 진행 방향으로 길쭉하고, 기둥을 보고 나면 한쪽이 확 줄어드는 그런 타원이다. 그 타원을 만드는 행렬이 공분산이고, 축 방향과 길이를 읽는 방법은 방금 배운 것과 똑같다.

다음 글에서는 로봇이 왜 답을 하나로 못 박지 않고 확률로 들고 다니는지, 그리고 서로 다른 두 정보를 어떻게 합치는지를 본다. 0편에서 SLAM 문제를 확률로 적었던 이유를 그때 제대로 갚는다.


8. 확인 문제

  1. $A = \begin{bmatrix} 4&0 \\ 0&2 \end{bmatrix}$ 의 특이값과 조건수를 구하라. 타원은 어떤 모양인가?
  2. $A = \begin{bmatrix} 1&2 \\ 2&4 \end{bmatrix}$ 의 랭크는? $A\mathbf{x}=0$ 을 만족하는 방향을 찾아보라.
  3. 회전행렬 $R$ 의 특이값은 모두 얼마인가? 조건수는? 그림 1의 타원은 어떤 모양이 되는가?
  4. $\sigma_1 = 100$, $\sigma_2 = 0.001$ 인 문제에서 입력에 1픽셀 잡음이 있으면 출력 오차는 대략 몇 배로 커지는가?
  5. 모든 특징점이 한 평면 위에 있을 때 왜 특이값 하나가 0에 가까워지는지 말로 설명해보라.

참고 자료

  • Strang, Introduction to Linear Algebra — 7장 특이값 분해
  • Hartley & Zisserman, Multiple View Geometry — 부록 A5, SVD와 최소자승
  • Hartley (1997), In Defense of the Eight-Point Algorithm — 정규화가 조건수에 미치는 영향
  • Golub & Van Loan, Matrix Computations — SVD의 수치적 계산
반응형
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2026/09   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30
글 보관함