도순씨의 코딩일지

딥러닝 :: 오차 역전파, 활성화 함수, 고급 경사 하강법 본문

𝐂𝐎𝐌𝐏𝐔𝐓𝐄𝐑 𝐒𝐂𝐈𝐄𝐍𝐂𝐄/𝐃𝐄𝐄𝐏 𝐋𝐄𝐀𝐑𝐍𝐈𝐍𝐆

딥러닝 :: 오차 역전파, 활성화 함수, 고급 경사 하강법

도순씨 2020. 8. 6. 14:41

오차 역전파


오차 역전파는 다층 퍼센트론에서의 최적화 과정이다. 경사 하강법의 확장 개념이라고도 할 수 있다. 

앞에서 살펴본 방법을 사용하여 가중치를 구하는 방법을 간단하게 살펴보자면 '임의의 가중치를 선언하고 최소 제곱법을 이용해 오차를 구한 뒤 이 오차가 최소인 지점으로 계속해서 조금씩 이동시킨다. 이 오차가 최소가 되는 점(미분했을 때 기울기가 0이 되는 지점)을 찾으면 된다'.

하지만 경사 하강법은 입력과 출력이 하나 씩일 때 (=단일 퍼셉트론)일 경우이다.

 

하지만 숨어 있는 층이 하나 더 생겼다면 어떻게 될까? 결괏값의 오차를 구해 이를 토대로 앞선 가중치를 차례로 거슬러 올라가며 조정하면 된다. 최적화의 계산 방향이 출력층에서 시작해 앞으로 진행되므로 오차 역전파(back propagation)라고 부른다. 역전파 구동 방식은 다음과 같이 정리할 수 있다.

 

1. 임의의 초기 가중치를 준 뒤 결과를 계산한다

2. 계산 결과와 우리가 원하는 값 사이의 오차를 구한다.

3. 경사 하강법을 이용해 바로 앞 가중치의 오차가 작아지는 방향으로 업데이트한다.

4. 1-3 과정을 더이상 오차가 줄어들지 않을 때까지 반복한다.

 

3번에서 오차가 작아지는 방향으로 업데이트한다는 것은 미분 값이 0에 가까워지는 방향으로 나아간다는 말이다. 이 말은 '가중치-기울기 = 가중치'라는 의미와 동일하다. 이를 수식으로 나타내면 다음과 같다.

 

 

기울기 소실 문제와 활성화 함수


오차 역전파는 하나씩 앞으로 되돌아가며 기울기를 수정하는 것이다. 하지만 이렇게 기울기를 수정하는 것을 반복하자 기울기에 0이 되는 문제가 생겨버렸다. 층을 거쳐 갈수록 기울기가 0에 가까워지면서 가중치를 수정하기 어려워지는 것이다.

출처 : https://ratsgo.github.io/deep%20learning/2017/04/22/NNtricks/

이를 해결하고자 활성화 함수를 시그모이드가 아닌 여러 함수로 대체하기 시작했다.

 

하이퍼볼릭 탄젠트는 시그모이드 함수의 범위를 -1에서 1으로 확장한 개념이다.

0을 기준으로 대칭이기때문에 학습 속도가 빠르다. 하지만 여전히 1보다 작은 값이 존재하므로 기울기 소실 문제는 사라지지 않는다. 

 

렐루(ReLU)는 현재 가장 많이 사용되는 활성화 함수이다. x가 0보다 작으면 모든 값을 0으로 처리하고, 0보다 큰 값은 x를 그대로 사용하는 방법이다. 이 방법을 쓰면 x가 0보다 크기만 하면 미분 값이 1이 된다. 따라서 여러 은닉층을 거치며 곱해지더라도 맨 처음 층까지 사라지지 않고 남아있을 수 있다.

 

 

고급 경사 하강법


경사 하강법은 정확하게 가중치를 찾아가지만, 각각의 과정마다 전체 데이터를 미분해야 하므로 계산량이 매우 많다는 단점이 있다. 이 단점을 보완한 것이 고급 경사 하강법이다.

 

1) 확률적 경사 하강법(SGD)

앞서 언급한 것과 같이 경사하강법은 전체 데이터를 반복하여 미분해야 하기 때문에 속도가 느려진다. 이러한 단점을 보완한 것이 확률적 경사 하강법(SGD)이다. 전체 데이터를 사용하는 것이 아니라 랜덤하게 추출한 일부 데이터를 사용하는 것이다. 결과가 불안정할 수도 있지만, 속도가 빠르면서도 근사한 값을 찾아낸다는 장점 덕분에 경사 하강법의 대안으로 사용되고 있다.

1
keras.optimizers.SGD(lr = 0.1)
cs

 

2) 모멘텀(momentum)

모멘텀은 경사 하강법에 탄력을 더해주는 것이다. 매번 기울기를 구하지만 오차를 수정하기 전에 바로 앞 수정값과 방향(+, -)을 참고하여 같은 방향으로 일정한 비율만 수정되게 한다. 따라서 불안정하지 않다.

1
keras.optimizers.SGD(lr = 0.1, momentum = 0.9)
cs

 

 

* 출처

조태호, 모두의 딥러닝(2017), 길벗

https://ratsgo.github.io/deep%20learning/2017/04/22/NNtricks/

Comments