AI공부 · 선형대수

역행렬, 열공간, 랭크, 영공간

7장. 역행렬, 열공간, 랭크, 영공간

이 장을 마치면 연립일차방정식을 “변환 후 v에 착지하는 벡터 찾기”로 읽고, 역행렬·랭크·열공간·영공간을 그림으로 설명할 수 있습니다. 계산법(가우스 소거법)은 다루지 않고 직관에 집중합니다. 실제 계산은 컴퓨터에 맡깁니다.

7.1 연립일차방정식과 Ax = v

선형대수가 그래픽스·로보틱스뿐 아니라 거의 모든 기술 분야에서 필수인 가장 큰 이유는 특별한 형태의 연립방정식을 풀 수 있게 해주기 때문입니다.

연립방정식은 모르는 값(변수) 여러 개와 그들을 묶는 식 여러 개입니다. 식이 복잡해질 수도 있지만, 운이 좋으면 특별한 형태를 띱니다.

  • 각 변수에는 상수를 곱하는 것만 일어납니다
  • 곱한 변수들은 서로 더해지기만 합니다
  • 제곱, sin 같은 함수, 변수끼리의 곱(xy)은 없습니다

이런 식을 연립일차방정식(linear system of equations)이라고 합니다. 정리할 때는 변수를 왼쪽, 상수를 오른쪽에 두고, 같은 변수끼리 세로로 줄을 맞춥니다. 없는 변수는 계수 0을 채워 넣습니다.

2x + 5y + 3z = −3
4x + 0y + 8z = 0
1x + 3y + 0z = 2

이것은 행렬-벡터 곱과 똑같이 생겼습니다. 계수를 모아 행렬 A, 변수를 모아 벡터 x, 오른쪽 상수를 모아 벡터 v로 쓰면 식 세 개가 한 줄이 됩니다.

253408130A x
y
z
x
= −3
0
2
v
    Ax = v

행렬의 한 행이 방정식 하나, 한 열이 변수 하나의 계수들입니다.

7.2 Ax = v의 기하학적 뜻

Ax = v는 식을 한 줄로 줄이는 표기 요령 이상입니다. 행렬 A는 선형 변환이므로 이 식은 이렇게 읽힙니다.

변환 A를 적용했을 때 v에 착지하는 벡터 x는 어느 것인가?

변수 여러 개가 복잡하게 얽힌 문제를, “공간을 주물러 변형했을 때 어느 벡터가 v에 내려앉나”라는 그림 하나로 머릿속에 담을 수 있습니다.

현장 비유. 도면 변환에 비유하면, Ax는 “설계도 좌표 x를 현장 좌표로 바꾸는 것”이고, Ax = v를 푸는 것은 “현장의 이 지점 v는 설계도의 어느 좌표였나”를 거꾸로 찾는 것입니다.

이제부터는 식 2개·변수 2개(2×2 행렬)로 생각합니다. 해를 어떻게 생각할지는 하나에 달려 있습니다. 변환 A가 공간을 더 낮은 차원으로 눌러버리는가? 6장의 언어로는 det(A)가 0인가 아닌가입니다.

7.3 행렬식이 0이 아닐 때: 역행렬로 되감기

행렬을 아무렇게나 고르면 행렬식은 거의 항상 0이 아닙니다. 이때 공간은 눌리지 않고, v에 착지하는 벡터는 정확히 하나 존재합니다. 찾는 방법은 변환을 거꾸로 재생하는 것입니다. 영상을 되감듯 변환을 되돌리며 v가 어디로 가는지 따라가면, 그 도착점이 x입니다.

역행렬. 변환을 거꾸로 재생하는 것도 하나의 선형 변환입니다. 이를 A의 역행렬(inverse)이라 하고 A⁻¹로 씁니다.

변환 A역변환 A⁻¹
반시계 90° 회전시계 90° 회전
ĵ를 오른쪽으로 1칸 미는 전단ĵ를 왼쪽으로 1칸 미는 전단
가로 2배 확대가로 1/2배 축소

핵심 성질. A를 하고 이어서 A⁻¹를 하면 제자리로 돌아옵니다. 4장에서 연달아 변환하는 것은 행렬 곱이라고 했으니 A⁻¹A = I로 씁니다. I는 항등 변환, 즉 아무것도 하지 않는 변환입니다. î와 ĵ를 제자리에 두므로 열이 [1, 0], [0, 1]입니다.

해 구하기. 양변에 A⁻¹를 곱하면 됩니다. Ax = v → A⁻¹Ax = A⁻¹v → x = A⁻¹v. 기하학적으로는 “변환을 되감으며 v를 따라간다”는 뜻입니다.

