on
MLP(Multi-Layer Perceptron)의 오차역전파(Error Backpropagation...
MLP(Multi-Layer Perceptron)의 오차역전파(Error Backpropagation...
MLP의 구조 (Multi-Layer Perceptron)
MLP의 구조
MLP의 전체적인 구조는 위와 같이 입력층, N개의 은닉층, 출력 층으로 이루어져 있다. 각 입력층의 노드와 히든층의 노드, 가중치(weight)와 편향(bios)을 통해 예측되는 Y를 구하고 결과를 예측한다. 오차역전파는 예측된 결과와 실제값 사이의 오차를 통해 가증치와 편향 재업데이트 시켜 좀 더 정확도 높은 모델을 만들게 된다.
위의 구조도를 볼때 주목할 점은 가중치(weight)와 편향(bios)의 갯수이다. 두 변수는 모두 화살표 만큼의 갯수를 가진다. 즉, 가중치는 현재 층과 다음층의 노드 수의 곱, 편향은 다음층의 노드 수 많큼 생성된다.
구현 전 설정
실제로 한층의 값이 갱신 될때는 모든 전층 노드와 가중치의 곱의 합에 평향치가 더해져 활성화 함수를 통과하며 업데이트 된다. (아래의 그림과 같다.)
가중치와 편향은 랜덤으로 설정되어 순전파를 진행 하고 이렇게 임의로 설정된 변수들의 결과값과 실제값을 통해 그 오차를 구한다. 우리는 구해진 오차가 최소가 되는 가중치와 편향을 오차역전파 법을 통해 구한다. 그 이전에 위의 복잡한 MLP의 구조를 하나의 가중치만을 중심으로 확대하여 자세히 그리면 다음과 같다.
순전파 롹대구조
위 그림은 입력노드 x가 출력노드 y에 오기까지 과정 중 하나의 가중치값에 주목하여 역전파 갱신을 쉽게 이해하기 위해 간단하게 그려놓은 순전파 구조도 이다.
구현에 앞서 사용되는 함수는 다음과 같이 정한다.
활성화 함수(Activation function) : Sigmoid function
손실(비용) 함수(Cost function) : MSE( Mean Squared Error)(평균 제곱 오차)
최적화 함수(Optimization) : SGD(Stochastic Gradient Descent)(확률적 경사하강법)
활성화 함수와 손실함수는 순전파시 사용되는 함수로 입력노드의 데이터의 타입에 따라 달라지며 자세한 포스팅은 차후 진행하겠다. 최적화 함수는 역전파시 사용되며 가중치를 갱신하는 방법이다.
오차역전파
역전파는 단어 그대로 순전파와 역방향으로 이동하며 가중치를 갱신하는 방법이다. 오차가 최소가 되는 지점의 가중치를 갱신하고 최소가 되는 지점은 미분을 이용하여 찾는다. 결국 오차를 가중치로 미분한 값으로 새로운 가중치를 만들어 모델을 학습하는 방법이다.
아래 그림과 같은 순서로 역전파를 진행 하겠다.
역전파 순서도
우리는 오차가 최소가 되는 지점에서 입력층의 가중치, 편향치와 은닉층의 가중치, 편향치를 구할 것이다. 따라서 오차를 구하려는 값으로 편미분하면 구할수 있고 은닉층의 변수들을 구한다고 했을때 다음과 같은 연쇄 법칙으로 풀어 쓸수 있다.
그리고 위의 식에서 보면 가중치와 편향치를 갱신할때 마지막 식을 제외하면 동일함을 확인 할 수 있고 역전파 순서도에 비교해서 보면 화살표와 다음과 같이 맵핑됨을 볼 수 있다.
위의 사실을 바탕으로 첫번째 식부터 전개 하겠다.
1. 1번식 미분 (은닉층의 가중치/편향 갱신)
결국 첫번째 식은 손실(비용) 함수를 미분하는 것이다. 우리는 손실함수로 MSE(Mean Squared Error)(평균 제곱 오차)를 사용 하였고 MSE는 다음과 같이 표현 할 수 있다.
실제 MSE 식과는 조금 차이가 있지만 계산을 편하게 하기 위해 간단하게 표현하겠다. 위 식에서 y는 실제값 y hat 은 예측값을 의미한다. 위의 식을 토대로 미분을 하면 다음과 같은 결과가 나온다.
2. 2번식 미분 (은닉층의 가중치/편향 갱신)
두번째 식은 활성화 함수를 미분하는 것이다. 우리는 활성화 함수로 Sigmoid function을 사용하였고 시그모이드 함수의 식은 다음과 같다.
시그모이드 함수식
시그모이드 함수 식을 미분하면 다음과 같은 식을 가지는데 자세한 증명은 따로 포스팅 하겠다.
시그모이드 함수 미분
위의 값을 2번식에 대입하면 다음과 같은 결과가 나온다.
위의 식에서 NET2는 은닉층과 그 가중치의 곱의 합과 편향치를 더한 값이다.
3. 3번식 미분 (은닉층의 가중치/편향 갱신)
위에서 NET2는 은닉층과 그 가중치의 곱의 합과 편향치를 더한 값 이라고 정의 하였다. NET2를 풀어서 쓰면 다음과 같은 식이 나온다.
위의 식을 W2로 편미분하면 결국은 H 값만 남는다. 더하여 편향치에 대해서도 추가로 미분 해준다. 오차를 은닉층의 편향치로 미분한 값을 구할때는 앞의 1,2 번식은 동일하게 사용됨을 위에서 확인 하였으므로 마지막 3번식만 다르게 구해 준다.
4. 은닉층의 가중치와 편향치 갱신
위에서 구한 값들을 토대로 오차를 각 변수들로 미분한 값들을 구하면 아래의 식과 같다.
각 변수들을 갱신한다. 갱신할때는 최적화 함수(Optimization)를 이용한다. 우리는 SGD(Stochastic Gradient Descent)(확률적 경사하강법)를 사용하므로 아래와 같이 갱신한다. 미분값 앞에 붙은 이상한 기혼
미분값 앞에 붙은 이상한 기호는 Learning rate(학습률) 라고 한다. 이 값은 학습전 사용자가 임의로 설정하는 하이퍼 파라미터(hyper parameter)로 가중치를 갱신 할때 얼마만큼 이동할 것인지를 정하는 변수이다. 이 값을 너무 작게 잡으면 학습을 하는데 시간이 오래 걸리고 너무 크게 잡으면 가중치를 너무 많이 이동시켜 최적점을 지나치게 된다. learning rate의 값은 여러차례 바꿔가며 모델에 적용해보고 적당한 값을 찾아가야 한다.
5. 오차를 입력층의 가중치와 편향으로 미분
은닉층의 가중치와 편향을 구했던 것과 같이 오차를 입력층의 변수로 미분 하고 연쇄 법칙을 적용하면 다음과 같은 식이 나옴을 볼 수 있다.
역전파 순서도와 맵핑하면 다음과 같이 확인 할 수 있다.
1번식과 2번식은 위에서 구해 놓았고 4번식을 보면 결국 3번식과 동일 하다는 것을 확인 할 수 있다. 또한 이번 포스팅에서 사용할 활성화 함수는 모두 시그모이드로 통일할 것이므로 5번식 또한 2번 식과 동일한 방식으로 풀수 있다. 6번식은 4번식과 마찬가지로 위의 3번 식과 동일하다. 따라서 아래처럼 풀이 가능하다.
6. 입력층의 가중치와 편향치 갱신
위에서 구한 식을 은닉층과 동일하게 SGD를 이용하여 갱신한다. 식은 다음과 같다.
7. 학습 반복 (Epoch)
각 층의 가중치와 편향이 오차를 줄이는 방향으로 새로 갱신 되었다면 갱신된 값을 이용하여 순전파를 다시 진행 하게 된다. 이 두번째 순전파를 통해 나온 오차를 이용해 다시 역전파를 진행하고 이를 반복하여 점점 정확도가 높은 모델을 만들게 된다.
이때, 학습 순전파와 역전파를 진행 하는 것을 하나의 행위로 보고 이 행위를 반복하는 횟수를 epoch(에포크) 라고 한다. epoch 역시 모델을 학습할때 사용자가 임의로 지정하는 하이퍼 파라미터 중 하나가 된다.
마무리
본 포스팅은 MLP의 오차역전파에 대해 이론적인 부분을 설명하였다. 이 포스팅에서 주의할 점은 간단하게 보기 위해 입력변수와 출력변수로 가는 하나의 입력신호 만을 중심으로 최대한 변수들의 갯수를 줄여 표현하였다. 실제로는 입력, 은닉, 출력층의 노드 갯수가 다양하며 은닉층 또한 여러개가 올 수 있다. 다음 포스팅 시에는 해당 부분을 유의하며 MLP의 오차역전파를 Python으로 구현 하겠다.
from http://25-1k.tistory.com/20 by ccl(A) rewrite - 2021-09-13 17:00:25