출처: https://sacko.tistory.com/19?category=632408
이전 시간까지 신경망이 무엇인지 어떻게 생긴 것인지 작동원리 등을 살펴보았다. 이후의 책에서 다루는 내용은 갑자기 난이도가 점프하는 느낌이 있어 필수 개념들을 빠르게 숙지하고 간단하게라도 전체적인 신경망을 끝까지 구현해볼 필요가 있다는 생각이 들어서 조금 더 쉬운 교재에서 내용을 다루고 다시 밑바닥으로 돌아가기로 했다.
오차 역전파, 경사하강법
문과생도 이해하는 딥러닝 (3)
1. 오차 역전파 Error Backpropagation
2. 경사하강법
1. 오차 역전파 Error Backpropagation
지난 시간까지는 Input에서 Output으로 가중치를 업데이트하면서 활성화 함수를 통해서 결과값을 가져오는 것까지 배웠다. 이렇게 쭉 오는 것을 순전파(foward)라고 하며 말 그대로 앞쪽으로 input 값을 전파, 보내는 것이라고 보면 된다. 하지만 우리가 임의로 한 번 순전파 했다고 출력 값이 정확하지는 않을 것이다. 우리가 임의로 설정한 가중치 값이 input에 의해서 한 번 업데이트 되긴 했지만 많은 문제가 있을 수 있다.
역전파 방법은 결과 값을 통해서 다시 역으로 input 방향으로 오차를 다시 보내며 가중치를 재업데이트 하는 것이다. 물론 결과에 영향을 많이 미친 노드(뉴런)에 더 많은 오차를 돌려줄 것이다.
위의 그림을 보면 Input이 들어오는 방향(순전파)으로 output layer에서 결과 값이 나온다. 결과값은 오차(error)를 가지게 되는데 역전파는 이 오차(error)를 다시 역방향으로 hidden layer와 input layer로 오차를 다시 보내면서 가중치를 계산하면서 output에서 발생했던 오차를 적용시키는 것이다.
한 번 돌리는 것을 1 epoch 주기라고 하며 epoch를 늘릴 수록 가중치가 계속 업데이트(학습)되면서 점점 오차가 줄어나가는 방법이다.
위의 그림을 보면 Output layer에서 나온 결과 값이 가진 오차가 0.6이라고 되어 있다. 이전 노드(뉴런에서) Output layer에 각각 3, 2라는 값을 전달하였기 때문에 Ouput의 Error에 위 노드는 60%, 아래 노드는 40% 영향을 주었다고 볼 수 있다. 균등하게 가중치를 나눠줄 수 있지만 영향을 미친 만큼 오차를 다시 역전파하는게 맞는 것 같다.
error 0.6을 0.6, 0.4를 곱하니 위 노드에는 error가 0.36이, 아래 노드에는 0.24가 전달된다.
오차 역전파는 말 그대로 이렇게 오차를 점점 거슬러 올라가면서 다시 전파하는 것을 의미한다.
2. 경사하강법 Gradient Descent
경사하강법을 왜 소개하는 것인가?
앞에서 오차가 역전파되는 것을 알아보았는데 오차를 역전파하여 계속 업데이트 하는 이유는 신경망을 통해 더 나은 결과 값을 내기 위해서 weight를 조정하는데 오차가 영향을 주기 때문이다. 위의 예처럼 간단한 신경망이라면 오차를 계산하는 식은 굉장히 간단할 것이지만 효과적인 신경망은 절대 저렇게 간단하지 않다. 수십, 수백개의 노드(뉴런)이 연결되어서 수많은 가중치의 조합으로 특정 노드의 weight를 계산해야 한다면... 효율적인 방법이 필요할 것이다.
경사하강법은 너무나 많은 신경망 안의 가중치 조합을 모두 계산하면 시간이 오래걸리기 때문에 효율적으로 이를 하기위해 고안된 방법입이다.
아래 그림을 보면 조심스럽게 산을 내려가고 있는 한 남성이 보일 것이다. 여기서 소개하고자 하는 경사하강법은 아래의 남성과 같이 조심스럽게 천천히 산을 내려가는 것과 같다.
위와 같이 절벽은 산을 내려갈 수 있는 가장 빠른 방법이다(사진이 하산 하는것 처럼 보이지는 않지만...). 한 발 한 발 조심스럽게 내딛어야 한다. 경사가 급하기 때문에 천천히 내려가며 하산할 때까지 한 발 한 발 내딛는 과정을 반복하게 된다. 경사는 지형의 기울기를 의미한다.
경사하강법을 사용하면 정확한 답을 얻지는 못할 수도 있다. 단계적으로 접근하는 것이기 때문에 만족스러운 정확도에 이를 때까지 계속해서 답을 찾아나가는 방식이다.
신경망의 오차를 경사하강법으로 최저 오차를 찾아나가는 방식이며 신경망의 계산 속도를 빠르게 한다. 아래 그림은 이를 보여주는 그래프이다. x축의 오른쪽으로 조금씩 이동하면서 최저 지점을 찾는다.
문제는 이 조금씩이라는 정도의 문제다 조금씩이더라도 너무 많이 이동하면 최저 지점을 지나가게 될 것이다. 또는 너무 작은 조금씩은 이동횟수가 많아져서 최저 지점을 찾지 못할 수도 있다.
또 다른 문제는 엉뚱한 최저점을 찾을 수 있다는 것이다. 만약 차원이 여러개라고 한다면 위에서 본 것처럼 단순한 2차함수 형태가 되지는 않을 것이다. 아래의 그림과 같이 여러 개의 계곡이 있고 발을 잘못 디딛으면 엉뚱한 계곡으로 갈 수도 있다.
이러한 문제를 피하기 위해서는 서로 다른 초기값으로 주어 산을 내려가게 하는 방법으로 신경망의 경우에서는 weight의 초기 값을 다르게 주면서 경사하강법을 활용해본다는 의미이다.
아래 그림과 같이 수학적으로 설명하면 ("낮은 쪽의 방향을 찾기 위해 오차함수를 현재 위치에서 미분함") 우리 문과생들은 이런말 잘 모르니까 이렇게 말해도 될 지 모르겠다. 한 발 내려간 시점에서 등산객이 자기가 산을 제대로 내려가고 있는지 주변 경사(기울기)를 보면서 판단하듯이 기울기가 음수인지? 양수인지? 확인하면서 최저지점으로 내려가는 거라고 보면 되지 않을까 싶다.
출처: https://www.slideshare.net/RickyPark3/2linear-regression-and-logistic-regression
경사하강법의 특징
- 함수의 최저점을 구하기 좋은 방법으로 신경망과 같이 계산해야 하는 양이 많고(선형대수학) 접근하기가 복잡한 수식에서 잘 작동
- 데이터가 불완전해도 유도리 있게 작동
'IT기술 관련 > A.I 인공지능' 카테고리의 다른 글
문과생도 이해하는 딥러닝 (5) - 신경망 학습 실습 (0) | 2019.10.16 |
---|---|
문과생도 이해하는 딥러닝 (4) - 신경망구현, 활성화함수, 배치 (0) | 2019.10.14 |
문과생도 이해하는 딥러닝 (2) - 신경망 Neural Network (0) | 2019.10.12 |
회귀분석 유형의 이해 (0) | 2019.10.11 |
문과생도 이해하는 딥러닝 (1) - 퍼셉트론 Perceptron (0) | 2019.10.11 |