2×2 예제. 2x + 2y = −4, x + 3y = −1을 풀어봅시다. A = [[2, 2], [1, 3]], det A = 6 − 2 = 4 ≠ 0.

A−1 = 14 3−2−12    x = A−1 −4
−1
= 14 −12 + 2
4 − 2
= −2.5
0.5

검산: 2(−2.5) + 2(0.5) = −4, (−2.5) + 3(0.5) = −1. 맞습니다.

참고: 2×2 역행렬 공식. [[a, b], [c, d]]의 역행렬은 (1/det)·[[d, −b], [−c, a]]입니다. 대각 성분은 자리를 바꾸고, 나머지는 부호를 바꾼 뒤 행렬식으로 나눕니다. 행렬식으로 나누므로 det = 0이면 역행렬이 없다는 것도 공식에서 바로 보입니다. 더 큰 행렬의 역행렬은 실무에서 컴퓨터로 구합니다.

식의 개수 = 변수의 개수일 때. 3차원 이상에서도 똑같습니다. 변환이 공간을 누르지 않으면(det ≠ 0) 역행렬이 있고 해는 하나입니다. 7.1의 3×3 예제는 det = 28이라 해가 하나입니다. x = 38/7, y = −8/7, z = −19/7(실습 1에서 확인). “변수 2개, 식 2개면 보통 해가 하나”라는 중학교 경험이 바로 이것입니다.

7.4 행렬식이 0일 때: 역행렬이 없는 이유

행렬식이 0이면 변환이 공간을 더 낮은 차원으로 눌러버립니다. 이때는 역행렬이 없습니다.

왜 없을까? 직선을 다시 평면으로 펼칠 수는 없습니다. 적어도 함수는 그렇게 할 수 없습니다. 평면이 직선으로 눌리면 직선 위의 점 하나에 원래 평면의 점이 한 줄 통째로 내려앉습니다. 되돌리려면 점 하나를 점 한 줄 전체로 보내야 하는데, 함수는 입력 하나에 출력 하나만 낼 수 있습니다.

현장 비유. 건물 입면도는 3차원 건물을 2차원으로 눌러 그린 것입니다. 입면도 한 장만으로는 안쪽 깊이를 알 수 없어 건물을 복원할 수 없습니다. 입면도의 한 점에는 앞뒤로 같은 위치인 점이 전부 겹쳐 있기 때문입니다.

3차원도 같습니다. 공간이 평면이나 직선, 점으로 눌리면 모두 부피가 0, 즉 행렬식이 0이고 역행렬은 없습니다.

그래도 해는 있을 수 있습니다. 역행렬이 없다고 해가 없는 것은 아닙니다. 변환이 공간을 직선으로 눌렀다면, v가 마침 그 직선 위에 있을 만큼 운이 좋으면 해가 있습니다. 그때는 해가 하나가 아니라 무수히 많습니다.

경우v의 위치해의 개수
det ≠ 0어디든정확히 1개
det = 0눌린 결과(직선 등) 위무수히 많음
det = 0눌린 결과 밖없음

모든 det = 0이 같은 건 아닙니다. 3×3 행렬에서 공간이 평면으로 눌린 경우와 직선으로 눌린 경우를 비교해봅시다. 둘 다 행렬식은 0이지만, 직선으로 눌리면 v가 그 가는 선 위에 있어야 하니 해가 있기가 훨씬 더 어렵습니다. 이 차이를 구분하는 말이 다음 절의 랭크입니다.

7.5 랭크와 열공간

랭크(rank) = 변환 결과(출력)의 차원 수.

출력 모양랭크
점(원점)0
직선1
평면2
3차원 공간 전체3
  • 2×2 행렬: 랭크 2가 최고입니다. 기저 벡터가 여전히 2차원 전체를 스팬하고 행렬식은 0이 아닙니다.
  • 3×3 행렬: 랭크 3이면 눌리지 않았습니다(det ≠ 0). 랭크 2는 눌렸지만 평면까지만, 랭크 1은 직선까지 더 심하게 눌렸습니다.

열공간(column space). 행렬이 낼 수 있는 모든 출력의 모음을 열공간이라고 합니다. 이름의 유래는 짐작할 수 있습니다. 행렬의 열은 기저 벡터가 착지한 곳이고, 모든 출력은 그 열들의 선형결합입니다(3장). 그러므로

열공간 = 행렬의 열들의 스팬. 랭크의 더 정확한 정의는 열공간의 차원입니다.

2장의 스팬, 3장의 “열 = 기저의 도착점”, 6장의 행렬식이 여기서 하나로 묶입니다.

