선형 변환(linear transformation)
벡터 공간의 구조를 보존하는 함수
- 덧셈에 대한 선형성
T(u + v) = T(u) + T(v)
u, v는 벡터 - 스칼라 곱에 대한 선형성
T(cu) = cT(u)
c는 스칼라, u는 벡터
→ 선형 변환은 이 두 가지 속성을 만족함
기하학적 해석
- 회전(rotation) : 벡터를 기준축을 중심으로 회전
- 확대/축소(scaling) : 벡터의 크기를 조정
- 전단(shear) : 벡터의 모양을 비틀어 변형
→ 선형 변환은 다음의 가하학적 변환을 포함
* 원점은 항상 원점으로 변환함
행렬로 표현되는 선형 변환
모든 선형 변환은 행렬로 표현할 수 있음
- n차원 벡터 공간에서 m차원 벡터 공간으로의 선형 변환은 m x n 크기의 행렬 A로 나타냄
- 변환된 벡터는 원래 벡터와 변환 행렬의 곱으로 계산: y = Ax
x : 원래 벡터, y : 변환된 벡터
머신러닝에서 선형 변환의 응용
데이터 증강
이미지 회전, 크기 조정, 전단 변환 등 선형 변환을 활용하여 데이터 확장
생성적 적대 신경망(Generative Adversarial Network, GAN)
생성기가 잠재 공간(latent space)의 벡터를 이미지 공간으로 변환할 때 선형 변환과 비선형 활성화 함수의 조합을 사용
→판별자 학습 : 판별자가 실제 데이터를 진짜로, 생성된 데이터를 가짜로 분류하도록 학습
→생성자 학습 : 생성자가 만든 데이터가 판별자에게 진짜처럼 보이도록 학습
위 과정을 반복하며 두 모델이 동시에 개선됨
*잠재 공간(Latent Space) → 이미지 공간(Image Space) 변환
잠재 공간
생성기가 데이터를 생성하기 위해 사용하는 저차원의 벡터 공간
이 공간의 벡터는 일반적으로 랜덤하게 샘플링된 값으로, 이미지 공간으로 변환되기 전까지는 특정 의미를 가지지 않음
이미지 공간
이미지 데이터는 픽셀 값으로 표현되는 고차원의 데이터
(28x28 픽셀의 흑백 이미지 : 784차원의 공간에 속함, RGB 컬러 이미지 : 28x28x3 =2,352 차원의 공간에 있음)
생성기는 잠재 공간의 벡터를 입력받아, 이미지 공간으로 매핑하는 역할 수행
잠재 공간 벡터를 이미지 공간으로 변환할 때, 네트워크 각 층은 선형 변환과 비선형 활성화를 통해 점진적으로 잠재 공간 벡터를 고차원 이미지 데이터로 바꿈 -> 이 과정에서 디컨볼루션(Transposed Convolution) 또는 업샘플링(Upsampling)을 사용, 이미지의 해상도를 높이며, 원하는 크기의 출력 이미지 생성
강화학습
상태 공간(state space)의 특징 변환 및 차원 축소
2D 공간에서의 선형 변환 시각화
행렬을 사용하여 2D공간에서 90도 회전을 시각화 해봄
import numpy as np
import matplotlib.pyplot as plt
from matplotlib.lines import Line2D
def plot_transformation(A):
# 기본 단위 벡터
v1 = np.array([1, 0])
v2 = np.array([0, 1])
# 변환된 벡터
v1_transformed = A.dot(v1)
v2_transformed = A.dot(v2)
# 변환 전후 벡터를 플로팅
plt.quiver([0, 0], [0, 0], [v1[0], v2[0]], [v1[1], v2[1]],
color=['red', 'blue'], angles='xy', scale_units='xy', scale=1, alpha=0.5)
plt.quiver([0, 0], [0, 0], [v1_transformed[0], v2_transformed[0]],
[v1_transformed[1], v2_transformed[1]], color=['red', 'blue'],
angles='xy', scale_units='xy', scale=1, alpha=0.4)
# 범례를 수동으로 설정
legend_elements = [
Line2D([0], [0], color='red', lw=2, label='원래 벡터 (v1)'),
Line2D([0], [0], color='blue', lw=2, label='원래 벡터 (v2)'),
Line2D([0], [0], color='orange', lw=2, label='변환 후 벡터 (v1)'),
Line2D([0], [0], color='purple', lw=2, label='변환 후 벡터 (v2)'),
]
plt.legend(handles=legend_elements)
# 그래프 범위와 시각화
plt.xlim(-2, 2)
plt.ylim(-2, 2)
plt.axhline(0, color='gray', linewidth=0.5)
plt.axvline(0, color='gray', linewidth=0.5)
plt.grid(color='gray', linestyle='--', linewidth=0.5)
plt.show()
# 90도 회전 변환 행렬
A = np.array([[0, -1], [1, 0]])
plot_transformation(A)
변환 전 후 차이를 명확하게 나타내고 싶었는데 내 한계 ㅋㅋㅋ
선형 변환 자체는 벡터 공간의 기하학적 변환(스케일링, 회전 등)에 가까움