콘텐츠로 이동

9강에서는 어떤 방향이 변환 뒤에도 방향을 유지하는지 고유값으로 읽었고, 10강에서는 벡터를 투영해 가장 가까운 해를 찾았습니다. 11강에서는 한 걸음 더 가서, 복잡한 행렬 전체를 중요한 방향 몇 개로 요약하는 방법을 봅니다. 그 도구가 특이값분해이고, 그 요약을 실제 압축으로 바꾸는 방법이 저랭크 근사입니다.

먼저 알아둘 말

  • 특이값분해: 행렬을 입력 방향, 축별 늘림, 출력 방향의 조합으로 분해하는 방법이다.
  • 특이값: 각 중요한 방향에서 얼마나 크게 늘어나거나 줄어드는지를 나타내는 값이다.
  • 오른쪽 특이벡터: 입력 쪽의 중요한 방향이다.
  • 왼쪽 특이벡터: 출력 쪽의 중요한 방향이다.
  • 랭크: 행렬이 실제로 살려 두는 독립적인 방향의 수다.
  • 저랭크 근사: 중요한 몇 개 방향만 남겨 원래 행렬을 단순하게 근사하는 방법이다.

이 강의에서 답할 질문

  • 왜 고유값분해만으로는 모든 행렬을 다루기 어려운가?
  • SVD는 행렬을 어떤 순서로 읽게 해 주는가?
  • 특이값은 왜 행렬의 중요한 크기를 나타내는가?
  • 왜 큰 특이값 몇 개만 남겨도 원래 정보를 많이 유지할 수 있는가?
  • 이미지 압축, 추천 시스템, 임베딩 압축에 왜 이 생각이 쓰이는가?

먼저 떠올릴 장면

  • 원을 어떤 선형변환에 통과시키면 타원으로 변합니다.
  • 이때 무엇이 중요할까요. 입력에서 어떤 방향이 가장 많이 늘어나는지, 또 그 결과가 출력에서 어떤 방향으로 나타나는지가 중요합니다.
  • 복잡한 변환도 결국 어느 방향을 얼마나 강하게 남기느냐로 읽을 수 있다면 훨씬 이해하기 쉬워집니다.

생각의 순서

  1. 먼저 왜 SVD가 필요한지 봅니다.
  2. 그다음 행렬이 입력 방향을 어떻게 바꾸는지 생각합니다.
  3. 이어서

$$ A = U\Sigma V^T $$

입력 방향 정렬 -> 축별 늘림 -> 출력 방향 정렬로 읽습니다. 4. 그다음 특이값이 큰 방향과 작은 방향의 의미를 봅니다. 5. 마지막으로 큰 특이값 몇 개만 남기는 저랭크 근사가 왜 압축이 되는지 연결합니다.

본문

고유값과 고유벡터는 매우 중요한 개념이지만, 모든 행렬에 바로 쓰기에는 한계가 있습니다. 고유값분해는 기본적으로 정사각행렬에서 잘 이야기되고, 어떤 행렬은 실수 범위에서 고유벡터를 충분히 가지지 않기도 합니다. 하지만 데이터 행렬은 직사각형인 경우도 많습니다. 예를 들어 사용자 수와 상품 수가 다른 추천 행렬, 단어 수와 문서 수가 다른 문서 행렬은 정사각형이 아닙니다.

그래서 더 넓게 쓸 수 있는 분해가 필요합니다. 그 역할을 하는 것이 특이값분해, 즉 SVD입니다.

행렬

$$ A $$

의 SVD는 다음과 같이 씁니다.

$$ A = U\Sigma V^T $$

여기서

$$ U $$

$$ V $$

는 직교행렬이고,

$$ \Sigma $$

는 대각선에 특이값이 놓인 행렬입니다.

이 식을 외우기보다 뜻으로 읽어야 합니다.

  • 먼저

$$ V^T $$

가 입력 공간의 좌표축을 다시 정렬합니다.

  • 그다음

$$ \Sigma $$

가 각 축을 서로 다른 비율로 늘리거나 줄입니다.

  • 마지막으로

$$ U $$

가 결과를 출력 공간의 방향으로 다시 놓아 줍니다.

즉 SVD는 복잡한 선형변환을 입력 방향 정렬 -> 축별 늘림 -> 출력 방향 정렬로 쪼개는 도구입니다. 흔히 회전-늘림-회전이라고 설명하는 것도 같은 뜻입니다.

그렇다면 특이값은 무엇일까요. 특이값

$$ \sigma_1,\sigma_2,\dots $$

는 각 중요한 방향에서 행렬이 얼마나 크게 작용하는지를 나타냅니다. 값이 크면 그 방향 정보는 강하게 남고, 값이 작으면 그 방향 정보는 많이 눌립니다. 특이값이 0이면 그 방향 정보는 완전히 사라집니다.

그래서 특이값을 보면 행렬이 어떤 방향을 중요하게 다루는지 알 수 있습니다. 큰 특이값은 행렬이 놓치지 않는 방향이고, 작은 특이값은 행렬이 거의 버리는 방향입니다.

