Post

[선형대수] 머신러닝에서의 SVD: 데이터와 가중치 관점

[선형대수] 머신러닝에서의 SVD: 데이터와 가중치 관점

입력 데이터의 관점

SVD를 통해 행렬 $A$를 $U\Sigma V^\top$으로 분해할 수 있고, 이는 아래와 같이 표현할 수 있다.

\[A=U\Sigma V^\top=\sum_{i=1}^r\sigma_i\mathbf{u}_i\mathbf{v}_i^\top=\sum_{i=1}^r\sigma_iA_i \tag{1}\]

$r$은 $0$이 아닌 특이값의 개수로, $r=\text{rank}(A)$이다.

여기서 $A_i=\mathbf{u}_i\mathbf{v}_i^\top$는 두 벡터의 외적으로 만들어진 행렬이다.
행렬 $A_i$의 모든 열은 $\mathbf{u}_i$의 스칼라배이고, 모든 행은 $\mathbf{v}_i^\top$의 스칼라배이므로, 열공간이 1차원이다.
따라서 $A_i$는 Rank-1 행렬이다.

즉, $A$는 여러 Rank-1 행렬들의 선형 결합이고, $\sigma_i$는 $i$번째 성분이 $A$에 기여하는 크기를 나타낸다.

이를 데이터의 관점에서 읽으면, SVD는 데이터를 여러 패턴의 합으로 분해하는 것이 된다.

\[\text{데이터} =\sigma_1\cdot(\text{성분}_1)+\sigma_2\cdot(\text{성분}_2)+\sigma_3\cdot(\text{성분}_3)+\cdots\]

각 성분 $A_i$는 단순한 기본 패턴이고, 특이값 $\sigma_i$는 그 패턴이 데이터에 얼마나 세게 들어있나를 나타낸다.

이때 큰 $\sigma$와 작은 $\sigma$에는 서로 다른 종류의 정보가 담긴다.

  • 데이터에서 중요한 패턴은 여러 샘플에서 일관되게 반복되므로, 같은 방향으로 힘이 쌓여 큰 $\sigma$로 뭉치게 된다.
  • 반면 노이즈는 샘플마다 방향이 제각각이기 때문에, 서로 상쇄되어 수많은 작은 $\sigma$로 흩어진다.

따라서 상위 몇 개의 성분만 남기고 나머지를 버리면, 데이터의 주된 구조는 보존하면서 노이즈를 제거할 수 있다.
이러한 방법을 Rank-k 근사라고 부른다.

Rank-k 근사

SVD에서 특이값은 크기 순으로 정렬되어 있으며, 이 중 상위 $k$개의 항만 취했을 때를 Rank-k 근사 (Rank-k Approximation)라고 한다.

\[\hat{A}(k)=\sum_{i=1}^k\sigma_i\mathbf{u}_i\mathbf{v}_i^\top=\sum_{i=1}^k\sigma_iA_i \tag{2}\]

$\hat{A}(k)$는 $A$의 SVD에서 가장 큰 $k$개의 특이값과 대응되는 Rank-1 성분만 더한 것으로, 전체 정보를 $k$개의 중요한 방향만 남겨서 압축한 근사 행렬을 의미한다.

fig1 출처: Deisenroth, Faisal, & Ong, Mathematics for Machine Learning

위 사진에서 각 성분 $A_i$가 단순한 기본 패턴을 담고 있음을 확인할 수 있다.

아래 사진을 보면, 큰 특이값부터 $k=5$개만 남겨도 데이터의 주요 구조가 유지되는 것을 확인할 수 있다.

fig2 출처: Deisenroth, Faisal, & Ong, Mathematics for Machine Learning

Example: Rank-1 근사
\[A=\begin{bmatrix}3&2&2\\2&3&-2\end{bmatrix}\]

행렬 $A$에 대해 Rank-1 근사를 수행하기 위해, 먼저 SVD를 수행하여 $U$와 $V$ 행렬을 얻는다.

\[U=\frac{1}{\sqrt2}\begin{bmatrix}1&-1\\1&1\end{bmatrix}~~,~~V=\frac{1}{\sqrt2}\begin{bmatrix}1&-\frac{1}{3}&-\frac{2\sqrt2}{3}\\1&\frac{1}{3}&\frac{2\sqrt2}{3}\\0&\frac{4}{3}&\frac{\sqrt2}{3}\end{bmatrix}\]

$A$에 대한 Rank-1 근사는 다음과 같이 구할 수 있다.

