딥러닝/기초수학

미분이야기 (feat. chain rule)

데이터_박과장 2023. 3. 14. 23:08

학교에 가던, 인강을 틀고 딥러닝 수업을 보면 항상 딥러닝 외에 배경 이야기가 정말 많습니다.

통계, 최적화, 파이썬 패키지 사용법부터 시작해서 딥러닝을 직접 다루기 전까지 기초설명이 많은데요, 그래서 딥러닝을 배우려고 하면 정말, 솔직히 정신이 산만해진다는 생각이 듭니다.

 

아무런 생각이 없다

 

 

딥러닝은 기계 학습의 한 분야로, 입력 데이터와 출력 데이터 사이의 복잡한 관계를 모델링하기 위해 인공 신경망을 사용합니다. 이 과정에서 미분이 매우 중요한 역할을 합니다.

미분은 함수의 변화율을 나타내며, 딥러닝에서는 이를 통해 손실 함수(loss function)의 기울기(gradient)를 계산합니다. 이 기울기는 모델의 가중치(weight)를 업데이트하는 데 사용됩니다. 즉, 기울기가 큰 방향으로 가중치를 업데이트하여 손실 함수 값을 줄이는 최적의 가중치를 찾아내는 것입니다.

 

 

미분 사용예시: 손실 함수(loss function)의 기울기(gradient) 계산

가장 기본적인 예시로, 선형 회귀(linear regression) 모델의 손실 함수인 평균 제곱 오차(Mean Squared Error, MSE)를 사용해보겠습니다. 선형 회귀 모델의 목표는 입력 데이터 x와 실제 출력 데이터 y 사이의 선형 관계를 찾는 것입니다.

MSE 손실 함수는 다음과 같이 정의됩니다.
MSE = (1/n) * Σ(y - y_hat)^2

여기서 n은 입력 데이터의 개수, y는 실제 출력 데이터, y_hat은 모델의 예측값입니다. 이제 이 함수의 기울기(gradient)를 구해보겠습니다. MSE 손실 함수의 기울기는 다음과 같이 계산됩니다.

d(MSE)/d(w) = (2/n) * Σ(y_hat - y) * x

여기서 w는 모델의 가중치(weight)를 나타냅니다. 이 식에서 Σ(y_hat - y) * x는 입력 데이터와 예측값 사이의 오차를 나타내는 것입니다. 즉, 이 식은 오차와 입력 데이터 x의 곱의 평균을 구하는 것입니다. 이를 통해 오차의 크기와 방향을 알아내어 가중치를 업데이트할 수 있습니다. 이처럼 미분을 사용해 손실 함수의 기울기(gradient)를 계산하면, 모델의 가중치를 업데이트하고 최적의 가중치를 찾아내는 데에 사용할 수 있습니다.

 

 

모델 가중치(weight) 업데이트

 

모델의 가중치(weight)를 업데이트하는 과정은 손실 함수(loss function)의 기울기(gradient)를 이용합니다. 기울기는 가중치가 손실 함수를 최소화하는 방향으로 어떻게 움직여야 하는지를 나타내는 값입니다. 따라서, 기울기를 이용하여 가중치를 업데이트하는 방법은 다음과 같습니다.

  • 현재 가중치에서 손실 함수의 기울기를 계산합니다.
  • 기울기의 반대 방향으로 일정한 크기(학습률, learning rate)만큼 이동한 새로운 가중치를 계산합니다.
  • 새로운 가중치를 현재 가중치로 업데이트합니다.

 

이렇게 가중치를 업데이트하면 손실 함수의 값이 줄어들게 됩니다. 이 과정을 여러 번 반복하면서, 최적의 가중치를 찾아내는 것이 모델 학습의 목표입니다. 예를 들어, 평균 제곱 오차(MSE) 손실 함수를 사용하는 선형 회귀 모델의 경우, 다음과 같이 가중치를 업데이트할 수 있습니다.

w_new = w_old - learning_rate * d(MSE)/d(w)

여기서 w_old는 이전 가중치, w_new는 새로운 가중치, d(MSE)/d(w)는 손실 함수 MSE의 기울기입니다. 학습률(learning rate)은 일정한 크기로 가중치를 이동하는 정도를 결정하는 하이퍼파라미터입니다. 즉, 학습률이 너무 작으면 학습 속도가 느리고, 학습률이 너무 크면 수렴하지 않을 수 있습니다. 따라서 적절한 학습률을 설정하는 것이 중요합니다.

 

 

경사하강법(Gradient Descent)

 

딥러닝에서 대표적인 미분 사용 예시는 경사하강법(Gradient Descent)이 있습니다. 경사하강법은 초기값부터 시작하여 미분값이 0이 되는 지점을 찾을 때까지 함수의 기울기를 조금씩 변경하는 방법입니다. 시작 지점은 중요하지 않습니다. 이러한 방법을 사용하면 함수의 최대값 또는 최소값을 찾을 수 있습니다.

 

경사하강법 알고리즘은 시작점에서 손실함수의 경사를 계산합니다. 그림에서 경사는 곡선의 도함수(기울기)와 같으며, 가중치가 여러 개인 경우(다차원 함수) 기울기는 가중치에 대한 편미분 벡터입니다.

 

 

손실 함수 곡선을 따라 시작지점은 손실함수의 기울기가 적용된 값을 더해서 손실함수의 다음 지점으로 이동합니다. 이렇게 점차적으로 이동하면서 손실함수의 최소값, 즉 기울기가 0이 되는 지점까지 움직입니다. 아래 그림을 보시면 경사하강법 방식이 어떻게 손실함수의 최저점을 찾아가는지 확인하실 수 있습니다.

 

예시를 들어보겠습니다. y = x^2 * sin(x) 라는 함수에서 손실함수가 최저점이 되는 구간을 구현해 보시죠.

 

y = x^2 * sin(x)

 

 

아래는 파이썬 코드입니다. graient descent알고리즘을 활용하여 최저점을 찾으니 x는 5 y는 -24 부근이 손실함수가 최저점이 되는 지점이라 할 수 있겠습니다. 

 

움직이는 영상으로 결과를 찾아가는 과정을 확인하실 수 있습니다. 참고하여 주시기 바랍니다.

경사하강법(Gradient Descent) 예시

그림출처

 

반면, 함수의 극값이 여러 개 있을 경우, 미분값이 0인 지점들 중에서 최대값이나 최소값이 되는 지점을 찾는 과정이 필요합니다. 이를 위해 미분값이 0인 지점에서의 2차 미분값(볼록함수인지 오목함수인지 판단하는 값)을 계산하고, 이 값이 양수인 경우 최소값이고, 음수인 경우 최대값입니다. 이러한 과정을 통해 함수의 극값을 찾을 수 있습니다.