본문 바로가기
개발 Tools/파이썬_Deep learning & ML

딥러닝 DNN, ANN의 모든 것이었으면 좋겠다 ( back propagation, error )

by 전컴반 2022. 5. 19.
반응형

어떻게 생겨먹은 놈인지 알아보자

 

퍼셉트론의 기본적인 모양은 다음과 같다. (모르겠으면 일단 넘어가면 된다)

입력을 받고 Weight를 입력과 곱해준 후 다 더해서 활성 함수에 넣고 출력을 낸다. 이렇게 하나만 있을 땐, 선형 분류와 유사하다. 간단하지 않은가?

 

 

위와 같은 perceptron이 여러 개가 쌓여서 만들어진 게 ANN이다. 또 이런 층이 겁나게 많으면 DNN이 된다.

 

 

ANN은 어떤 문제를 해결할 수 있을까??

기존에 선형 모델로는 해결할 수 없는 문제를 보자. 아래 그림을 보면 선형 모델로는 분류할 수 없는 문제가 있다.

분류 성능은 75%가 최대다. 이 문제를 ANN을 이용하여 해결해보자.

 

 

빨간색 perceptron을 보면 마치 AND Gate와 같은 동작을 한다.

파란색 perceptron을 보면 마치 OR Gate와 같은 동작을 한다.

그리고 초록색 perceptron을 이용하여 h(x)가 어떻게 되는지 보자. (활성 함수는 sigmoid를 사용한다)

 

h(0, 0) = ( -10 + 20*(0) + 20*(1) ) = 10 ~= 1

h(0, 1) = ( -10 + 20*(0) + 20*(0) ) = -10 ~= 0

h(1, 0) = ( -10 + 20*(0) + 20*(0) ) = -10 ~= 0

h(1, 1) = ( -10 + 20*(1) + 20*(0) ) = 10 ~= 1

 

이렇게 (0,0)과 (1,1)를 같은 군집으로 분류할 수 있다. 선형 모델로는 분류할 수 없었지만 gate들의 조합으로 우리가 원하는 분류를 해냈다.

 


 

무슨 말인지 느낌이 잘 안 올 수도 있다. 조금 더 친숙한 Mnist를 예로 들어보자, 아래 그림은 많이 봤으리라 믿는다.

DNN으로 어떻게 얘네들을 구분하는지 단계별로 알아보자, 그냥 이해 못 하더라도 느낌을 느끼면 좋겠다.

Hidden층은 1개만 있다고 하자

 

 

1. 하나의 이미지는 28 * 28로 돼 있다. 요놈을 일짜로 펼친다.

- 그러면 784개의 벡터가 생긴다. 이걸 입력으로 집어 넣는다. So easy

 

2. 가중치가 랜덤으로 정해졌다고 하자.

-  그러면 입력과 해당 가중치를 곱한다. 예를 들면,

Hidden[0] = Input[0] * Input_Weight[0][0] + Input[1] * Input_Weight[1][0] .....

요런 식으로 Hidden perceptron 하나하나가 정해진다.

 

3. 활성 함수를 거쳐서 Output이 나왔다고 하자, 

- 그러면 제일 높은 값을 가지는 output index가 예측이라고 하고 정답과 비교한다. 그러면서 이제 가중치를 업데이트시켜주는 것이다.  이때 업데이트시켜주는 게 back propagation이라는 것이다. 

이렇게 반복하는 게 학습을 하는 과정이다. 간단하지 않나??

 

 


 

더 뜯어보자,

neural networks에는 2가지 신호가 있다. 기존 W를 계산하여 신호를 앞으로 보내는 forward propagation과 결과를 바탕으로 W를 조절하기 위해 신호를 뒤로 보내는 back(ward) propagation이 있다. 

 

 

그전에 에러의 종류는 3가지가 있는데 알고 가자,

1. ek (error signal)

- k번째 에 대한 output과 정답과의 차이

 

2. En (error energy)

- error signal들의 합이다. 미분했을 때 연산을 쉽게 하기 위해 2로 나눠줬다. 오차 제곱으로 나타냈다. 주의해야 할 건 하나의 클래스에 대한 에러다. 예를 들면 강아지 사진을 입력으로 넣었을 때에 대한 에러를 나타낸다. 하지만 입력이 하나만 있는 게 아니다.

3. Ed (mean squared error)

- 전체 여러 데이터의 error energy를 합한 것이다. 

 

 

자 이제 에러의 종류를 알았으니 이 에러를 줄이는 방법에 대해 알아보자, 결과부터 말하면 W를 조절하여 에러를 줄여나가는데 어떻게 W를 업데이트할까?? back propagation에 답이 있다.

 

 

back propagation

 

back propagation에는 정답과 비교하는 부분이 있고 hidden층끼리 비교하여 보내는 신호가 있다. 정답과 비교하는 부분은 결괏값이 있기 때문에 비교적 쉽다. 그러니 먼저 알아보자

 

1. output layer

 

 

간단하게 보면, sensitivity factor를 변화시켰을 때 전체 에러의 변화를 보면 된다. 그런데 가만 보면 하나하나의 W를 보는 것보다 W들의 합으로 이루어진 Sk를 바꿨을 때 전체 에러를 봐도 무방하다 (local gradient). 

이 에러를 "delta error"라고 부른다.

 

미분을 분해해보면 sensitivity factor를 다음과 같이 볼 수 있다. 

 

 

똑같이 delta error를 분해해보자

 

 

이렇게 나온 delta error를 sensitivity factor에 대입하면 우리가 원하는 식이 나온다. 

(E = error energy) 

 

하나의 w가 업데이트되는 전체적인 흐름을 보자.

 

 

z는 하나의 perceptron이고 w를 곱한 값들의 합을 s로 나타나어 활성 함수에 넣고 output으로 h를 뽑아낸다.

그리고 정답과의 차이로 error를 계산하고 활성 함수를 미분한 값과 곱하여 delta error를 계산하고 다시 z와 곱하여 w를 업데이트한다.

 

 

2. hidden layer

 

정답이 있는 output layer와 다르게 hidden layer는 정답이 없어서 찾기 어렵다. 하지만 접근하는 방식은 유사하다.

식이 길어서 결론만 정리했다.

 

output layer와 다른 점은 delta error가 이전 단에 있는 값들을 모두 더해서 반영한다는 것이다. 엄청난 연산량을 야기한다.

 

 

 

 

반응형

댓글