풀 랭크(full rank). 랭크가 가능한 최댓값, 즉 열의 개수와 같으면 풀 랭크라고 합니다. 정사각 행렬에서 풀 랭크 = det ≠ 0 = 역행렬 있음입니다.

Ax = v에 해가 있는가? 열공간은 “착지할 수 있는 곳”의 모음이므로, v가 열공간 안에 있으면 해가 있고, 밖에 있으면 없습니다.

영벡터는 항상 열공간에 있습니다. 선형 변환은 원점을 고정하므로 A·0 = 0이고, 원점은 언제나 출력 중 하나입니다.

7.6 영공간

풀 랭크 변환에서는 원점에 착지하는 벡터가 영벡터 하나뿐입니다. 하지만 풀 랭크가 아닌(눌리는) 변환에서는 원점에 착지하는 벡터가 한꺼번에 많이 생깁니다.

변환열공간(출력)원점에 착지하는 벡터들
2차원 → 직선으로 눌림직선 (랭크 1)다른 방향의 직선 하나
3차원 → 평면으로 눌림평면 (랭크 2)직선 하나
3차원 → 직선으로 눌림직선 (랭크 1)평면 하나

원점에 착지하는 벡터들의 모음을 영공간(null space) 또는 커널(kernel)이라고 합니다. “영(null)이 되는”, 즉 영벡터가 되는 벡터들의 공간이라는 뜻입니다.

A = [[2, −2], [1, −1]]: 평면이 직선으로 눌린다 (랭크 1)입력 공간출력 공간A 적용[4, 2][1, 1]빨간 선(영공간, 방향 [1, 1]): 전부 원점에 착지점선([2, 0]을 지나는 평행선): 전부 [4, 2]에 착지파란 선(열공간, 방향 [2, 1]): 가능한 출력 전부[4, 2]는 선 위 → 해 있음, [1, 1]은 밖 → 해 없음
랭크 1인 2×2 행렬의 영공간(입력 쪽)과 열공간(출력 쪽)

그림 읽기. A = [[2, −2], [1, −1]]의 열은 [2, 1]과 [−2, −1]로 종속입니다. 출력은 [2, 1] 방향 직선(열공간)뿐입니다. 입력 쪽에서는 [1, 1] 방향 직선이 통째로 원점에 착지합니다. A[1, 1] = 1·[2, 1] + 1·[−2, −1] = [0, 0]이기 때문입니다. 이 직선이 영공간입니다.

  • v = 0일 때, 즉 Ax = 0의 해는 영공간 전체입니다.
  • v가 열공간 안에 있을 때, 해 하나를 찾으면 거기에 영공간의 벡터를 아무거나 더해도 여전히 해입니다. 그림의 점선이 그 모습입니다. [2, 0]이 [4, 2]에 착지하므로 [2, 0] + t[1, 1]은 모두 [4, 2]에 착지합니다.

보충: 랭크-널리티 정리. 입력의 차원(열의 개수)은 “살아남는 차원(랭크)”과 “눌려 사라지는 차원(영공간의 차원)”으로 정확히 나뉩니다. 랭크 + 영공간의 차원 = 열의 개수. 위 표에서 확인해보면 2차원→직선은 1 + 1 = 2, 3차원→평면은 2 + 1 = 3, 3차원→직선은 1 + 2 = 3입니다.

7.7 정리: 연립방정식의 세 질문

모든 연립일차방정식에는 선형 변환이 하나 대응합니다. 그 변환을 보면 세 질문에 답할 수 있습니다.

질문답하는 도구판단 방법
해가 있는가?열공간v가 열공간 안에 있는가
해가 몇 개인가?영공간영공간이 영벡터뿐이면 1개, 아니면 무수히 많음
어떻게 구하는가?역행렬det ≠ 0이면 x = A⁻¹v

이 장에서 다루지 않은 것. 이것들을 실제로 계산하는 방법(가우스 소거법, 행 사다리꼴)과, 식의 개수와 변수의 개수가 다른 경우입니다. 계산법이 필요하면 한국어 강의(한양대 이상화 교수 선형대수 등)의 “가우스 소거법” 편을 보면 됩니다. 이 장의 목표는 그 계산을 배울 때 “지금 공간에서 무슨 일이 일어나는지” 알 수 있게 하는 것입니다.

