logo

그래디언트 부스팅이란? 📂머신러닝

그래디언트 부스팅이란?

정의

그래디언트 부스팅gradient boosting이란 의사결정나무부스팅을 적용해서 성능을 향상시키는 머신러닝 기법을 말한다. 의사결정나무의 예측에 의해 생긴 잔차를 새로운 종속변수로 두어 또 다른 의사결정나무를 학습시키고, 이를 반복해서 각 스테이지의 잔차에 대응하는 최종 모델을 결정한다.

설명

그래디언트 부스팅은 주로 회귀문제에서 많이 쓰이는 고전적 머신러닝 기법으로써, 해석가능성interpretability 보다는 예측 성능 자체가 중시되는 상황에서 더 빛을 발한다. 개인적으로는 고전적인 수단 중에서는 가장 딥러닝의 정신과 가까운 기법이라고 보는데, 원하는 함수의 근사를 위해서 어떻게든 비선형 활성화함수를 때려넣는 것처럼 구체적으로 어떻게 생겼는지는 알 바 아닌 의사결정나무의 조합으로 문제 해결에 도전하는 점이 닮았다. 실제로 공모전이나 대회같은 곳에서 좋은 성적을 많이 거둬왔고, 뛰어난 범용성을 수없이 증명해왔다.

인기가 좋다는 점은 또 다른 장점이 있는데, 원시적인 형태의 그래디언트 부스팅을 발전시키고 손쉽게 쓸 수 있도록 한 XGBoost, LightGBM, CatBoost 등의 라이브러리 혹은 알고리즘이 공개되어 있어 접근성이 높다는 것이다. 접근성이 높으니 더 많이 사용하게 되고, 더 많이 사용하게 되니 좋은 성적을 자주 거두는 선순환이 일어나 많은 사랑을 받았다.

왜 그래디언트인가

잔차를 종속변수로 둔다는 것 자체는 언뜻 보기에 편미분을 통해 기울기를 구하고 그 방향으로 값을 옮겨간다는 경사하강법과 전혀 상관 없어 보이지만, 형식적으로 어떻게 유사한 점이 있는지 살펴보도록 하겠다. 주어진 데이터셋 $\left\{ \left( x _{k} , y_{k} \right) \right\}_{k=1}^{n}$ 에 대해 $t$ 단계 모델 $f_{t}$ 의 $k$번째 잔차 $r_{t} \left( x_{k} \right)$ 는 다음과 같다. $$ r_{t} \left( x_{k} \right) = y_{k} - f_{t} \left( x_{k} \right) $$ 여기서 $t$ 단계의 $r_{t}$ 를 목표로 새로이 학습되는 의사결정나무 $h_{t}$ 는 노드의 분기에 따라 나눠지는 $i$ 번째 영역 $R_{i}$ 에 속하는 데이터셋의 잔차의 평균 $\bar{r}_{i}$ 로 예측을 하는, 지시함수선형결합으로 볼 수 있다. $$ h_{t} (x) = \sum_{i} \bar{r}_{i} \mathbf{1}_{R_{i}} (x) $$ 이러한 표기에 따르면 $f_{t}$ 는 다음과 같이 의사결정나무의 합이다. $$ f_{t} (x) = h_{1} (x) + h_{2} (x) + \cdots + h_{t} (x) $$ 여기서 만약 $h_{t}$ 가 $r_{t}$ 를 완벽하게 예측할 수 있다면, 다시 말해 우리의 목표대로 $f_{t+1} \left( x_{k} \right) = y_{k}$ 를 만족 시킬 수 있다면 $f_{t+1}$ 은 다음을 만족시킬 것이다. $$ f_{t+1} \left( x_{k} \right) = f_{t} \left( x_{k} \right) + h_{t} \left( x_{k} \right) = y_{k} $$

보통 회귀문제라면 손실함수 $L$ 은 MSE로 둘 수 있고, 이는 잔차제곱의 평균이다. $$ L = {\frac{ 1 }{ n }} \sum_{k=1}^{n} \left( y_{k} - f_{t} \left( x_{k} \right) \right)^2 $$ $f_{t} (x)$ 에서의 $L$ 의 그래디언트는 다음과 같다. $$ \begin{align*} & n \nabla L \\ =& {\frac{ \partial L }{ \partial f_{t} \left( x_{1} \right) }} + \cdots + {\frac{ \partial L }{ \partial f_{t} \left( x_{n} \right) }} \\ =& \sum_{k=1}^{n} -2 \left( y_{k} - f_{t} \left( x_{k} \right) \right) \\ =& -2 \sum_{k=1}^{n} h_{t} \left( x_{k} \right) \end{align*} $$ 여기서 주의해야할 점은 보통의 경사하강법에서처럼 $x$ 에서 미분하는 것이 아니라, $f_{t} (x)$ 에서 미분한다는 것이다. 이는 현재의 세팅이 파라메터 공간에서 한 점을 찾는 것이 아니라 모든 데이터 포인트에 대한 최적화를 원하기 때문에 당연한 건데, 많은 문서에서 이걸 수식적으로는 빠뜨리지 않지만 구체적인 설명을 생략해버려서 때문에 이해가 안 되는 경우가 있다. 결국 전체 데이터 셋에서 봤을 때는 다음과 같은 형태를 갖춘다. $$ \begin{align*} & \sum_{k} f_{t+1} \left( x_{k} \right) = \sum_{k} f_{t} \left( x_{k} \right) + \sum_{k} h_{t} \left( x_{k} \right) \\ \implies & \sum_{k} f_{t+1} \left( x_{k} \right) = \sum_{k} f_{t} \left( x_{k} \right) - {\frac{ n }{ 2 }} \nabla L \\ \implies & f_{t+1} (x) \approx f_{t} (x) - {\frac{ 1 }{ 2 }} \nabla L \end{align*} $$ 여기서 $\nabla L$ 이 $0$ 에 가까울수록 $f_{t+1} \approx f_{t}$ 일 것이고, 우리가 원하던 근사가 된다.

경사하강법: 손실함수 $L$ 의 극소값을 찾기 위해 다음과 같은 업데이트 규칙을 경사하강법이라 한다. $$\mathbf{w}_{t+1} \gets \mathbf{w}_{t} - \alpha \nabla L$$

마지막으로 $\mathbf{w}_{t} = f_{t} (x)$ 라고 두면 그래디언트 부스팅의 본질이 경사하강법과 같다는 것을 알 수 있다. 여기서 러닝 레이트 $\alpha$ 야 $f_{t+1} (x) = f_{t} (x) + \alpha h_{t} (x)$ 와 같이 의사결정나무의 가중치에 대응시키면 된다.

왜 부스팅인가

그래디언트 부스팅은 말해 순차적으로 잔차를 종속변수로 둔다는 점에서 기존의 모델이 파악하지 못한 약점을 보완한다고 볼 수 있다. 이는 굳이 가중치를 구한다거나 하는 별도의 과정이 없더라도 충분히 부스팅이라 부를 수 있다.

같이보기