안녕하세요, 이번 포스팅은 딥러닝에서 가중합과 바이어스를 실제적으로 구할 수 있는 방법인 오차 역전파와 고급 경사 하강법에 대해서 작성하도록 하겠습니다. 오차 역전파는 경사 하강법을 통해서 기울기와 y절편을 구하는 것과 기본 이론은 동일합니다.
오차 역전파
: 위에서 간단하게 설명한 대로 오차 역전파는 실제적인 모델에 들어가는 가중합과 바이어스를 구하는 방법입니다. 임의의 값을 입력하고 출력되는 값과 기존에 입력값에 설정된 출력값과 비교하여 오차 값을 설정하고 이 오차에 대해서 미분값을 구해 원하는 가중합과 바이어스를 찾는 과정입니다.
▼ 기 포스팅한 XOR 문제 해결 관련 코드를 보면 이미 가중합과 바이어스를 구해서 입력하고 그것이 출력되는 값에 대해서 확인하는 과정의 코드를 구현하였습니다. 이런 과정을 순전파(foward)라고 합니다. 자세한 사항은 아래 포스팅을 참조하시면 됩니다.
하지만 이런 과정은 이미 가중합과 바이어스를 알고 있을 때 애기입니다. 즉 모를 때는 임의 값을 입력을 해야 합니다. 하지만 우리가 임의의 값으로 순전파를 진행 하였을때 출력 값이 정확하지 않을 수 있습니다. 그리고 나서 수정을 해야 하는데 피드백이 없어서 수정이 불가합니다.
하지만 오차 역전파는 결과 값을 통해서 다시 역으로 입력하는 방향으로 오차를 다시 보내며 가중합과 바이어스를 재 업데이트 하는 과정입니다. 즉 오차를 기존에 입력에 매치가 되는 출력값과 비교하여 출력하고 오차를 줄어가는 과정에서 최적의 가중치와 바이어스를 찾는 것입니다.
▼ 아래 그림을 보면 해당 Flow를 이해하시는데 도움이 되실 겁니다. W1, W2의 가중치를 이용해서 임의로 입력을 하고 그 값을 기준으로 출력값을 뽑아 내고 뽑안 낸 출력값과 실제적으로 설정한 값을 비교하는 과정입니다.
그래서 순전파 방향으로 입력한 값을 기준으로 실제값과 입력된 값을 비교해서 오차를 출력하게 되는데 이 오차값은 경사하강법을 통해서 오차의 기울기를 구해 그 값을 이용해서 가중치를 수정하는 과정입니다.
▼ 오차값은 +, - 두가지 부호로 나타날 수 있으므로 이를 방지하기 위해서 해당 사항은 제곱을 하게 됩니다. 그래서 가중치와 바이어스별로 미분을 통해서 가중치를 얼마만큼 수정할지를 계산하게 됩니다. 물론 여기에서 학습률은 꼭 반영을 해야 합니다.
고급 경사 하강법
: 위에서 설명한 오차 역전파를 구현하기 위해서는 가중치를 수정하는 오차값과 학습률이 필요합니다. 오차, 즉 오차의 제곱한 식의 기울기를 구해서 학습률과 곱해 해당 사항을 평균하여 가중치를 새로 구하게 되는 과정입니다.
▼ 이런 과정에서 오차를 역전파하여 가중치를 계속적으로 업데이트를 하게 됩니다. 경사 하강법의 그래프를 보면 해당 경사 하강법에 사용되는 이차 함수 그래프의 기울기가 "0"이 되는 지점까지 계속적으로 가중치와 바이어스 업데이트를 하게 됩니다.
여기에서 오차가 중요한 이유는 계속 업데이트 하는 이유는 신경망을 통해 더 나은 결과 값을 내기 위해서 가중치를 조정하는데 오차가 큰 영향을 주기 때문입니다.
하지만 오차의 제곱을 한 이차함수에 대해서 기울기 "0"을 찾는 과정이 얼마나 업데이트를 해야 하는지 모를 때가 많을 것입니다. 왜냐하면 해당 모델은 입력값과 결과값만 알고 있지 가중치와 바이어스의 초기 값은 임으로 설정을 해야 합니다.
▼ 저도 이 부분에 대해서 의문을 가지게 되었습니다. 초기 값은 어떻게 설정을 하면 되는지, 어떤 기준으로 초기값을 설정하는지에 대해서 의문을 가지게 되었습니다. 하지만 계속적인 공부를 통해서 깨달은 것은 기준은 없다는 것입니다.
물론 해당 모델에 대해서 많은 경험을 가지고 있는 사람이라면 근사한 가중치와 바이어스를 입력하는데 도움이 될 수 있습니다. 하지만 데이터 사이어스 엔지니어나 해당 입력값과 결과값의 상관관계를 모르는 사람의 입장에서는 초기 값을 잡는게 쉽지 않습니다.
▼ 즉 여기에서는 반복적인 시도가 필요합니다. 입력값 뿐만 아니라 학습률도 마찬가지입니다. 기존 입력값과 출력값을 잘 설정하였다고 하더라도 학습률을 너무 과도하게 잡게 되면 오버플로우 현상으로 값을 구할 수가 없게 됩니다.
▼ 아래와 같이 대표적인 고급 경사 하강법에 대해서 정리를 하였습니다. 현재 사용하는 고급 경사 하강법 중에 가장 좋은 방법은 아탐(Adam) 이라는 고급 경사 하강법입니다.
고급 경사 하강법 종류 | 고급 경사 하강법 설명 | 고급 경사 하강법 효과 |
확률적 경사 하강법 (SGD) |
가장 기초적인 고급 경사 하강법으로 랜덤하게 추출한 일부 데이터를 사용해 더 빠르고 자주 업데이튼 하게 하는 고급 경사 하강법 | 경사 하강법에 비해 속도 개선되는 효과 |
모멘텀 (Momentum) |
관성의 방향으로 고려해 지동과 폭을 줄이는 효과를 가지고 가중치를 수정하는 고급 경사 하강법 | 확률적 경사 하강법 (SGD)에 비해 정확도가 개선되는 효과 |
네스테로프 모멘텀 (NAG) |
모멘텀이 이동시킬 방향으로 미리 이동해서 그레이디언트를 계산함. 불필요한 이동을 줄이는 효과를 가지고 있는 고급 경사 하강법 | 모멘텀 (Momentum)에 비해 정확도가 개선되는 효과 |
아다그라드 (Adagrad) |
변수의 업데이트가 잦으면 학습률을 적게하여 이동 보폭을 조절하는 고급 경사 하강법 | 네스테로프 모멘텀 (NAG)에 비해 보폭 크기가 개선되는 효과 |
알엠에스프롭 (RMSProp) |
아다그라드의 보폭 민감도를 보완하는 고급 경사 하강법 | 아다그라드 (Adagrad)에 비해 보폭 크기가 개선되는 효과 |
이상입니다. 지금까지 딥러닝에서 가중합과 바이어스를 실제적으로 구할 수 있는 방법인 오차 역전파와 그 오차 역전파를 구현하기 위해서 사용하는 고급 경사 하강법에 대해서 포스팅을 작성하였습니다.
이상적인 가중치와 바이어스를 구하는 방법에 대해서도 계속적으로 연구 중이며 적용하고 있는 것으로 인지하고 있습니다. 즉 딥러닝을 하면서 계속적으로 공부하고 연습해야 될 거 같습니다. 그럼 여기까지 정리 하도록 하겠습니다. 감사합니다.
관련 다른 글
'파이썬 (Python) > 딥러닝 (Deep Learning)' 카테고리의 다른 글
Python 딥러닝 퍼셉트론 이론 및 XOR 문제 해결 코드 구현 (0) | 2021.06.13 |
---|---|
Python 딥러닝 로지스틱 회귀 (시그모이드 함수) (0) | 2021.06.12 |
Python 딥러닝 다중 선형 회귀 경사 하강법 (1) | 2021.06.10 |
Python 딥러닝 경사 하강법 (0) | 2021.06.08 |
Python 딥러닝 선형 회귀 평균 제곱 오차 (0) | 2021.06.05 |
댓글