쿼터니언이란 무엇인가?

쿼터니언(Quaternion)이란 선형대수학에서 사용되는 개념으로 3차원 벡터 공간에서 회전을 표현하는 수학적 개념이다. 우리말로 사원수라고 일컬으며 4개의 요소로 구성된 복소수 시스템이다.

 

쿼터니언은 어떤 배경에서 고안되었는가?

쿼터니언은 3차원 공간의 회전을 표현한다고 했다. 이러한 3차원 공간의 회전을 표현하는 데 있어 원래는 오일러 각(roll, pitch, yaw)을 사용해 표현한다. 하지만 이 오일러 각을 사용할 경우 Gimbal Lock 현상이 발생한다. 잠깐 Gimbal에 대한 개념을 설명하자면, 단일 축에 대한 회전을 허용하는 수평 유지 장치를 의미한다. 

 

(좌): 각각의 짐벌은 roll, pitch, yaw의 자유도를 갖는다.

 

Gimbal Lock 현상은 3차원 공간상에서 두 축이 겹쳐 한 축이 소실되거나 자유도가 떨어지는 현상이다.  각 Gimbal들은 각자 특정 축(x, y, z)으로만 회전하도록 되어 있다. 하지만 위 우측 그림의 STATIC POSITION을 보면 맨 안쪽의 Gimbal은 다른 Gimbal을 회전시켜 두지 않는 이상 더 이상 roll 축으로 회전할 수 없게 된다. 이를 Gimbal Lock 현상이라 한다. 그렇다면 왜 Gimbal Lock 현상이 발생할까? 그 원인은 세 축이 의존적이기 때문이다. 예를 들어 z축을 회전시키면 x, y축도 함께 회전하게 되기 때문이다.

 

또 다르게 말하면 오일러 각에서 회전 자체를 세 축으로 나눠서 계산하기 때문이다. 예를 들어 어떤 물체 a가 있고 이 물체 a를 roll에 대해 회전하고 pitch에 대해 회전하고 yaw에 대해 회전한다고 가정하자. 어떤 물체 a는 roll에 대해 회전한 뒤 a’가 된다. 이후 pitch에 대해 회전한다고 하면 a에 대해 회전하는 게 아니라 a` 에서 회전하게 된다. 또 yaw에 대해 회전한다고 하면 a`가 아니라 a``에 대해 회전시킨다. 즉 각 축에 대한 회전은 이전 축에 의존하는 것이다.

 

쿼터니언은 이 Gimbal Lock 문제를 어떻게 해결할까?

쿼터니언은 정확히는 Gimbal Lock 문제를 해결하진 못한다. 다만 오일러 각을 사용해 회전을 표현할 때보다 Gimbal Lock 문제를 최소화시킬 수 있다. 쿼터니언은 4차원 복소수 공간의 벡터로 마찬가지로 벡터 공간에서의 회전을 표현하는 역할을 한다. 쿼터니언은 다음과 같은 형태를 가진다.

 

$$ q = xi + jy + zk + w $$

 

크게 보자면 쿼터니언 q는 xi + jy + zk는 벡터 요소, w는 스칼라 요소로 구성된다. i, j, k는 각각 x, y, z 축을 나타내는 허수 단위 벡터다. 이러한 쿼터니언은 4개의 요소로 구성되어 4차원 공간에서 회전을 표현한다. 이렇게 회전을 4차원으로 표현하는 쿼터니언은 세 개의 축을 사용하는 3차원 오일러 각과 달리 축의 의존성을 없애고 독립성을 가져오는 데 도움을 준다. 쿼터니언의 수식적 표현으로 파고들어 쿼터니언의 4차원 구조와 회전 연산 수식에 내재된 특성으로 짐벌락 문제를 해결하는 원리를 이해하는 데 도움될 수 있다 생각드나 짐벌락 문제 자체는 직관적으로 이해하는 것이 더 직접적이란 생각이 든다.

 

Reference

[1] https://handhp1.tistory.com/3

[2] https://luv-n-interest.tistory.com/805

[3] https://kangworld.tistory.com/185

[4] https://ko.wikipedia.org/wiki/짐벌

 

주성분 분석이란 무엇일까?

