Linear algebra 선형대수 야나두 딥러닝

어느 딥러닝 책에서 이런 카피가 나왔다. 
 딥러닝과 수학엔 어떤관계가 있을까? 

 딥러닝은 미분적분학, 선형대수학, 통계학과 관련 있고 이중에서 선형대수학이 단연 으뜸이라 한다. 그런데 도대체 어떤 관계가 있다는 걸까?

  선형대수는 관련 성이 아주 깊다.  딥러닝 모델을 만들때, Single Layer를 만들어서 하는 경우는 거의 없기 때문이다.   Single Layer는  만드는 경우는  교육 받을 때 이외에는 거의 쓰지 않는다.   실제로 모델을 만들때는 Multi Layer를 사용한다.   Multi Layer의 기본적인 공식이 행렬로 이루어 졌으니,  반드시 알고 넘어가야 한다. 


  
선형대수  Linear algebra




행렬

 행렬의 덧셈 뺄샘

   행렬의 덧셈과 뺄셈은 각 원소 별로 대응 하여 더하고 빼면 된다. 

행렬의 덧셈

아래에 x 라는 2차원 array와  y라는 2차원 array 를 만들고 이를 더하는 것을 보여 준다.

# x  2d array
x = np.array([[1,2],[4,3]])
x
array([[1, 2],
[4, 3]])

# y 2d array
y = np.array([[1,1],[1,2]])
y
array([[1, 1],
[1, 2]])
  
# x, y 두 array들을 더한다.
x + y
array([[2, 3], [5, 5]])


행렬의 뺄셈

앞에서 만든  x, y  2d array를 뺀다.

# x, y, 두 array를 뺀다. 
x - y
array([[0, 1], [3, 1]])

 행렬의 곱셈

행렬곱은 Multi Layer 계산 할 때 기본적으로 계산을 한다.   행렬의 방법을 헤깔리지 않으려면,  "ㄱ" 자로 연산을 하면 된다.   2d array에서 1d array로 계산하면  1d array 결과가 나온다. 


행렬 곱 연산


# x 2d array 
x = np.array([[1,2],[3,4]])
x
array([[1, 2], [3, 4]])

# 1d array
y = np.array([1,2])
y
array([1, 2])

행렬을 곱하는 연산으로서는 np.dot() 함수를 사용한다. 코드를 볼 때 잘 봐야 한다.
# 행렬곱
np.dot(x,y)
array([ 5, 11])


아래는 새로운 y 행렬을 추가 한다. 2d array 에서 2d array를 계산 하면 2d array가 나온다.


행렬곱 연산


