[선형대수] 머신러닝에서의 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$개의 중요한 방향만 남겨서 압축한 근사 행렬을 의미한다.
출처: Deisenroth, Faisal, & Ong, Mathematics for Machine Learning
위 사진에서 각 성분 $A_i$가 단순한 기본 패턴을 담고 있음을 확인할 수 있다.
아래 사진을 보면, 큰 특이값부터 $k=5$개만 남겨도 데이터의 주요 구조가 유지되는 것을 확인할 수 있다.
출처: 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가 된다.
이 조립을 담당하는 것이 가중치 행렬 $W$이다.
$W$의 각 행벡터 $\mathbf{w}_j$는 출력 뉴런 $y_j$의 감지기로, 입력 Feature들을 적절히 조합하여 새로운 Feature 하나를 만들어낸다.
예를 들어 걷고 있는가라는 Feature를 감지하는 행은 다리 $x_1$과 몸통 $x_2$를 크게 반영하고, 무슨 종인가라는 Feature를 감지하는 행은 몸통 $x_2$와 귀 $x_3$를 크게 반영하는 식이다.
그런데 이 행벡터들은 서로 직교한다는 보장이 없다.
걷기를 판단하려 해도, 종을 판단하려 해도 몸통 정보는 필요하므로, 위의 예시에서 두 행벡터는 $x_2$에 대해 동일한 방향의 성분을 공유한다.
이처럼 여러 가중치 벡터가 비슷한 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가 무시하는 입력 패턴이다.
위 예시의 가중치 행렬 $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$이다.