주성분 분석은 차원 축소에 사용되는 대표적인 알고리즘이다. 차원 축소는 고차원 공간 데이터를 저차원 공간으로 옮기는 것을 말한다. 그렇다면 이 차원축소가 왜 필요할까? 고차원으로 표현된 데이터는 계산 비용 많고 분석에 필요한 시각화가 어렵기 때문이다. 또 고차원을 이루는 피처 중 상대적으로 중요도가 떨어지는 피처가 존재할 수 있기 때문이다. 따라서 중요도가 낮은 피처를 제외하는 대신 계산 비용이나 비교적 준수한 성능을 얻는다. 주성분 분석을 진행하면 차원 축소로 인해 표현력이 일부 손실된다. 만약 4차원에서 2차원으로 축소를 통해 첫 번째 주성분과 두 번째 주성분을 얻고, 이 두 개가 원래 피처 표현력의 90%를 띤다면 나머지 10%의 손실을 감수하더라도 계산 효율을 얻게 된다. 

 

주성분 분석을 통해 저차원 공간으로 변환할 때 피처 추출(feature extraction)을 진행한다. 이는 기존 피처를 조합해 새로운 피처로 만드는 것을 의미한다. 이 때 새로운 피처와 기존 피처 간 연관성이 없어야 한다. 연관성이 없도록 하기 위해 직교 변환을 수행한다. 직교 변환을 수행하면 새로운 피처 공간과 기존 피처 공간이 90도를 이루게 된다. 즉 내적하면 0이 되는 것이다. 이러한 직교 변환을 수행할 때 기존 피처와 관련 없으면서 원 데이터의 표현력을 '잘' 보존해야 한다. 잘 보존하는 것은 주성분 분석의 핵심인 분산(Variance)을 최대로 하는 주축을 찾는 것이다.

 

여기서 분산이란? 데이터가 퍼진 정도를 의미한다. 예를 들어 만약 4차원 공간이 있고 3차원 공간으로 차원 축소를 한다면 3차원 공간상에서 데이터 분포가 넓게 퍼지는, 즉 분산을 가장 크게 만드는 벡터를 찾아야 한다. 만약 3차원 공간이 있고 2차원 공간으로 차원 축소한다면, 2차원 공간상에서 데이터 분포가 가장 넓게 퍼지도록 하는 벡터를 찾아야 한다. 만약 2차원 공간이 있고 1차원 공간으로 차원 축소 한다면 1차원 공간상에서 데이터 분포가 가장 넓게 퍼지게 만드는 벡터를 찾아야 한다.

 

애니메이션으로 이해하자면 다음과 같다. 

 

2차원 공간을 1차원으로 줄일 때 2차원에 넓게 퍼진 데이터 분포를 1차원 상에서도 똑같이 넓게 퍼질 수 있도록 하는 "벡터"를 찾아야 한다. 여기서 "벡터"는 곧 주축을 의미한다. 이 때 주축과의 동의어를 Eigen vector라고 한다. 주축을 찾고 주축에 피처들을 사상시키게 되면 주성분이 된다. 다르게 말해 피처들을 주축에 사상시킬 때 분산이 최대가 되는 주성분이 만들어진다. 이렇게 분산이 가장 큰 주성분을 첫 번째 주성분, 두 번째로 큰 축을 두 번째 주성분이라 한다. 

 

그렇다면 이 주축인 Eigen vector는 어떻게 구하고, Eigen vector에 피처를 어떻게 사상시킬수 있는 것일까? Eigen vector를 구하기 위해서는 특이값 분해 (SVD, Singular Value Decomposition)가 수행된다. 또 사상을 위해서 공분산 행렬이 필요하다. 따라서 사실상 PCA를 한마디로 말하면 데이터들의 공분산 행렬에 대한 특이값 분해(SVD)로 볼 수 있다. 먼저 공분산 행렬에 대해 알아보자.

 

공분산 행렬이란 무엇일까?

공분산은 한 마디로 두 피처가 함께 변하는 정도, 즉 공변하는 정도를 나타낸다. 수식으로 표현하면 다음과 같다.

 

$\sum = Cov(X) = {X^TX\over n}$

 