오른쪽 특이벡터는 입력 쪽의 중요한 방향입니다. 즉 어떤 방향으로 입력을 넣었을 때 행렬이 가장 크게 반응하는지를 알려 줍니다. 왼쪽 특이벡터는 그 결과가 출력에서 어떤 방향으로 나타나는지를 말해 줍니다.

이제 랭크를 다시 생각해 봅시다. 랭크는 행렬이 실제로 만들어 낼 수 있는 독립적인 방향의 수입니다. SVD 관점에서는 0이 아닌 특이값의 개수와 같습니다. 왜냐하면 특이값이 0인 방향은 출력에서 완전히 사라지기 때문입니다.

이 점이 저랭크 근사로 이어집니다. 특이값을 큰 순서대로

$$ \sigma_1 \ge \sigma_2 \ge \cdots $$

라고 놓으면, 앞의 몇 개만 남기고 뒤의 작은 특이값을 버려도 원래 행렬의 큰 구조는 유지되는 경우가 많습니다. 그렇게 만든 근사 행렬을

$$ A_k $$

라고 쓰고, 이를 랭크

$$ k $$

저랭크 근사라고 합니다.

왜 이게 압축이 될까요. 원래는 행렬의 모든 원소를 저장해야 했지만, 저랭크 근사에서는 상위

$$ k $$

개의 특이값과 그에 대응하는 특이벡터만 저장하면 됩니다. 즉 전체 표를 다 저장하지 않고, 중요한 방향 정보만 저장하는 것입니다.

직관적으로 보면 데이터에는 중복이 많습니다. 이미지에서 비슷한 색과 패턴이 반복되고, 추천 행렬에서는 비슷한 취향의 사용자가 반복되고, 문서 벡터에서는 비슷한 의미 방향이 반복됩니다. 이런 중복은 작은 수의 중요한 방향으로 잘 요약될 수 있습니다.

예를 들어 이미지 행렬에 SVD를 하면, 큰 특이값 몇 개만으로도 큰 윤곽과 구조는 꽤 잘 남습니다. 세부 질감은 조금 사라질 수 있지만, 전체 모양은 유지됩니다. 그래서 압축이 가능합니다.

추천 시스템에서도 사용자-아이템 행렬 전체를 그대로 보기보다, 몇 개의 숨은 취향 축과 몇 개의 상품 특성 축으로 요약하는 것이 더 유용합니다. 이것도 저랭크 근사의 한 형태로 볼 수 있습니다.

결국 SVD는 행렬이 중요한 방향 몇 개를 어떻게 다루는가를 보여 주는 도구이고, 저랭크 근사는 그 구조를 이용해 계산을 가볍게 하고 노이즈를 줄이고 데이터를 압축하는 방법입니다.

예제

  1. 대각행렬에서 특이값 읽기 문제: 다음 행렬의 특이값을 말하라.

$$ A= \begin{bmatrix} 3 & 0 \ 0 & 1 \end{bmatrix} $$

풀이: 이 행렬은 이미 축 방향으로만 작용한다. x축은 3배, y축은 1배로 남기므로 특이값은 대각 원소의 절댓값이다.

$$ \sigma_1 = 3, \qquad \sigma_2 = 1 $$

해설: 복잡한 회전이 없는 경우에는 특이값이 각 축에서의 늘림 크기를 바로 보여 준다.

  1. 작은 특이값을 버린다는 뜻 읽기 문제: 어떤 행렬의 특이값이

$$ 5,\ 2,\ 0.1 $$

이라면 랭크 2 근사에서는 무엇을 버리는가?

풀이: 가장 작은 특이값

$$ 0.1 $$

에 대응하는 방향을 버린다.

해설: 이 방향은 행렬이 거의 살리지 않는 방향이므로, 제거해도 전체 구조 손실이 상대적으로 작다.

  1. 왜 저랭크 근사가 압축이 되는지 설명하기 문제: 왜 저랭크 근사가 압축으로 이어지는가?

풀이: 원래 행렬의 모든 원소를 저장하는 대신, 큰 특이값 몇 개와 대응하는 특이벡터 몇 개만 저장하면 되기 때문이다.

해설: 전체 데이터를 그대로 저장하지 않고 중요한 방향 정보만 저장하므로, 용량은 줄고 핵심 구조는 비교적 잘 유지된다.

스스로 점검

  1. 왜 직사각형 행렬에서도 SVD를 쓸 수 있는지 설명할 수 있는가?

$$ A = U\Sigma V^T $$

를 입력 방향, 늘림, 출력 방향의 순서로 읽을 수 있는가? 3. 큰 특이값과 작은 특이값의 차이를 말로 설명할 수 있는가? 4. 랭크와 0이 아닌 특이값의 개수가 왜 연결되는지 설명할 수 있는가? 5. 저랭크 근사가 이미지 압축이나 추천 시스템에 왜 유용한지 설명할 수 있는가?