[인공지능 수학 - 미적분]6강 : 선형변환
선형변환(Linear Transformation)
함수 복습
함수의 개념 : 함수는 상자(함)에 입력(input)이 들어가면 어떤 기능을 수행한 다음 출력을 뱉어내는 블랙박스이다.
입력이 정의되는 집합 D을 domain(정의역)이라 한다. 출력이 정의되는 집합 C을 codomain(공역)이라 하며, codomain 중 실제 함수의 출력이 나오는 부분집합은 range(치역)이라 한다.
함수 f는 D의 각 원소 x가 C의 한 원소 y(=f(x))에 대응되는 매핑룰(mapping rule)이다. 다음과 같이 표기한다.
$f : D \overrightarrow C$
다음과 같은 함수가 있다.
$f(x) = x^2 + 2x + 3$
이 함수는 domain과 codomain을 강조해서 다음과 같이 표기한다.
$f : R \overrightarrow R$
C-스타일 프로그래밍으로 위의 함수 f를 구현한다면 이와 같다. 입출력으로 실수 집합 R(real number)을 다루는 함수라는 것을 명시하기 위해 입출력 타입을 float으로 한다.
float f(float x){return x*x + 2*x + 3;}
선형함수(Linear Function)
만일 함수 f가 아래 두가지 조건을 만족하면 함수 f를 선형함수(linear function)이라 한다.
그려봤을때 직선형태, 평면의 형태.
$f(x + y) = f(x) + f(y)$, $f(cx) = cf(x)$, (단, c는 임의의 스칼라)
- 임의의 두 입력에 대해, ‘+연산을 먼저 수행한 결과를 함수 입력으로 넣고 함수를 수행한 결과’와 ‘각 입력에 대해 함수를 수행한 후 나온 결과에 대해 +연산을 수행한 결과’는 같다.
- 임의의 입력에 대해, ‘스칼라 곱셈 연산을 먼저 수행한 다음 함수를 수행한 결과’와 ‘입력에 대해 함수를 수행한 후 나온 결과에 대해 스칼라 곱셈 연산을 수행한 결과’는 같다.
선형변환(linear transformation): 행렬은 선형변환의 구현체
변환(Transformation)
함수의 입력이 n-벡터이고 출력이 m-벡터인 함수 T를 생각해 보자. 이와 같이 함수의 입출력이 벡터인 함수를 변환(transformation)라 한다.
$T : R^n -> R^m$
특별히 n=m인 경우, 해당 변환을 연산자(operator)라고 한다.
변환의 예 : MNIST 손글씨 인식 문제
예를 들어, $28 * 28$ 해상도의 손글씨 숫자영상을 그레이스케일로 받아, 0부터 9까지의 어떤 숫자가 적혀있는지 알아내는 MNIST 손글씨 인식 문제는 다음과 같은 (비선형)변환이다. 함수가 아니라 변환이라고 한다.
$T : R^{28*28} -> R^{10}$
인공지능의 변환은 대부분 선형변환이 아니라 비선형 변환이다. 참고!
행렬변환(Matrix Transformation)
$m * n$ 행렬 A에 대해 Ax는 n-벡터를 입력으로 받아 m-벡터를 출력으로 내는 변환 $T_A(x) = Ax$으로 볼 수 있다. 이 변환은 행렬이 정의하기 때문에 행렬변환(matrix transformation)이라고 한다.
$T_A : R^n \overrightarrow R^m$
그런데 행렬변환은 다음의 선형함수 성질을 모두 만족하기 때문에 선형변환(linear transformation)이다.
$T_A(x+y) = T_A(x) + T_A(y)$,
$T_A(cx) = cT_A(x)$
(단, $x,y \in R^n$이고, c는 임의의 스칼라)
$T_A$를 행렬 A라고 생각하고 보면 쉽다. 행렬은 입출력이 벡터이기 때문에 함수 중에서도 특별한 변환(transformation)이 된다. 즉 행렬은 선형변환이다.
정리
$m*n$ 행렬은 n-벡터를 입력으로 받아 m-벡터를 출력으로 내는 선형변환이며, 임의의 선형변환은 행렬로 표현가능하다. 즉, 행렬은 선형변환의 구현체이다.
표준행렬(standard matrix): 선형변환 코딩하기
행렬변환 코딩하기
- 구현하고자 하는 기능(function)의 입력과 출력이 벡터로 정의되는지 확인한다. 벡터가 아니면 변환이 아니기 때문에 행렬로 구현할 수 없다.
- 구현하고자 하는 기능이 선형인지 확인한다.
- 입력이 n-벡터이고, 출력이 m-벡터이면 $m*n$ 표준행렬(standard matrix) 을 구성한다.
표준행렬(Standard Matrices)을 이용한 선형변환 코딩
다음의 $m * n$ 표준행렬(standard matrix)을 구성하여 우리가 원하는 방식대로 동작하는 행렬변환 $T_A : R^n$ -> $R^m$을 코딩할 수 있다.
$
\begin{bmatrix}
T_A(e_1) & T_A(e_2) & \dots & T_A(e_n)
\end{bmatrix}
_{m*n}
$
정리 : 표준행렬 구하기
- n-차원 표준기저벡터 ${e_1, e_2, \dots, e_n}$를 생각한다.
- 각 n-차원 표준기저벡터 $e_i$에 대해, 우리가 원하는 기능을 동작시켜 얻은 결과인 m-차원 벡터 $T(e_i)$를 표준행렬의 각 열에 적는다.
예제1 : 표준행렬(Standard Matrices)을 이용한 선형변환 코딩
2차원 벡터를 입력으로 받아, 해당 벡터를 x-축에 프로젝션(투영)하는 기능을 구현
예제2 : 표준행렬(Standard Matrices)을 이용한 선형변환 코딩
2차원 벡터를 입력으로 받아, 해당 벡터를 반시계 방향으로 $\theta$만큼 회전하는 기능을 구현
-> 벡터로 입력받아 벡터로 출력되는지 확인, 선형인지 확인