
2000차원의 어두운 방에서 검은 고양이 찾기: 머신러닝 알고리즘 토너먼트
요약
21개의 다양한 머신러닝 알고리즘을 대상으로 고차원 데이터 환경에서의 성능을 비교한 실험적 연구입니다. 기존의 정형 데이터 강자들과 더불어 Polyharmonic Cascade와 같은 새로운 아키텍처의 성능을 스트레스 테스트를 통해 검증합니다.
핵심 포인트
- 21개의 ML 알고리즘(Linear Regression, XGBoost, MLP 등) 성능 비교
- 기존 벤치마크를 넘어선 고차원 데이터 스트레스 테스트 수행
- Polyharmonic Cascade 아키텍처의 예상치 못한 강력한 성능 확인
- 정형 데이터 알고리즘의 한계점 탐색 및 재현 가능성 강조
제사(Epigraph):
"실험은 끝났다. 결과는 마치 내가 전통적인 정형 데이터 ML (tabular ML)을 지배하는 물리 법칙을 약간 어긴 것처럼 보인다."
"어쩌면 이것은 애초에 의도되지 않았던 경쟁이었을까?"
"이것을 재현(replicate)하기 위한 초대장으로 여겨라."
건초더미에서 바늘 찾기? 오, 당연하죠!
저의 작은 실험장에 오신 것을 환영합니다.
이 글에서 저는 어떻게 21개의 머신러닝 (machine learning) 알고리즘을 링 위에 올려 서로 싸우게 했는지 말씀드리려 합니다. 오래된 선형 회귀 (linear regression), k-NN, 그리고 랜덤 포레스트 (Random Forest)부터 정형 데이터의 삼위일체라 불리는 왕들 (XGBoost, LightGBM, CatBoost), 몇몇 다층 퍼셉트론 (multi-layer perceptrons), 그리고 어텐션 기반 신경망 (attention-based neural networks)까지 말이죠. 그리고 저는 그들 모두에게 언뜻 보기에는 완전히 터무니없어 보이는 문제(혹은 언뜻 보기에만 그런 것일까요?)를 풀도록 강요했습니다.
MNIST나 타이타닉 (Titanic) 같은 대부분의 머신러닝 벤치마크 (benchmarks)들은 이미 오래전에 밑바닥까지 다뤄졌습니다. 이미지에서는 컨볼루션 (Convolutions)이 승리하고, 정형 데이터에서는 그래디언트 부스팅 (gradient boosting)이 승리합니다. 예측 가능하고 지루하죠. 그래서 저는 특별한 스트레스 테스트를 설정하기로 했습니다. 정형 데이터 알고리즘들을 절대적인 한계점까지 밀어붙이는, 약간 다른 형식의 경쟁 말입니다.
그리고 네... 이 경주에는 여러분 대부분이 아마 들어본 적도 없을 신참도 등장할 것입니다. 화제가 되고 있지도 않고, Kaggle에 팬덤 군단이 있는 것도 아닙니다. 하지만 아주 멋진 이름을 가지고 있죠: 폴리하모닉 캐스케이드 (Polyharmonic Cascade)입니다. 이것은 무작위 함수 (random functions) 이론과 무관심 (indifference) 원리에서 파생된 딥 아키텍처 (deep architecture)입니다. 이 테스트에서 이것은 궁극의 언더독 (underdog) 역할을 했습니다. 하지만 이것이 헤비급들을 상대로 보여준 모습은 마치 대놓고 부정행위를 하는 것처럼 보였습니다. 이에 대해서는 나중에 더 자세히 다루겠습니다.
그렇다면, 이 작업이 정확히 무엇일까요?
첫 번째 아이디어를 개괄하며 시작하겠습니다.
보통 사람들이 머신러닝의 기초에 대해 이야기할 때, 가장 먼저 제시하는 예시는 대략 다음과 같습니다:

하지만 이것은 너무 단순합니다.
그들은 보통 조금 더 복잡한 것을 그립니다:

여전히 너무 단순합니다. 여기서는 기본적인 비선형(non-linear) 표면으로 클래스를 쉽게 분리할 수 있습니다. 예를 들어 다음과 같은 형태가 있습니다:

쌍곡 포물면(hyperbolic paraboloid)을 닮았습니다.
만약 처음부터 문제를 구성하여 이 표면, 즉 함수를 얻는 것을 목표로 설정한다면, 우리는 이제 회귀 작업(regression task)을 다루고 있는 것입니다.
함수가 비선형적일수록, 그리고 국소 최솟값(local minima)과 국소 최댓값(local maxima)이 많을수록 학습하기가 더 어렵습니다. 당연합니다.
이런 이미지로 정의된 함수는 어떨까요? 아름답지 않나요?

이 이미지를 가져와 회귀 작업으로 바꿉니다. 두 개의 입력 특징(input features), 즉 x 좌표와 y 좌표가 있습니다. 출력은 0부터 1까지의 정규화된 밝기입니다. 분류(classification)는 없고, 고양이와 개도 없습니다. 그저 평면 위의 한 점을 주고 그곳이 얼마나 밝은지 알려달라는 것입니다.
만약 이것을 3D 표면으로 바꾼다면, 다음과 같은 결과가 나옵니다:

이것은 이미 쌍곡 포물면 (hyperbolic paraboloid)보다 조금 더 복잡하죠? 머신러닝 (ML) 방법론들이 이것을 학습하도록 해봅시다!
하지만 여러분은 이것이 여전히 기본적인 보간 (interpolation)일 뿐이며 너무 쉽다고 말할 것이 분명합니다. 잠시만 기다려 주세요 — 이것은 단지 도입부에 불과했습니다.
512x512 픽셀 해상도는 262,144개의 예시로 구성된 데이터셋을 제공하며, 이를 훈련 세트 (training set)용 240,000개와 테스트 세트 (test set)용 22,144개로 나눌 수 있습니다. 물론 사전에 무작위로 셔플 (shuffle)할 것입니다. 테스트하기에 나쁘지 않은 설정입니다.
하지만 다시 한번 말씀드리겠습니다. 저와 마찬가지로 여러분도 이것을 보고 현대적인 방법론들에 비해 작업이 여전히 너무 단순해 보인다고 생각했을 것입니다! 그것은... 음, 비록 매우 복잡한 2차원 함수라 할지라도, 평범한 보간 (interpolation)처럼 들립니다.
함정은 무엇인가?
하지만 이 작업을 작은 악몽으로 바꾸지 않는다면 제가 아니겠죠. 저는 입력 공간의 차원 (dimensionality)을 인위적으로 부풀리는 작업을 스스로 맡았습니다. 단 두 개의 특징 (feature)인 x와 y 대신, 모델에 500개, 1000개, 그리고 최종적으로 2000개의 특징을 입력할 것입니다. 그중 오직 두 개만이 실제 좌표일 것입니다 (비록 알고리즘은 어떤 것인지 알 수 없겠지만요). 나머지 498개, 998개, 1998개의 특징은 노이즈 (noise)가 될 것입니다.