여기서 n은 행렬 X에 있는 데이터 샘플 개수를 나타내며 $X$란 전체 피처와 데이터 값을 나타낸다. X의 열축은 피처가 되고 X의 행축은 데이터 개수가 된다. 예를 들어 $x_1, x_2, x_3 $ 피처 3개가 있다고 가정하면 $X^T \times T$는 아래와 같이 표현할 수 있다. 

 

$X^T \times X = $ $\begin{vmatrix} 0.1 & 0.4 & 0.7 \\ 0.2 & 0.5 & 0.8 \\ 0.3 & 0.6 & 0.9 \end{vmatrix}$ $\times$ $\begin{vmatrix} 0.1 & 0.2 & 0.3 \\ 0.4 & 0.5 & 0.6 \\ 0.7 & 0.8 & 0.9 \end{vmatrix}$

 

전치 행렬과 행렬을 내적하게 되면  아래와 같은 대칭 행렬이 만들어진다.

 

$\begin{vmatrix} dot(x_1,x_1) & dot(x_1,x_2) & dot(x_1,x_3) \\ dot(x_2,x_1) & dot(x_2,x_2) & dot(x_2,x_3) \\ dot(x_3,x_1) & dot(x_3,x_2) & dot(x_3,x_3) \end{vmatrix}$

 

이 행렬에서 모든 대각 성분은 같은 피처 간 내적이므로 분산에 해당한다. 대각 성분 이외에는 모두 다른 피처 간 내적이므로 공분산에 해당한다. 즉 이러한 피처 간 내적을 통해 수치적으로 i번 피처와 j번 피처가 공변하는 정도를 알 수 있게 된다. 이것이 수식이 나타내는 의미이다. 수식에서 n으로 나눈 것은 공분산이 커질 수 있으므로 데이터 개수로 나누어 평균을 구한 것이다. 이렇게 만들어진 행렬을 공분산 행렬이라 한다. 

 

공분산 행렬이 가지는 의미는 무엇이고 어떻게 활용할까?

공분산 행렬은 피처 간에 서로 함께 변하는 정도를 의미한다고 했다. 공분산 행렬은 이러한 공변의 의미와 더불어 한 가지 의미가 더 있다. 그 의미는 바로 벡터에 선형 변환(사상)을 가능하게 하는 것이다. 즉, 공간상에 한 벡터가 있을 때 공분산 행렬을 곱해주게 되면 그 벡터의 선형 변환이 이루어진다. 이는 선형대수학에서 행렬이 벡터를 선형 변환시키는 역할을 하기 때문이다. 즉 공분산 행렬엔 피처간 공변 정보가 담겨 있으므로 이를 주축인 Eigen vector에 사상시키면 주성분을 구할 수 있다. 다음으로 주축을 구하기 위한 특이값 분해(SVD)를 살펴보자.

 

특이값 분해란 무엇이며 이를 통해 어떻게 Eigen vector를 구할 수 있을까?

먼저 특이값 분해란 일종의 행렬에서 이뤄지는 인수 분해다. 정확히는 행렬을 대각화하는 방법 중 하나이다. 대각화하는 이유는 대각화된 행렬의 대각선에 있는 값이 특이값(Singular Value)에 해당하기 때문이다. PCA에서 특이값 분해 대상은 위에서 본 공분산 행렬이다. 공분산 행렬을 특이값 분해 함으로써 PCA에 필요한 주축인 Eigen vector와, Eigen vector 스케일링에 필요한 Eigen value를 얻을 수 있다. Eigen value를 얻은 뒤 내림차순으로 정렬했을 때 가장 첫 번째 값이 분산을 최대로 하는 값이다.

 

일반적으로 특이값 분해는 고유값 분해(EVD)와 함께 설명된다. 고유값 분해의 경우 m x m의 정방 행렬에서만 사용할 수 있지만, 특이값 분해의 경우 m x n 인 직사각 행렬에도 적용가능하다. 따라서 일반화가 가능하단 장점이 있다. 또 특이값이란 고유값에 루트를 씌운 값이다. 그렇다면 특이값 분해는 어떻게 진행될까? 먼저 실수 공간에서 임의의 m x n 행렬에 대한 특이값 분해는 다음과 같이 정의된다.

 

$ A = U\sum V^T$

 

