1 왜 선형 변환인가 — 관점의 전환
지금까지 행렬을 다룬 방식은 크게 두 가지였다.
- 행 관점 (row picture): \(\mathbf{A}\mathbf{x} = \mathbf{b}\) 를 “여러 선(또는 초평면)의 교점을 구하는 문제”로 본다.
- 열 관점 (column picture): \(\mathbf{A}\mathbf{x}\) 를 “\(\mathbf{A}\) 의 열들의 선형결합”으로 본다.
두 관점 모두 행렬을 정적(static) 대상, 즉 “계수들의 묶음”으로 본다. Ch.7 에서는 세 번째 관점을 도입한다. 행렬을 함수(function) 로, 즉 벡터를 입력받아 벡터를 출력하는 변환으로 읽는다.
\[ T : \mathbb{R}^n \to \mathbb{R}^m, \qquad T(\mathbf{x}) = \mathbf{A}\mathbf{x} \]
이 관점이 왜 중요한가. 행렬을 계수표로 보는 한, 우리는 “계산 규칙”에 머무른다. 함수로 보면 질문이 달라진다.
- 입력 공간 전체가 출력 공간의 어디로 옮겨지는가 (치역·이미지).
- 입력 공간의 어떤 부분이 \(\mathbf{0}\) 으로 뭉개지는가 (커널·영공간).
- 같은 변환을 다른 언어(기저) 로 쓰면 행렬의 모양이 어떻게 바뀌는가 (유사 변환).
- 어떤 기저를 고르면 변환이 가장 단순한 형태(대각행렬, 조르당 형)가 되는가.
이 질문들은 대각화(Ch.6), 최소제곱(Ch.4), SVD(§6.7), 딥러닝의 선형 레이어, 컴퓨터 그래픽스의 아핀 변환을 하나의 언어로 묶는다 (Strang, 2009, Ch.7).
종이 위에 균일한 격자를 그렸다고 상상한다. 선형 변환은 이 격자를 다음 세 가지 규칙 아래에서 마음대로 주무르는 것이다.
- 원점은 원점 그대로 둔다.
- 직선은 직선으로 유지한다 (꺾거나 구부리지 않는다).
- 등간격은 등간격으로 유지한다 (한쪽 끝만 늘어나는 것은 허용하지 않는다).
이 세 조건을 지키면서 격자를 회전·확대·전단(shear)·사영하는 모든 조작이 선형 변환이다.
2 정의 (Definition)
벡터 공간 \(V\) 에서 벡터 공간 \(W\) 로 가는 함수 \(T : V \to W\) 가 모든 \(\mathbf{v}, \mathbf{w} \in V\) 와 모든 스칼라 \(c \in \mathbb{R}\) 에 대해 다음 두 조건을 만족하면 \(T\) 를 선형 변환이라 한다.
- 가법성 (Additivity): \[T(\mathbf{v} + \mathbf{w}) = T(\mathbf{v}) + T(\mathbf{w})\]
- 동차성 (Homogeneity): \[T(c\mathbf{v}) = c\, T(\mathbf{v})\]
이 두 조건은 하나로 묶을 수 있다. 임의의 스칼라 \(a, b\) 와 벡터 \(\mathbf{v}, \mathbf{w}\) 에 대해 \[T(a\mathbf{v} + b\mathbf{w}) = a\, T(\mathbf{v}) + b\, T(\mathbf{w})\] 가 성립한다.
표기 정리
| 기호 | 의미 |
|---|---|
| \(V, W\) | 벡터 공간 (정의역·공역) |
| \(T : V \to W\) | 선형 변환 |
| \(\mathbf{v}, \mathbf{w}\) | 입력 벡터 |
| \(T(\mathbf{v})\) | 출력 벡터 |
| \(\ker T\) | 커널: \(T(\mathbf{v}) = \mathbf{0}\) 을 만족하는 \(\mathbf{v}\) 들의 집합 |
| \(\text{Im}\, T\) | 치역(상): \(T(V) = \{T(\mathbf{v}) : \mathbf{v} \in V\}\) |
두 공리가 주는 즉각적 귀결
- \(T(\mathbf{0}) = \mathbf{0}\): 동차성에서 \(c = 0\) 을 대입하면 곧장 나온다.
- 원점 보존: 선형 변환은 반드시 원점을 원점으로 보낸다. 평행이동 \(T(\mathbf{x}) = \mathbf{x} + \mathbf{b}\) 는 \(\mathbf{b} \neq \mathbf{0}\) 이면 선형 변환이 아니다. 이를 피하기 위해 컴퓨터 그래픽스는 동차좌표(homogeneous coordinates)를 도입해 평행이동을 선형 변환으로 “위장”한다.
- 직선 보존: \(\mathbf{u} + t\mathbf{v}\) 꼴의 직선은 \(T(\mathbf{u}) + t\, T(\mathbf{v})\) 로 옮겨져 여전히 직선이다.
- 비율 보존: \(\mathbf{v}\) 와 \(2\mathbf{v}\) 의 길이비는 \(T\) 통과 후에도 \(1 : 2\) 로 유지된다.
- 평행이동: \(T(\mathbf{x}) = \mathbf{x} + \mathbf{b}\), \(\mathbf{b} \neq \mathbf{0}\). → 원점 보존 실패.
- 비선형 함수: \(T(x) = x^2\). → \(T(x + y) = (x+y)^2 \neq x^2 + y^2 = T(x) + T(y)\) 이므로 가법성 실패.
딥러닝에서 ReLU, Sigmoid 같은 활성화 함수는 모두 비선형이다. 덕분에 층을 쌓을수록 표현력이 폭발적으로 늘어난다. 반면 활성화 없이 선형 층만 쌓으면 \(\mathbf{A}_2 \mathbf{A}_1 \mathbf{x}\) 꼴이 되어 결국 하나의 선형 변환과 동등해지므로 깊이가 무의미해진다.
3 기하학적 직관 (Geometric Intuition)
정의만 보면 선형 변환은 추상적이다. 그러나 2차원에서 시각화하면 선형 변환의 전체 종류가 몇 개의 기본형으로 분류된다. \(2 \times 2\) 행렬은 \(\mathbf{e}_1 = (1, 0)\) 과 \(\mathbf{e}_2 = (0, 1)\) 이 어디로 가는지만 정하면 모든 다른 벡터의 상이 자동으로 정해진다. 이것이 기하 직관의 출발점이다.
\[ \mathbf{v} = v_1 \mathbf{e}_1 + v_2 \mathbf{e}_2 \;\Longrightarrow\; T(\mathbf{v}) = v_1 T(\mathbf{e}_1) + v_2 T(\mathbf{e}_2) \]
즉 기저 벡터의 이동만 추적하면 선형 변환 전체가 결정된다. 이 사실이 뒤에 “선형 변환 = 행렬” 이라는 대응을 낳는다.
3.1 대표적인 2D 선형 변환
| 변환 | \(T(\mathbf{e}_1)\) | \(T(\mathbf{e}_2)\) | 행렬 | 기하 효과 |
|---|---|---|---|---|
| 항등 | \((1,0)\) | \((0,1)\) | \(\mathbf{I}\) | 아무것도 안 함 |
| 스케일 (\(k\)배 확대) | \((k,0)\) | \((0,k)\) | \(k\mathbf{I}\) | 중심 기준 등방 확대 |
| 회전 \(\theta\) | \((\cos\theta, \sin\theta)\) | \((-\sin\theta, \cos\theta)\) | \(\mathbf{R}_\theta\) | 원점 기준 회전 |
| \(x\)축 반사 | \((1,0)\) | \((0,-1)\) | \(\text{diag}(1,-1)\) | \(y\) 좌표 부호 뒤집기 |
| 수평 전단 (shear) | \((1,0)\) | \((k,1)\) | \(\begin{bmatrix}1 & k\\ 0 & 1\end{bmatrix}\) | \(x\)축은 고정, 위로 갈수록 오른쪽 기울기 |
| \(y=x\) 선 위로의 사영 | \((0.5, 0.5)\) | \((0.5, 0.5)\) | \(\tfrac{1}{2}\begin{bmatrix}1 & 1\\ 1 & 1\end{bmatrix}\) | 2차원을 1차원으로 찌그러뜨림 |
3.2 회전 행렬의 유도 — 기하 직관을 수식으로
각도 \(\theta\) 만큼 반시계 방향 회전을 시키는 변환 \(R_\theta\) 를 생각한다. 단위벡터 \(\mathbf{e}_1 = (1, 0)\) 을 원 위에서 각도 \(\theta\) 만큼 돌리면 \((\cos\theta, \sin\theta)\) 가 된다. \(\mathbf{e}_2 = (0, 1)\) 은 \(\mathbf{e}_1\) 보다 이미 \(90^\circ\) 앞서 있으므로 \(\theta\) 만큼 더 돌리면 각도 \(\theta + 90^\circ\) 지점에 놓인다.
\[ R_\theta(\mathbf{e}_2) = (\cos(\theta + 90^\circ), \sin(\theta + 90^\circ)) = (-\sin\theta, \cos\theta) \]
두 상을 열로 나란히 세우면 회전 행렬이 얻어진다.
\[ \mathbf{R}_\theta = \begin{bmatrix} \cos\theta & -\sin\theta \\ \sin\theta & \cos\theta \end{bmatrix} \]
왜 이 유도가 중요한가. 회전 행렬의 성분을 외우는 사람은 많지만, 그것이 “기저 벡터를 어디로 보내는가”를 기록한 표에 불과하다는 사실을 잊기 쉽다. 이 관점이 체화되면 새로운 변환을 마주쳤을 때 “\(\mathbf{e}_1, \mathbf{e}_2\) 를 먼저 보자” 라는 반사가 생긴다.
3.3 비행렬 예시 — 선형 변환은 행렬보다 더 넓은 개념이다
선형 변환의 정의는 \(\mathbb{R}^n\) 에 국한되지 않는다. 벡터 공간이기만 하면 된다. 그러면 우리가 행렬로 인식하지 않던 연산들이 모두 선형 변환의 예가 된다.
- 미분 연산자 \(D : \mathcal{P}_n \to \mathcal{P}_{n-1}\), \(D(p) = p'\)
- \((p + q)' = p' + q'\), \((cp)' = cp'\) 이므로 선형 변환이다.
- 적분 연산자 \(I : C[a, b] \to \mathbb{R}\), \(I(f) = \int_a^b f(x)\, dx\)
- 적분의 선형성 그대로 두 공리를 만족한다.
- 푸리에 변환 \(\mathcal{F} : L^2 \to L^2\)
- 주파수 성분으로의 분해도 선형 변환이다. 이 덕분에 “기저 변환”으로 해석할 수 있다.
- 시프트 연산자 \(S : \mathbb{R}^\infty \to \mathbb{R}^\infty\), \(S(x_1, x_2, \ldots) = (0, x_1, x_2, \ldots)\)
이들은 무한차원에서 정의되거나 기저가 자명하지 않은 공간에 작용한다. 그러나 기저를 선택하는 순간 이들도 모두 (무한차원) 행렬로 표현된다. 다음 절에서 이 대응을 명확히 한다.
4 행렬 표현 (Matrix Representation)
4.1 핵심 정리 — 기저가 있으면 모든 선형 변환은 행렬이다
\(V\) 가 기저 \(\mathcal{B} = \{\mathbf{v}_1, \ldots, \mathbf{v}_n\}\) 을 갖는 \(n\) 차원 공간이고, \(W\) 가 기저 \(\mathcal{C} = \{\mathbf{w}_1, \ldots, \mathbf{w}_m\}\) 을 갖는 \(m\) 차원 공간이라 하자. 그러면 모든 선형 변환 \(T : V \to W\) 에 대응하는 유일한 \(m \times n\) 행렬 \([T]_{\mathcal{C} \leftarrow \mathcal{B}}\) 가 존재한다. 이 행렬의 \(j\) 번째 열은 \(T(\mathbf{v}_j)\) 를 출력 기저 \(\mathcal{C}\) 로 표현한 좌표이다.
이 정리는 “행렬이 무엇인가” 에 대한 가장 깊은 답을 준다. 행렬은 원래 존재하는 추상적 대상이 아니라, 선형 변환을 특정 기저 아래에서 표현한 좌표표이다.
4.2 왜 기저 벡터의 상만 알면 충분한가
임의의 \(\mathbf{v} \in V\) 는 기저로 유일하게 분해된다. \[ \mathbf{v} = c_1 \mathbf{v}_1 + c_2 \mathbf{v}_2 + \cdots + c_n \mathbf{v}_n \]
선형성을 차례로 적용하면
\[ T(\mathbf{v}) = c_1 T(\mathbf{v}_1) + c_2 T(\mathbf{v}_2) + \cdots + c_n T(\mathbf{v}_n) \]
따라서 \(T(\mathbf{v}_1), \ldots, T(\mathbf{v}_n)\) \(n\) 개의 출력만 알면 변환 \(T\) 전체가 결정된다. 이 \(n\) 개의 출력을 열로 나열한 것이 바로 \(T\) 의 행렬이다.
이 관점은 “무한히 많은 벡터를 어떻게 유한한 정보로 담는가” 라는 당혹감을 해소한다. 답: 기저 벡터 \(n\) 개의 상만 저장하면 된다.
4.3 직관 — 행렬 곱은 “좌표로 번역한 변환”
벡터 \(\mathbf{v}\) 를 기저 \(\mathcal{B}\) 좌표로 쓰면 열벡터 \([\mathbf{v}]_{\mathcal{B}} \in \mathbb{R}^n\) 이다. 그러면 다음 다이어그램이 성립한다.
\[ V \xrightarrow{\;T\;} W \quad\Longleftrightarrow\quad \mathbb{R}^n \xrightarrow{\;[T]_{\mathcal{C} \leftarrow \mathcal{B}}\;} \mathbb{R}^m \]
즉 “추상 공간에서의 선형 변환” 을 “좌표 공간에서의 행렬 곱” 으로 번역할 수 있고, 이 번역은 기저 선택만 고정되면 일대일 대응이다. 행렬 \(\mathbf{A}\) 와 선형 변환 \(T\) 는 본질적으로 같은 대상의 두 얼굴이다.
4.4 합성과 행렬 곱 — 왜 행렬 곱은 바로 “그렇게” 정의되었는가
두 선형 변환 \(S : U \to V\) 와 \(T : V \to W\) 를 합성한 \(T \circ S : U \to W\) 도 선형 변환이다. 기저를 모두 고정하면 합성의 행렬은 각 변환의 행렬의 곱으로 표현된다.
\[ [T \circ S] = [T]\, [S] \]
행렬 곱이 그렇게 이상한 순서(앞 행렬의 열과 뒤 행렬의 행을 내적)로 정의된 이유가 여기에 있다. 합성 순서가 정확히 행렬 곱으로 번역되도록 정의한 것이다. 이 해석 없이 행렬 곱을 외우면 영원히 “왜 이렇게 생겼지?” 라는 물음이 남는다.
5 기저 변환과 유사 변환 (Change of Basis & Similarity)
5.1 같은 변환, 다른 옷
동일한 선형 변환 \(T : V \to V\) 을 기저 \(\mathcal{B}\) 에서 보면 행렬 \(\mathbf{A}\), 기저 \(\mathcal{B}'\) 에서 보면 행렬 \(\mathbf{B}\) 로 나타난다. 두 행렬은 같은 변환의 서로 다른 좌표 표현일 뿐이다. 이 둘이 어떻게 관계되는지가 기저 변환(change of basis)의 핵심이다.
\(\mathbf{M}\) 을 기저 \(\mathcal{B}'\) 의 벡터들을 기저 \(\mathcal{B}\) 좌표로 적은 전이행렬(change-of-basis matrix) 이라 하자. 같은 선형 변환 \(T\) 의 두 행렬 표현은 다음과 같이 연결된다.
\[ \mathbf{B} = \mathbf{M}^{-1} \mathbf{A} \mathbf{M} \]
이 관계를 유사 변환(similarity transformation) 이라 하고, \(\mathbf{A}\) 와 \(\mathbf{B}\) 는 닮음 행렬(similar matrices) 이라 부른다.
5.2 읽는 법 — 세 단계 번역
공식 \(\mathbf{B} = \mathbf{M}^{-1} \mathbf{A} \mathbf{M}\) 을 오른쪽에서 왼쪽으로 읽으면 세 단계가 된다. 입력 벡터 \(\mathbf{x}\) 가 새로운 기저 \(\mathcal{B}'\) 좌표로 주어졌다고 하자.
- \(\mathbf{M}\mathbf{x}\): \(\mathcal{B}'\) 좌표를 \(\mathcal{B}\) 좌표로 번역.
- \(\mathbf{A}(\mathbf{M}\mathbf{x})\): \(\mathcal{B}\) 좌표에서 원래 변환 \(\mathbf{A}\) 적용.
- \(\mathbf{M}^{-1}(\mathbf{A}\mathbf{M}\mathbf{x})\): 결과를 다시 \(\mathcal{B}'\) 좌표로 역번역.
즉 \(\mathbf{B}\) 는 “잠시 원어(기저 \(\mathcal{B}\))로 돌아가서 일을 처리한 뒤 현지 언어(\(\mathcal{B}'\))로 돌려받는” 절차를 하나의 행렬로 표현한 것이다.
5.3 왜 중요한가 — 대각화와 SVD의 공통 언어
- 대각화 (§6.2): \(\mathbf{A} = \mathbf{S}\mathbf{\Lambda}\mathbf{S}^{-1}\) 은 정확히 기저 변환이다. 고유벡터를 기저로 선택하면 같은 변환이 대각행렬 \(\mathbf{\Lambda}\) 로 단순해진다. “행렬을 대각화한다” 는 말은 결국 “변환이 가장 단순해지는 기저를 찾는다” 는 뜻이다.
- SVD (§6.7): \(\mathbf{A} = \mathbf{U}\mathbf{\Sigma}\mathbf{V}^\top\) 은 두 개의 서로 다른 기저(입력·출력 각각의 직교 기저) 아래에서 변환이 단순한 스케일링 \(\mathbf{\Sigma}\) 로 보인다는 사실의 선언이다.
- 조르당 표준형: 대각화가 불가능할 때 최대한 단순한 꼴로 보여주는 기저를 찾은 결과이다.
이 세 분해 모두 공통 질문의 답이다. “이 변환이 가장 단순해지는 좌표계는 무엇인가?” 선형 변환 관점이 체화되어야 이 질문이 자연스럽게 보인다.
6 커널과 치역, 계수-영차원 정리
선형 변환은 두 개의 근본 부분공간을 낳는다. 하나는 \(\mathbf{0}\) 으로 뭉개지는 입력들, 다른 하나는 실제로 도달되는 출력들이다.
- 커널 (Kernel, Null Space): \(\ker T = \{\mathbf{v} \in V : T(\mathbf{v}) = \mathbf{0}\}\)
- 치역 (Image, Range): \(\text{Im}\, T = \{T(\mathbf{v}) : \mathbf{v} \in V\} \subseteq W\)
의미 번역
- \(\ker T\) 는 \(T\) 가 정보를 잃는 방향이다. 사영 행렬의 커널은 “사영 면에 수직인 방향” 이다. 그 방향의 정보는 변환 후 복구 불가능하다.
- \(\text{Im}\, T\) 는 \(T\) 가 도달할 수 있는 출력 전체이다. 열공간과 같은 것이고, 행렬 관점에서는 \(\mathbf{A}\) 의 열들이 생성하는 부분공간이다.
유한차원 벡터 공간 \(V\) 에서 정의된 선형 변환 \(T : V \to W\) 에 대해 \[ \dim(\ker T) + \dim(\text{Im}\, T) = \dim V \]
직관적 해석: \(V\) 가 가진 \(n\) 차원의 “정보 예산”을 \(T\) 는 두 곳에 나눠 쓴다. 일부는 \(\ker T\) 로 빠져 사라지고, 나머지는 \(\text{Im}\, T\) 에 남는다. 사영 행렬처럼 차원을 줄이는 변환은 커널에 예산을 많이 할당하고, 가역 변환은 커널이 \(\{\mathbf{0}\}\) 이라 모든 예산이 치역에 그대로 들어간다.
이 정리는 행렬 관점의 “열공간 차원 + 영공간 차원 = 열의 개수” (Ch.3 §3.6 네 개의 근본 부분공간) 와 정확히 같은 진술이다. 선형 변환 언어로 쓰면 공간 자체의 성질로 읽힌다.
7 단사·전사·동형 (Injective, Surjective, Isomorphism)
선형 변환은 일반 함수이기도 하므로 일대일과 위로의 개념이 적용된다.
| 성질 | 정의 | 선형 변환에서의 조건 |
|---|---|---|
| 단사 (Injective, one-to-one) | 서로 다른 입력은 서로 다른 출력 | \(\ker T = \{\mathbf{0}\}\) |
| 전사 (Surjective, onto) | 모든 \(\mathbf{w} \in W\) 가 어떤 \(\mathbf{v}\) 의 상 | \(\text{Im}\, T = W\) |
| 동형 (Isomorphism) | 단사이면서 전사 | 역변환 \(T^{-1}\) 존재 |
왜 이 분류가 실무에 중요한가
- 단사가 아닌 선형 레이어는 “다른 입력을 같은 출력으로 압축” 한다. Autoencoder 의 인코더가 이렇다. 원본 복구는 근사적으로만 가능하다.
- 전사가 아닌 선형 레이어는 “출력 공간의 일부 방향에는 절대 도달할 수 없다”. 임베딩 차원이 충분하지 않을 때 이런 일이 일어난다.
- \(\dim V = \dim W\) 이고 \(T\) 가 단사이면 자동으로 전사가 되며 (계수-영차원 정리), 이때 \(T\) 는 동형이다. 정방행렬의 “가역” 은 이 동형과 같은 개념이다.
치역이 스칼라체 \(\mathbb{F}\) 인 선형 변환 \(\varphi: V \to \mathbb{F}\) 를 선형형식(linear form, linear functional)이라 한다. \(V = \mathbb{R}^n\) 이면 선형형식은 행벡터 하나로 표현된다.
\[\varphi(\mathbf{x}) = \mathbf{a}^\top \mathbf{x} = a_1 x_1 + a_2 x_2 + \cdots + a_n x_n\]
쌍대기저(dual basis): 기저 \(\{\mathbf{e}_1, \ldots, \mathbf{e}_n\}\) 이 주어지면, 이에 대응하는 선형형식들 \(\{\alpha_1, \ldots, \alpha_n\}\) 이 유일하게 결정된다.
\[\alpha_i(\mathbf{e}_j) = \delta_{ij} = \begin{cases} 1 & (i = j) \\ 0 & (i \neq j) \end{cases}\]
즉 \(\alpha_i\) 는 “\(i\) 번째 좌표만 뽑아내는 선형형식”이다. 모든 선형형식 \(\varphi\) 는 쌍대기저의 선형결합으로 유일하게 표현된다: \(\varphi = a_1 \alpha_1 + \cdots + a_n \alpha_n\).
\(V\) 의 쌍대공간 \(V^* = \{\varphi: V \to \mathbb{F} \mid \varphi \text{ 선형}\}\) 은 \(V\) 와 동형이다 (\(\dim V^* = \dim V\)). 실무에서는 “행벡터 공간 = 열벡터 공간의 쌍대”로 이해하면 된다 — \(\mathbf{a}^\top \mathbf{x}\) 가 바로 \(\mathbf{a}^\top \in (\mathbb{R}^n)^*\) 의 \(\mathbf{x}\) 에 대한 작용이다.
응용: 미적분의 미분형식, 텐서 해석의 공변·반변 성분 구분, 양자역학의 bra-ket \(\langle \varphi | \psi \rangle\). Strang 18.06 범위 밖이지만 선형대수 II·미분기하에서 재등장한다.
8 응용 분야
| 분야 | 선형 변환의 역할 | 구체적 예 |
|---|---|---|
| 딥러닝 | Fully connected 층 \(\mathbf{y} = \mathbf{W}\mathbf{x} + \mathbf{b}\) 의 \(\mathbf{W}\mathbf{x}\) 부분 | \(\mathbf{W}\) 가 특징을 새로운 축으로 재배치 |
| 컴퓨터 그래픽스 | 회전·확대·전단 변환 | 3D 모델을 화면 좌표로 투영 |
| 신호처리 | 푸리에 변환 | 시간 기저 → 주파수 기저로의 기저 변환 |
| PCA (통계/ML) | 공분산 행렬의 고유 기저로 회전 | 분산이 가장 큰 방향을 축으로 선택 |
| 컴퓨터 비전 | 카메라 투영 행렬 | 3차원 세계 좌표를 2차원 이미지 평면으로 |
| 수치해석 | 이산 미분·적분 연산자 | 유한차분 행렬이 미분 연산자의 이산 표현 |
| 양자역학 | 관측 가능량 연산자 | 에르미트 행렬이 물리량을 기저로 표현 |
딥러닝 관점에서의 재조명. 선형층 \(\mathbf{W}\mathbf{x}\) 는 “입력 특징 공간을 다른 좌표계로 회전/확대/사영하는” 변환이다. 이어지는 비선형 활성화(ReLU 등)는 “그 좌표계에서 특정 방향만 살리는” 선택이다. 다시 말해 딥러닝의 층 구조는 기저 변환과 비선형 선택을 반복해 특징을 점진적으로 재정렬하는 과정으로 해석할 수 있다. 이 해석은 Ch.7 의 선형 변환 관점 없이는 성립하지 않는다.
9 예시 (손계산)
9.1 예시 1 — 회전 행렬의 합성
\(60^\circ\) 회전 후 \(30^\circ\) 회전을 합성하면 기하적으로 \(90^\circ\) 회전이어야 한다. 행렬로 직접 확인한다.
\[ \mathbf{R}_{30^\circ} \mathbf{R}_{60^\circ} = \begin{bmatrix} \tfrac{\sqrt{3}}{2} & -\tfrac{1}{2} \\ \tfrac{1}{2} & \tfrac{\sqrt{3}}{2} \end{bmatrix} \begin{bmatrix} \tfrac{1}{2} & -\tfrac{\sqrt{3}}{2} \\ \tfrac{\sqrt{3}}{2} & \tfrac{1}{2} \end{bmatrix} = \begin{bmatrix} 0 & -1 \\ 1 & 0 \end{bmatrix} = \mathbf{R}_{90^\circ} \]
직관 확인: \(\mathbf{R}_{90^\circ}\) 는 \(\mathbf{e}_1 \mapsto \mathbf{e}_2\), \(\mathbf{e}_2 \mapsto -\mathbf{e}_1\) 이다. 종이에 그려보면 정확히 반시계 \(90^\circ\) 이다. 합성 공식 \(T \circ S\) 의 행렬이 \(\mathbf{R}_{30^\circ}\mathbf{R}_{60^\circ}\) 라는 점, 그리고 행렬 곱 순서가 “나중 변환이 왼쪽” 이라는 점이 자연스럽게 확인된다.
9.2 예시 2 — 전단 변환의 기저 표현과 유사 변환
전단 행렬 \[ \mathbf{A} = \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix} \] 은 표준 기저에서는 “위로 갈수록 오른쪽으로 \(1\) 만큼 밀리는” 변환이다. 이제 새로운 기저 \(\mathcal{B}' = \{(1, 0), (1, 1)\}\) 를 선택한다. 전이행렬은 \[ \mathbf{M} = \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix}, \qquad \mathbf{M}^{-1} = \begin{bmatrix} 1 & -1 \\ 0 & 1 \end{bmatrix} \] 따라서 새 좌표에서 같은 변환은 \[ \mathbf{B} = \mathbf{M}^{-1} \mathbf{A} \mathbf{M} = \begin{bmatrix} 1 & -1 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix} \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix} = \begin{bmatrix} 1 & 1 \\ 0 & 1 \end{bmatrix} \] 의 계산 과정을 거친다. 이 예에서는 \(\mathbf{A}\) 와 \(\mathbf{B}\) 가 같은 모양이지만, 일반적으로는 행렬 모양이 달라진다. 핵심은 “같은 변환이라도 기저를 바꾸면 행렬이 달라진다” 는 사실 자체이다.
10 코드 예시
10.1 Step 1 — 순수 Python으로 선형성 확인
# 선형 변환인지 두 공리로 직접 확인한다
def apply_T(v):
"""T(x, y) = (2x + y, x - y) — 선형인지 확인해볼 대상"""
x, y = v
return (2 * x + y, x - y)
def apply_NonLinear(v):
"""비선형 예: (x^2, y) — 가법성이 깨짐"""
x, y = v
return (x ** 2, y)
def check_linearity(T, trials=5):
import random
for _ in range(trials):
u = (random.uniform(-3, 3), random.uniform(-3, 3))
v = (random.uniform(-3, 3), random.uniform(-3, 3))
c = random.uniform(-2, 2)
# 가법성: T(u + v) ?= T(u) + T(v)
lhs = T((u[0] + v[0], u[1] + v[1]))
rhs_a = T(u)
rhs_b = T(v)
add_ok = all(abs(lhs[i] - (rhs_a[i] + rhs_b[i])) < 1e-9 for i in range(2))
# 동차성: T(cu) ?= c T(u)
lhs2 = T((c * u[0], c * u[1]))
rhs2 = tuple(c * x for x in T(u))
hom_ok = all(abs(lhs2[i] - rhs2[i]) < 1e-9 for i in range(2))
if not (add_ok and hom_ok):
return False
return True
print("T is linear? ", check_linearity(apply_T))
print("NonLinear linear?", check_linearity(apply_NonLinear))해석: 두 공리를 랜덤 입력으로 검증한다. 가법성이나 동차성 중 하나라도 깨지면 선형 변환이 아니다. 정리를 외우는 것보다 코드로 한 번 확인하는 편이 체화에 훨씬 효과적이다.
10.2 Step 2 — NumPy로 기저 이미지에서 행렬 복원
import numpy as np
# 미지의 선형 변환 (블랙박스)
def T(v):
return np.array([2 * v[0] + v[1], v[0] - v[1]])
# 표준 기저 벡터의 상을 모으면 행렬이 된다
e1 = np.array([1.0, 0.0])
e2 = np.array([0.0, 1.0])
A = np.column_stack([T(e1), T(e2)])
print("복원된 행렬 A =")
print(A)
# 임의의 벡터에 대해 T(v) 와 A @ v 가 일치하는지 확인
v = np.array([3.0, -2.0])
print("T(v) =", T(v))
print("A @ v =", A @ v)해석: “행렬은 기저 벡터의 상을 열로 모은 것” 이라는 이론을 코드로 그대로 구현한다. 복잡한 내부 구현을 몰라도 \(T(\mathbf{e}_1)\) 과 \(T(\mathbf{e}_2)\) 만 관측하면 변환 전체를 복원할 수 있다는 사실이 눈으로 확인된다.
10.3 Step 3 — 기저 변환 (Similarity Transformation) 검증
import numpy as np
# 원래 변환 (표준 기저에서)
A = np.array([[3.0, 1.0],
[0.0, 2.0]])
# 새 기저 B' = {(1, 1), (1, -1)}
M = np.array([[1.0, 1.0],
[1.0, -1.0]])
# 같은 변환을 새 기저에서 본 행렬
B = np.linalg.inv(M) @ A @ M
print("새 기저에서의 행렬 B =")
print(B)
# 핵심 확인: 고유값은 기저 변환 아래에서 보존된다
print("A의 고유값:", np.linalg.eigvals(A))
print("B의 고유값:", np.linalg.eigvals(B))해석: 기저가 바뀌어도 고유값 같은 불변량(invariant) 은 보존된다. 이것이 “닮음 행렬은 같은 변환의 다른 옷” 이라는 주장의 수치적 증거이다. 행렬식, 트레이스, 랭크도 같은 이유로 불변이다.
11 정리
이번 개요에서 다룬 핵심을 한 문장으로 요약하면 다음과 같다.
선형 변환은 “원점·직선·등간격을 보존하는 벡터 함수” 이고, 행렬은 그것을 특정 기저로 번역한 좌표표이다.
세 가지 관점 전환이 이 장의 모든 결과를 낳는다.
- 행렬 \(\to\) 함수: \(\mathbf{A}\mathbf{x}\) 를 \(T(\mathbf{x})\) 로 읽는다.
- 기저 벡터의 상 \(\to\) 행렬의 열: 변환 전체를 \(n\) 개의 관측으로 복원한다.
- 기저 변환 \(\to\) 유사 변환: 같은 변환의 가장 단순한 표현을 찾는 행위가 대각화·SVD이다.
이 관점은 Ch.6 의 고유값 분해, Ch.4 의 최소제곱, §6.7 의 SVD 를 하나의 언어로 묶고, 딥러닝과 컴퓨터 그래픽스에서의 선형 레이어를 “추상적 연산” 이 아니라 좌표계를 다시 짜는 작업 으로 이해하게 한다.
12 관련 주제
선행 지식
- Ch.3 §3.5 — Independence, Basis and Dimension
- Ch.3 §3.6 — Dimensions of the Four Subspaces
- Ch.6 §6.2 — 대각화: \(\mathbf{A} = \mathbf{S}\mathbf{\Lambda}\mathbf{S}^{-1}\)
- Ch.6 §6.6 — 닮음 행렬과 기저 변환
후속 주제
- Ch.7 §7.2 — The Matrix of a Linear Transformation (심화)
- Ch.7 §7.3 — Diagonalization and the Pseudoinverse (선형 변환 관점의 재해석)
- Ch.6 §6.7 — SVD: 두 직교 기저 아래에서의 선형 변환
다른 카테고리 연결
- PCA 와 주성분 분석 — 공분산의 고유 기저 변환
- Attention 메커니즘 — Query/Key 선형 투영의 기하 해석
- Convolution 과 선형성 — 합성곱을 선형 변환으로 재해석
교재 참조
- Strang, Introduction to Linear Algebra, 4th Ed., Ch.7 §7.1–§7.3 (pp. 376–409)