티스토리 뷰
앞 글에서 두 가지 숙제를 남겼다. 하나는 수치 오차로 망가진 회전행렬을 가장 가까운 회전행렬로 되돌리는 일이고, 다른 하나는 앞으로 나올 삼각측량과 8점 알고리즘에서 $A\mathbf{x} = 0$ 을 푸는 일이다.
둘은 전혀 달라 보이는데 답을 주는 도구가 같다. SVD, 특이값 분해다. 이번 글은 SLAM에 필요한 만큼의 선형대수를 정리하고, SVD가 왜 이렇게 자주 등장하는지를 본다.
미리 결론부터 말하면 이렇다. 모든 행렬은 공간을 늘이고 돌리는 일을 한다. SVD는 그 동작을 "어느 방향으로 몇 배 늘어나는가"로 번역해 준다. 이 관점 하나로 위 두 문제가 동시에 풀린다.
1. 행렬은 원을 타원으로 만든다
행렬을 벡터에 곱하면 무슨 일이 벌어지는지 눈으로 보는 방법이 있다. 길이가 1인 벡터를 모든 방향으로 모으면 단위원이 된다. 이 원 위의 모든 점에 행렬 $A$ 를 곱해보면 결과는 항상 타원이다.
예를 들어 $A = \begin{bmatrix} 3 & 0 \\ 0 & 1\end{bmatrix}$ 은 가로로 3배 늘이고 세로는 그대로 둔다. 원이 가로로 길쭉한 타원이 된다. 대각선 성분이 있는 행렬은 여기에 회전까지 섞여서 기울어진 타원이 나온다.
타원이 나온다는 사실이 왜 중요할까. 타원은 가장 긴 축과 가장 짧은 축이 정해져 있고 그 둘은 항상 수직이기 때문이다. 즉 어떤 행렬이든 "가장 크게 늘어나는 방향"과 "가장 적게 늘어나는 방향"이 존재하고, 그 방향들은 서로 직각이다. 이 두 방향과 배율만 알면 행렬이 하는 일을 다 안 것이다.
2. SVD — 돌리고, 늘이고, 다시 돌리기
그림 1의 관찰을 식으로 적은 것이 특이값 분해다. 어떤 행렬이든 세 개의 행렬 곱으로 쪼갤 수 있다.
오른쪽부터 읽어야 한다. $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이 딱 이 이야기다.
3. 손으로 돌려보기
멀쩡한 행렬
$A = \begin{bmatrix} 2&1 \\ 1&2 \end{bmatrix}$ 을 쪼개 보자. 특이값을 구하려면 $A^{\top}A$ 의 고유값에 제곱근을 씌우면 된다.
고유벡터는 $(1,1)/\sqrt{2}$ 와 $(1,-1)/\sqrt{2}$ 다. 정말 그런지 직접 곱해서 확인해보자.
대각선 방향 $(1,1)$ 은 3배로 늘어나고, 반대 대각선 $(1,-1)$ 은 그대로다. 그림 1의 타원이 정확히 이 행렬을 그린 것이다.
망가진 행렬
이번엔 $A = \begin{bmatrix} 2&1 \\ 4&2 \end{bmatrix}$ 를 보자. 두 번째 행이 첫 번째 행의 정확히 2배다.
$\sigma_2 = 0$ 이다. 어떤 방향은 0배로 늘어난다, 즉 납작하게 눌려 사라진다는 뜻이다. 타원이 아니라 선분이 나온다. 눌려서 사라지는 방향은 $(1,-2)/\sqrt{5}$ 이고, 넣어보면 확인된다.
이렇게 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}$ 는 존재하지 않는다. 그래서 문제를 이렇게 고쳐 적는다.
"길이가 1인 벡터 중에서 $A$ 를 통과했을 때 가장 짧아지는 것을 찾아라." 그림 1로 돌아가면 답이 바로 보인다. 타원의 가장 짧은 축 방향이다. 그리고 그건 $V$ 의 마지막 열이다.
왜 마지막 열이 답인가
$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$ 이 유지된다.
$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차원 점들의 깊이 |
| 모든 특징점이 한 평면 위 | 일반적인 자세 복원 |
가장 큰 특이값과 가장 작은 특이값의 비를 조건수라고 하고, 이 값이 크면 문제가 불안정하다는 신호다. 입력의 작은 잡음이 출력에서 조건수만큼 증폭되기 때문이다.
셋째, 가장 가까운 회전행렬을 찾는다
앞 글에서 미뤄둔 문제다. 수치 오차로 $R^{\top}R$ 이 $I$ 에서 벗어난 행렬 $A$ 가 있을 때, $A$ 와 가장 비슷하면서 진짜 회전행렬인 것을 찾고 싶다. 답은 놀랄 만큼 간단하다.
늘이는 부분인 $\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. 확인 문제
- $A = \begin{bmatrix} 4&0 \\ 0&2 \end{bmatrix}$ 의 특이값과 조건수를 구하라. 타원은 어떤 모양인가?
- $A = \begin{bmatrix} 1&2 \\ 2&4 \end{bmatrix}$ 의 랭크는? $A\mathbf{x}=0$ 을 만족하는 방향을 찾아보라.
- 회전행렬 $R$ 의 특이값은 모두 얼마인가? 조건수는? 그림 1의 타원은 어떤 모양이 되는가?
- $\sigma_1 = 100$, $\sigma_2 = 0.001$ 인 문제에서 입력에 1픽셀 잡음이 있으면 출력 오차는 대략 몇 배로 커지는가?
- 모든 특징점이 한 평면 위에 있을 때 왜 특이값 하나가 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의 수치적 계산
'SLAM' 카테고리의 다른 글
| [SLAM] 7. 미분·테일러 전개·자코비안 — 곡선을 직선으로 속이는 기술 (0) | 2026.08.25 |
|---|---|
| [SLAM] 6. 가우시안과 베이즈 정리 — SLAM은 왜 확률 문제인가 (0) | 2026.08.25 |
| [SLAM] 4. 동차좌표와 4×4 변환행렬 — 회전과 이동을 도장 하나로 (0) | 2026.08.23 |
| [SLAM] 3. 회전을 적는 세 가지 방법 — 오일러각·회전행렬·쿼터니언 (0) | 2026.08.22 |
| [SLAM] 2. 내부 파라미터와 렌즈 왜곡 — 캘리브레이션은 왜 필요한가 (0) | 2026.08.20 |
- Total
- Today
- Yesterday
- 블랜더
- instant-ngp
- 제미나이37Flash
- 구글gemini
- ROS2
- Blenderproc
- ubuntu 20.04
- 사진으로 3D 모델링 하기
- Photogrammetry
- ROS2 #설치 #우분투20.04 #
- Gemini37
- RNNPose
- 인공지능트렌드
- 딥러닝
- aiagent
- 데이터셋 자동 생성
- 가상데이터셋
- 자세추정
- python 코드
- 제미나이
- Ceres-solver
- 딥러닝 데이터셋
- 6D Pose estimation
- SfM의 의존성
- RTX3090TI
- ConvGRU
- 데이터셋생성
- 라이브러리 설치
- OpenSfM
- 카메라 내부파라미터 #c++
| 일 | 월 | 화 | 수 | 목 | 금 | 토 |
|---|---|---|---|---|---|---|
| 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 |