수식 성분이 나타내는 바는 다음과 같다. 참고로 여기서 $\sum$이란 합을 의미하는 기호가 아니라 행렬을 의미한다. 

 

$A = m \times n $ 직사각 행렬 (diagonal matrix)

$U = m \times m $ 직교 행렬 (orthogonal matrix)

$\sum = m \times n$ 직사각 대각행렬 (diagonal matrix)

$V = n \times x $ 직교 행렬 (orthogonal matrix)

 

 

특이값 분해를 이해하기 앞서 두 가지 선형대수적 특성을 알아야 한다. 첫 번째는 $U$, $V$가 직교 행렬이라면 선형대수적 특성에 의해 $UU^T = VV^T = E$, $U^{-1} = U^T, V^{-1} = V^T$가 만족한다는 것이다. 여기서 $E$는 항등행렬이다. 여기서 항등행렬이란 가령 $U$에 역행렬인 $U^{-1}$를 곱했을 때 나오는 행렬을 의미한다. 두 번째론 대칭 행렬은 고유값 분해가 가능하며 또 직교행렬로 분해할 수 있다는 것이다. 앞에 보았던 공분산인 행렬 $A$는 대각선으로 기준으로 값들이 대칭을 띠는 대칭 행렬이었다. 그러므로 고유값 분해 또는 직교행렬로 분해할 수 있다. 또 행렬 $A$가 대칭행렬이므로 $A^T$도 대칭 행렬이다.

 

결과적으로 PCA는 특이값 분해를 통해 $\sum$를 구하고자 한다. 이 $\sum$는 $AA^T, A^TA$를 고유값 분해해서 나오는 고유값들에 루트를 씌운 값들이 대각선에 위치하는 행렬이다. 그리고 $AA^T$와 $A^TA$의 고유값이 같다. 이를 증명하는 하는 과정은 다음과 같다.

 

앞서 특이값 분해의 정의는 $A = U\sum V^T$라고 했다. 이때 $A$는 대각행렬이므로 고유값 분해가 가능하다. 

 

$AA^T = (U\sum V^T)(U\sum V^T)^T$

            $= U\sum V^T V\sum^T U^T$ (이 때 $V^TV$ = $V^{-1}V$ 즉 직교행렬이므로 항등 행렬이 되어 사라짐)

            $= U(\sum \sum^T)U^T$

 

즉 $AA^T$를 고유값 분해하면 = $U(\sum \sum^T)U^T$가 된다. 또,

 

$A^TA = (U\sum V^T)^T(U\sum V^T)$

            $= V\sum^T U^TU\sum V^T$ (이 때 $U^TU$ = $U^{-1}U$ 즉 직교행렬이므로 항등 행렬이 되어 사라짐)

            $= V(\sum ^T\sum)V^T$

 

즉 $A^TA$를 고유값 분해하면 = $ V(\sum ^T\sum)V^T$가 된다.

 

그리고 이를 정리하고 덧붙이면,

$U$는 $AA^T$를 고유값 분해 해서 얻은 직교행렬이다. 그리고 U의 열벡터를 A의 left singular vector라 부른다.

$V$는 $A^TA$를 고유값 분해 해서 얻은 직교행렬이다. 그리고 V의 열벡터를 A의 right singular vector라 부른다.

$\sum$은 $AA^T, A^TA$를 고유값 분해해서 나온 고유값($\lambda$, eigen value)들의 제곱근을 대각원소로 하는 직사각 대각행렬이다. 

이 $\sum$의 대각원소들을 행렬 A의 특이값(singular value)라 부른다. 아래 수식과 같다. 

 

$\begin{vmatrix} \sqrt\lambda_1 & 0 & 0 & \dots \\ 0 & \sqrt\lambda_2 & 0 & \dots \\ 0 & 0 & \sqrt\lambda_3 & \dots \\ 0 & 0 & 0 & \dots \end{vmatrix}$

* 참고로 $\sum$의 경우 직사각 대각행렬이므로 m > n이거나 m < n인 경우로 나뉜다. 이 두 경우 모두 항상 대각선에만 특이값이 있어야 한다는 점만 상기하면 혼동되지 않는다. 

 

특이값들($\sum\sum^T or \sum^T\sum)$을 제곱하게 되면 $AA^T, A^TA$의 고유값과 같다.

 

