본문 바로가기
AI 이론과 개발의 혼재/Theory

Neural Network - 인공신경망

by ministar 2019. 5. 1.

사실, 코드 넣기가 너무 복잡해서 티스토리를 계속 할까 말까 고민하다가 이게 웬일인가요!! ㅎ_ㅎ 코드도 추가할 수 있게 되었네요.
오호호..!!!! 그렇다면.. 힘내서 다시 이 블로그에 잘 정리해볼까 합니다. 슉슉 고우고우!

오늘은 Neural Network에 대해서 아주 간단하게 정리를 해볼까 해요.
중요한 것만 짚고 넘어갈까 합니다. 

 


Neural Network, 인공신경망

 

인공지능이라는 것이 우리의 뇌를 표방하여 만든 건데요..
이름만 들어도 짐작 할 수 있겠다 싶이, Neuron 이라는 우리의 신경세포를 모티브로 만들어지게 된 알고리즘입니다.
그래서 그런지 생김새도 우리의 뉴런과 굉장히 유사해요.

 

Perceptron 

 

좌측이 우리 뇌의 신경세포이고,  우측이 그를 본 따 만든 인공신경이라고 생각하면 돼요.
이 인공신경을 앞으로 우리는 perceptron(퍼셉트론)이라고 부를꺼예요.
옛날 옛적 처음 이걸 고안한 사람은 여러개의 전기적 입력 신호가 Dendrite(가지돌기)에 도착하면 Soma는
이들을 하나의 신호로 통합하고 통합된 신호값이 어떤 임계치를 초과하면 하나의 단일 신호가 생성되며
이 신호가 Axon(축삭돌기)을 통해 다른 신경세포로 전달(출력)합니다.

그러면 이 신호가 모이고 모여서 우리가 생각을 하고 행동하게 되는 것이죠! 

그럼 퍼셉트론에 대해서 얘기를 해볼께요.
여러가지 들어올 수 있는 입력 신호를 이제는 x1, ... xm 이라고 해볼께요 (허걱,, 이거 수식입력은 여전히 안돼네요 ㄷㄷ..)
그러면 이 신호마다 조금씩 중요도가 다르겠죠? 들어오는 신호들에 대한 조금씩 다른 가중치(weight)를  w라고 할께요.
그리고 이것을 통합하여, 특정 임계치(threshold)를 넘어가면 신호를 발생하거나/안하거나를 결정하는 함수를 f로 표기하고
그에 대한 출력값을 y라고 표현한거예요. 

어때요, 우리의 신경세포와 완전 똑같죠? ㅎㅎ 아닌가요;; ㅎㅎ

그러면 0을 출력할 것이냐 1을 출력할 것이냐를 판단하는 기준은 어떻게 하면 좋을까요?

 

Activate Function

쉽게는  x 와 w의 weighted summation한 값이 0보다 크면 1, 작으면  0으로 출력하게 만들수 있어요.
우측에 보이는 그래프가 그걸 나타내죠. 우리는 이렇게 극단적으로 0 아니면 1만 출력하는 값을 나타내는 function을
'step function' 이라고 불러요. 

step function을 이용하면 앞으로 이 neural network를 학습할 때 잘 안되서 다른 function을 쓰게 되는데, 
이건 나중에 자세히 다루고,, 그럼 이제 이 perceptron을 이용하여 어떻게 학습이라는걸 한다는 것인지 알아볼께요.

기본적인 모든 machine learning의 개념은 
주어진 x (데이터)와 y(결과)가 주어지면, 이를 학습을 통해 다음 데이터가 주어졌을때 y'를 예측할 수 있게 만든다는건데요.

도대체 그 '학습'이란걸 어떻게 할까요?

우리 어렸을때 받아쓰기 했던거 생각해보면.. 
받아쓰기 문제를 풀고, 틀리면 선생님이 교정을 해주죠? 그러면 그걸 다시 공부해서 재시험을 통해 또 한 번 테스트합니다.
그렇게 교정을 받고 또 풀고 하다 보면 어느새 그 단어에 대한 맞춤법을 다 익히게 되죠! 

그거랑 같아요 머신러닝도 계속 학습을 시켜서 틀리면 틀렸다고 알려주고 또 다시 학습을 시킵니다.
그래서 '반복적으로' 학습을 하게 돼요. 

그럼 틀렸다는건 어떻게 알려줄까요?

#퍼셉트론 구조를 설명할때  주어진 input에 대한 weight들이 있었어요. input X 를 통해 Y를 예측할 때에 중요도에 대한 지표를
나타내는 것이 바로 이 weight라고 할 수 있는데, 

'back-propagation'을 통해 이 weight를 조금씩 미세하게 조정하여 나가게 됩니다.

 


backpropagation

