본문 바로가기

딥러닝/딥러닝북 뜯어보기

02. 딥러닝을 위한 선형대수학(Linear Algebra)_part1

02. 딥러닝을 위한 선형대수학(Linear algebra)_part1

 


  

MIT Press2016. 11. 18. - 800페이지
※ 이 글은 http://www.deeplearningbook.org/ 을 보고 개인적인 관점을 토대로 요약정리, 추가한 자료입니다.
   틀리거나 잘못된 점이 있다면 댓글로 남겨주시면 감사하겠습니다.



이번 글에서는 2장 내용인 선형대수학의 절반정도 까지 알아보도록 하겠습니다.

딥러닝의 대부분의 연산이 행렬로 계산되어지기 때문에 선형대수학은 딥러닝에서 빼놓을수 없는 영역입니다.

개인적인 생각으로는 용어랑 표기만 완벽하게 알아도 뒷 부분에 설명을 이해하기에 많은 도움이 될 것 같습니다.


2개의 파트로 나누어서, 첫번째 파트에서는 용어,연산 설명을 위주로 하고

두번째 파트에서는 연산을 이용해서 SVD, Pseudoinverse 등을 다루겠습니다.

이해를 돕기 위해서 numpy를 이용해서 간단한 실습을 포함했습니다.

02.1 Scalars, Vectors, Matrices and Tensors

익숙하다고 생각 할 수 있는 용어가 많이 나오는데 하나씩 살펴보겠습니다.
※ 용어는 번역을 하게 되면 개인적으로 괴리감을 좀 느껴서 그대로 쓰도록 하겠습니다.

Scalars 

네, 우리의 머리속에 있는 그 스칼라 맞습니다. 

표기 :    

x가 실수 범위 R의 한 값이라는 말입니다. 

Scalar x는 소문자로, italic체로 표현하여 사용합니다.


Vectors 

여러개의 수들을 표현할 때에는 vector를 사용합니다. 이 vector의 원소들은 1부터 벡터의 크기 n까지 인덱스를 통해서 접근을 할 수 있습니다. 각각의 원소들은 vector의 이름 밑에 아래첨자로 자신의 인덱스를 사용해서 접근합니다. 

표기 :    

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
= np.array([01234567])
S= [1,3,5]
print (V[S])
cs


Matrices

Matrix, 즉 우리가 잘아는 행렬입니다. 2차원의 수의 집합입니다.

표기 :    

위의 수식처럼, 대문자, italic체, 진한 글씨체를 이용해서 표현합니다. 원소는 vector때 처럼 인덱스를 이용해서 표기합니다.

높이 m, 너비 n인 matrix는 이전의 vector 때와 유사한 모양으로 위와같이 표기 할 수 있습니다.

Matrix는 재미있는 표기법이 있는데 바로, ( : ) 표기법 입니다. 주로 한 행이나, 열을 모아서 표현하고 싶을 때 사용합니다.


이런 식으로, 원하는 열과 행을 선택적으로 표현 할 수 있습니다.

NumPy로 Matrix를 쓸 때 또한 위의 연산을 지원합니다.

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

마지막으로 Tensor입니다. 용어는 아마도 Tensorflow에서 많이 들어보셨을텐데, 이 Tensor가 Tensorflow의 Tensor입니다. 
Tensor는 2차원보다 큰 수의 집합입니다.

NumPy로는 array로 표현 할 수 있습니다.
1
2
3
4
5
# Tensor
= np.array([[[1,2],[3,4],[5,6]],
              [[1,2],[3,4],[5,6]],
              [[1,2],[3,4],[5,6]]])
print (T.shape)
cs

표기 :    

위의 수식처럼, 대문자, 진한 글씨체를 이용해서 표현합니다. Matrix와 똑같은 표기지만 글씨체가 다릅니다. 원소를 접근하는 법 또한 일치합니다. 단지 차원수가 높아졌기 때문에  i,j로 표현하던 것은 i,j,k....개로 표현하면 됩니다.


02.2 Matrix의 연산

1. Transpose

