머신러닝(기계학습)

GBM(Gradient Boost Machine)이란? +학습이 되는 원리 자세히 설명

Suhd 2022. 10. 10. 10:52

 

GBM을 알아보자

<이해하기 위한 기본 개념 CART에 대하여..>

2022.10.10 - [머신러닝(기계학습)] - Decision Tree(의사결정나무)

 

 

<간단한 예를 들어 설명>

맨 처음 녹색의 점 샘플들에 적절한 회귀를 하고 싶다면,

 

1. 실제값 y에 대해 OLS(Ordinary Least Squre)값을 줄이는 node 분기를 가지는 Tree를 만든다.

(위의 그림에서 tree 1에 해당한다.)

< OLS를 구하는 방법 >

-> leaf node에 존재하는 샘플들의 평균값은 그 leaf node속에 있는 샘플들의 예측값이 된다.

(같은 leaf node에 들어있는 샘플들은 같은 예측값을 가지므로, 위에 예측값 그래프가 계단식을 띤다.)

 

-> 실제값 과 예측값의 차이로 만든 OLS는 Tree의 손실함수가 된다 (값이 작을수록 성능이 높은 Tree)

n개의 샘플들에 대해 실제값 y와 그 예측값 f(x)의 차이의 제곱이 손실함수가 된다.


2. 이때, GBM은 새로운 Tree를 만드는데 , 맨처음 실제값에 해당하는 샘플들에 대해서가 아니라

실제값과 예측값의 차이(잔차 : residual)를 y값으로 갖는 샘플들에 대해서 새로운 Tree를 만드는 것이다.

(위의 그림에서 tree 2에 해당한다.)

 

=> 이 때문에 Tree1의 샘플들과 Tree2의 샘플들이 서로 다른값을 가지는 것이다.

Tree2의 샘플들은 (Tree1의 샘플들의 값 - 예측값)을 실제값 y로 가지는 샘플들이다.


 

3. 우리가 원하는 횟수만큼(적절하게) 2.를 반복해서 새로운 Tree들을 만들어 낸다.

(주의해야 할 점은 새로운 Tree를 만들기 위해 사용되는 샘플은,

이전 Tree에서 사용된 샘플에서 각 샘플에 해당하는 예측값이 차감된 값으로 이루어진 샘플이다. )

=> 실제값과 예측값의 차이 : 잔차에 해당한다.

+ 이해해야 할 점은 (Tree 를 만들어 낸다는 것 => 새로운 node들을 얻는다는 것 )


4. 최종적으로 모든 Tree들의 node들을 모두 모아서 하나의 Tree를 만든다.

=> 성능이 좋다. => 원래 맨처음의 샘플들(녹색점)을 잘 분류한다.


성능이 좋아지는 이유에 대해서 직관적인 설명을 해보겠다.

만약 맨 처음 샘플들의 데이터인 y1이라는 실제값에 대해

OLS를 줄이는 적절한 node 분기(x=a)를 통해 생긴 leaf node들의 평균인 예측값들과의

차이(잔차)를 구한다.

=> 이 차이의 값을 실제값 y2으로 가지는 샘플들에 대해서 Tree를 만들 것이다.(=분기를 위한 node 생성)

이때, 새로운 Tree의 node는 어디에 생기게 될 것인지에 대해 생각해보자

=> 만약 잔차가 큰 샘플들에 대해서는 실제값 y2가 y2=0으로부터 멀리 떨어질 것이고(양이든 음이든),

잔차가 작은 샘플들에 대해서는 실제값 y2가 y2=0과 비슷한 값들을 가질 것이다.

=> 예측값과 실제값을 줄이기 위해서는

1. 잔차가 큰 샘플들과 잔차가 작은 샘플들 사이에 node를 위치하거나,

2. 잔차가 양의방향으로 크거나, 음의방향으로 큰 샘플들의 사이에 node를 위치하거나

해야한다.

 

<시각화>

이 노드들(x=b,x=c)이 원래의 샘플을 분류하기 위한 node로써 사용된다면,

다음과 같이 실제값과 예측값의 차이를 잘 줄이는 예측값을 만들어 내는 node가 되어서 분류를 잘 하는 것을 보여준다.

=> 즉, 잔차가 큰 부분은 적절히 분류되지 않은 부분이라고 생각할 수 있고,

잔차에 대해서 Tree를 만듬으로써 얻은 node들은 잔차가 큰 부분 주위에 위치하게 되며

=> 이는 적절하게 분류되지 않은 부분 주변에 새로운 node가 생겨서 분류 성능이 향상된다는 것을 알 수 있다.

=> 만약 Tree를 많이 만들어 낼수록, node가 위와 같은 규칙에 의해 만들어 질 것이고,

분류 성능이 향상된다.

=> 물론, 너무 많으면 과적합이 일어나게 된다.


<Gradient라는 이름이 붙은 이유?>

마지막으로 Gradient 라는 이름이 붙은 이유는,

잔차에 해당하는 값을 우리는 계속해서 예측하고, 줄여나가서, Optimal한 분류를 위한 node들을 찾을 것인데

n개의 샘플들에 대해 실제값 y와 그 예측값 f(x)의 차이의 제곱이 손실함수가 된다.

출처 :  https://github.com/pilsung-kang/Business-Analytics-IME654-/blob/master/04%20Ensemble%20Learning/04-6_Ensemble%20Learning_Gradient%20Boosting%20Machine.pdf
 

이 잔차라는 것이 알고보니 손실함수에 대한 예측값의 역방향(negative) gradient였던 것이다.

1. 이 gradient(=잔차)는 학습함에 따라 점점 줄어나가고,

2. 0에 가까운 값(GD에서도 최솟값(optimal 값)에 다가갈수록 gradient가 0에 가까워진다)에 점점 다가갈수록

학습이 완성된다는 점에서 gradient라는 이름이 붙었다.