본문 바로가기
데이터 과학 관련 스터디/모두의 딥러닝

[모두의 딥러닝] 8장 오차 역전파/ 9장 신경망에서 딥러닝으로

by inhovation97 2020. 6. 11.

이번에도 8장, 9장이 짧아서 한 번에 포스팅을 합니다.

 

<오차 역전파>

 

우선 8장의 오차 역전파를 알아보도록 할게요~ 책에서는 오차 역전파가 2장으로 설명했지만, 이게 또 굉장히 중요한 부분입니다! 오차 역전파에서 생긴 문제가 다시 한번 AI의 침체기를 야기시키는 원인이었거든요.

 

오차 역전파는 우리가 6,7장에서 배웠던 신경망의 가중치들을 출력층부터 반대로 거슬로 올라가면서 최적의 가중치들로 수정해나가는 방식입니다. 신경망의 성능을 높이는 핵심 개념이죠. 이는 우리가 앞서 배운 4장의 경사 하강법의 개념을 그대로 이용하면 됩니다.

 

1. 임의의 초기 가중치(W)를 준 뒤 결과(Y out)를 계산합니다.

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

 

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

 

4. 위 과정을 더 이상 오차가 줄어들지 않을 때까지 반복합니다.

 

 

 

 

 

 

 

이 책이 자세한 수식을 알려주지 않는 점이 단점이죠...

위의 식을 이용해 가중치를 최적화시켜나가는데, 식을 보면 알듯 미분하여 경사 하강법을 이용합니다. 이해가 잘 가지 않는다면, 4장의 경사 하강법에서 미지수 a, b를 업데이트했던 식을 다시 보면 이해가 쉽습니다. 오차 함수와 가중치의 관계에 대한 그래프(아래로 볼록한 2차 함수)를 생각했을 때, 현 가중치에서 가중치의 미분한 값을 빼는데 그 미분한 값이 0이 되는 바로 그 값을 찾아 뺏을 때가 비로소 최적의 새 가중치(W)를 찾은 것으로 보면 되겠죠.

 

 

 

 

 

 

 

<코딩으로 오차 역전파를 설계하기>

 

우리는 앞서서 'XOR 문제'를 코딩으로 확인할 때는 가중치를 미리 알고 접근했지만, 실제 데이터를 마주했을 때는 그럴 수 없겠죠? 그래서 우리는 처음에 임의의 가중치를 아무 값이나 대입한 뒤, 오차 역전파를 통해서 최적의 값을 찾는 것입니다.

 

 

1. 환경 변수 지정: 인공 신경망을 설계할 각종 파라미터들을 지정해 줍니다.

 

2. 신경망 실행: 초깃값(임의의 값)을 대입하여 Y out을 뽑아냅니다.

 

3.결과를 실제 값과 비교: 오차를 측정합니다.

 

4. 역전파 실행: 출력층과 은닉층의 가중치를 수정합니다.

 

5. 결과 출력

 

 

 

우리는 이제 이러한 수학적인 설계가 내포되어 있는 케라스, 텐서플로 같은 딥러닝 라이브러리를 이용하면 되는 겁니다! 위에 환경 변수 지정 부분의 파라미터들만 조정하면 간단한 코드 몇 줄로 복잡한 딥러닝을 간단히 설계할 수 있는 것이죠!!

 

*계속 아쉬워했던 자세한 식에대한 과정이 책의 뒷부분 심화 학습 쪽에 있다고 하네요! 나중에 꼭 포스팅해야겠습니다.

 

 

 

 

 

 

<9장 신경망에서 딥러닝으로>

 

우리는 단일 퍼셉트론에서 은닉층을 만들어 'XOR문제'를 해결하여 다층 퍼셉트론 즉 신경망을 만들었고, 이를 또 오차 역전파를 통해 드디어 인공지능에 한 발짝 더 가까워졌습니다. 하지만 여기서 또 다른 문제에 직면합니다.

바로 '기울기 소실' 문제입니다. 이로인해 AI는 다시 한번 침체기로 들어서게 됩니다.

 

 

기울기 소실문제는 바로 오차 역전파에서 일어납니다. 처음에는 저도 시그모이드 함수의 미분값이 최대 0.3이므로 계속해서 곱해주면, 수 많은 은닉층들을 거치면서 기울기가 결국은 0으로 수렴하게 된다는 기울기 소실 문제를 직관적을 이해했습니다.

하지만 8장에서 나오는 가중치 w의 업데이트 식은 'w(t+1)=wt - 오차식의 미분값' 이었죠.

저는 여기서  시그모이드 함수의 미분을 곱해주는 것도 아닌데 왜 기울기 소실이 있는지 혼자 논리적인 오류에 빠졌어요. 이 책은 정말 수식을 많이 생략한 점이 너무 아쉬웠어요. 그래서 나중에 포스팅하려 했지만, 8장에서 말한 뒷 부분 심화 부분을 가서 계산도 해보고, 여기저기 웹 서핑도 많이 해봤습니다.

 

 

 

다행히도 심화 부분은 이 업데이트 부분의 수식을 상세히 설명했습니다. 간단히 은닉층의 오차 업데이트 부분을 보면 오차식의 미분값이 미지수 부분이었죠. 이 식을 얻으려면 오차 함수가 합성함수이기에 3중 4중으로 계속 편미분 해야했습니다. 아무쪼록 미분을 끝까지 해보니, 그 내부에는 부모층으로 갈수록 가중치들을 계속해서 곱해갔으며, 시그모이드 함수를 거쳐서 나온 '결과값'들을 계속해서 곱해주는 것이었습니다. 

 

1보다 작은 값들을 계속해서 곱해주면 그 값은 너무너무 작아져서 입력층에 다다를때 쯤이면 값은 거의 0에 수렴하고, 1,0 만 뱉어내는 시그모이드 함수의 결과값들을 곱해주면 부모층으로 거슬로 올라갈때 학습이 제대로 이루어지지 않는 것이지요. 그래서 이 기울기 소실 문제(VanishingGradient)를 해결하기위해 다른 함수들을 찾기 시작합니다.

 

출처 https://yjjo.tistory.com/5

 

 

 

 

탄젠트 함수는 범위를 확장하여 기울기가 커지긴 했지만, 여전히 1보다 작기 때문에 탈락.

렐루 함수는 항상 기울기가 1이기 때문에 최초 층까지 값이 남아있어 학습이 가능해졌습니다. 이후 소프트플러스 함수 등등 개발중이며 지금은 렐루 함수가 가장 상용화된 활성화 함수입니다.

 

기울기 소실 문제가 해결되면서 인공 신경망은 빠르게 발전하기 시작했습니다. 경사 하강법은 한번 업데이트 할 때 전체 미분해야 하므로 계산량이 너무 많아서 확률적 경사 하강법과 모멘텀을 통해 최적의 속도로 빠른 해를 찾아내어 오늘날 더욱더 좋은 성능의 딥러닝을 구현할 수 있게 됐습니다. 

 

 

인공 신경망의 원리를 공부한 우리는 이제 케라스에서 제공하는 딥러닝을 표에 있는 파라미터만을 설정하여 매우매우 쉽게 딥러닝을 구동할 수 있는 것입니다!!!

댓글