우선 우리의 신경망 학습이 최종적으로 도달하고자 하는 곳을 살펴보자.
위의 그래프는 가로가 가중치 w의 값을 나타내고, 세로가 비용을 나타낸다. 예측한 결과가 실제 결과와 얼마나 다른 지를 나타내는 값이 비용임을 생각해보면, 이 비용을 최소한으로 줄여나가는 것이 학습의 목적이라는 것을 이해할 수 있다. (실제로 일반적인 용어로는 "목적 함수"라고 한다.)
우리가 학습을 통해 도달하고자 하는 목적지를 최적값(optimum), 혹은 더
쉽게 최솟값(minimum)이라고 한다.
비용을 최솟값으로 만드는 가중치 w를 최적 w라고 하자.
그런데 가중치를 이 최적 w로 단번에 업데이트하지 않고, 굳이 여러 번씩
업데이트해가면서 학습하는 이유가 뭘까?
하지만 우리가 처해 있는 상황은, 다음과 같이 작은 촛불에 의지해서 길을
찾아야하는 길 잃은 등산객과 비슷하다.
최솟값으로 가기 위해서, 우리는 어느 방향으로 몇 발자국 정도 내딛어볼 지 정도만
선택할 수 있다.
그 방법으로 기울기(gradient)를 이용해볼 수 있다.
여기서 잠깐 기울기에 대해서 복습을 하고 넘어가자.
기울기가 작다면, 그 순간에 있어 변화량이 작은 것이다.
기울기가 크다면, 그 순간에 있어 변화량이 큰 것이다.
다음과 같은 상황을 한 번 생각해보자.
어느 방향으로 이동해야 비용이 줄어들까?
바로 왼쪽으로 이동하는 것이 비용을 감소시킬 수 있다.
즉, 가중치 w의 값을 더 작은 값으로 업데이트시키면 된다.
반대의 경우도 한 번 살펴보자.
이 경우에는 가중치 w가 어느 방향으로 이동해야 비용을 줄일 수 있을까?
바로 오른쪽이다.
즉, 가중치 w의 값을 더 큰 값으로 업데이트시키면 된다.
이 두 위치의 기울기를 한 번 구해보자.
처음 살펴보았던 경우는 기울기가 양수다.
이 경우에는 왼쪽으로 이동하면 된다. (가중치 w값 감소)
두번째로 살펴보았던 경우는 기울기가 음수다.
이 경우에는 오른쪽으로 이동하면 된다. (가중치 w값 증가)
기울기 + 면 가중치 -
기울기 - 면 가중치 +
이 두 가지 경우를 일반화시켜보자.
원래 가중치 w가 새로운 w로 업데이트될 때의 공식은 다음과 같다.
이를 더 쉽게 나타낸다면 다음과 같다.
예를 들어, 원래 w가 1이고 최적 w가 2인 상황에서,
기울기 5를 방향만 맞다고 더해버리면 다음과 같이 될 수 있다.
이를 방지하기 위해서 우리는 항상 기울기에 작은 상수를 곱해서 사용한다. 이를
학습률(learning rate)이라고 한다.
이 학습률은 말 그대로 매 업데이트 마다 학습을 얼마나 시킬지를 결정하는데, 신경망 학습에 있어서 매우 중요한 요소이다. 학습을 통해 최적값이 나오는 게 아니라, 학습률만 바꿔가면서 신경망 학습을 여러 번 시도해보면서 찾아내야하는 변수라고 할 수 있다. 이러한 변수를 하이퍼파라미터(hyperparameter)*라고 한다.
* 매개변수(parameter)는 보통 함수에 입력값으로 들어와 어떤 설정값을
지정하는 변수라고 생각하면 된다.
하이퍼파라미터란 그보다 더 고차원으로, 신경망 학습이라는 시스템에
입력값으로 들어와 학습에 대한 설정값을 지정하는 변수라고 생각하면
된다.
머신러닝 서적이나 강의를 보면 다음과 같은 수식이 등장한다.
이 수식이 의미하는 바는 사실 위에서 우리가 다룬 식과 완전히 동일하다. 수식이
의미하는 바만 차근차근 이해해놓는다면, 어려워보이는 수식들도 전혀 두려워할
필요가 없다.
이 수식에서 등호(=) 기호가 콜론과 함께 등장하는데, 이는 "w 라는 변수를 이런
값으로 업데이트하겠다"는 의미로 이해하면 된다. 파이썬 코드에서는 등호만
사용된다.
알파(α)는 단순히 학습률을 의미하는 기호라고 보면 된다.
알파 뒤에 등장하는 기호들은 단순히 "기울기"를 의미한다.
기울기란 앞서 다뤘듯이 순간 변화율을 의미하는데, 다시 말해 분모에 있는 변수가
변할 때 분자에 있는 변수가 얼마나 변하는지를 의미한다고 보면 된다.
시간이 변할 때 속도가 얼마나 변하는지가 바로 가속도인 것처럼 말이다.
이 기울기는 "미분"을 통해 구할 수 있다.
우리가 고등학교 때 배웠던 미분은 다음과 같다.
눈치챘겠지만, 우리가 신경망에서 사용하는 미분은 기호가 조금 다르다.
왜냐하면 여기서는 "편미분"이 사용되기 때문이다.
편미분이란 단순히 여러 개의 변수들 중에서 딱 두 개만 보겠다는 뜻으로 이해하면
쉽다.
신경망 층에서 수많은 가중치 w1, w2, ... 들로 구성된 식에서, 딱 w1이 변할 때
cost가 어떻게 변하는지만 보겠다는 것이다.
다음과 같이 x, y, z 축의 그래프가 있다고 생각해보자.
이때 x에 대한 y의 편미분 값은, z를 무시한 채 x, y 평면에서 기울기를 계산하면
된다.*
* 이는 그래프를 z 축에서 빛을 쏘아 x, y 평면에 그림자를 투영시킨 후, 그
그림자에서 미분을 계산한다는 의미와 동일하다.
신경망에서는 이전 장들에서 살펴보았듯이, 가중치 w가 하나만 존재하는 게 아니라
엄청나게 많이 존재한다. 따라서 모든 가중치 변수들을 미분해서 기울기를 계산하는
것이 아니라, 각각 편미분을 통해 아주 간단하게 기울기를 계산하고 업데이트하는
식으로 학습을 진행하는 것이다.
이렇게 기울기를 계산해서 최솟값으로 나아가는 방법을
경사하강법(gradient descent)*이라고 한다.
* 기울기(gradient)와 하강(descent)이 합쳐진 말이다.
간단히 경사하강법에 대해서 알아보았다.
추가적으로, 경사하강법으로 학습을 할 때
지역 최솟값(local minimum) 문제가 생길 수 있다. 다음 그림처럼, 주변
지역에서는 최소이지만 전체에서는 최소가 아닌 부분을 만나면
전역 최솟값(global minimum)으로 갈 수 없게 된다.
이때 지역 최솟값을 지나 기울기를 역행한다면 넘어갈 수 있게 된다.
이는 기울기만이 아니라 내려가는 가속도를 함께 반영하는 방법으로 그 문턱을
넘어갈 수 있다. 가속도라는 뜻인 모멘텀(momentum)이 그 방법이며,
최근에는 더 다양한 상황에서 학습 실패가 적은 아담(adam) 등의 방법이
많이 사용된다. (확률적) 경사하강법, 모멘텀, 아담 등을
옵티마이저(optimizer)라고 부른다.
마지막으로, 컴퓨터 메모리에서 변수가 어떻게 업데이트 되는지 알아보면서
마무리하도록 하자. (학습률이 알파가 아닌 에타(η)로 표기되는 경우도 종종 있기
때문에, 익숙해지라는 의미에서 한 번 해봤다.)
그 다음 w를 w+5로 업데이트하는 명령을 실행하면,
w + 5가 먼저 계산되고 그 값이 w에 들어간다.
즉, w라는 변수 입장에서는 다음과 같이 값이 변한 것이라고 할 수 있다.
다음 장은 신경망의 마지막 단원으로, 그 유명한
역전파(backprobagation)에 대해 알아보도록 하자.
4 댓글
감사합니다
답글삭제감사합니다 :)
삭제안녕하세요, 선생님 궁금한게 있어서 댓글을 남깁니다.
답글삭제내용 중 new W = old W - 기울기 부분에서요,
new W = old W - Δ E / 기울기
가 되어야 맞는거 아닐까요?
기울기 = ΔE (그림 y축) / ΔW (그림 x축) 이고
Δ W = ΔE / 기울기가 되고
new W = old W + ΔW 니까, 다시 말해
new W = old W - 기울기 / ΔW 가 되어야 맞는거 아닐까요?
안녕하세요, 좋은 질문을 주셔서 감사합니다.
삭제우선 "기울기"라는 말만으로는 사실 어떤 변수에 대한 기울기인지 불명확한 점 때문에 질문을 주신 것 같습니다. 최대한 단순화하여 쉽게 설명하려다 보니 단순히 "기울기"라고 표현했는데, 이 기울기가 의미하는 바는 본문에 적었듯 "w가 변할 때 cost가 얼마나 변하는지"입니다.
질문해주신 표현에 따르면 new W = old W - Δ C / Δ W 가 될 것이며, "Δ C / Δ W" 이 부분이 본문에서의 "기울기"라고 할 수 있습니다.
가속도의 경우 시간의 변화에 따른 속도의 변화를 나타내는데, 속도의 변화량을 시간의 변화량으로 나눈 것이므로 이것도 하나의 기울기라고 표현할 수 있습니다. 이 때의 식은 "가속도 = Δ 속도 / Δ 시간"이 됩니다.
마찬가지로 W의 변화에 따른 C의 변화는 "Δ C / Δ W"로 나타낼 수 있으며, 이 기울기의 값이 양수인지 음수인지를 보면 어느 방향으로 W 값을 이동시켜야 C 값을 줄일 수 있는지를 알 수 있습니다. 물론 "어느 정도로" 이동시켜야 하는지도 그 기울기가 가파른지 혹은 완만한지를 따져 계산할 수 있지만, 이 부분 역시 설명의 단순화를 위해 생략하였습니다.