7.8 AI와의 연결

  1. 실무에서는 역행렬을 직접 구하지 않습니다. x = A⁻¹v는 생각하는 방법이고, 코드에서는 np.linalg.solve(A, v)를 씁니다. 역행렬을 먼저 만드는 것보다 빠르고 숫자 오차도 작습니다.
  2. 해가 없을 때가 오히려 보통입니다: 최소제곱. 센서 데이터 1,000건(식 1,000개)으로 계수 5개(변수 5개)를 맞추는 선형회귀에서는, 데이터에 잡음이 있어 v가 열공간 밖에 있습니다. 그래서 “열공간 안에서 v에 가장 가까운 점”을 찾습니다. 이것이 최소제곱법이고, 코드로는 np.linalg.lstsq입니다. 설비 고장 예측의 선형회귀가 바로 이 문제입니다.
  3. 랭크 = 데이터에 실제로 들어 있는 정보의 차원. 센서가 6개여도 서로 독립인 정보가 3가지뿐이면 데이터 행렬의 랭크는 3입니다(실습 4). PCA 같은 차원 축소와, 4장에서 본 LoRA(랭크 r인 작은 행렬 두 개의 곱)가 모두 “랭크가 생각보다 낮다”는 사실을 이용합니다.
  4. 영공간 = 모델이 못 보는 방향. 신경망 층의 가중치 행렬에 영공간이 있으면, 입력을 그 방향으로 아무리 바꿔도 출력이 변하지 않습니다. 그 방향의 정보는 다음 층으로 전달되지 않고 사라집니다.
  5. 되돌릴 수 있는 변환. 생성모델 중 일부(Normalizing Flow)는 데이터와 잡음 사이를 양방향으로 오가야 해서, 각 층을 반드시 역변환이 있도록(행렬식 ≠ 0) 설계합니다.

7.9 코드 실습

실습 1 — 7.1의 연립방정식 풀기

import numpy as np

A = np.array([[2, 5, 3],
              [4, 0, 8],
              [1, 3, 0]], dtype=float)
v = np.array([-3, 0, 2], dtype=float)

print(np.linalg.det(A))           # 28.0 → 0이 아니다 → 해가 하나
x = np.linalg.solve(A, v)          # 실무에서 쓰는 방법
print(x)                           # [ 5.4286 -1.1429 -2.7143] = [38/7, -8/7, -19/7]
print(A @ x)                       # [-3.  0.  2.]  검산: v가 나온다

실습 2 — 역행렬과 항등 행렬

B = np.array([[2, 2], [1, 3]], dtype=float)
B_inv = np.linalg.inv(B)
print(B_inv)                       # [[ 0.75 -0.5 ] [-0.25  0.5 ]] = (1/4)[[3, -2], [-1, 2]]
print(np.round(B_inv @ B))         # [[1. 0.] [0. 1.]]  되감으면 제자리
print(B_inv @ [-4, -1])            # [-2.5  0.5]  7.3의 답

R = np.array([[0, -1], [1, 0]])    # 반시계 90°
print(np.round(np.linalg.inv(R)))  # [[ 0.  1.] [-1.  0.]]  시계 90°

실습 3 — 눌리는 행렬: 랭크, 영공간, 해가 있을 때와 없을 때

from scipy.linalg import null_space

C = np.array([[2, -2], [1, -1]], dtype=float)
print(np.linalg.matrix_rank(C))    # 1
print(null_space(C).ravel())       # [0.707 0.707] → [1, 1] 방향

try:
    np.linalg.solve(C, [4, 2])
except np.linalg.LinAlgError as e:
    print('역행렬 없음:', e)          # Singular matrix

# v가 열공간 안: 무수히 많은 해 중 하나를 돌려준다
x1 = np.linalg.lstsq(C, [4, 2], rcond=None)[0]
print(x1, C @ x1)                  # [ 1. -1.] [4. 2.]
# v가 열공간 밖: 가장 가까운 답을 돌려준다
x2 = np.linalg.lstsq(C, [1, 1], rcond=None)[0]
print(x2, C @ x2)                  # [ 0.3 -0.3] [1.2 0.6]  → [1, 1]과 다르다

실습 4 — 센서 6개, 실제 정보는 3개

rng = np.random.default_rng(0)
signals = rng.standard_normal((100, 3))   # 독립적인 원인 3개(100회 측정)
mix = rng.standard_normal((3, 6))         # 센서 6개가 원인들을 섞어서 측정
sensors = signals @ mix                   # 100 × 6 데이터 행렬
print(sensors.shape, np.linalg.matrix_rank(sensors))   # (100, 6) 3

열은 6개지만 랭크는 3입니다. 센서 3개는 나머지의 선형결합이라 새 정보가 없습니다.

7.10 용어 정리

