인공지능을 위한 선형대수학 기초

선형 변환

최 수빈 2025. 1. 6. 18:13

 

선형 변환(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)

 

변환 전 후 차이를 명확하게 나타내고 싶었는데 내 한계 ㅋㅋㅋ

 


 

선형 변환 자체는 벡터 공간의 기하학적 변환(스케일링, 회전 등)에 가까움

'인공지능을 위한 선형대수학 기초' 카테고리의 다른 글

최적화 기법  (2) 2025.01.08
고유값과 고유벡터  (4) 2025.01.07
행렬식과 역행렬  (2) 2025.01.03
행렬과 행렬 연산  (1) 2025.01.03
벡터 공간과 기저  (5) 2024.12.24