선형 대수학 핵심 정리
선형 대수학은 벡터와 행렬을 다루는 수학이다.
처음 보면 고등학교 수학의 연장선처럼 보이지만, 실제로는 컴퓨터 그래픽스, 물리 엔진, 게임 개발, 머신러닝, 데이터 분석 등에서 상당히 많이 사용된다.
특히 게임 개발에서는 위치, 방향, 회전, 크기, 좌표 변환을 다루기 위해 벡터와 행렬을 사용한다. 머신러닝에서는 데이터를 벡터와 행렬로 표현하고 행렬 연산을 통해 신경망의 계산을 수행한다.
핵심 흐름은 다음과 같이 볼 수 있다.
스칼라 -> 벡터 -> 행렬 -> 선형 변환 -> 내적/외적 -> 고유값/고유벡터
스칼라
스칼라(Scalar)는 하나의 숫자다.
3
-2
0.5
100
크기만 가지고 있으며 방향은 없다.
게임에서 속도에 2를 곱하거나 벡터의 크기를 조절하는 경우처럼 단순한 수치 연산에 사용된다.
Vector * Scalar
예를 들어 속도가 다음과 같다고 하자.
velocity = (3, 4)
여기에 2를 곱하면
2 * (3, 4) = (6, 8)
벡터의 방향은 그대로이고 크기만 2배가 된다.
벡터
벡터(Vector)는 크기와 방향을 표현한다.
2차원에서는 보통 다음과 같이 표현한다.
v = (x, y)
3차원에서는
v = (x, y, z)
게임 개발에서 벡터는 거의 모든 곳에서 사용된다.
위치
방향
속도
가속도
힘
법선
이동량
Unity의 Vector3도 결국 3차원 벡터를 표현하는 자료형이다.
벡터의 덧셈
a = (1, 2)
b = (3, 4)
a + b = (4, 6)
두 이동량을 합치거나 여러 방향의 힘을 합칠 때 사용한다.
벡터의 크기
벡터
v = (x, y)
의 크기는 피타고라스 정리를 이용해서 구한다.
|v| = sqrt(x² + y²)
3차원에서는
|v| = sqrt(x² + y² + z²)
정규화
정규화(Normalization)는 벡터의 방향은 유지하면서 크기를 1로 만드는 것이다.
v_normalized = v / |v|
방향만 필요할 때 사용한다.
예를 들어 플레이어에서 적을 향하는 방향을 구할 때
direction = enemyPosition - playerPosition
direction = Normalize(direction)
처럼 사용할 수 있다.
내적
내적(Dot Product)은 두 벡터를 입력받아 하나의 스칼라를 반환한다.
a · b = axbx + ayby + azbz
또한 다음과 같은 관계가 있다.
a · b = |a||b|cosθ
여기서 중요한 것은 두 벡터의 방향 관계를 알 수 있다는 점이다.
정규화된 두 벡터라면
a · b = cosθ
가 된다.
따라서 내적을 이용하면 다음과 같은 판단이 가능하다.
a · b > 0 -> 비슷한 방향
a · b = 0 -> 서로 수직
a · b < 0 -> 반대 방향
게임에서는 시야 판정에 자주 사용한다.
directionToTarget · forward
값이 충분히 크다면 대상이 플레이어가 바라보는 방향에 가까이 있다는 뜻이다.
빛과 표면의 관계에서도 사용된다.
normal · lightDirection
이 값은 조명 계산의 기본적인 요소가 된다.
외적
외적(Cross Product)은 3차원 벡터 두 개를 입력받아 두 벡터에 모두 수직인 새로운 벡터를 만든다.
a × b
결과 벡터의 방향은 오른손 법칙으로 결정된다.
외적은 게임 개발에서 특히 중요하다.
대표적으로 다음에 사용한다.
법선 벡터 계산
회전 방향 판단
좌우 방향 계산
평면의 방향 계산
3차원 공간에서의 좌표 계산
두 방향 벡터가 있을 때
right = forward × up
처럼 다른 방향 벡터를 만들 수도 있다.
내적이 주로 두 방향 사이의 관계를 수치화한다면, 외적은 두 방향으로부터 새로운 수직 방향을 만든다고 이해하면 편하다.
행렬
행렬(Matrix)은 숫자를 행과 열의 형태로 배치한 것이다.
[ 1 2 ]
[ 3 4 ]
2×2 행렬이라고 부른다.
행렬은 단순히 숫자를 모아놓은 표가 아니다.
선형 변환을 표현하는 도구로 사용하는 것이 핵심이다.
벡터 -> 행렬 -> 변환된 벡터
게임에서는 행렬을 이용해 좌표를 변환한다.
Local Space -> World Space -> View Space -> Clip Space
행렬 곱셈
행렬 곱셈은 일반적인 숫자 곱셈과 다르다.
두 행렬
A = [ a b ]
[ c d ]
B = [ e f ]
[ g h ]
를 곱하면
AB = [ ae + bg af + bh ]
[ ce + dg cf + dh ]
가 된다.
행렬 곱셈에서 중요한 특징 중 하나는 교환법칙이 성립하지 않는다는 것이다.
일반적으로
AB != BA
이다.
이 특성은 게임 개발에서 매우 중요하다.
예를 들어
이동 -> 회전
과
회전 -> 이동
은 결과가 다르다.
그래서 Transform을 구성할 때도 변환 순서가 결과에 영향을 준다.
선형 변환
선형 대수학에서 가장 중요한 개념 중 하나다.
선형 변환(Linear Transformation)은 벡터 공간의 구조를 유지하면서 벡터를 다른 벡터로 변환하는 함수다.
조건은 다음 두 가지다.
T(u + v) = T(u) + T(v)
T(cu) = cT(u)
즉 벡터의 덧셈과 스칼라 곱 관계를 유지한다.
행렬은 선형 변환을 표현하는 대표적인 방법이다.
v' = Av
여기서
v -> 원래 벡터
A -> 변환 행렬
v' -> 변환된 벡터
가 된다.
대표적인 변환 행렬
2차원에서 회전 행렬은 다음과 같다.
[ cosθ -sinθ ]
[ sinθ cosθ ]
벡터에 이 행렬을 곱하면 벡터가 θ만큼 회전한다.
크기 조절은 다음과 같이 표현할 수 있다.
[ sx 0 ]
[ 0 sy ]
이동은 일반적인 선형 변환만으로 표현하기 어렵기 때문에 3차원 그래픽스에서는 보통 동차 좌표(Homogeneous Coordinates)를 사용한다.
동차 좌표
3차원 위치
(x, y, z)
에 하나의 좌표를 추가해서
(x, y, z, 1)
로 표현한다.
이를 이용하면 이동, 회전, 크기 조절을 하나의 4×4 행렬로 표현할 수 있다.
Local Position
-> Scale
-> Rotation
-> Translation
-> World Position
그래픽스에서 4×4 행렬이 자주 등장하는 이유가 이것이다.
행렬식
행렬식(Determinant)은 정사각행렬에서 계산되는 하나의 값이다.
2×2 행렬
A = [ a b ]
[ c d ]
의 행렬식은
det(A) = ad - bc
이다.
행렬식은 단순한 숫자 이상의 의미를 가진다.
특히 중요한 것은 다음이다.
det(A) != 0
이면 역행렬이 존재할 수 있고,
det(A) = 0
이면 역행렬이 존재하지 않는다.
또한 선형 변환이 공간의 크기를 얼마나 변화시키는지와도 관련이 있다.
예를 들어 2차원에서 행렬식의 절댓값이 2라면 변환된 도형의 넓이가 원래보다 2배가 된다.
역행렬
행렬 A의 역행렬은 다음 조건을 만족하는 행렬이다.
AA⁻¹ = A⁻¹A = I
여기서 I는 단위행렬이다.
숫자에서
5 * 1/5 = 1
인 것과 비슷한 개념이다.
행렬을 이용해서 변환했다면 역행렬을 이용해 원래 상태로 되돌릴 수 있다.
World Space -> Local Space
같은 좌표 변환에서 자주 사용한다.
연립방정식과 행렬
선형 대수학은 연립방정식을 행렬 형태로 표현할 수 있다.
예를 들어
2x + 3y = 7
4x + y = 5
를 다음처럼 표현할 수 있다.
[ 2 3 ] [ x ] = [ 7 ]
[ 4 1 ] [ y ] [ 5 ]
이를
Ax = b
형태로 표현한다.
여기서 행렬을 이용하면 많은 수의 연립방정식을 체계적으로 처리할 수 있다.
가우스 소거법
가우스 소거법(Gaussian Elimination)은 연립방정식을 풀기 위해 행렬을 변형하는 방법이다.
기본적인 흐름은 다음과 같다.
연립방정식 -> 확대 행렬 -> 행 연산 -> 행 사다리꼴 -> 해 계산
행 연산에는 다음 세 가지가 있다.
두 행 교환
한 행에 0이 아닌 상수 곱하기
한 행에 다른 행의 배수를 더하기
이 방법은 선형 시스템을 해결하는 기본적인 알고리즘이다.
벡터 공간
벡터 공간(Vector Space)은 벡터의 덧셈과 스칼라 곱이 정의된 공간이다.
2차원 벡터 공간에서는
(x, y)
형태의 모든 벡터를 다룰 수 있다.
3차원에서는
(x, y, z)
가 된다.
벡터 공간을 이해하면 이후에 나오는 기저, 차원, 선형 독립 같은 개념도 자연스럽게 연결된다.
선형 독립
벡터 집합이 선형 독립이라는 것은 어느 한 벡터가 다른 벡터들의 조합으로 만들어지지 않는다는 의미다.
예를 들어
v1 = (1, 0)
v2 = (0, 1)
은 선형 독립이다.
반면
v1 = (1, 2)
v2 = (2, 4)
는 선형 독립이 아니다.
두 번째 벡터가 첫 번째 벡터의 2배이기 때문이다.
선형 독립은 기저를 이해하기 위한 핵심 개념이다.
기저
기저(Basis)는 벡터 공간의 모든 벡터를 표현할 수 있는 선형 독립 벡터 집합이다.
2차원 공간의 대표적인 기저는
(1, 0)
(0, 1)
이다.
이 두 벡터를 조합하면 모든 2차원 벡터를 만들 수 있다.
(x, y) = x(1, 0) + y(0, 1)
게임에서 사용하는 좌표계의 right, up, forward 같은 방향 벡터도 기저와 연결해서 생각할 수 있다.
차원
차원(Dimension)은 벡터 공간의 기저가 가지고 있는 벡터의 개수다.
2차원 -> 기저 2개
3차원 -> 기저 3개
다만 차원은 단순히 공간의 모양을 의미하는 것이 아니다.
어떤 공간을 표현하는 데 필요한 독립적인 방향의 개수라고 보는 편이 정확하다.
랭크
행렬의 랭크(Rank)는 행렬이 가지고 있는 독립적인 정보의 차원을 나타낸다.
예를 들어
[ 1 2 ]
[ 2 4 ]
에서는 두 번째 행이 첫 번째 행의 2배이므로 독립적인 행은 하나뿐이다.
따라서 랭크는
rank(A) = 1
이다.
랭크는 연립방정식의 해의 존재 여부나 자유도 등을 판단하는 데 사용된다.
고유값과 고유벡터
고유값(Eigenvalue)과 고유벡터(Eigenvector)는 선형 대수학에서 중요한 개념이다.
행렬 A에 대해
Av = λv
를 만족하는 v가 고유벡터이고 λ가 고유값이다.
일반적인 벡터는 행렬을 곱하면 방향과 크기가 모두 바뀔 수 있다.
하지만 고유벡터는 행렬을 곱해도 방향이 변하지 않는다.
v -> Av = λv
크기만 λ배 변한다.
고유값은 다음 식을 통해 구할 수 있다.
det(A - λI) = 0
고유값과 고유벡터는 물리, 데이터 분석, 머신러닝, 차원 축소 등의 분야에서 활용된다.
직교
두 벡터의 내적이 0이면 두 벡터는 직교한다.
a · b = 0
직교 벡터는 서로 영향을 주지 않는 독립적인 방향으로 생각할 수 있다.
게임 그래픽스에서는 직교 좌표계가 중요하다.
예를 들어 카메라의
Right
Up
Forward
벡터가 서로 직교하도록 유지하면 3차원 공간에서 안정적인 좌표계를 구성할 수 있다.
전치 행렬
행렬의 행과 열을 뒤집는 것을 전치(Transpose)라고 한다.
A = [ 1 2 3 ]
[ 4 5 6 ]
전치하면
Aᵀ = [ 1 4 ]
[ 2 5 ]
[ 3 6 ]
이 된다.
전치 행렬은 벡터와 행렬의 연산, 직교 행렬, 선형 변환 등에서 자주 등장한다.
내적과 행렬의 관계
내적은 행렬 곱셈의 형태로도 표현할 수 있다.
두 벡터를 열벡터로 표현하면
aᵀb
로 내적을 계산할 수 있다.
aᵀb = scalar
이런 표현을 이해하면 머신러닝에서 등장하는 수식이 훨씬 덜 낯설어진다.
신경망의 기본적인 계산도 결국 행렬과 벡터의 연산으로 구성된다.
Input -> Matrix Multiplication -> Bias -> Activation -> Output
선형 대수학과 게임 개발
게임 개발에서 선형 대수학은 별도의 수학 분야라기보다 공간을 다루기 위한 기본 도구에 가깝다.
대표적인 사용처는 다음과 같다.
Vector
-> 위치 / 방향 / 속도 / 힘
Dot Product
-> 시야 판정 / 조명 / 각도 계산
Cross Product
-> 법선 / 좌우 방향 / 회전 방향
Matrix
-> 좌표 변환 / 회전 / 크기 / 카메라
Inverse Matrix
-> World Space <-> Local Space
Orthogonal Basis
-> 좌표계 / 카메라 / 방향 벡터
게임 엔진에서 Transform, Quaternion, Matrix4x4, Vector3 같은 자료형을 제대로 이해하려면 결국 선형 대수학이 필요하다.
선형 대수학과 머신러닝
머신러닝에서도 데이터는 대부분 벡터와 행렬로 표현된다.
예를 들어 여러 개의 데이터를 행렬로 묶으면
X = [ x₁
x₂
x₃
... ]
처럼 표현할 수 있다.
신경망에서는 가중치 행렬과 입력 벡터를 곱해서 다음 층의 입력을 만든다.
z = Wx + b
그리고 활성화 함수를 적용한다.
y = f(Wx + b)
딥러닝 모델의 규모가 커지면 결국 거대한 행렬 연산을 반복적으로 수행하는 구조가 된다.
그래서 GPU가 행렬 연산에 강하다는 점도 중요하다.
선형 대수학에서 핵심적으로 기억할 것
선형 대수학을 처음 공부할 때 모든 정리를 외우려고 할 필요는 없다.
다음 관계를 이해하는 것이 우선이다.
스칼라 -> 하나의 값
벡터 -> 크기와 방향
행렬 -> 벡터를 변환하는 표현
내적 -> 두 벡터의 방향 관계
외적 -> 두 벡터로부터 수직 방향 생성
행렬식 -> 변환의 성질과 역행렬 가능 여부
역행렬 -> 변환을 되돌림
선형 독립 -> 서로 중복되지 않는 방향
기저 -> 공간을 표현하는 기준 벡터 집합
차원 -> 필요한 독립적인 방향의 개수
랭크 -> 행렬이 가진 독립적인 정보의 차원
고유벡터 -> 변환 후에도 방향이 유지되는 벡터
고유값 -> 그 벡터가 얼마나 확대/축소되는지 나타내는 값
결국 선형 대수학의 핵심은 공간과 변환을 수학적으로 표현하는 것이다.
게임에서는 월드 좌표와 카메라, 회전과 방향, 물리와 그래픽스에 사용되고, 머신러닝에서는 데이터와 가중치, 신경망의 계산을 표현하는 기반이 된다.
수식을 개별적으로 외우기보다
벡터 -> 공간을 표현
행렬 -> 공간을 변환
내적 -> 방향 관계를 계산
외적 -> 새로운 방향을 생성
기저 -> 공간을 구성
고유값/고유벡터 -> 변환의 본질을 분석
이라는 구조로 이해하는 것이 선형 대수학을 공부하는 가장 효율적인 출발점이다.