\[A_1=\sigma_1\mathbf{u}_1\mathbf{v}_1^\top=5\cdot\frac{1}{2}\begin{bmatrix}1\\1\end{bmatrix}\begin{bmatrix}1&1&0\end{bmatrix}=\frac{5}{2}\begin{bmatrix}1&1&0\\1&1&0\end{bmatrix}\]


Eckart-Young Theorem

Eckart-Young Theorem은 모든 rank-k 행렬 $B$ 중에서 원본 $A$와 가장 가까운 최고의 근사 행렬은 SVD 기반의 rank-k 행렬 $\hat{A}(k)$라는 것을 수학적으로 증명해준다.

\[\hat{A}(k)=\underset{\text{rank}(B)=k}{\text{argmin}}~\lVert A-B\rVert_2 \tag{3}\]

이때의 오차는 $k+1$번째 특이값과 같다.

\[\lVert A-\hat{A}(k)\rVert_2=\sigma_{k+1} \tag{4}\]

가중치 행렬의 관점

신경망에서는 아래의 연산이 반복해서 일어난다.

\[\mathbf{y}=W\mathbf{x}\]

이때 입력 뉴런 $\mathbf{x}$​는 이전 layer에서 포착된 Feature, 출력 뉴런 $\mathbf{y}$는 현재 layer에서 포착한 Feature이다.

예를 들어, 뉴런 $\mathbf{x}=[x_1,~x_2,~x_3]$와 $\mathbf{y}=[y_1,~y_2]$가 다음의 의미를 담고 있다고 가정해 보자.

  • $x_1$: 다리가 보이는가
  • $x_2$: 몸통 실루엣이 보이는가
  • $x_3$: 귀가 보이는가
  • $y_1$: 걷고 있는가
  • $y_2$: 무슨 종인가

즉, $x_1$​이 크다는 건 이전 layer에서 다리 형태를 강하게 발견했다는 의미이고, 0에 가까우면 그런 것은 보이지 않는다는 의미이다.
그리고 각 $y_j$​는 이 $x_i$들을 가중합해 만든, 한 단계 더 추상적인 Feature가 된다.

fig3

이 조립을 담당하는 것이 가중치 행렬 $W$이다.
$W$의 각 행벡터 $\mathbf{w}_j$는 출력 뉴런 $y_j$의 감지기로, 입력 Feature들을 적절히 조합하여 새로운 Feature 하나를 만들어낸다.

\[W=\begin{bmatrix} \text{걷고 있는가}\\ \text{무슨 종인가} \end{bmatrix}= \begin{bmatrix} 1&1&0\\ 0&1&1 \end{bmatrix} \in\mathbb{R}^{2\times 3}\]

예를 들어 걷고 있는가라는 Feature를 감지하는 행은 다리 $x_1$과 몸통 $x_2$를 크게 반영하고, 무슨 종인가라는 Feature를 감지하는 행은 몸통 $x_2$와 귀 $x_3$를 크게 반영하는 식이다.

그런데 이 행벡터들은 서로 직교한다는 보장이 없다.
걷기를 판단하려 해도, 종을 판단하려 해도 몸통 정보는 필요하므로, 위의 예시에서 두 행벡터는 $x_2$에 대해 동일한 방향의 성분을 공유한다.

fig4

이처럼 여러 가중치 벡터가 비슷한 Feature를 함께 사용하면서 감지기들이 겹치고 중복될 수 있다.

SVD를 왜 하는가

1. 입력과 출력은 다른 공간이다

가중치 행렬 $W$는 입력 공간에서 출력 공간으로 매핑하는 선형사상이다.
이때 입력 공간과 출력 공간은 서로 다른 공간이다. (차원조차 다를 수 있음)

따라서 하나의 기저로는 두 공간을 동시에 담을 수 없고, 입력 공간을 정리할 기저와 출력 공간을 정리할 기저가 각각 필요하다.

SVD에서 $V$는 입력 공간의 기저, $U$는 출력 공간의 기저이므로, 두 공간을 각자의 기저로 따로 정리할 수 있다.

2. 크기 정보를 $\Sigma$ 한 곳에 모은다

정규직교 기저로의 좌표 변환은 길이와 각도를 보존한다.
즉 $U$와 $V$는 방향만 바꾸고 크기는 전혀 건드리지 않으므로, 크기(중요도) 정보는 전부 $\Sigma$ 한 곳에 모인다.

게다가 $\Sigma$는 대각행렬이므로, 그 크기 정보가 방향끼리 섞이지 않고 $\sigma_i$ 하나씩으로 분리된다.
$\sigma_i$는 $\mathbf{v}_i$ 방향 입력이 출력 크기에 기여하는 정도를 직접 나타내기 때문에, 다음과 같이 해석할 수 있다.

  • 큰 $\sigma$: 출력에 크게 반영되는 방향
  • 작은 $\sigma$: 버려도 출력이 거의 변하지 않는 방향

