Artificial Intelligence Theory : 앙상블 학습(Ensemble Learning)
앙상블 학습(Ensemble Learning)
중요한 결정을 내릴 때 한 사람의 의견보다 여러 사람의 의견을 모으는 편이 더 믿을 만한 경우가 많습니다. 각자 실수를 하더라도 그 실수가 서로 다르다면, 의견을 모으는 과정에서 개인의 실수가 상쇄되기 때문입니다. 병원에서 어려운 진단을 여러 전문의가 함께 검토하는 것도 같은 이유입니다.
앙상블 학습(Ensemble Learning)은 이 원리를 기계 학습에 적용합니다. 하나의 모델을 최대한 잘 만드는 대신, 여러 모델을 학습시켜 그 예측을 결합합니다. 앙상블을 이루는 개별 모델을 기본 학습기(Base Learner)라 하며, 각각은 평범한 성능이라도 잘 결합하면 어느 하나보다 뛰어난 결과를 낼 수 있습니다.
앙상블은 실무에서 매우 강력한 방법입니다. 표 형태로 정리된 데이터를 다루는 기계 학습 대회에서는 오랫동안 앙상블 기반 모델이 상위권을 차지해 왔고, 금융의 신용 평가, 광고의 클릭 예측, 수요 예측처럼 정형 데이터를 다루는 실제 서비스에서도 널리 쓰입니다. 이 강좌에서는 앙상블이 왜 동작하는지부터 시작해, 대표적인 세 가지 방식인 배깅, 부스팅, 스태킹을 차례로 다룹니다.
앙상블이 동작하는 이유
앙상블의 효과를 간단한 계산으로 확인해 보겠습니다. 이진 분류에서 정확도가 70%인 분류기 세 개가 있고, 세 분류기의 실수가 서로 독립적이라고 가정합니다. 세 분류기의 다수결로 답을 정하면, 두 개 이상이 맞힐 때 앙상블이 맞힙니다.
\[P(\text{정답}) = 0.7^{3} + 3 \times 0.7^{2} \times 0.3 = 0.343 + 0.441 = 0.784\]첫 항은 세 분류기가 모두 맞힐 확률이고, 둘째 항은 정확히 두 개가 맞힐 확률입니다. 정확도 70%의 분류기 셋을 모았을 뿐인데 앙상블의 정확도는 78.4%로 올랐습니다. 분류기를 늘리면 효과가 더 커져, 다섯 개면 약 83.7%, 열한 개면 약 92.2%, 스물다섯 개면 약 98.3%가 됩니다.
위 그래프는 서로 독립적인 분류기의 수에 따른 다수결 정확도입니다. 개별 정확도가 60%로 낮더라도 분류기가 늘어날수록 정확도가 꾸준히 오릅니다. 그러나 개별 정확도가 45%로 무작위 추측보다 나쁘다면, 분류기를 늘릴수록 오히려 정확도가 떨어집니다. 앙상블은 틀리는 경향을 증폭하기도 하므로, 기본 학습기는 적어도 무작위 추측보다는 나아야 합니다.
이 계산에는 중요한 전제가 하나 있습니다. 분류기들의 실수가 서로 독립적이어야 한다는 것입니다. 세 분류기가 같은 데이터에서 같은 실수를 한다면, 다수결을 해도 같은 답이 나올 뿐 정확도는 오르지 않습니다. 앙상블의 핵심은 결국 서로 다른 실수를 하는 모델들을 만드는 것이며, 이를 다양성(Diversity)이라 합니다. 앞으로 다룰 방법들은 모두 이 다양성을 만드는 서로 다른 전략입니다.
과대적합과 정칙화에서 다룬 편향(Bias)과 분산(Variance)으로도 설명할 수 있습니다. 데이터가 조금만 바뀌어도 예측이 크게 흔들리는 분산이 큰 모델들을 평균하면, 흔들림이 서로 상쇄되어 분산이 줄어듭니다. 반대로 단순해서 체계적으로 틀리는 편향이 큰 모델들은, 앞 모델의 실수를 다음 모델이 보완하도록 차례로 쌓아 편향을 줄일 수 있습니다. 앞의 방식이 배깅이고, 뒤의 방식이 부스팅입니다.
투표(Voting)
여러 모델의 예측을 결합하는 가장 단순한 방법은 투표(Voting)입니다. 서로 다른 알고리즘으로 학습한 모델들, 예를 들어 로지스틱 회귀, 서포트 벡터 머신, 신경망의 예측을 모아 최종 답을 정합니다.
하드 투표(Hard Voting): 각 모델이 고른 범주로 다수결을 합니다. 세 모델이 각각 A, A, B를 골랐다면 최종 답은 A입니다.소프트 투표(Soft Voting): 각 모델이 출력한 범주별 확률을 평균한 뒤, 평균 확률이 가장 높은 범주를 고릅니다.
소프트 투표는 모델이 얼마나 확신하는지까지 반영합니다. 세 모델이 A에 각각 0.51, 0.51, 0.10의 확률을 주었다면, 하드 투표는 두 모델이 A를 골랐으므로 A를 선택합니다. 그러나 A의 평균 확률은 약 0.373이고 B의 평균 확률은 약 0.627이므로, 소프트 투표는 B를 선택합니다. 앞의 두 모델은 거의 반반으로 망설였고, 세 번째 모델은 B를 강하게 확신했기 때문입니다. 모델들의 확률이 잘 보정되어 있다면 소프트 투표가 대체로 더 좋은 결과를 냅니다.
회귀 문제에서는 투표 대신 각 모델의 예측값을 평균하거나, 성능이 좋은 모델에 더 큰 가중치를 주는 가중 평균을 사용합니다.
배깅(Bagging)
투표는 서로 다른 알고리즘으로 다양성을 만들었습니다. 배깅(Bagging)은 같은 알고리즘을 서로 다른 데이터로 학습시켜 다양성을 만듭니다. 1996년 브라이먼(Leo Breiman)이 제안한 방법으로, 이름은 부트스트랩 집계(Bootstrap Aggregating)의 줄임말입니다.
부트스트랩(Bootstrap)은 원래 데이터에서 같은 크기만큼 중복을 허용하여 무작위로 뽑는 방법입니다. 데이터가 1,000개라면 한 번 뽑을 때마다 다시 넣고 1,000번을 뽑습니다. 어떤 데이터는 여러 번 뽑히고, 어떤 데이터는 한 번도 뽑히지 않습니다. 이렇게 만든 부트스트랩 표본 여러 개로 모델을 하나씩 학습시키면, 각 모델은 조금씩 다른 데이터를 보았으므로 서로 다른 실수를 하게 됩니다. 예측할 때는 모든 모델의 결과를 투표하거나 평균합니다.
데이터가 \(n\)개일 때 특정 데이터 하나가 한 번의 추출에서 뽑히지 않을 확률은 \(1 - 1/n\)이므로, \(n\)번의 추출에서 끝까지 뽑히지 않을 확률은 \((1 - 1/n)^{n}\)입니다. 데이터가 100개면 약 0.366, 1,000개면 약 0.368이며, \(n\)이 커질수록 \(1/e \approx 0.368\)에 가까워집니다. 즉, 각 부트스트랩 표본에는 원래 데이터의 약 63%만 포함되고 약 37%는 빠집니다.
빠진 37%의 데이터를 OOB(Out-of-Bag) 데이터라 합니다. 각 모델 입장에서 OOB 데이터는 학습에 사용하지 않은 데이터이므로, 별도의 검증 데이터를 떼어 두지 않아도 이것으로 성능을 평가할 수 있습니다. 데이터가 적어서 검증용으로 나누기 아까울 때 유용한 성질입니다.
배깅은 분산이 큰 모델에 특히 효과적입니다. 학습 데이터가 조금만 바뀌어도 결과가 크게 달라지는 모델일수록, 부트스트랩 표본마다 서로 다른 모델이 만들어지고 평균의 효과가 커지기 때문입니다. 반대로 선형 회귀처럼 안정적인 모델은 부트스트랩 표본이 달라도 거의 같은 모델이 만들어지므로 배깅의 효과가 작습니다.
결정 트리와 랜덤 포레스트
배깅과 가장 잘 어울리는 기본 학습기는 결정 트리(Decision Tree)입니다. 결정 트리는 “나이가 30 이상인가?”, “소득이 5천만 원 이상인가?”처럼 특성 하나에 대한 질문을 반복해 데이터를 나누고, 마지막에 도달한 구역의 다수 범주나 평균값으로 예측하는 모델입니다. 질문을 고를 때는 나눈 뒤의 각 구역이 최대한 한 범주로만 이루어지도록 하는 질문을 고릅니다.
결정 트리는 사람이 읽고 이해하기 쉽고, 특성의 크기를 정규화할 필요가 없으며, 숫자와 범주형 특성을 함께 다룰 수 있다는 장점이 있습니다. 그러나 질문을 계속 늘리면 학습 데이터 하나하나를 완벽히 나눌 때까지 깊어지므로 과대적합되기 쉽고, 데이터가 조금만 바뀌어도 맨 위의 질문이 달라져 트리 전체의 모양이 바뀝니다. 즉, 분산이 매우 큰 모델입니다. 이 단점이 바로 배깅이 해결하는 문제입니다.
2001년 브라이먼이 제안한 랜덤 포레스트(Random Forest)는 결정 트리에 배깅을 적용하면서, 다양성을 한 단계 더 높였습니다. 트리의 각 마디에서 질문을 고를 때 모든 특성이 아니라 무작위로 고른 일부 특성 중에서만 고르게 한 것입니다. 분류 문제에서는 전체 특성 수가 \(d\)일 때 보통 \(\sqrt{d}\)개 정도를 고릅니다.
이 제약이 필요한 이유는 다음과 같습니다. 데이터에 매우 강력한 특성이 하나 있다면, 부트스트랩 표본이 달라도 모든 트리가 맨 위에서 그 특성으로 질문을 시작하게 됩니다. 그러면 트리들이 서로 비슷해지고 실수도 비슷해집니다. 특성을 무작위로 제한하면 어떤 트리는 그 특성 없이 다른 특성으로 시작해야 하므로, 트리들이 서로 다른 방식으로 데이터를 나누게 됩니다. 개별 트리의 성능은 조금 떨어지지만, 트리 사이의 상관관계가 줄어들어 앙상블 전체의 성능은 높아집니다.
랜덤 포레스트는 설정할 하이퍼파라미터가 적고, 기본값으로도 대체로 좋은 성능을 내며, 트리들을 서로 독립적으로 학습하므로 병렬 처리도 쉽습니다. 이러한 실용성 덕분에 정형 데이터에서 가장 먼저 시도해 보는 기준 모델로 널리 쓰입니다.
- Tip : 랜덤 포레스트는 각 특성이 트리의 분할에 얼마나 기여했는지를 집계해
특성 중요도(Feature Importance)를 제공합니다. 어떤 특성이 예측에 중요한지 파악하는 데 유용하지만, 서로 상관관계가 높은 특성들은 중요도를 나눠 가지므로 각각의 중요도가 실제보다 낮게 나올 수 있다는 점에 주의해야 합니다.
부스팅(Boosting)
배깅이 여러 모델을 동시에, 독립적으로 학습한다면, 부스팅(Boosting)은 모델을 하나씩 차례로 학습하면서 각 모델이 앞 모델들의 실수를 보완하도록 만듭니다. 기본 학습기로는 보통 깊이가 얕은 결정 트리처럼 단순한 모델을 사용합니다. 하나하나는 무작위 추측보다 조금 나은 약한 학습기(Weak Learner)이지만, 차례로 쌓아 올리면 강력한 모델이 됩니다.
AdaBoost
1990년대 중반 프로인트(Yoav Freund)와 샤피르(Robert Schapire)가 제안한 AdaBoost(Adaptive Boosting)는 데이터마다 가중치를 둡니다. 처음에는 모든 데이터가 같은 가중치를 갖고, 첫 번째 모델을 학습한 뒤 그 모델이 틀린 데이터의 가중치를 높이고 맞힌 데이터의 가중치를 낮춥니다. 다음 모델은 가중치가 높은 데이터를 더 중요하게 다루며 학습하므로, 자연스럽게 앞 모델이 어려워한 데이터에 집중하게 됩니다.
최종 예측은 모든 모델의 가중 투표로 정하며, 정확한 모델일수록 더 큰 발언권을 갖습니다. 어려운 문제를 여러 사람이 차례로 풀되, 앞사람이 틀린 문제를 다음 사람이 집중해서 다시 보는 방식과 비슷합니다.
그래디언트 부스팅(Gradient Boosting)
2001년 프리드먼(Jerome Friedman)이 체계화한 그래디언트 부스팅(Gradient Boosting)은 실수를 보완하는 방식이 더 직접적입니다. 데이터의 가중치를 바꾸는 대신, 다음 모델이 앞 모델들의 예측이 정답에서 얼마나 벗어났는지, 즉 잔차(Residual)를 직접 예측하도록 학습합니다.
간단한 회귀 예로 따라가 보겠습니다. 정답이 \([3, 5, 7]\)인 데이터 세 개가 있고, 처음 예측은 정답의 평균인 \([5, 5, 5]\)로 시작합니다.
- 잔차는 \([3-5, 5-5, 7-5] = [-2, 0, 2]\)입니다. 첫 번째 트리가 이 잔차를 학습합니다.
- 트리의 예측을 그대로 더하지 않고
학습률(Learning Rate)0.5를 곱해 더합니다. 트리가 잔차를 정확히 맞혔다면 예측은 \([4, 5, 6]\)이 됩니다. - 새 잔차는 \([-1, 0, 1]\)입니다. 두 번째 트리가 이를 학습해 더하면 예측은 \([3.5, 5, 6.5]\)가 됩니다.
- 세 번째 트리까지 더하면 잔차는 \([-0.5, 0, 0.5]\), 예측은 \([3.25, 5, 6.75]\)로 정답에 계속 가까워집니다.
이 방식의 이름에 “그래디언트”가 붙은 이유는, 평균 제곱 오차 손실에서 잔차가 곧 손실 함수의 음의 기울기이기 때문입니다. 잔차를 예측하는 트리를 더하는 것은 최적화 알고리즘에서 다룬 경사 하강법을 가중치 공간이 아니라 예측값 공간에서 한 걸음씩 수행하는 것과 같습니다. 이 관점 덕분에 평균 제곱 오차뿐 아니라 손실 함수에서 다룬 교차 엔트로피나 후버 손실처럼 미분 가능한 어떤 손실 함수에도 같은 방법을 적용할 수 있습니다.
학습률을 1보다 작게 두는 이유도 경사 하강법과 같습니다. 각 트리의 예측을 그대로 다 더하면 학습 데이터의 잡음까지 빠르게 맞춰 과대적합되므로, 작은 보폭으로 많은 트리를 쌓는 편이 일반화 성능이 좋습니다. 대신 학습률이 작을수록 더 많은 트리가 필요하므로, 학습률과 트리 수는 함께 조정합니다.
현대적인 구현
그래디언트 부스팅은 구현 방식에 따라 속도와 성능이 크게 달라지며, 실무에서는 최적화된 라이브러리를 주로 사용합니다.
XGBoost: 2016년 첸톈치(Tianqi Chen)가 발표했습니다. 손실 함수의 2차 미분까지 활용하고, 트리의 복잡도에 대한 정칙화 항을 손실에 포함했으며, 병렬 처리와 결측값 처리를 효율적으로 구현했습니다. 정형 데이터 대회에서 널리 쓰이며 그래디언트 부스팅을 대중화했습니다.LightGBM: 2017년 마이크로소프트에서 발표했습니다. 특성 값을 구간으로 나눈 히스토그램으로 분할 지점을 빠르게 찾고, 트리를 층 단위가 아니라 손실을 가장 많이 줄이는 잎부터 키워, 대용량 데이터에서 매우 빠릅니다.CatBoost: 2017년 얀덱스(Yandex)에서 발표했습니다. 도시 이름이나 상품 분류처럼 범주가 많은 특성을 별도의 전처리 없이 효과적으로 다루는 데 강점이 있습니다.
부스팅은 앞 모델의 실수를 계속 보완하므로 편향을 크게 줄일 수 있지만, 같은 이유로 잡음이나 잘못된 레이블까지 열심히 맞추려 해 과대적합되기 쉽습니다. 그래서 학습률, 트리의 깊이, 트리 수를 조절하고, 검증 데이터의 성능이 더 이상 오르지 않으면 조기 종료로 트리 추가를 멈추는 방식을 함께 사용합니다. 트리를 차례로 학습해야 하므로 배깅보다 병렬 처리가 어렵다는 점도 차이입니다.
스태킹(Stacking)
스태킹(Stacking)은 여러 모델의 예측을 또 하나의 모델로 결합하는 방법입니다. 투표나 평균처럼 정해진 규칙으로 결합하는 대신, 어떻게 결합하는 것이 좋은지를 학습합니다.
먼저 서로 다른 여러 기본 모델을 학습시킵니다. 다음으로 각 기본 모델의 예측값을 새로운 특성으로 삼아, 최종 예측을 하는 메타 모델(Meta Model)을 학습합니다. 메타 모델은 “랜덤 포레스트는 이런 데이터에서 믿을 만하고, 신경망은 저런 데이터에서 믿을 만하다”는 식의 결합 규칙을 데이터에서 배웁니다. 메타 모델로는 과대적합을 피하기 위해 로지스틱 회귀처럼 단순한 모델을 주로 사용합니다.
스태킹에서 가장 주의해야 할 점은 데이터 누수입니다. 기본 모델이 학습한 데이터에 대해 예측을 만들면, 그 예측은 이미 정답을 본 상태라 실제보다 지나치게 정확합니다. 이것으로 메타 모델을 학습하면 메타 모델은 기본 모델을 과도하게 믿게 되고, 새 데이터에서는 성능이 떨어집니다. 그래서 교차 검증처럼 데이터를 여러 부분으로 나누어, 각 부분에 대한 예측은 그 부분을 학습에 사용하지 않은 모델로 만듭니다.
신경망의 앙상블
앙상블은 결정 트리만의 기법이 아닙니다. 같은 구조의 신경망을 서로 다른 초기 가중치로 여러 번 학습시키고 예측을 평균하는 것만으로도 성능이 꾸준히 오르며, 이를 딥 앙상블(Deep Ensemble)이라 합니다. 가중치 초기화와 미니배치 순서가 다르면 신경망은 서로 다른 해에 도달하므로, 같은 데이터로 학습해도 자연스럽게 다양성이 생깁니다.
딥 앙상블은 정확도뿐 아니라 예측의 불확실성을 추정하는 데도 유용합니다. 여러 모델이 같은 답을 비슷한 확률로 내면 믿을 만한 예측이고, 모델마다 답이 크게 다르면 모델이 잘 모르는 입력이라는 신호입니다. 의료 진단이나 자율 주행처럼 모델이 모를 때 그 사실을 아는 것이 중요한 분야에서 이 성질이 활용됩니다.
과대적합과 정칙화에서 다룬 드롭아웃(Dropout)도 앙상블의 관점에서 이해할 수 있습니다. 학습할 때마다 노드를 무작위로 꺼서 구조가 조금씩 다른 신경망을 학습하는 것이므로, 수많은 신경망의 앙상블을 하나의 모델 안에서 적은 비용으로 흉내 내는 셈입니다.
신경망 앙상블의 단점은 비용입니다. 모델을 다섯 개 쓰면 학습과 추론 비용이 다섯 배가 되므로, 큰 신경망에서는 부담이 큽니다. 그래서 여러 모델의 앙상블을 하나의 작은 모델로 옮기는 지식 증류를 함께 사용하기도 합니다.
앙상블 학습 정리
| 방식 | 다양성을 만드는 방법 | 학습 순서 | 주로 줄이는 것 | 대표 방법 |
|---|---|---|---|---|
| 투표 · 평균 | 서로 다른 알고리즘 | 독립적 | 분산 | 하드 투표, 소프트 투표 |
| 배깅 | 부트스트랩 표본 | 독립적, 병렬 가능 | 분산 | 랜덤 포레스트 |
| 부스팅 | 앞 모델의 실수에 집중 | 순차적 | 편향 | AdaBoost, XGBoost, LightGBM |
| 스태킹 | 서로 다른 알고리즘 + 메타 모델 | 기본 모델 학습 후 메타 모델 학습 | 결합 방식의 최적화 | 교차 검증 기반 스태킹 |
| 딥 앙상블 | 서로 다른 초기 가중치 | 독립적, 병렬 가능 | 분산, 불확실성 추정 | 신경망 여러 개의 평균 |
앙상블의 모든 방법은 서로 다른 실수를 하는 모델을 어떻게 만들 것인가라는 하나의 질문에 대한 서로 다른 답입니다. 배깅은 데이터를 다르게, 랜덤 포레스트는 특성까지 다르게, 부스팅은 앞 모델이 틀린 곳에 집중하게, 스태킹은 결합 방식까지 학습하게 하여 다양성을 만들고 활용합니다.
어떤 방법을 쓸지는 데이터와 상황에 따라 다릅니다. 정형 데이터라면 랜덤 포레스트로 빠르게 기준 성능을 확인한 뒤, 그래디언트 부스팅으로 성능을 끌어올리는 순서가 일반적입니다. 이미지나 텍스트처럼 비정형 데이터에서는 신경망이 주로 쓰이며, 여유가 있다면 딥 앙상블로 성능과 신뢰도를 함께 높일 수 있습니다. 앙상블은 성능을 높이는 대신 모델이 복잡해지고 예측 비용이 늘어나므로, 늘어난 성능이 그 비용을 정당화하는지 함께 판단해야 합니다.
- Writer by : 윤대희
댓글 남기기