Transpose는 Matrix에서 diagonal line을 중심으로 반사된 행렬을 구하는 것입니다. 



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
= 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 끼리 더하고 빼는 것은 아주 쉬운일이지요.
그냥 단순히 같은 shape(m x n)이라고 하면 같은 (i , j) 원소끼리 계산을 해주면 됩니다.

matrix와 scalar의 연산은 모든 matrix의 원소 (i , j)에 따로 적용을 해주면 됩니다.

 

이쁘게 적어놓으면 위의 식처럼 생각 할 수 있습니다.


제일 중요한 것은 matrix와 vector의 연산입니다. 



위의 경우 처럼 (3 x 2)의 matrix와  2차원 vector의 덧셈은 결과가 어떻게 될까요?



이런 식으로 vector가 각 행에 복사가 되어 형태를 일치시킨 후에 덧셈을 하게 되어집니다.

이런 연산을 broadcasting 이라고 합니다.


NumPy에서도 역시 broadcasting을 사용하여서 연산을 가능하게 해줍니다.


1
2
3
4
 # Broadcasting
= np.matrix([[1,2],[3,4],[5,6]])
= np.array([10,10])
print(A+b)
cs

3. Multiplying

matrix의 곱셈은 다들 아시겠지만, 혹시나 하는 마음에 정리해보겠습니다.


이런식으로 왼쪽 행렬의 한 행과, 오른쪽 행렬의 한 열을 몽땅 곱한후 더하면 새로운 행렬 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
= np.matrix([[1,2],[3,4]])
= 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


vector의 크기를 알고싶을 경우에 바로 Norm을 사용합니다. 즉 vector의 크기를 재어주는 함수를 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
 
= np.matrix([[1,2],[3,4],[5,6]])
print (np.linalg.norm(M,'fro'))
cs


02.4 특별한 Matrices 와 Vectors

vector나 matrix에서 특정한 형태나, 원소값을 가지고 있는 것들을 모아서 부르는 표현들이 있습니다. 용어를 정확하게 알고 있는 것이 중요할 것 같습니다.

1. Diagonal


위의 수식을 읽어보면 딱 감이 올겁니다.

대각선의 원소를 제외하고 다 0인 matrix을  Diagonal matrix 라고 합니다.

이 대각선의 원소들의 값을 vector를 이용해서 초기화 하는 모습을 위의 수식으로 볼 수 있습니다.


이 diagonal matrix는 vector와 곱셉을 한다고 생각을 해보면 연산이 아주 간단하게 됩니다.


위의 수식을 보면 보이는 것처럼, 두 vector의 원소끼리 곱셈을 하는 결과와 일치하게 됩니다.

또한 역행렬 또한 구하는 것이 아주 간단합니다.(각원소 = 1/각원소)

1
2
3
4
5
# Diagonal
= np.array([1,2,3,4])
= 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

unit vector는 L2norm이 1인 vector를 의미합니다.
L2norm이 1인 경우를 unit norm 이라고 합니다.
orthogonal은 vector x, y의 내적이 0인 경우를 의미합니다.

orthogonal + unit norm = orthogonal 이라고 합니다.


마지막으로 orthogonal matrix는 모든 열과 행이 각각 orthogonal 한 경우입니다.


orthogonal matrix는 이러한 특성을 가지기 때문에 역행렬 계산이 매우 쉽습니다.

(matrix내의 vector끼리 곱하면 unit norm이기 때문에 1이고, 다른 vector랑 곱하면 0이 되니깐 I가 나옵니다)



02.5 마치며

당분간은 글에 잔뜩 수식밖에 없을 것 같습니다... feedforward networks만 가도 흥미로운 내용들이 많은데, 이런 앞의 내용을 모르면 두루뭉실하게 알고 넘어가야 하기 때문에 할수 없이 수학을 어느정도는 알고 있어야지 제대로 딥러닝을 할 수 있다고 봅니다. 

이번 장은 사실상 용어 표기에 중점을 두었기 때문에 좀 이해 해야 되는 것도 없고, 사전식으로 나열해서 재미는 없었지만,  나중을 위해서.. 용어들의 뜻과 표기는 다 암기하고 있어야 될 것같습니다.

'딥러닝 > 딥러닝북 뜯어보기' 카테고리의 다른 글

01. 딥러닝이란?(Introduction)  (0) 2017.04.18