결국 특이값 분해를 수행하게되면 $AA^T$와 $A^TA$의 고유벡터와, 고유값이 도출된다.

 

이후 고유벡터의 방향으로 피처들을 사상시키고, 고유값의 크기만큼 스케일링 해줌으로써 PCA 과정이 마무리 된다.

 

Reference

[1] Eigen Vector, Eigen Value: https://m.blog.naver.com/galaxyenergy/222123501087

[2] Covariance, SVD: https://www.youtube.com/watch?v=jNwf-JUGWgg 

[3] SVD: https://blog.naver.com/galaxyenergy/222865992256

[4] SVD: https://rfriend.tistory.com/185

[5] SVD: https://darkpgmr.tistory.com/106

[6] Image: https://medium.com/vlgiitr/principal-components-analysis-82a7682323e6

선형대수학을 볼 때마다 느끼지만 대수적으로만 기술되어 있다보니 늘 추상적으로 느껴지고 직관적이지가 않았습니다. 이번에 국문과 공대생이라는 블로그를 운영하시는 분의 글을 보다가 명불허전이라는 분의 선형대수 강의를 수강하고보니 선형대수 이해를 이렇게 잘 알려주는 사람이 있구나 하면서 감탄했습니다. 아무래도 선형대수에서 흔히 배우는 방식인 대수적인 측면이외에도 기하적인 측면의 설명과 더불어 시각화 자료가 높은 이해도의 핵심을 차지 한 것 같습니다. 

 

늘 선형대수를 보며 그래서 대체 물리와 어떻게 연결해 설명할 수 있는 것인지 궁금했습니다. 중고등학교때 함수나 미적분을 왜 배우는지 몰랐지만 지나고나니 물리학에서 파동을 기술하거나 다른 물리량을 알아내는 데에 쓰인다는 것을 알게 되었고, 수학으로 물리학을 말할 수 있다는 사실이 흥미로워지면서 더 관심을 갖게 됐습니다. 마찬가지로 선형대수도 물리학적으로 가지는 의미를 이해하면 더 이해가 높아질 것 같아서 그런 강의가 없을까 했는데 3Blue1Brown라는 유튜버의 강의를 접하고나서 많이 해소가 된 것 같습니다.

 

링크는 https://www.youtube.com/playlist?list=PLZHQObOWTQDPD3MizzM2xVFitgF8hE_ab 입니다. 총 16강으로 구성되어 있구요 각 강의는 10분대 내외로 짧게 이루어집니다. 서두가 길어지면서 홍보글 같긴하네요. 아무튼 강추합니다. 

 

첫 강의에서부터 선형대수를 바라볼 수 있는 3가지 측면을 언급하면서 시작합니다. 물리학의 관점, 컴퓨터 과학의 관점, 수학의 관점이 있다고 이야기합니다. 선형대수에서 자주 쓰이는 벡터는 물리학의 관점에서 화살표와 동일하며, 컴퓨터과학에서는 숫자 리스트, 수학의 관점에서는 모든 것이라 이야기합니다. 관점으로는 간단히 여기까지만 이야기하고 이후로는 선형대수의 개념에 대해 설명을 진행합니다. 저는 물리 이외에도 (당연하지만) 컴퓨터과학과 수학의 관점에서 바라볼 수 있다고 언급한 것에서 넘어가서 계속 보게 된 것 같습니다.

 

기초 벡터 연산

선형대수학에서는 크게 두 가지 기본적인 연산으로 이루어집니다. 벡터 합스칼라곱입니다. 벡터는 단순합니다. 화살표라고 생각해도 됩니다. 또는 화살표의 좌표를 나타내는 것이라 생각하면 됩니다. 이후 강의를 통해 스칼라의 의미를 처음으로 제대로 이해하게 됐습니다. 

 

 

스칼라는 단순히 숫자로만 이해하고 있었으나 위와 같이 하나의 벡터(화살표)의 길이를 늘리거나 줄이거나 방향을 바꾸는 것을 Scaling이라 하는데, 위의 그림과 같이 2, 1/3, -1.8과 같이 벡터 스케일링에 사용되는 숫자들을 스칼라(scalar)라고 한다고 합니다. (스칼라의 영어발음이 스케일라였습니다.) 즉 선형대수에서 스칼라는 벡터 스케일링을 목적으로 사용됩니다.

 