한국말로 풀면 어렵게 역전파,, 라고 말을 하게되는데 이 방법이 무엇이냐면..
내가 틀린것에 대한 오류 (error)를 역으로 전파시킨다(?) 허허,, 에러를 줄여나감으로써 학습 성능을 높힌다는 말이예요.

그럼 우리가 받아쓰기 100점을 목표로 하듯 우리도 목표를 정해야겠죠.
보통 이런 목표를 cost function이라고 부르는데,
neural network를 통해 나온 결과 값(H(x))과 실제 정답 값(Y)의 오차를 우리는 cost function으로 두고,
이를 최소화 하는 방향으로 학습을 시킬꺼예요.

 

Cost function

약간의 수식으로 표현하면 MSE(mean square error)로 표현할 수 있어요.

notation

  •  n : 학습 데이터의 수 
  • Yi : 실제 정답
  • Yi' : neural network가 뱉은 값 (모델이 학습한 값)

 

이 MSE 값이 0에 가까우면 받아쓰기 100점!이라고 할 수가 있겠죠?
그래서.. 이 MSE 로 뭘 어쩌겠다는 건데...? ..ㅎㅎ

MSE 값이 적어지는 방향으로  앞으로 weight를 수정해 나갈 꺼예요.
이걸 다른말로, back propagation을 진행하여 모형을 학습시킬 거라고 말할 수 있겠네요.
여기서 부터 쪼끔.. 복잡해질 수 있음 주의 ^^; 

Gradient Descent

Gradient Descent라는 방법이 바로~ 오류를 줄여나가는 방법입니다 !
기울기 하강법 이라고도 표현하는것 같던데..
음.. 우리의 weight와 bias 에 대한 출력의 변화량이 linear 하다는 점을 기억해야 하는데요.
이런 linear한 특징 때문에 weight와 bias를 조금씩 바꿔가면서 우리가 원하는 정답을 맞추기에 도달 할 수가 있게 되는거예요!

우리의 cost function에 대한 error를 그림으로 그려서 이런 차원의 모양이라고 생각해볼께요.

 

저 error가 제일~ 최소화 되는 값은 위에 빨간색 화살표로 표시한 지점이겠죠?
저 지점으로 가기위해서 앞으로 w와 b를 쪼금씩 움직여볼까 합니다. 
내려가게 하려면 현재 지점에서의 기울기(gradient)를 구해서, 그 기울기의 반대쪽으로 쪼금씩 내려가다보면 아래로 내려가겠죠? 
그래서 'gradient descent' 방법이라고 불러요. 

이제 그럼 이 cost function (=Loss function) 과 gradient descent 방법으로 어떻게 학습을 해나가는지
진짜 backpropagation에 대해서 말해볼께요.

backpropagation은 두 단계로 나뉘어요 
1. feed forward 
2. backpropagation

feed forward는 받아쓰기 시험을 보는거고, backpropagation은 틀린 것에 대한 조정을 해나가는 과정이라고 할 수 있어요. 

 

 

 

 

notation이 계속 바뀌어서 조금 헷갈릴 수도 있지만..
(여기 수식 입력을 어떻게 하는지 몰라서 인터넷에서 가져와서ㅠㅠ)

이렇게 weight w_ij에 대해서 미분을 하면 아래와 같이 나타낼 수가 있고, 이걸 learning rate 만큼 조금씩 움직이게 돼요

 

이걸 푸는 과정에 대한 자세한 내용은 아래 블로그에 잘 정리되어 있어서 여기 참고하시면 좋을 것 같아요.

https://laonple.blog.me/220513815694

 

[Part Ⅱ. Neural Networks] 4. Backpropagation [2] - 라온피플 머신러닝 아카데미 -

Part I. Machine Learning Part V. Best CNN Architecture Part VII. Semantic ...

blog.naver.com

 

아, 그리고 activate function으로 위에 step function을 보여줬었는데요.
gradient descent를 이용하여 편미분을 할 때 편의성을 위해 neural network에서는 'sigmoid' 함수를 가장 많이 씁니다.

 

또 한가지, neural network에서 틀린것에 대해서 얼마나 교정을 할지에 대한 parameter를 'learning rate'라고 부르게 되는데
이 파라메터 값은 우리가 지정해줘야 해요!
그럼 learning rate를 어떻게 줘야 좋을지 한번 고민해봐야겠죠?

 

Learning rate

위 그림은 아까 error를 그래프로 나타낸것과 같은건데요. learning rate가 높으면 높을수록 조금씩 최저 점으로 도달하는게 아니라 이리저리 튀길 수가 있어요! (우측그림참고)
그렇기 때문에 적절한 learning rate 값을 세팅하여 차근히, 조금씩 욕심부리지 않고 천천히 내려가는게 좋아요.
물론 너무 작은 값은 아주 쪼금씩 움직이기 때문에 학습이 느릴 수 있다라는 단점이 존재해요.

 

그럼 포스팅을 마치겠습니다! 

댓글