인공신경망과 역전파
인공신경망은 뇌를 구성하는 신경 세포인 뉴런의 동작 원리에 기반하여 나온 개념이다.
뉴런의 기본 동작은 가지돌기에서 신호를 받아들이고, 이 신호가 축삭돌기를 지나 축삭말단으로 전달되는 것이다.
인공신경망에서 제일 기초적인 개념은 단층 퍼셉트론이다.
퍼셉트론은 하나의 뉴런이 출력신호를 발생할지 안할지를 결정하기 위해 뉴런으로 들어오는 각 입력값에 곱해지는 가중치 값을 자동적으로 학습하도록 한 모델이며 입력 벡터를 두 분류로 구분하는 선형 분류기 이며, 다수의 신호를 입력 받아 하나의 신호를 출력한다. 여기서 말하는 신호는 전류처럼 흐름이 존재하는 것을 뜻한다.
이제 단층 퍼셉트론을 통해 구현이 가능한 논리 게이트들을 살펴보자
(입력이 둘이고 출력이 하나인 단층 퍼셉트론을 살펴볼 것이다.)
<AND게이트> : 입력이 둘다 1일때 1출력
X1 | X2 | Y |
0 | 0 | 0 |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
만약 활성화 함수가
z>0일 때 1, z<=0일 때 0이고 (z=wx+b) 학습시켜서 얻은 값으로 w=1, b=-1.5라고 하면
0+0-1.5=1
0+1-1.5=-0.5
1+0-1.5=-0.5
1+1-1.5=0.5
라는 결과들이 나오게 된다.
위의 각점들을 x,y로 이루어진 좌표평면에 위치를 표시하게 되면 출력값이 0보다 큰값, 출력값이 0보다 작은값이 선형 그래프를 통해 분류가 가능함을 볼 수 있다.
마찬가지로 OR, NAND게이트 역시 선형그래프로 분류가 가능하다. 하지만 XOR게이트는 선형그래프로는 분류가 불가능함을 확인할 수 있다.
밑에는 더 쉬운 이해를 돕기위한 그림이다(삐뚤빼뚤한거는 양해를 부탁드린다.)
선형그래프로 분류가 불가능한 XOR게이트의 한계를 보완하기 위한 방법으로 나온것이 바로 은닉층을 입력층과 출력층 사이에 추가해주는 것이다.
더 쉬운 이해를 위해 밑에 그림을 참조 바란다.
XOR게이트를 표현하기 위해 은닉층을 하나 추가한것 처럼 입력층과 출력층 사이에 은닉층을 하나 이상 추가한 인공신경망을 다층 퍼셉트론이라고 부른다. 또한 은닉층이 여러개인 인공신경망을 심층신경망이라고도 불른다. 이러한 심층신경망을 학습하기 위해 고안된 특별한 알고리즘이 바로 딥러닝이라고 한다.
앞서 올린 글인 선형회귀와 로지스틱 회귀 때 내용에서 조금 더 발전된 내용을 알아보도록하자.
이전 글에서는 가중치를 오차를 보정하면서 업데이트를 한다고만 언급하였지 정확히 어떤 과정을 거쳐서 업데이트가 되는지는 설명하지 않았다. 이번에는 그 과정을 설명하기 위한 역전파에 대해 알아볼 것이다.
먼저 순전파는 입력층에서 은닉층 방향으로 이동하면서 각 입력에 해당하는 가중치를 곱하고 결과적으로 가중치의 합을 계산한 결과를 활성화함수를 거쳐서 출력하는 것을 뜻한다.
반면 역전파는 입력값과 출력값을 알고 있는 상태에서 신경망을 학습시키는 방법인데 출력값에서 나온 오차값에 기반하여 거꾸로 가장 가까운 가중치부터 거슬러 올라가면서 수정해주는 과정을 말한다.
위의 과정으로만 봐서는 정확하게 어떤 식으로 가중치를 업데이트 하는지 알기는 힘들다. 지금부터 아래의 수식들의 과정을 통해 자세히 살펴보겠다.
각 노드들을 지나가면서 가중치를 곱해지는 상태로 순전파가 진행이 되므로 거꾸로 역전파는 미분을 통해서 가장 처음 부분의 가중치까지 업데이트를 해준다.
그런데 위의 그림과 같이 체인룰에 의하여 역전파를 시행할 시 각 계층에 있는 가중치와 편향값들이 활성화 함수에 영향을 받게 되어 경사 소실 문제(vanishing gradient problem)가 발생한다. 다시 말해서 계층이 많을 수록 미분 결과를 최소 계층까지 제대로 전달하기가 어려워 진다.
가장 많이 알려진 시그모이드 함수의 경우도 한번 미분할경우 미분값의 범위가 0~0.3으로 줄어든다.
이에 대한 대안책으로 tanh 함수가 있지만 이 역시도 차원이 점점 커질 수록 경사소실문제가 드러나게된다.
경사소실문제를 해결하기위해 도입된 함수로 ReLU함수가 있다. ReLU(x)=max(0,x)
이 함수는 sigmoid, tanh함수보다 연산이 쉬워 학습속도가 빠르다는 장점이 있다.
하지만 x<0인 값에서는 기울기가 전부 0으로 나오기 때문에 해당가중치를 거치는 노드를 통해서는 학습이 더이상 진행되지 않는다는 단점이 존재한한다.
이런 단점을 보안하기위해 x<0인 값들에 0.01을 곱해주어 어느정도 값을 갖도록 유지시켜주는
Leaky ReLU(x)=max(0.01*x,x) 라는 함수가 존재한다.
이 밖에도 여러 활성화 함수가 존재하지만 이 글에서는 이정도로 마무리한다.
아래는 자세한 역전파를 구하는 과정이다.(질문있으시면 댓글남겨주세요 최대한 열심히 답변해보겠슴돠~)