하지만 이것은 단순한 노이즈가 아닙니다. 각 노이즈 특징은 단순히 동일한 x와 y 값을 무작위로 섞은 버전입니다. 그 자체만으로는 유용한 신호 (signal)와 구별할 수 없습니다. 동일한 분포 (distribution), 동일한 진폭 (amplitude), 동일한 평균 (mean)을 갖기 때문입니다. 입력 데이터만 보고는 가짜 좌표와 실제 좌표를 구별하는 것이 불가능합니다.
이것은 전형적인 특징 선택 (feature selection) 문제이지만, 극단적인 상황으로 몰아넣은 것입니다. 알고 luận은 매우 복잡한 함수를 학습해야 할 뿐만 아니라, 수천 개의 변수 중 실제로 그 작업을 수행하는 데 필요한 정확한 두 개의 변수가 무엇인지도 찾아내야 합니다.
하지만 이것은 전형적인 현실 세계의 시나리오입니다. 금융 데이터, 유전체 서열 (genomic sequences), 수백 개의 센서에서 읽어들인 값들이 그러합니다. 어떤 측정값이 중요하고 어떤 것이 쓰레기인지 미리 알 수 있는 방법은 없습니다.
그리고 이제, 예상치 못한 반전이 기다립니다. 행렬 회전 (matrix rotation)입니다!
자, 자... 작업이 눈에 띄게 더 어려워지고 흥미로워졌습니다. 하지만 저는 여기에 무언가를 더 추가하고 싶었습니다! 더욱 아름답고 매혹적으로 만들 수 있는 작은 옵션 하나를 더 말이죠!
기본 버전에서, 두 개의 정보가 담긴 특징 (informative features)은 데이터 테이블의 단 두 개의 열 (columns)일 뿐입니다 (비록 우리가 그것이 무엇인지는 모르더라도 말이죠).
많은 알고리즘, 특히 트리 기반 (tree-based) 알고리즘들은 무차별 대입 (brute force)을 통해 유용한 특징을 찾는 데 탁월합니다: "만약 5번 특징으로 데이터를 분할한다면 어떨까? 117번 특징은 어떨까?". 이는 정보가 담긴 축이 좌표축과 일치할 때 작동합니다.
하지만 제가 이렇게 한다면 어떨까요: 이 전체 다차원 특징 공간 (정보가 있는 공간과 노이즈가 있는 공간 모두)을 가져와서 임의의 각도로 회전시키는 것입니다. 임의의 회전 행렬 (rotation matrix)을 곱하는 것이죠! 점들 사이의 거리를 바꾸지 않고, 기하학적 구조를 변경하지 않은 채로 말입니다. 그저 단순한 직교 변환 (orthogonal transformation)일 뿐입니다.
이러한 회전 이후에는, 단일 특징이 완전한 정보를 보유하지 못하게 됩니다. 유용한 신호는 2,000개의 모든 좌표에 걸쳐 얇은 층으로 흩어지게 됩니다. 이전에는 유용한 신호가 가상의 "바닥" (X축과 Y축을 따라)에 놓여 있었다면, 회전 후에는 이 "바닥"이 뒤집혀 2,000차원 공간의 기묘한 각도 어딘가에 떠 있게 됩니다.
인간에게나, 혹은 열을 하나씩 분석하는 알고리즘에게 이 작업은 절대 해결 불가능한 것이 되었습니다.
성공과 실패를 어떻게 측정할까요?
학습이 끝난 후, 각 알고리즘은 262,144개의 예시로 구성된 새로운 테스트 세트(test set)를 받게 됩니다. 하지만 한 가지 결정적인 세부 사항이 있습니다. 테스트 데이터의 노이즈 특징(noise features)은 완전히 새로운, 방금 생성된 무작위 숫자라는 점입니다 (마찬가지로 치환(permutation)을 사용하지만, 다른 방식을 사용합니다). 만약 알고리즘이 단순히 훈련 세트(training set)를 암기했다면, 테스트에서 즉시 실패할 것입니다.
결과는 기준 이미지에 대한 평균 제곱근 오차 (Root Mean Square Error, RMSE)라는 단 하나의 숫자로 측정됩니다. RMSE = 0은 완벽한 성능을 의미합니다. 우리가 곧 보게 되겠지만, RMSE ~0.2는 "포기하겠습니다, 여기 평균 밝기입니다"라고 말하는 것과 같습니다.
나아가, 학습된 모델의 최종 테스트 단계 동안, 우리는 이 테스트 세트를 이미지의 픽셀과 정확히 동일한 순차적 순서로 배열할 수 있습니다. 이런 방식을 통해 모델의 출력값을 쉽게 새로운 이미지로 변환할 수 있으며, 이를 원본과 시각적이고 직관적으로 비교할 수 있습니다. 또는 두 개의 3D 표면(3D surfaces)을 그래프로 그려 시각적으로 비교할 수도 있습니다.
예를 들어, 다음과 같은 식입니다:

자, 그럼 제가 현대적인 방법론들에게 도전장을 내밀었을 때 어떤 일이 벌어졌는지 살펴봅시다.
누가 출발선에 섰을까요?
자존심 있는 경쟁이라면 참가자 명단이 필요합니다. 하이퍼파라미터 (hyperparameter) 설정의 변형까지 포함하여 약 24개 정도의 참가자를 모았습니다.
참가자:
• 후보 1: Ridge Regression (릿지 회귀)
• 후보 2: k-NN (k-최근접 이웃)
• 후보 3: SVR (서포트 벡터 회귀)
• 후보 4: HistGradientBoostingRegressor (Claude의 설정)
• 후보 5: HistGradientBoostingRegressor (기본 설정)
• 후보 6: LightGBM (Claude의 설정)
• 후보 7: LightGBM (기본 설정)
• 후보 8: XGBoost (Claude의 설정)
• 후보 9: XGBoost (기본 설정)
• 후보 10: CatBoost (Claude의 설정)
• 후보 11: RandomForest (Claude의 설정)
• 후보 12: RandomForest (기본 설정)
• 후보 13: ExtraTrees (Claude의 설정)
• 후보 14: ExtraTrees (기본 설정)
• 후보 15: Neural Network 1 (bottleneck 구조, Claude가 작성한 코드)
• 후보 16: Neural Network 2 (두 가지 모드, Claude가 작성한 코드)
• 후보 17: Neural Network 3 (본인이 직접 구현)
• 후보 18: TabNet 변형 1 (Claude의 설정)
• 후보 19: TabNet 변형 2 (Claude의 설정)
• 후보 20: TabNet 변형 3 (기본 설정)
• 후보 21: Polyharmonic Cascade (본인이 직접 구현)
그리고 여기서, 저는 특정한 방법론적 결정에 대해 설명해야 합니다.
저는 과학자들이 어떻게 행동하는지 아주 잘 알고 있습니다. 누군가 나타나서 "내 알고리즘이 경쟁자들을 완전히 박살 냈다"라고 말한다면, 대개 첫 번째 반응은 "당신이 다른 알고리즘의 구현을 망쳐놓았거나, 당신의 특정 작업에서 실패하도록 하이퍼파라미터 (hyperparameter)를 조작한 것 아니냐"라는 것입니다. 그리고 이는 꽤 타당한 의심입니다.
그래서 제 평판을 지키기 위해, 저는 가능한 한 가장 냉소적인 방식으로 진행하기로 했습니다. 널리 알려진 방법론들의 코드를 제가 직접 작성하지 않았습니다.
저는 데이터 형식, 노이즈가 섞인 특성 (noisy features), 행렬 회전 (matrix rotation)을 이용한 비열한 속임수, 성공 기준 등 경연의 모든 본질을 상세히 설명하고 데이터 생성 코드를 제공했습니다. 그런 다음, 모든 것을 전적으로 Claude Opus 4.6에게 맡겼습니다.
저는 당시 최고 수준이었던 신경망 (neural network)에게 테스트를 작성하고, 적응형 하이퍼파라미터 (adaptive hyperparameters)를 설정하며, 기본적으로 부스팅 알고리즘 (boosting algorithms)과 신경망 (neural nets)이 이 작업에서 절대적인 최선의 결과를 보여줄 수 있도록 할 수 있는 모든 능력을 발휘해 달라고 요청했습니다.
AI 자동 생성 콘텐츠
본 콘텐츠는 Dev.to AI tag의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기