# 새로운 y 행렬 추가
y = np.array([[2,1],[2,4]])
y
array([[2, 1], [2, 4]]


# 행렬곱
np.dot(x,y)
array([[ 6, 9], [14, 19]])


 배열 원소 끼리 곱

맨 처음에   "◉"  심볼을 보았을때  적지 않게 놀랐다.    이게  무슨 기호인가 했는데,  배열 원소 끼리의 곱으로 통하는 심볼이 었다.  배열 원소 끼리의 곱도   2d array에서 1d array로 갈때는 "ㄱ" 자 행태로 계산이 되는데,  2d array로 남아 있다.   행렬곱과는 헤깔릴수 있는데,  헤깔지 않도록  계산을 해야 한다. 

배열 원소 끼리의 곱

x = np.array([[1,2],[3,4]])
x
array([[1, 2], [3, 4]])

y = np.array([1,2])
y
array([1, 2])

x * y
array([[1, 4], [3, 8]])

새로운 y 행렬을 추가하여 배열 원소끼리의 곱을 실행 한다.  이것도 2d array로 결과가 나온다.  행렬곱과 헤깔려서는 안된다.   하지만 Multi Layer에서 증명에서 쓰이니 잘 알고 있어야 한다. 

배열 원소 끼리의 곱




y = np.array([[1,2],[3,4]])
y
array([[1, 2], [3, 4]])


x * y
array([[ 1, 4], [ 9, 16]])
 



행렬의 성질 

x, y, z는  행렬이고  a,b,c 가 스칼라 일 때는 아래와 같은 법칙이 성립이 된다. 

 x +y  =  y + x     교환 
 x+(y+z) = (x+y)+z  결합
 x(yz) = (xy)z      좌분배
 x(y+z) = xy +xz 우분배



x, y, z 3개의 행렬을 만든다. 

# x 행렬
x = np.array([[1,2],[2,3]])
x
array([[1, 2], [2, 3]])

# y 행렬
y = np.array([[3,2], [4,1]])
y
array([[3, 2], [4, 1]])


# z 행렬
z = np.array([[1,1], [2,1]])
z
array([[1, 1], [2, 1]])

 
행렬의 성질을 구한다.  행렬의 성질이 맞으면 True로 표시 된다.  

# 교환법칙
x + y  == y + x
array([[ True, True], [ True, True]])


# 결합법칙 
x + (y + z) == (x + y) +z
array([[ True, True], [ True, True]])


# 좌분배
x*(y*z) == (x*y)*z
array([[ True, True], [ True, True]])


# 우분배
x*(y+z) == x*y + x*z
array([[ True, True], [ True, True]])

# 분배
a = 2
a*(y+z) == a*y +a*z array([[ True, True], [ True, True]])



영행렬(zero matrix)와  일행렬 (one matrix)

영행렬과 일행렬은  array 구조를  초기화 할 때 사용한다.   영행렬은  numpy에서  np.zeros(), 일행렬은 np.ones 함수를 사용한다. 

 영행렬의 성질 
  x + 0 =  0 + x =x
  x - x =0
  0-x = x
  0x =x0= 0
영행렬
# 영행렬
zero = np.zeros((3,2))
zero
array([[0., 0.], [0., 0.], [0., 0.]])



 일행렬의 성질 
 x1 = 1x = x
일행렬

#일행렬
one = np.ones((3,2))
one
array([[1., 1.], [1., 1.], [1., 1.]])

단위 행렬

단위 행렬을 어떤  행렬 x를 곱해도 자기 자신인 x 가 되는 행렬이다. 

단위 행렬

단위 행렬은 numpy에서 np.eye() 함수를 사용한다. 

# 단위 행렬
eye = np.eye(3,3)
eye
array([[1., 0., 0.], [0., 1., 0.], [0., 0., 1.]])


# x 행렬
x = np.array([[1,4,7], [2,5,8], [3,6,9]])
x
array([[1, 4, 7], [2, 5, 8], [3, 6, 9]])

전치 행렬

선형대수학에서, 전치 행렬(轉置行列, 영어transposed matrix)은 행과 열을 교환하여 얻는 행렬이다. 즉, 주대각선을 축으로 하는 반사 대칭을 가하여 얻는 행렬이다. 기호는 .

 Kaist에서 교육을 받을때,  알고리즘 마다 transposed 이야기를 많이 한다.  행과열을 교환 해여, 열을 축소 할때 가장 많이 사용한다.  알고리즘 마다 전치 행렬을 transposed 를 많이 쓰니, 기본적인 개념을 익히고 가야 한다. 

전치행렬

# x 행렬
x = np.array([[1,2],[3,4]])
x
array([[1, 2], [3, 4]])


#x의 전치 행렬
x_T = x.T  
x_T
array([[1, 3], [2, 4]])


이번에는 반대로 행을 축소하고 열을 늘릴 경우를 생각해 보자,  행렬을 계산 할때,  전치 행렬을 사용해서 계산 해도 결과 값은 바뀌지 않는다. 

전치 행렬



# x 행렬  2 x 3행렬
x = np.array([[1,2],[3,4],[5,6]])
x
array([[1, 2], [3, 4], [5, 6]])

# x 의 전치 행렬 3x2행렬
x.T
array([[1, 3, 5], [2, 4, 6]])


 지금 까지 선형 대수학에 대해서 설명 하였다.   여러가지 계산 방법이 더 있는데,  인공지능에 필요한 부분만 설명 하였다.  더 이상 설명을 하게 되면 헤깔리게 된다. 



댓글 없음:

댓글 쓰기

css cheat sheet 클래스 선택자, margin(마진), display , center 조정 간단한 구성 요소

 앞에서는 html의 간단한 sheet를 소개 하였습니다.   html은  주로 골격을 나타나는 것이라, 디자인을 하는데는 css로 하여야 합니다.  아래 코드와 같이 css 관련 하여 매우 간단하게 코딩 하겠습니다.  body 부분의 css 코딩  ...