이러한 해석을 이용해 작은 $\sigma$에 해당하는 방향을 버림으로써, Low-Rank Approximation을 할 수 있다.

SVD

이 가중치 행렬을 SVD로 분해하면 중복을 정리할 수 있다.

\[\mathbf{y}=W\mathbf{x}=U\Sigma V^T\mathbf{x}\]

여기서 $V$는 입력 공간의 직교 축이고, $U$는 출력 공간의 직교 축이다.
구체적으로 Right Singular Vector $\mathbf{v}_i$와 Left Singular Vector $\mathbf{u}_i$는 다음의 역할을 한다.

  • Right Singular Vector: 가중치 행벡터들을 중복 없이 재구조화한 직교 패턴으로, 입력을 이 패턴들의 좌표로 다시 읽는다.

    \[c_i=\mathbf{v}_i^\top\mathbf{x}\]

    각 좌표 $c_i$는 입력이 패턴 $\mathbf{v}_i$를 얼마나 담고 있는가를 의미한다.

  • Left Singular Vector: 패턴 $\mathbf{v}_i$가 감지되었을 때, 그 신호가 어떤 출력 뉴런들로 분배되는지를 나타낸다.

    \[\mathbf{y}=(\sigma_1 c_1)\mathbf{u}_1+(\sigma_2 c_2)\mathbf{u}_2+\cdots\]

그리고 두 축 사이에서 특이값 $\sigma_i$는 각 패턴의 반영 세기를 결정한다.
큰 $\sigma$에 해당하는 $\mathbf{v}_i$는 해당 layer가 민감하게 반응하는 입력 패턴이고, $\sigma\approx0$에 해당하는 $\mathbf{v}_i$ 방향의 입력은 해당 layer가 무시하는 입력 패턴이다.

fig5

위 예시의 가중치 행렬 $W=\begin{bmatrix}1&1&0\\0&1&1\end{bmatrix}$를 실제로 SVD하면 다음과 같다.

\[\sigma_1=\sqrt3,\quad\sigma_2=1,\quad\sigma_3=0\] \[\mathbf{v}_1=\frac{1}{\sqrt6}\begin{bmatrix}1\\2\\1\end{bmatrix},\quad \mathbf{v}_2=\frac{1}{\sqrt2}\begin{bmatrix}1\\0\\-1\end{bmatrix},\quad \mathbf{v}_3=\frac{1}{\sqrt3}\begin{bmatrix}1\\-1\\1\end{bmatrix}\] \[\mathbf{u}_1=\frac{1}{\sqrt2}\begin{bmatrix}1\\1\end{bmatrix},\quad \mathbf{u}_2=\frac{1}{\sqrt2}\begin{bmatrix}1\\-1\end{bmatrix}\]

이때, Right Singular Vector들이 각각 다음의 의미를 담고 있다고 가정해 보자.

  • $\mathbf{v}_1$: 동물이 있다 (공통 패턴)
  • $\mathbf{v}_2$: 다리 쪽이냐 귀 쪽이냐 (대비 패턴)
  • $\mathbf{v}_3$: 무시되는 방향

$\mathbf{v}_1$은 두 행벡터가 겹치던 부분이 한 방향으로 뭉친 공통 패턴으로, 둘이 공유하던 $x_2$의 비중이 가장 크다.
두 뉴런이 함께 의존하는 방향이므로 가장 큰 특이값 $\sigma_1=\sqrt3$을 가지며, 이 layer가 가장 민감하게 반응하는 입력 패턴이 된다.

$\mathbf{v}_2$는 공유 성분인 $x_2$가 $0$으로 빠지고, 다리($+$)와 귀($-$)를 맞세우는 대비 패턴이다.
입력이 다리 위주인지 귀 위주인지를 가르는 정보로, 두 뉴런의 출력을 서로 다르게 만들어주는 역할을 한다.

$\mathbf{v}_3$는 $\sigma_3=0$에 대응하는, 이 layer가 완전히 무시하는 방향이다.
이 방향의 입력은 아무리 강하게 들어와도 출력에 아무 영향을 주지 못한다.
행벡터가 $2$개뿐이므로 $3$차원 입력 중 한 방향은 반드시 버려지는데, 그 방향이 바로 $\mathbf{v}_3$이다.

This post is licensed under CC BY 4.0 by the author.