Yet Never Lose Faith

- Good to Great , Jim Collins

How To Preprocess Image Data 자세히보기

Deep Learning/[Books] Do it! 정직하게 코딩하며 배우는 딥러닝 입문

[모델 구축] 경사하강법을 구현하는 방법 - ② 손실함수 미분하기

Kellyyyy 2020. 6. 29. 08:00

 

 

 

머신러닝 모델 구축 단계에서 가장 중요한 일은

정확한 예측값을 계산하는 좋은 규칙(가중치)을 찾는 것이다.

 

우리는 좋은 가중치를 찾기 위해서 여러가지 알고리즘을 사용할 수 있는데,

이번 포스팅에서는 경사하강법을 다룬다.

 

경사하강법의 정의는 아래와 같다.

 

델이 데이터를 잘 표현할 수 있도록 변화율을 사용하여 모델을 조금씩 조정하는 최적화 알고리즘

 

정의에서 보면 알 수 있듯이 경사하강법을 구현하기 위해서는 변화율을 구해야한다.그리고 변화율을 구하는 방법은 2가지가 있다.

 

1. 직접 변화율을 계산하는 방법

2. 손실함수를 미분하는 방법

 

1.직접 변화율을 계산하는 방법은 아래 더보기 포스팅에서 다뤘다.

 

이번 포스팅에서는 2. 손실함수를 미분하는 방법을 다룬다.

 


| 경사하강법과 손실함수의 관계

 

앞서 경사하강법의 정의를 다뤘다.

그런데 이를 좀 더 기술적으로 표현해보면 아래와 같다.

 

어떤 손실함수가 정의되었을 때 손실함수의 값이 최소가 되는 지점을 찾아가는 방법

 

손실함수(loss function)란 예상한 값과 실제 타깃값의 차이를 함수로 정의한 것을 말한다.

*손실함수는 비용함수(cost function) 또는 목적함수(objective function)으로도 불린다.

 

손실함수의 예시는 많다.

제곱오차 함수, 로지스틱 손실함수 그리고 크로스엔트로피 손실함수 등이 있다.

이 함수들에 대해서는 차차 하나씩 다뤄보도록 한다.

 

손실함수는 머신러닝 모델에 따라 적합한 함수가 정해져있다.

나는 선형회귀 모델을 사용할 것이기 때문에

이번 포스팅에서는 선형회귀 모델에 적합한 손실함수인 제곱오차 함수를 다룬다.


| 제곱오차 함수

 

제곱오차(Square Error, SE) 함수는 아래와 같이 정의한다.

 

 

 

이때 y는 실제 타깃값을 의미하고, y_hat은 예측값을 의미한다.

 

앞서 손실함수의 정의가 예측값과 실제 타깃값의 차이를 함수로 나타낸 것이라고 했으니

제곱오차 함수는 손실함수의 자격이 있어보인다.

 

그런데 왜 제곱을 하는 걸까?

제곱을 하는 이유는 차이가 음수이든 양수이든 상관없이 차이의 크기만 고려하고자하기 때문이다.

 

이렇게 하기 위해서는 절댓값과 같은 역할이 필요한데,

절댓값을 사용하면 함수가 복잡해지기 때문에 제곱을 취해서 부호를 없애준다.

 

자, 그럼 제곱오차 함수의 정의에 대해서는 이해했다.

 

이 함수를 어떻게 이용해서 가중치를 업데이트 할 수 있을까?

우선, 가중치 - 제곱오차 함수의 관계를 살펴보자.

 

y_hat = w * x + b이므로

SE는 아래와 같이 정리할 수 있다.

 

 

따라서 제곱오차와 w가 이차함수관계이기 때문에 아래와 같이 그릴 수 있다.

엄밀히 따지자면 2차항 계수가 음수기 때문에 뒤집어진 모양으로 그려야하지만

가중치 찾는 원리는 어떤 그래프든 동일하기 때문에 편의를 위해서 아래와 같이 그렸다.
(2차항의 계수는 양수이기 때문에 아래와 같이 그리는 게 맞음, 20210424 수정)

 

최적의 가중치를 찾는다는 것은 예측값과 실제값의 차이를 최소화하는 가중치를 찾는 것이고,

이는 손실함수의 값이 최솟값인 가중치를 찾는 것이다.

 

최적의 가중치 = 예측값과 실제값의 차이를 최소화하는 가중치 = 손실함수값을 최솟값으로 만드는 가중치

 

여기서 w가 제곱오차의 최솟값으로 이동하기 위해서는

그래프가 감소하고 있을 때는 w를 증가시키고, 그래프가 증가하는 방향이면 w를 감소시켜야한다.


 

이를 수학적으로 표현하면 아래와 같다.

 

접선의 기울기가 음수이면 w를 증가시키고, 접선의 기울기가 양수이면 w 를 감소시킨다.

 

또한 아래와 같이 식을 세울 수 있다.

 

w_new = w - 접선의 기울기

 

그렇다면 접선의 기울기를 어떻게 구하는가?

여기서 미분이 등장한다.

 

미분의 정의가 바로 한 점에서의 접선의 기울기이다.

따라서 다시 아래와 같이 정리할 수 있다.

 

w_new = w - 손실함수 미분값

 

이와 같은 원리로, 경사하강법을 구현할 때 미분값을 활용하는 것이다. 

그렇다면 이제 선형외귀 모델로 돌아오자.

선형회귀 모델에서 규칙이란 가중치와 절편을 의미한다.

 

그래서 우리는 가중치와 절편에 대해서 제곱오차 함수를 미분하고, 업데이트 식을 세워본다.


 

| 1. 가중치에 대해 제곱오차 미분

 

 

가중치에 대한 제곱오차의 미분한 결과를 구했다.

위에서 구한 식에 대입해보자.

 

 

그런데 여기서 2는 이동하는 정도에만 관여할 뿐 방향성에는 영향을 미치지 않는다.

따라서 2는 없애줘도 가중치를 찾아가는 과정에는 무방하다.

최대한 식을 간단하게 만들어주기 위해서 2는 없앤다.

 

 

 

 

 

 

이번 포스팅을 봤다면 눈치챘을 수 있는데 사실 직접 변화율을 계산하는 방법과 결과적으로 동일한 수식이 도출된다.

 

#이전 포스팅에서 다룬 w 업데이트 식
y_hat = x_i * w + b
err = y_i - y_hat
w_rate = x_i
w = w + w_rate * err

 

그럼 이제 절편에 대해서 제곱오차를 미분해보겠다.

 


 

| 2. 절편에 대해 제곱오차 미분

 

 

 

여기서도 마찬가지로 2를 없애고 업데이트 식에 대입한다.

 

 

 

 

이 식도 앞선 포스팅에서 다룬 코드와 정확히 일치한다.

 

# 이전 포스팅에서 다룬 절편 업데이트 식
err = y_i - y_hat
b = b + 1 * err

 


 자, 이렇게 두 포스팅에 걸쳐서 경사하강법 구현 즉, 변화율을 통해서 규칙을 업데이트 하는 방법을 알아보았다.

 

참고로 변화율은 인공지능 분야에서 특별히 그레디언트라고 부르고,

변화율을 통해서 규칙을 업데이트하는 과정을

'그레디언트가 전파된다' 혹은 '그레디언트가 소실된다'고 표현하기도 한다.