02. 딥러닝을 위한 선형대수학(Linear algebra)_part1
이번 글에서는 2장 내용인 선형대수학의 절반정도 까지 알아보도록 하겠습니다.
딥러닝의 대부분의 연산이 행렬로 계산되어지기 때문에 선형대수학은 딥러닝에서 빼놓을수 없는 영역입니다.
개인적인 생각으로는 용어랑 표기만 완벽하게 알아도 뒷 부분에 설명을 이해하기에 많은 도움이 될 것 같습니다.
2개의 파트로 나누어서, 첫번째 파트에서는 용어,연산 설명을 위주로 하고
두번째 파트에서는 연산을 이용해서 SVD, Pseudoinverse 등을 다루겠습니다.
이해를 돕기 위해서 numpy를 이용해서 간단한 실습을 포함했습니다.
02.1 Scalars, Vectors, Matrices and Tensors
Scalars
표기 :
x가 실수 범위 R의 한 값이라는 말입니다.
Scalar x는 소문자로, italic체로 표현하여 사용합니다.
Vectors
표기 :
Vector x는 소문자로, italic체로 진하게 표현하여 사용합니다.
이런 식으로 벡터의 모든 원소가 R의 집합의 원소이고 n개의 원소가 있을 경우 위와 같은 식으로 vector를 표현하기도 합니다.
vector의 경우 각 원소들을 각 축의 좌표로 생각 할 수가 있습니다.
예를 들면 X=[1,2,3] 이라는 벡터가 있다고 하면, 이것은 3차원 좌표계에서 (1,2,3) 점이라고 생각 할 수 있습니다.
만약에 벡터의 부분집합을 표현하고 싶을 때에는 아래와 같이 표기하면 됩니다.
즉, X라는 벡터의 1,4,5번째 원소를 고르고 싶으면, 위의 수식처럼 1,4,5라는 집합을 X의 아래첨자로 표기해 주면 됩니다.
만약에 1,4,5번째 원소를 빼고 고르고 싶다면, -S를 아래첨자로 표기해 주면 됩니다.
NumPy를 이용하면 아래와 같이 사용 할 수 있습니다.
1 2 3 4 | # Vectors V = np.array([0, 1, 2, 3, 4, 5, 6, 7]) S= [1,3,5] print (V[S]) | cs |
Matrices
표기 :
1 2 3 4 5 | # Matrices M1 = np.matrix([[1,2],[3,4],[5,6]]) print(M1) print (M1[0,:]) print (M1[:,1]) | cs |
Tensors
1 2 3 4 5 | # Tensor T = np.array([[[1,2],[3,4],[5,6]], [[1,2],[3,4],[5,6]], [[1,2],[3,4],[5,6]]]) print (T.shape) | cs |
표기 :
02.2 Matrix의 연산
1. Transpose
main diagonal은 위의 수식에서 빨간색 원소, 즉 i==j인 성분을 말합니다.
직관적으로 위의 그림으로 보면 Transpose가 감이 잡히실 겁니다. 하지만 정의를 해보면
위의 수식처럼 간결하게 정의 할 수 있습니다.
이 Transpose를 이용해서 vector를 표현 할 때 위의 수식처럼 자주 사용되곤 합니다.
이럴 수 있는 이유는, vector를 (n x 1) matrix로 볼 수 있기 때문입니다.
Scalar는 생각해보면 (1 x 1) matrix로 볼 수 있습니다. 값이 딱 1개이기 때문에 transpose를 해도 값이 똑같은 것이 특징입니다.
NumPy에서 역시나 transpose를 지원하기 때문에 실제로 출력하면서 결과를 따라가면 좋을 것 같습니다.
1 2 3 4 5 6 7 8 9 10 | # Matrices_Transpose M1 = np.matrix([[1,2],[3,4],[5,6]]) print(M1.transpose()) # Tensor_Transpose T = np.array([[[1,2],[3,4],[5,6]], [[1,2],[3,4],[5,6]], [[1,2],[3,4],[5,6]]]) print (T.transpose()) | cs |
2. Add, Sub
이쁘게 적어놓으면 위의 식처럼 생각 할 수 있습니다.
제일 중요한 것은 matrix와 vector의 연산입니다.
위의 경우 처럼 (3 x 2)의 matrix와 2차원 vector의 덧셈은 결과가 어떻게 될까요?
이런 식으로 vector가 각 행에 복사가 되어 형태를 일치시킨 후에 덧셈을 하게 되어집니다.
이런 연산을 broadcasting 이라고 합니다.
NumPy에서도 역시 broadcasting을 사용하여서 연산을 가능하게 해줍니다.
1 2 3 4 | # Broadcasting A = np.matrix([[1,2],[3,4],[5,6]]) b = np.array([10,10]) print(A+b) | cs |
3. Multiplying
이런식으로 왼쪽 행렬의 한 행과, 오른쪽 행렬의 한 열을 몽땅 곱한후 더하면 새로운 행렬 C의 한 원소가 됩니다.
만약에 (M x N) 차원의 행렬과 (N x P) 차원의 행렬을 곱했다면 결과는 (M x P) 차원이 나올것입니다.
중요한 점은 두 행렬의 곱셈에서 중간의 차원이 같아야 한다는 점입니다.
기본적인 행렬연산의 성질은 다음과 같습니다.
이 중에서 3번 째인 matrix의 not commutative한 성질만 파악하고 있으면 될 것 같습니다.
또한 matrix들의 곱을 transpose 하면 아래와 같은 결과를 가집니다.
NumPy로는 matmul이나 dot을 이용해서 곱셉을 할 수 있습니다.
matmul이나 dot은 동일한 함수는 아니고 정확한 차이는 찾아보시길 바랍니다..
1 2 3 4 5 6 | # Matmul A = np.matrix([[1,2],[3,4]]) B = np.matrix([[4,5],[6,7]]) print(np.matmul(A,B)) print(np.dot(A,B)) | cs |
이 matrix 곱셉을 통해서 vector나 scalar에 적용 할 수 있습니다.
재미있는 점은 vector들의 내적을 matrix 곱셉으로 표현 할 수 있습니다.
이런 식으로 두 vector의 내적을 간단하게 표현 할 수 있습니다.
이 처럼 두 vector의 내적은 양쪽의 vector의 순서를 바꾸어도 값이 동일한 특성을 가지고 있습니다.
왜인지는 (AB)에 transpose한 결과를 적용해보면 쉽게 알 수 있고, 직관적으로 그냥 계산식을 써보아도 쉽게 알 수 있습니다.
여태까지 열심히 matrix에 대해서 알아본 이유는 이러한 matrix의 연산들을 통해서 우리는 어떤 선형 방정식을 정의할 수 있습니다.
어떤 머신러닝 또는 딥러닝 알고리즘에서 Ax=b 꼴로 식을 만들어서 이것의 해를 구함으로써 답을 얻어 낼 수 있습니다.
Inverse나 실제 해를 구하는 방법에 대해서는 Part2에 다루겠습니다.
02.3 Norm
은 위의 식처럼 정의가 됩니다.
Norm은 직관적으로 보면, 원점과 vector x와의 거리를 의미한다고 볼 수 있습니다.
p가 2인 경우 우리가 잘 알고있는 Euclidean norm 입니다. 두 점의 거리를 구할 때 제곱한 것을 다 더하고 루트를 씌워주었던 바로 그것입니다. 이때 루트를 씌우지 않고 그대로 쓰는 것은 squared L2 norm이라고 합니다. 이것은 미분을 할때 그냥 L2 norm에 비해서 편하기 때문에(각 항에대해서만 미분하면되기 때문에) 자주 사용이 되어 지지만, 0의 근처에서 값의 변화가 상당히 적기 때문에(y=x^2을 생각해보세요) 머신러닝에서는 L1 norm을 사용하게 됩니다. L1 norm은 0에 가까운 값에 대해서도 항상 일정하게 변화하기 때문입니다.
이 외에도 vector원소 중 최대값을 찾기 위해서 max norm 을 사용 할 수 있습니다. 위의 수식처럼 정의가 됩니다.
여태까지 vector의 크기를 알고싶었지만, matrix의 크기를 알고 싶을 때가 있습니다. 이때는 Frobenius norm을 사용하면 됩니다.
Frobenius norm은 vector의 L2 norm을 matrix로 확장한 느낌으로 볼 수 있다.
실제 NumPy로 값을 넣어보면서 확인해 보면 좋을 것 같습니다.
1 2 3 4 5 6 7 | # Norm V= np.array([1,2,3,4]) print (np.linalg.norm(V,ord=1)) #L1 norm print (np.linalg.norm(V,ord=2)) #L2 norm M = np.matrix([[1,2],[3,4],[5,6]]) print (np.linalg.norm(M,'fro')) | cs |
02.4 특별한 Matrices 와 Vectors
1. Diagonal
위의 수식을 읽어보면 딱 감이 올겁니다.
대각선의 원소를 제외하고 다 0인 matrix을 Diagonal matrix 라고 합니다.
이 대각선의 원소들의 값을 vector를 이용해서 초기화 하는 모습을 위의 수식으로 볼 수 있습니다.
이 diagonal matrix는 vector와 곱셉을 한다고 생각을 해보면 연산이 아주 간단하게 됩니다.
위의 수식을 보면 보이는 것처럼, 두 vector의 원소끼리 곱셈을 하는 결과와 일치하게 됩니다.
또한 역행렬 또한 구하는 것이 아주 간단합니다.(각원소 = 1/각원소)
1 2 3 4 5 | # Diagonal V = np.array([1,2,3,4]) D = np.diag(V) print(D) print(np.linalg.inv(D)) | cs |
2. Symmetric
transpose 한 matrix가 자기 자신과 같은 것을 symmetric matrix라고 합니다.
이런 matrix는 예를들어보면
X=[1,2,3,4,5], Y=[1,2,3,4,5] 라는 좌표평면의 거리를 matrix로 만들면 symmetric matrix가 됩니다.
1에서 2로 가는 거리와, 2에서 1로가는 거리가 같기 때문에 즉, i에서 j로 가는 거리와 j에서 i로 가는 거리가 같기 때문에 symmetric matrix의 정의와 일치합니다.
3. unit vector, unit norm, orthogonal
orthogonal + unit norm = orthogonal 이라고 합니다.
마지막으로 orthogonal matrix는 모든 열과 행이 각각 orthogonal 한 경우입니다.
orthogonal matrix는 이러한 특성을 가지기 때문에 역행렬 계산이 매우 쉽습니다.
(matrix내의 vector끼리 곱하면 unit norm이기 때문에 1이고, 다른 vector랑 곱하면 0이 되니깐 I가 나옵니다)
02.5 마치며
이번 장은 사실상 용어 표기에 중점을 두었기 때문에 좀 이해 해야 되는 것도 없고, 사전식으로 나열해서 재미는 없었지만, 나중을 위해서.. 용어들의 뜻과 표기는 다 암기하고 있어야 될 것같습니다.
'딥러닝 > 딥러닝북 뜯어보기' 카테고리의 다른 글
01. 딥러닝이란?(Introduction) (0) | 2017.04.18 |
---|