한국어영어뜻
연립일차방정식linear system of equations변수에 상수를 곱해 더하기만 하는 식들의 묶음. Ax = v
역행렬inverse matrix, A⁻¹변환을 거꾸로 재생하는 행렬. A⁻¹A = I
항등 변환identity transformation, I아무것도 하지 않는 변환
랭크rank출력(열공간)의 차원 수
열공간column space가능한 모든 출력 = 열들의 스팬
풀 랭크full rank랭크 = 열의 개수. 눌리지 않음
영공간, 커널null space, kernel원점에 착지하는 모든 입력 벡터
가우스 소거법Gaussian elimination연립방정식을 손으로 푸는 표준 계산법
최소제곱법least squares해가 없을 때 열공간에서 v에 가장 가까운 답을 찾는 방법

7.11 연습문제

기본

  1. 3x − y = 5, x + 2y = 4를 Ax = v 꼴로 쓰고, 행렬식을 구한 뒤 역행렬로 풀어라.
  2. 반시계 90° 회전 [[0, −1], [1, 0]]의 역행렬을 그림으로 추론해 써라.
  3. [[2, 0], [0, 3]]의 역행렬을 그림으로 추론해 써라.
  4. [[1, 2], [2, 4]]의 랭크, 열공간, 영공간을 구하라.

응용

  1. 4번 행렬에서 Ax = [3, 6]과 Ax = [1, 0]은 각각 해가 있는가? 있다면 모두 구하라.
  2. 행 단위로 [[1, 2, 3], [2, 4, 6], [1, 1, 1]]인 행렬의 랭크와 영공간을 구하고, 랭크-널리티 정리를 확인하라.
  3. 행 단위로 [[1, 2, 3], [2, 4, 6], [3, 6, 9]]인 행렬은 랭크가 몇이고, 열공간과 영공간은 각각 어떤 모양인가?
  4. (AB)⁻¹ = B⁻¹A⁻¹인 이유를 “되감기”로 설명하라.
해설 펼치기
  1. A = [[3, −1], [1, 2]], v = [5, 4]. det = 3·2 − (−1)·1 = 7. A⁻¹ = (1/7)[[2, 1], [−1, 3]]. x = (1/7)[2·5 + 1·4, −1·5 + 3·4] = (1/7)[14, 7] = [2, 1]. 검산: 6 − 1 = 5, 2 + 2 = 4.
  2. 반시계 90°를 되돌리는 것은 시계 90° 회전입니다. î → [0, −1], ĵ → [1, 0]이므로 [[0, 1], [−1, 0]]. 두 행렬을 곱하면 I가 됩니다.
  3. 가로 2배·세로 3배를 되돌리려면 가로 1/2배·세로 1/3배. [[1/2, 0], [0, 1/3]].
  4. 2열 [2, 4] = 2 × 1열 [1, 2]이라 랭크 1. 열공간은 [1, 2] 방향 직선. 영공간은 A[x, y] = 0인 벡터들인데, x + 2y = 0이면 되므로 [2, −1] 방향 직선.
  5. [3, 6] = 3 × [1, 2]는 열공간 안이라 해가 있습니다. [3, 0]이 하나의 해이고(1·3 + 2·0 = 3, 2·3 + 4·0 = 6), 영공간을 더해 모든 해는 [3, 0] + t[2, −1]. [1, 0]은 [1, 2]의 배수가 아니라 열공간 밖이므로 해가 없습니다.
  6. 2행 = 2 × 1행이라 공간이 눌리고 랭크는 2입니다(열공간은 평면). 영공간은 [1, −2, 1] 방향 직선입니다. 검산: 1 − 4 + 3 = 0, 2 − 8 + 6 = 0, 1 − 2 + 1 = 0. 랭크 2 + 영공간 차원 1 = 열 3개.
  7. 세 열 [1, 2, 3], [2, 4, 6], [3, 6, 9]가 모두 [1, 2, 3]의 배수입니다. 랭크 1. 열공간은 [1, 2, 3] 방향 직선. 영공간은 x + 2y + 3z = 0인 평면(차원 2). 1 + 2 = 3.
  8. AB는 B를 하고 A를 하는 것입니다. 영상을 되감을 때는 마지막에 한 A부터 취소하고(A⁻¹), 그다음 B를 취소합니다(B⁻¹). 오른쪽부터 적용하므로 B⁻¹A⁻¹입니다. 양말을 신고 신발을 신었으면, 벗을 때는 신발부터 벗는 것과 같습니다.

다음 장 예고: 8장 “비정사각 행렬”. 입력과 출력의 차원이 다른 변환(예: 2차원 → 3차원)을 다룹니다. 5장에서 미리 본 nn.Linear(512, 256)의 비밀이 여기서 풀립니다.