들어가며...
그동안의 바쁜 일정으로 인해서 2달 만에 포스팅을 하게 되었습니다... 다른 카테고리의 글들도 업데이트를 해야 하나 우선 가장 급하다고 생각하는 '수학'에 대해서 먼저 다루려고 합니다.
기초편에서도 말했듯이 데이터를 분석하거나 머신러닝, 딥러닝을 하기 위해서는 약간의 수학적 개념만 알아도 충분히 할 수 있지만 실무 프로젝트와 학업을 진행하면서 느낀 점은 수학적인 뒷밤침이 없다면 단순히 코드만 돌리고 결과만 확인하게 된다는 것입니다. 이는 모래 위에 쌓은 성과 같은 '사상누각'이라고 할 수 있습니다. 데이터 과학의 대부분은 우리 주변의 문제 'What'을 해결하고자 하지만 우리가 수행한 'How'에 대한 'Why'가 충분히 뒷받침 되지 않는다면 결과의 정확도나 해석의 타당성이 떨어집니다. 또 어떤 예측 모형을 구축한다고 했을 때 그 과정에서 발생하는 문제를 적절하게 해소하지 못할 수 있습니다.
그렇다면 수학을 왕창 다 배워야 하느냐? 그건 아닌 것 같습니다. 선형대수와 행렬 미분 정도만 그 기본 개념을 제대로 짚고 넘어간다면 충분하다는 생각을 했습니다. 딥러닝은 벡터의 연산 집합이라고도 할 수 있습니다. 그 유명한 PCA도 벡터 연산이 중심입니다.
최근 Coursera에서 Mathematics for Machine Learning이라는 Specialization을 오픈했습니다. 딱! 제가 필요로 하던 수학만 학습할 수 있도록 준비되어 있습니다. 제 스스로도 너무 오랫동안 수학을 안했고 필요성을 느껴 필요한 것만 되짚어 보기 위해, 다시 공부하기 위해 위 강의를 수강하며 들은 내용들을 정리하려고 합니다.
- Linear Algebra
- Matrix Calculus
- PCA
제가 직접 해보진 않았지만 칸 아카데미의 Linear Algebra도 굉장히 유용하다고 합니다. 칸 아카데미는 수학을 정말 쉽게 공부할 수 있도록 그것도 무료로! material을 제공하고 있습니다.
- Khan Academy [Link]
- 미국의 대학원생들이 보는 선형대수 책 Introduction to Linear Algebra by Gilbert Strang, Wellesley-Cambridge Press, 5th Ed, 2016. http://math.mit.edu/~gs/linearalgebra/
- 기타참고 자료
http://www.3blue1brown.com
https://en.wikipedia.org/wiki/Linear_algebra
선형대수 Linear Algebra
1. 데이터 과학에서 벡터란 Vector in Data Science
다음은 벡터에 대한 정의입니다.
2. 벡터(vector)의 정의
1) A list of numbers
Vectors are usually viewed by computers as an ordered list of numbers which they can perform "operations" on - some operations are very natural and, as we will see, very useful!
2) Position in three dimensions of space and in one dimension of time
A vector in space-time can be described using 3 dimensions of space and 1 dimension of time according to some co-ordinate system.
3) Something which moves in a space of fitting parameters
As we will see, vectors can be viewed as a list of numbers which describes some optimisation problem.
3. 벡터 연산 Vector Operation
3.1 벡터의 합연산은 순서와 관계가 없다
3.2 벡터의 스칼라(넘버) 곱연산은 scalar 만큼 반복하는 것이고 -(minus)는 반대로 방향이 바뀐다
3.3 벡터는 크기(size/length)와 방향(direction)을 가졌다.
벡터의 크기와 방향을 표현할 때는 이렇게 계산해서 구할 수 있다. 피타고라스 정리를 사용한 것입니다.
# Simple Python code for Calculation of vector size
In [1]: import numpy as np
In [2]: a = np.array([1, 3, 4, 2])
In [3]: size_of_a = np.sqrt(np.sum(np.square(a)))
In [4]: size_of_a
Out[4]: 5.4772255750516612
3.4 Dot Product ★★★
# Simple Python code for dot product
In [1]: import numpy as np
In [2]: a = np.array([-5, 3, 2, 8])
In [3]: b = np.array([1, 2, -1, 0])
In [4]: np.dot(a, b)
Out[4]: -1
Dot Product : Its simply the projection of one vector onto the other multiplied by the magnitude of other vector . The dot product tells you what amount of one vector goes in the direction of another (Thus its a scalar ) and hence do not have any direction .
a.b= ||a|| ||b|| cos(θ). Alternatively if a=(x1,y1) and b=(x2,y2) (Position vectors) the dot product is x1.x2+y1.y2 .
3.5 Cosine Rule을 벡터로 바꾸어봅시다
삼각형의 세 변 a, b, c는 벡터 r, s. r-s로 표현됩니다. 각도는 θ입니다. 코사인 법칙 을 벡터로 바꾸면
가 됩니다. cos 90도 일때는 이 값이 0이 되므로 rs=0이 되고 아래의 그림처럼 직각인 상태에서는 전체가 0이 됩니다. cos 0도일 때는 그 값이 1이며 rs=1이 됩니다. 이 때는 r과 s 벡터가 같은 방향을 가집니다.
이미 딥러닝을 공부하신 분들은 아시는 내용이지만 cos 90도로 벡터 간 각도가 90인 것은 벡터가 서로 직교(Orthogonal)함을 의미합니다. 다른 딥러닝 포스팅에서도 이 내용을 다루었습니다. one-hot encoding 방식은 벡터간의 내적이 0이 되므로 interaction이 고려되지 않음을 말하고 그래서 확률적 표현(probabilistic representation)을 통해 이를 극복하고자 하기도 하였습니다.
직교한다는건 서로 만날 일도 없고 연관되지 않는다고도 볼 수 있는데 방금 증명하였듯이 90도일 때는 두 벡터의 내적(dot product)이 0이 되기 때문에 이를 뒷받침해줍니다. 직교에 대한 자세한 내용은 이후에 더 다룰 것으로 보입니다. cosine 180도라면 -1이므로 두 벡터간의 관계가 반대방향으로 될 것입니다. ←→ 이런식으로.
벡터의 내적을 통해서 벡터간의 관계를 확인할 수 있었습니다. 우리가 통계시간에 배운 interaction term은 이것과 관련있습니다. (임의의 변수 a와 변수 b를 곱해 변수 ab를 만들어 interaction을 분석해 보셨을 것입니다... 사회과학에서 자주 사용하는 방법입니다)
3.6 Projection ★★
In this case, , hence the scalar projection is also .
그래서 두 벡터가 직교했을 때 서로 투영하는 부분이 전혀 없기 직각으로 선을 내렸을 때 겹치는 부분이 0이 됩니다. 이렇게도 설명할 수 있습니다. 아래의 판서는 앞의 내용들을 정리한 것이며 아래 |s|cosθ는 인접한 영역의 투영을 의미하는 것으로 벡터 s가 벡터 r에 얼마만큼 투영되는지를 보여주는 것입니다. 결과적으로 두 벡터 r, s의 내적(dot product)은 한 벡터와 그에 투영되는 다른 벡터에 대한 관계가 표현된다고 볼 수 있습니다.
한 벡터의 변화를 다른 벡터가 얼마만큼 설명할 수 있는가가 Projection의 핵심이다
Scalar projection
그리고 이는 역으로 투영되는 정도가 얼마나 되는지 볼 수 있다는 의미이기도 합니다. scalar projection으로 이를 계산할 수 있습니다. 두 벡터의 내적에서 한 벡터의 크기 만큼 나눠주면 인접하는 벡터의 투영 정도를 계산할 수 있습니다. 결과 값은 scalar(숫자)입니다.
☞ 투영되는 정도 = |s|cosθ = r.s / |r|
# Simple Python code for Scalar Projection
In [1]: import numpy as np
In [2]: r = np.array([3, -4, 0])
In [3]: s = np.array([10, 5, -6])
In [4]: np.dot(r, s) / np.sqrt(np.sum(np.square(r))) # r.s / |r|
Out[4]: 2.0
Vector projection
☞ r (r.s / |r| |r|)
# Simple Python code for Vector projection
In [1]: import numpy as np
In [2]: r = np.array([3, -4, 0])
In [3]: s = np.array([10, 5, -6])
In [4]: def size_of_vector(vector): # function for calculating length of vector
...: return np.sqrt(np.sum(np.square(vector)))
In [5]: (np.dot(r,s)/(size_of_vector(r)*size_of_vector(r)))*r # Calculation of r (r.s / |r| |r|)
Out[5]: array([ 1.2, -1.6, 0. ])
Summary of Projection
The scalar projection of a vector u onto a vector v is q ⋅ u, where q is the unit vector in the direction of v.
The vector projection of u onto v is the scalar projection of u onto v times q, where q is the unit vector in the direction of v.
The vector projection of u onto v is the best approximation of u in the direction of v, in the sense that the difference between u and its vector projection onto v is orthogonal to v.
The work done by a force that is applied at an angle to the displacement vector can be computed by projecting the force vector onto the displacement vector, and then multiplying the magnitudes of the force and displacement vectors.
Sample Quiz solving by python
|a|+|b|의 결과가 더 크게 나왔습니다. 우리가 피타고라스의 정리를 생각해보면 간단합니다. 빗변 c의 제곱은 양변 a와 b의 각 제곱을 합친 값과 같다는 사실을 떠올려보면 쉽게 이해가 될 것입니다. 이것을 "Triangle Inequality"라고 부르는데 삼각형을 만들기 위해서는 양변의 길이의 합이 빗변보다 길어야 삼각형을 만들 수 있다는 것을 의미합니다. 아래의 코드로 문제를 풀었습니다.
# Simple Python code for 'triangle inequality'
In [1]: import numpy as np
In [2]: def size_of_vector(vector):
...: return np.sqrt(np.sum(np.square(vector)))
In [3]: a = np.array([3, 0, 4])
In [4]: b = np.array([0, 5, 12])
In [5]: res1 = size_of_vector(a+b)
In [6]: res2 = size_of_vector(a) + size_of_vector(b)
In [7]: print(res1, res2)
17.0293863659 18.0
4. Changing basis (co-ordinate system)
딥러닝에서 많이 하는 것이 어떤 문제를 다른 고밀도의 벡터로 표현하는 방법이 많은데 수학적으로는 하나의 coordinate system에서 다른 coordinate system으로 바꾸는 것과 비슷하다고 합니다. 대부분의 머신러닝 문제가 이것과 상당히 밀접한 관련이 있습니다.
좌표계(coordinate system)
"숫자나 좌표를 이용해서 유클리디안 공간안에서 기하학적으로 문제를 표현하는 시스템"
앞에서 다루었던 projection product를 통해서 basis space에서 새로운 space로 데이터의 표현이 가능해진다고 합니다.
그리고 기저 벡터(basis vector)를 알아야 새롭운 벡터를 정의할 수 있다. 아래 그림을 보면 re라는 벡터는 청므의 기저벡터인 e1과 e2 벡터를 통해서 [3, 4]라는 새로운 벡터를 만들어 냈는데 여기서 새로운 기저 벡터 b1, b2를 사용해 rb라는 새로운 벡터를 만들어내었다. 기존의 re 벡터와 b1, b2 각 벡터와의 projection을 구하여 2b1, 0.5b2로 벡터 rb를 표현할 수 있었다.
다른 축을 사용해서 데이터를 새롭게 표현한 것이다. 이를 dot / projection product를 통해서 통해서 간단하게 해볼 수 있었다. 아래는 dot product가 깔끔하고 빠르게 되는 벡터의 직교(orthogonal) 사례입니다. 다르게 생각해보면 computation을 빠르게 하려면 벡터들을 직교로 만들어주는게 좋은데 기저변환(changing basis)을 통해서 직교 상태로 basis axis를 만들어 놓고 새롭게 벡터를 구할 수도 있습니다.
In [1]: import numpy as np
In [2]: def sov(vector): #size of vector
...: return np.sqrt(np.sum(np.square(vector)))
In [3]: re = np.array([3, 4])
In [4]: b2 = np.array([-2, 4])
In [5]: np.dot(re, b2) / np.square(sov(b2))
Out[5]: 0.4999999999999999
위의 코드는 re 벡터에 대해서 새로운 basis(기저)로 표현하고자 할때 그 projection을 구하는 문제였습니다. 결과는 0.5가 나왔고 b2에 대해서는 0.5 선형결합(;곱하기)을 해주면 re 벡터를 새로운 기저로 표현 가능합니다. 동일한 방식으로 계산했을 때 b1에 대해서는 2가 나왔습니다. 결과적으로 벡터 re는 기존의 e1, e2벡터에서 [3,4]로 표현됐으나 새로운 기저 b1, b2에서는 re = [2, 0.5] 로 새로운 기저에서 표현이 가능합니다.
In [1]: v = np.array([5, -1])
In [2]: b1 = np.array([1,1])
In [3]: b2 = np.array([1,-1])
In [11]: np.dot(v, b1) / np.square(sov(b1))
Out[4]: 1.9999999999999996 ## == 2
In [5]: np.dot(v, b2) / np.square(sov(b2))
Out[5]: 2.9999999999999996 ## == 3
### vb = [2, 3]
#귀찮아서 기저변환하는 함수를 만들었다.
In [6]: def sov(vector): #size of vector
...: return np.sqrt(np.sum(np.square(vector)))
...: vb1 = np.dot(v, b1) / np.square(sov(b1)) # vector projection 구하는 부분
...: vb2 = np.dot(v, b2) / np.square(sov(b2))
...: print(vb1, ',', vb2)
...: return np.array([vb1, vb2])
In [8]: v = np.array([10, -5])
In [9]: b1 = np.array([3, 4])
In [10]: b2 = np.array([4, -3])
In [11]: vb = change_basis(v, b1, b2)
### vb = [0.4 , 2.2]
5. Basis, Vector space, Linear independence
Basis is a set of n vectors that:
- basis are not linear combinations of each other (linearly independent)
- basis span the space
- The space is then n-dimensional
6. Applications of changing basis = Changing reference frame
지금까지 dot product와 projection 그리고 basis와 change of basis(기저변환)에 대해서 다루었습니다. 이제 데이터 과학에서 왜 이러한 것들을 배워야 했는지 조금은 이해한 것 같습니다. 아래와 같이 X, Y 축에 데이터를 매핑하였다고 봅시다. 붉은 색 데이터 포인트들에 가장 잘 fit하는 선을 그리는 것이 일반적인 선형회귀의 문제입니다. 저 선으로부터 직교(orthogonal)하는 선을 그렸을 때 저 선으로부터 데이터까지 떨어지는 것은 noise 입니다. 저 noise를 가장 적게 하는 것이 데이터를 가장 올바르게 표현하는 방법이 될 것입니다. noise에 대한 정보가 모인 noise vector에 직교하는 선이되는 것입니다. 아래의 그림을 보면 위에서 우리가 보았던 형태의 직교하는 선이 추가로 그려졌고 이를 통해서 우리는 vector projection과 같은 방법으로 transformation이 가능합니다. 기존에 X-Y에 찍혔던 데이터를 새로운 선으로 표현할 수 있게 되는 것입니다.
머신러닝과 인공신경망을 이미 알고 있는 분들은 이미지를 분석할 때 이미지로 들어온 픽셀pixel 데이터가 새로운 basis에서 코나 피부 형태, 눈 사이의 거리 같은 것들을 묘사하기 위해 기존의 basis에서 바뀌는 것을 자주 보았을 것입니다. 우리가 보통 weight vector라고 말하는 vector에서 transformation이 일어나게 됩니다. 이 weight vector를 조정하기 위한 다른 vector space인 parameter function에 대한 space도 존재하게 됩니다. 자세한 건 앞으로 차차 다루도록 하겠습니다.
지금까지 배운 내용들은 하나의 공간에서 다른 공간으로 새롭게 데이터가 표현되는 것을 이해하기 위해서 선형대수(Linear Algebra)를 다루었습니다.
7. Matrices in Linear Algebra
머신러닝 또는 딥러닝에서 매트릭스는 vectors를 transform하기 위한 것으로서 많이 사용된다.
Linear Algebra is a mathematical system for manipulating vectors in the spaces described by vectors.
How matrices transform space
Types of matrix transformation
기존의 기저(basis)를 변경해서 새로운 기저로 표현하는 것이 matrix transformation이라고 볼 수 있는데
[ [1, 0], [0, 1] ] 의 행렬이 있다고 했을 때 1을 -1로 바꿔주면 matrix rotation이 발생하게 되고 matrix가 변하게 된다(transformation).
shears, stretches and inverses 등의 방식으로 matrix가 rotation되기도 하고 combination되기도 하면서 변화하게 된다.
transformation이라는 것이 다른 곳으로 매핑(mapping)한다고 봐도 되는데 coordinate system이 바뀌게 되는 것이다.
그중에서도 선형 변환(linear transformation)은 하나의 벡터 안에 있는 각 element를 다른 벡터의 각 element에 사상(mapping)하는 것이다.
행렬 변환(matrix transformation)은
shear
: 고정된 방향으로 각 포인트를 그 방향과 평행한 라인에서 부호가 있는 거리에 비례하는 양만큼 이동시키는 선형 맵 (출처: 위키백과)
참고자료
Linear Independence and Linear Transformation
http://contents.kocw.or.kr/contents4/document/lec/2013/Chungbuk/LeeGeonmyeong1/4.pdf
http://www.math.usm.edu/lambers/mat169/fall09/lecture22.pdf
'Data Science > 문과생을 위한 딥러닝 수학' 카테고리의 다른 글
문과생을 위한 딥러닝 수학 - 기본편 (4) 절댓값 함수, 가우스 함수 (0) | 2018.01.11 |
---|---|
문과생을 위한 딥러닝 수학 - 기본편 (3) 유리함수, 무리함수 (0) | 2018.01.10 |
문과생을 위한 딥러닝 수학 - 기본편 (2) 지수함수, 로그함수 (0) | 2018.01.08 |
문과생을 위한 딥러닝 수학 - 기본편 (1) 1차함수, 2차함수 (0) | 2018.01.04 |
문과생을 위한 딥러닝 수학 - 쌩기초편 (4) 연립방정식, 부등식 (0) | 2017.11.18 |
문과생을 위한 딥러닝 수학 - 쌩기초편 (3) 방정식 (0) | 2017.11.09 |
문과생을 위한 딥러닝 수학 - 쌩기초편 (2) 곱셈공식과 인수분해 (0) | 2017.11.07 |
문과생을 위한 딥러닝 수학 - 쌩기초편 (1) 다항식과 연산 (9) | 2017.11.07 |
댓글