딥러닝 101_Chapter 7
앞선 글 들에서 Binary Classification과 이를 구현하기 위한 Logistic Regression 알고리즘과 Sigmoid 함수, 그리고 Loss 함수 및 Cost 함수 등의 수학적 정의에 대해서 알아보았다. 이번 글에서는 우리가 학습시켜야 할 파라미터인 weight(w)와 bias(b)을 어떻게 학습을 시켜야 하는 것인지, Gradient Descent라는 알고리즘을 같이 공부해보면서 알아보도록 하자.
일단 앞선 글들에서의 내용을 먼저 상기해보도록 하겠다. Logistic Regression에서의 y ^은 sigmoid 함수를 사용해서 표기가 되며, Cost 함수 J(w, b)는 아래와 같이 log함수를 사용하여 정의된다고 하였다. 복습하고 싶다면 지난 글을 참조하자 (1-5.Logistic Regression https://brunch.co.kr/@minsukshin/23)
잠깐, 여기서 우리의 목표를 잊지 말자. 왜 지금 이렇게 복잡한 수식들을 보고 있는 것이지? 무엇을 위해서?
우리는 지금 딥러닝을 공부하고 있으며, 그 출발의 단계로 Binary Classification을 구현하기 위한 Logistic Regression을 공부하고 있고, 이때 Cost 함수 J(w, b)가 최소가 되는 w와 b를 학습을 통해서 찾아야 한다. 이것이 딥러닝이 해야 하는 일이자 우리의 목적이다. (Cost 함수 J는 인풋 x를 제외하면 w와 b를 변수로 하는 함수이므로 J(w, b)로 표기하였다). 이를 위해 필요한 알고리즘이 바로 Gradient Descent이다.
아래 3차원 축 J, w, b 축으로 이루어진 공간이 있고 w, b를 변수로 하는 J(w, b)의 값을 3차원 공간에 표현하였다. z 축 수직선의 높이가 J라고 보면 된다. 높이가 높을수록 J가 크다는 의미이다.
우리는 앞서 J(w, b)를 위에서 정의한 수식으로 정의하였으므로, 아래와 같은 bowl 형태의 차트가 그려지게 될 것이다. w, b의 값이 어떤 특정 값으로 초기화되었다고 가정하면, 알고리즘 학습의 초기에는 J(w, b)가 위쪽 높은 곳, 즉 Cost가 아직 큰 곳에 위치하고 있다. 하지만 이것이 Gradient Descent라는 알고리즘을 거쳐서 점점 Cost가 낮은 쪽, 즉 아래 그림에서 Global Optima라고 표기된 빨간 점의 위치로 학습의 반복 과정을 거쳐 점점 이동하게 된다. 이에 따라 w, b도 마찬가지로 학습을 통해서 변하게 되어 있으며, Global Optima에 도달했을 때의 w, b가 최종적으로 우리가 학습을 통해서 찾고자 하는 값이 되는 것이다.
Gradient Desecent를 조금 더 수학적으로 살펴보도록 하자. 우선 이해를 쉽게 하기 위해서 b 축은 없애고, Cost 함수 J를 w에 대해서만 정의해 보자. 그러면 J(w)는 아래 그림과 같이 2차원의 평면 상에서 Convex 한 함수로 표현이 된다.
Gradient Desecent란 한국말로 굳이 풀자면 '경사 하강법'이라고 한다. 말 그래도 경사가, 다시 말해 기울기가 점점 작아지는 방향으로 내려가는 알고리즘이라는 뜻이다. 우선은 수학적으로 w에 대한 Gradient descent는 ' w := w - α*dJ(w) /dw ' 이렇게 표현이 된다. 이것을 뜯어보면 크게 3가지 요소인데,
1) := 표시는 w가 계속 업데이트된다는 뜻이다.
2) α는 learning rate라는 학습 파라미터 중의 하나인데 나중에 다시 설명하도록 하겠다. 0보다 큰 양수이다.
3) dJ(w) /dw는 J의 w에 대한 미분 값 (w에서의 J함수의 기울기)이다.
그리고 그것을 학습을 반복한다는 측면에서 코딩으로는 대략 아래와 같은 콘텍스트로 표현이 된다.
이때 위 2차원 그래프에서 알고리즘의 학습 초기에 2가지의 경우가 있을 수 있는데,
1) J(w)가 그래프의 우측 상단에 위치하고 있다고 하면, 그때 그 지점에서의 미분 값, 즉 기울기가 양수이므로 α가 곱해진 만큼 w는 왼쪽 방향으로 감소하면서 J(w)가 오목한 부분인 최솟값으로 향하는 방향으로 업데이트된다.
2) 반대로 J(w)가 그래프의 좌측 상단에 위치했다면, 여기서의 기울기는 음수이므로 α가 곱해진 만큼 w는 오른쪽 방향으로 증가하면서, 마찬가지로 J(w)가 오목한 부분인 최솟값으로 향하는 방향으로 업데이트된다.
이를 w, b의 2가지 변수에 대한 경우로 표기하면 아래와 같이 w, b 각각의 미분 값으로 기울기를 구해서 w, b각각이 학습을 통하여 업데이트가 된다. 이 변수들이 업데이트되는 주기를 Iteration이라고 하며, Iteration은 batch 단위로 학습이 반복되는 것을 의미하는데, 이에 대해서는 다른 글에서 다루어 보도록 하겠다.
여기서 한 가지 수학적 표기법 이해를 위해서 짚고 넘어가자면, 미분 기호를 d로 쓰냐 혹은 ∂로 쓰냐가 헷갈릴 수 있는데 이는 대학교 기초 수학 과정에서 나오는 편미분(Partial Derivatives)을 대략 이해하면 된다. (요새는 고등학교 과정에서도 나오려나?) 우리가 보통 미분을 이해할 때는 2차원 평면 상에서, 이는 다시 말하면 변수가 1개인 경우이므로 보통 d로 미분 표기를 하는데, 변수가 2개 이상이 되면 각각의 변수에 대해서 따로따로 미분이 들어가야 한다. 이때 편미분 한다고 하며, 기호로는 ∂, 이 녀석을 쓰는 것이다.
한글로 풀어써보자면 ∂J/∂w는 J를 변수 w에 대해서 미분한다는 뜻, ∂J/∂b는 J를 변수 b에 대해서 미분한다는 뜻이다. 이렇듯 w와 b, 두 가지 변수의 Gradient Descent 알고리즘을 사용하는 것이므로 정확하게는 편미분 기호를 사용하는 것이 맞다. 다만 코딩에서는 용이성을 위하여 ∂J/∂w를 dw라고 표기하고, ∂J/∂b를 db라고 표기를 한다는 점 참고로 알고 있도록 하자.
참조 : 강의 원본 출처 (앤드류 응 교수 딥러닝 강의)
Gradient Descent (C1 W2 L04)
https://www.youtube.com/watch?v=uJryes5Vk1o&list=PLkDaE6sCZn6Ec-XTbcX1uRg2_u4xOEky0&index=10