본문 바로가기

Data Science/Machine Learning

[딥러닝] NN(Neural Network)의 등장과 개념

반응형

이번 포스팅에서는 딥러닝 즉, 뉴럴네트워크(NN)의 등장과 개념, 그리고 뉴럴네트워크의 한계를 Backpropagation(역전파)를 통해서 어떻게 해결했는지에 대해 알아보려고 한다.

 

1. 뉴럴네트워크의 등장

 

우리가 다루었던 선형회귀, 로지스틱 회귀, 소프트맥스 이러한 머신러닝 모델들은 linear로 여러가지 문제들을 해결할 수 있었다. 하지만 절대 해결할 수 없는 문제가 하나 있었으니.. 그것은 바로 XOR 문제이다. XOR이란 다음과 같다.

 

X Y XOR
0 0 0
1 0 1
0 1 1
1 1 0

 

OR 과 AND 그리고 XOR 문제를 그래프로 나타내보면 다음과 같다.

 

OR, AND, XOR

 

그림에서 보다시피 OR 과 AND 는 기본적으로 Linear를 그려서 분류를 할 수 있다. 하지만 XOR은 어떤 방식으로라도 Linear를 그리더라도 +/- 를 구분할 수가 없다. 

 

그래서 이러한 XOR문제를 해결하기 위해서 Neural Network가 등장 했다. 뉴럴 네트워크는 XOR문제를 해결하기 위해서 다음과 같은 방식을 취해주었다.

 

 

 

뉴럴네트워크의 XOR 문제 해결 방법

 

2. 뉴럴네트워크의 개념

뉴럴네트워크는 위 그림 같이 특정한 W(가중치)와 b(바이어스) 값을 주게한 후 시그모이드를 취해주면 XOR문제를 해결한다고 하였다. 위 그림은 네트워크를 3개로 분류했지만 우리가 이전에 Softmax모델에서 각각의 모델을 하나로 합쳐준것처럼 이것도 합쳐준다면 밑의 그림과 같아진다.

 

 

네트워크들끼리 합친 네트워크 그림

 

이렇게 합쳐진 네트워크를 Y헤더값(예측값)과 Hypothesis(Wx+b)에 관한 식으로 나타내주면 밑의 오른쪽 수식과 같아진다.

 

 

예측값에 대한 식

즉, K(x)=sigmoid(Wx+b)는 왼쪽 그림의 input X에 가까운 왼쪽박스 모델에 대한 식이다. 그리고 Y헤더값=가설(H(x))은 우리가 방금 정의한 첫번째 박스모델을 거쳐 나온 output값인 K(x)에다가 똑같이 가중치와 바이어스를 각 곱하고 더해준다음 sigmoid를 취하는 것이다.

 

결국 그림 속 뉴럴네트워크의 가설값은 H(x) = sigmoid(K(x)W+b) 가 된다.

(W2,b2인데 숫자를 조그맣게 쓸 줄 몰라서 그냥 W, b로 대체했습니다!)

 

3. 뉴럴네트워크의 한계

 

그런데 문제가 생겼다. 우리가 앞서 이용했던 W(가중치)와 b(바이어스)값을 누군가가 우리에게 "이게 최적의 값이야" 라고 갖다주는 것이 아니다. 즉 알아서 최적의 W,b값을 자동적으로 계산해서 결정할 수 있어야 하는데 이러한 자동으로 W,b값을 계산은 절대 할 수 없다는 이러한 반론에 의해서 당시 뉴럴네트워크(딥러닝)가 거의 세상에서 잊혀져가고 있었다고 한다.

 

4. 해결책은 Backpropagation(역전파)

 

일반적인 Cost 최소화

 

우리가 지금까지 다루어 왔던 선형회귀나 로지스틱 회귀, Softmax같은 경우 Cost함수를 최소화 하기 위해서는 Gradient Decent라는 기울기하강 알고리즘을 사용하면 되었다.

 

 

뉴럴네트워크

 

그러나 연산이 복잡한 뉴럴네트워크에게는 이러한 기울기를 구하는 미분방법이 복잡한 계산을 이겨낼 수가 없었다.

 

 

역전파

 

따라서 역전파라는 방법이 고안되었는데 예를들어 input을 넣고 human face라는 label이 아닌 dog라는 output이 나왔을 때 에러임을 인정하고 backward로 돌아가면서 적당한 W,b값을 찾아내는 것이 바로 역전파이다.

 

그렇다면 역전파방법은 어떻게 하는걸까? 이에 대한 예시를 들기 위해 수학적인 편미분 개념이 필요하다 이 편미분에 대한 개념을 모른다면 김성훈 교수님이 제공하시는 아래의 강의링크를 참고하자. 

https://www.youtube.com/watch?v=oZyvmtqLmLo&feature=youtu.be

 

역전파 방법 예시

 

편미분을 간단하게 소개하자면 하나의 특정한 문자에 대해서만 미분하고 나머지는 모두 상수취급을 해주는 것이다.

(위 그림에서 분모미분할 문자 기준을 제시해주고 분자의 함수를 분모가 지정해준 문자를 기준으로 미분한다.)

 

그림과 같이 f = wx + b가 있다. g = wx라고 치환한 후 f = g + b 라는 식을 또하나 적어준다. 그리고 이에 대한 편미분값은 각각 오른쪽 위에 있는 초록색의 값과 같다. ( f 값은 예측값 )

 

그렇다면 이제 W=-2, x=5 , b=3 이라고 주어진 값을 이용해 forward를 진행하고 다시 역으로 맞추기 위해 backward를 진행해 보겠다. 먼저 forawrd를 이용해 해당 연산(*, +)를 이용하면 f = -7 이라는 값이 나오게 된다.

 

이제 backward를 해보자. 우선 g가 f 값에 얼마나 영향을 끼치는지 알아내기 위해 f = g + b를 g의 문자를 기준으로 편미분을 하면 1이라는 값이 나오게 된다.

 

그렇다면 이제 b값이 f 에 얼마나 영향을 미치는지 알아내기 위해 f = g + b 를 b라는 문자를 기준으로만 편미분을 하게 되면 1이라는 값이 나오게 된다.

 

이제 W,x 값을 구하기만 하면 되는데 이 때 주의할 것은 중간에 g함수가 존재하기 때문에 Chain Rule(복합함수)를 사용해야 한다는 것이다.

(Chain Rule에 관한 내용도 위에서 언급한 링크 속 강의에 있다)

 

그럼 w값이 f에 영향을 얼마나 미치는지 알아내기 위해서 우선적으로 f = g + b를 g자를 기준으로 미분을 해준 값과 g = wx 를 w문자를 기준으로 미분을 해준 값곱해준다. 그러면 1 *(곱하기) x가 나오게 되는데 처음에 x = 5가 주어졌으니 결국 5가되며 w이 f 값에 영향을 5만큼이나 미친다는 것이다. 방금 한 것처럼 이번엔 x값이 f 에 영향을 얼마나 미치는지 똑같은 방식으로 구하면 x는 f 에 -2만큼 영향을 미친다.

 

w가 f 값에 영향을 5만큼이나 미친다는 것은 w가 1만큼 증가한다면 f 값에 5배만큼 증가한다는 것이다.

 

이렇게 역전파를 이용하는 이유는 본질적으로 노드 중간중간에 연산이 있기 때문이다. 따라서 텐서플로우에서는 Cross-entropy와 같은 Cost 최소화 함수를 만들기 위해서 항상 중간중간에 연산을 끼워놓는다. 

 

Tensorflow의 Cross-entropy 구조

 

반응형