벡터에 스칼라를 곱하는 것은 숫자 리스트(행렬)라는 개념에서 리스트의 각 원소에 숫자를 곱하는 것과 같습니다. 스칼라를 이용해 벡터를 스케일링할 수 있고 이렇게 스케일링된 두 벡터끼리 더하는 것을 선형결합(linear combination)이라고 합니다. 

 

기저

기저 또한 처음으로 시원하게 강의를 듣게 되어 이해할 수 있었습니다. 기저를 설명하기 위해서는 먼저 2차원 x, y 좌표계상의 특별한 두 가지 벡터가 있다고 합니다. 바로 x축에 있는 단위 벡터(unit vector)인 $\hat{i}$와 y축에 있는 단위 벡터인 $\hat{j}$입니다. 이 둘을 좌표계의 기저(basis)라고 합니다. 

 

 

그렇다고하면 이 기저는 어떤 의미를 가지는가?라고 했을 때 핵심은 벡터의 변환을 구할 수 있다는 것입니다. 조금 더 설명하면 어떤 벡터 $(x, y)$가 있을 때 어떤 행렬을 거쳐서 공간상에 $(x', y')$로 매핑된다면 그 기저는 어떤 행렬이 되는 것입니다. 즉 Input vector $(x, y)$는 기저만 알고 있다면 바로 output vector $(x', y')$를 도출해낼 수 있는 것과 같습니다. 조금 더 자세히 말해 벡터가 행렬로부터 변환이 된다면 벡터를 이루는 기저 또한 변환이 되는데 결과적으로 변환된 기저벡터를 알고 있다면 어떤 벡터 $(x, y)$가 와도 변환을 바로 시킬 수 있다는 것입니다. (보충 설명은 앞으로 작성될 선형변환 포스팅에서 참고 바랍니다)

 

이 기저라고 하는 것은 암묵적으로 원점을 기준으로 하는 것으로 사용하고 있습니다. 때문에 움직이는 것은 두 벡터만 움직입니다. 두 벡터를 가지고 어디에 활용할까요? 아래와 같이 2차원 공간상의 모든 좌표를 표현할 수 있게 됩니다. 무한하고 평평한 2차원 평면을 만들 수 있다는 것입니다. 

 

 

이렇게 두 벡터를 통해 표현할 수 있는 공간을 Span이라고 합니다. 정확히 Span의 사전적 정의는 주어진 두 벡터 쌍의 조합으로 나타낼 수 있는 output vector의 집합입니다. 2차원 벡터쌍의 span은 대부분 2차원 공간 전체가 됩니다. 

 

하지만 이러한 span이 특정 선 위로 제한이 되는 경우도 있습니다. 바로 두 벡터 중 하나가 다른 벡터와 겹치게 되는 경우 입니다.

 

 

이럴 때는 Span이 2차원 공간이 아니라 단순히 직선 하나로 볼 수 있습니다. 이렇게 하나의 벡터가 다른 벡터에 겹치게 되어 Span이 한 차원 확장되지 못하는 경우를 선형 종속(Linear Dependent)이라고 합니다. 다시 말해 벡터가 하나만 있었다면 1차원 선만 표현하지만 2개라면 2차원을 표현해야합니다. 하지만 2개의 벡터가 있음에도 불구하고 1차원 밖에 표현하지 못하는 것을 의미합니다. 

 

반대로 하나의 벡터를 추가하여 기존 Span이외에 다른 차원을 추가해주는 것이 가능하다면 선형 독립(Linear Independent)라고 합니다. 이는 3차원에서도 마찬가지입니다.

 

 

세 개의 벡터가 있을 때 스팬은 모든 가능한 선형결합의 결과집합입니다. 즉, 세 개의 벡터로 모든 3차원 공간을 다 만들 수 있는 것과 동일합니다. 하지만 2차원과 마찬가지로 예외가 존재하는데, 만약 세 번째 벡터가 두 개의 벡터가 만드는 스팬(평면)에 놓여있다면 세 번째 벡터를 추가해도 스팬이 바뀌지 않습니다. 이를 선형종속이라 하였습니다.

+ Recent posts