
장미 꽃잎이 귀납법(Induction)에 대해 우리에게 가르쳐 주는 것
요약
귀납법(Induction)의 근본적인 한계와 '관찰에서 이해로 나아가는 체계적 방법의 부재'를 다룹니다. 다양한 알고리즘적 접근 방식과 트레이드오프를 통해 ARC-AGI, 월드 모델, 트랜스포머 아키텍처의 맥락을 이해하는 직관을 제공합니다.
핵심 포인트
- 귀납의 문제: 관찰을 통해 일반적인 원리를 도출하는 체계적 방법은 존재하지 않음
- 알고리즘적 접근의 한계: 머신러닝 알고리즘이 귀납적 추론을 어떻게 처리하는지 분석
- AI 연구의 핵심 연결: ARC-AGI, 월드 모델, 트랜스포머의 원리를 이해하는 기초 제공

장미 꽃잎이 귀납법 (Induction)에 대해 우리에게 가르쳐 주는 것
Richard Hamming은 Bell Labs의 동료들에게 다음과 같은 질문을 던지기로 유명했습니다: “당신의 분야에서 가장 중요한 문제는 무엇이며, 왜 당신은 그것을 연구하고 있지 않습니까?” 이에 대해 동료들은 아마 이렇게 대답했을 것입니다. “이봐요, Dick, 지금은 아침 8시 30분이라고요. 난 아직 커피도 못 마셨어요. 누가 대화를 그렇게 시작합니까?”
그럼에도 불구하고, 이는 좋은 질문입니다, 그렇지 않나요? 저에게 그 답은 명확합니다: “귀납법 (Induction)을 위한 일반적인 방법이 존재하는가?” 이제 여러분은 인류가 과학적 방법론 (Scientific method)과 통계학 (Statistics) 등을 통해 귀납법을 꽤 잘 다루고 있다고 생각할지도 모릅니다. 하지만 아닙니다. 우리 이해의 근간에는 간극이 존재하며, 우리는 오직 가끔씩, 그리고 무작위로만 그 간극을 건너뛸 수 있을 뿐입니다.
Hume은 이를 귀납의 문제 (Problem of induction)라고 불렀습니다. 더 기억하기 쉬운 이름으로는 No Free Lunch 정리 (No Free Lunch theorem)가 있지만, 이는 실제 '정리'와는 거리가 매우 멉니다. 그리고 그 내용은 단순합니다: 관찰 (Observation)에서 이해 (Understanding)로 나아가는 일반적이고 체계적인 방법은 존재하지 않는다는 것입니다.
만약 이 문제를 이전에 접해본 적이 없다면, 이것이 왜 큰 문제인지 이해하지 못할 수도 있습니다. 우리 모두가 생각조차 하지 않고 항상 이렇게 하고 있지 않나요? 우리는 실제로 그렇게 하고 있지만, 어떻게 그렇게 하는지는 모릅니다. 이는 우리가 그것을 어떻게 가르칠지, 어떻게 자동화할지, 혹은 우리가 제대로 하고 있는지조차 모른다는 것을 의미합니다.
필요한 것은 수학적 정교함 없이도 이 개념을 설명할 수 있는 단순하고 구체적인 예시입니다. 저는 바로 그러한 예시를 들어, 다양한 알고리즘적 접근 방식 (Algorithmic approaches)이 어떻게 작동하는지 보여주고, 문제의 핵심에 있는 피할 수 없는 트레이드오프 (Trade-off)를 설명해 보고자 합니다.
모든 것이 잘 풀린다면, 여러분은 세상에서 가장 근본적이고 미해결된 문제 중 하나에 대해 중요한 무언가를 배우게 될 뿐만 아니라, 예를 들어 François Chollet이 왜 ARC-AGI 벤치마크를 도입했는지, 왜 AI 연구자들이 월드 모델 (World Models)에 대해 계속 이야기하는지, 그리고 트랜스포머 (Transformer) 아키텍처가 언어 모델 (Language Models)에 있어 왜 최적의 지점 (Sweet spot)에 도달했다고 말하는지 이해하는 데 도움이 될 실질적인 직관을 기르게 될 것입니다.
게임
전통적으로 이 트릭을 알고 있는 친구가 당신을 '이런 걸 즐길 만한 사람'이라고 판단하여 전해주는 약간의 너드 민담 (Nerd folklore)으로 시작해 봅시다. 저는 이곳에서 그 경험을 최대한 비슷하게 재현했습니다. 반드시 문제를 풀어야 하는 것은 아니지만, 그 밑바탕에 깔린 교훈을 완전히 파악하고 싶다면 정직하게 노력해야 합니다.
다 하셨나요? 좋습니다! 어떤 방법을 사용하셨나요? 당신의 방법을 아이에게 가르칠 수 있나요? 당신의 방법을 구현하는 프로그램을 작성할 수 있나요? 아니라고요? 글쎄요, 저도 할 수 없습니다. 그것이 바로 이 글이 다루고자 하는 내용입니다. 하지만 어쨌든 기성 머신러닝 (Machine Learning) 알고리즘들을 사용하여 시도해 보고, 그것이 우리에게 무엇을 알려주는지 살펴봅시다.
스포일러 주의!
알고리즘적 접근 방식 (Algorithmic Approaches)
제가 수행한 작업은 다음과 같습니다. 서로 다른 머신러닝 (Machine Learning) 알고리즘들에게 점진적으로 증가하는 수의 예시를 보여주었습니다. 각 예시는 다섯 번의 주사위 눈금 수치와 해당 주사위 눈금에 대응하는 장미 꽃잎의 정확한 개수로 구성됩니다. 각 알고리즘은 자신만의 방식으로 해당 주사위 눈금을 꽃잎의 개수로 매핑하는 함수 (Function)를 학습합니다. 그 다음, 알고리즘의 성능은 이전에 본 적이 없고 학습에 사용되지 않은 다른 예시 세트를 통해 평가됩니다. 함수가 출력하는 숫자는 가장 가까운 정수로 반올림되며, 실제 꽃잎의 개수와 정확히 일치하는 경우에만 정답으로 표시됩니다. 만약 0.5라도 차이가 나면 오답으로 처리됩니다. 테스트 정확도 (Test Accuracy)는 알고리즘이 맞춘 주사위 눈금의 비율입니다. 특정 알고리즘이 100% 정확도에 도달하면, 해당 벤치마크 (Benchmark)를 포화 (Saturated)했다고 간주하고 중단합니다. 100% 정확도에 도달하는 데 필요한 최소 예시의 수는 점으로 표시되며 범례의 $N$으로 나타납니다.
(참고로, 아주 상세한 내용이 궁금하시다면 GitHub에서 전체 소스 코드와 요약 보고서를 확인하실 수 있습니다.)
잠시 후 각 접근 방식이 왜 잘 되었는지 혹은 좋지 않았는지 사례별로 살펴보겠지만, 우선 상위 수준의 결과부터 살펴보겠습니다:

한눈에 보더라도 그래프에서 도출할 수 있는 매우 흥미로운 결론들이 이미 존재합니다. 우선, 어떤 알고리즘들은 거의 즉시 문제를 해결하는 반면, 어떤 것들은 패턴을 파악하기 전까지 오랫동안 고전하고, 어떤 것들은 전혀 해결하지 못한다는 점이 명백합니다. 따라서 이 특정 문제에서 어떤 접근 방식이 다른 방식보다 더 낫거나 나쁘게 만드는 무언가가 존재한다는 것을 알 수 있습니다.
또한 근본적으로 다른 학습 알고리즘들 사이에서도 각 곡선이 동일한 특성적 형태를 따르는 것처럼 보인다는 점도 흥미롭습니다. 각 알고리즘은 무언가를 학습하기 시작하기 전까지 일정한 최소한의 예시 수를 필요로 하는 것처럼 보이지만, 일단 감을 잡으면 진행 속도가 빨라지며 빠르게 100%에 도달합니다. 아마도 이것은 여러분 자신의 경험을 반영하는 것일지도 모릅니다?
그렇다면 당연히 드는 질문은, 왜 서로 다른 알고리즘들이 장미 주변의 꽃잎을 "해결"하는 데 서로 다른 수의 예시를 필요로 하는가 하는 점입니다. 이것은 그저 무작위적인 일일까요? 불투명하고 알 수 없는 영역이라서 우리는 그저 무작위로 다양한 접근 방식을 시도해야만 하는 걸까요? 전혀 그렇지 않습니다.
귀납적 편향 (Inductive Bias)
핵심 개념은 귀납적 편향 (Inductive Bias)이라고 불립니다. 모델의 귀납적 편향 (Inductive Bias)은 대략적으로 말해, 모델의 사전 지식 (Priors)과 가정 (Assumptions)의 조합입니다. 즉, 모델이 선호하거나 잘 들어맞는 패턴의 종류, 그리고 가능한 모든 해결책이 갖추어야 한다고 요구하는 구조를 의미합니다.
데이터셋의 특정 구조와 일치하는 귀납적 편향 (Inductive Bias)을 가진 모델은 매우 빠르게, 때로는 단 몇 개의 예시만으로도 학습할 수 있습니다. 반면, 탐색해야 할 가설 공간 (Hypothesis Space)이 더 넓고 덜 구체적인 일반적인 모델들은 패턴을 파악하기 위해 훨씬 더 많은 예시를 필요로 합니다. 그리고 잘못된 귀납적 편향 (Inductive Bias)을 가졌거나 문제의 실제 구조와 정면으로 모순되는 가정을 하는 모델은 결코 아무것도 학습할 수 없을 것입니다.
이 알고리즘들이 왜 이 문제에 적합하거나 부적합한지를 정확히 이해하기 위해, 몇 가지 알고리즘의 구체적인 세부 사항을 살펴보겠습니다.
단순 선형 회귀 (Naïve Linear Regression)
기준점 (Baseline) 역할을 할 의도적으로 약한 선형 모델부터 시작하겠습니다.

이 접근 방식이 "단순 (Naïve)"한 이유는 단순히 주사위 하나당 하나의 수치적 특징 (Numeric Features)을 사용하여 총 5개의 특징만을 사용하기 때문입니다. 머신러닝 (ML) 애호가라면 이것이 어리석은 방법이라고 말할 것입니다. 하지만 잠시 후 우리는 이 형식을 갖춘 원시 데이터 (Raw Data)를 입력받았을 때도 잘 작동하는 여러 다른 모델들을 보게 될 것이므로, 왜 우리가 선형 모델에게만 정보를 떠먹여 주어야 할까요?
그래프를 보면 이 접근 방식이 1,000개의 예시를 보여준 후에도 아무런 진전이 없음을 알 수 있습니다. 하지만 실제로는 그보다 더 심각합니다. 이 알고리즘은 이 문제를 해결할 수 없습니다. 결코 해결할 수 없을 것입니다. 이 알고리즘의 귀납적 편향 (Inductive Bias)에는 실제 모델이 파라미터 (Parameters)에 대해 선형적이라는 가정이 포함되어 있는데, 이는 이 문제에서는 사실이 아니기 때문입니다.
결과적으로, 이 모델은 말 그대로 실제 해답을 표현할 능력이 없습니다. 저는 주로 귀납적 편향 (Inductive Bias)이 잘못되었을 때 어떤 일이 발생하는지에 대한 경고로서 이를 포함했습니다. 잘못된 가정을 하면, 단순히 파악하는 데 시간이 조금 더 걸리는 문제가 아니라, 아예 작동하지 않는 모델을 얻게 될 수도 있습니다.
범주형 특성 (Categorical Features)을 사용한 선형 회귀 (LR)
물론, 이는 아주 기본적인 특성 공학 (Feature Engineering)을 사용하여 쉽게 해결할 수 있습니다. 주사위 눈을 범주형 레벨 (Categorical Levels)로 원-핫 인코딩 (One-hot encoding)하면 모델에게 더 나은 "어휘 (Vocabulary)"를 제공하게 됩니다.

이제 모델은 각 면을 별개의 사례로 취급할 수 있으며, 해답을 찾아낼 수 있습니다. 하지만 여러분이 주목하시겠지만, 그렇다고 해서 특별히 빠르게 찾아내는 것은 아닙니다. 그 이유는 간단합니다. 모델이 각 주사위를 개별적으로 취급하며, 각 주사위에 대한 규칙을 독립적으로 "재학습 (Relearn)"해야 하기 때문입니다. 만약 꽃잎 규칙이 "다른 두 개는 무시하고 첫 번째, 중간, 마지막 주사위의 합을 구하라"와 같은 것이었다면 효과가 있었을 것입니다. 모델이 서로 다른 주사위에 대해 서로 다른 파라미터 (Parameters)를 학습할 수 있을 만큼 충분히 유연하기 때문입니다. 하지만 규칙이 작동하는 방식이 그렇지 않기 때문에, 이 접근 방식은 약간 더 느립니다.
빈 카운트 피벗 (Bincount Pivot)
사실 선형 회귀 (Linear Regression)가 문제를 매우 빠르게 해결할 수 있게 해주는 훨씬 더 나은 특성 표현 (Feature Representation)이 있습니다. 각 주사위를 하나의 특성으로 취급하는 대신, 특정 값을 나타내는 주사위의 개수를 나타내는 6개의 특성을 갖는 것은 어떨까요?
def bincount(X: npt.NDArray[np.int_]) -> npt.NDArray[np.int_]:
return np.array([np.bincount(row, minlength=7)[1:7] for row in X])
이러한 특성 인코딩 (Feature Encoding)은 회귀 부분을 사소하게 만들며, 당연하게도 $N=6$만으로 문제를 해결합니다.
하지만, 이는 모델이 무언가를 학습하고 있다는 느낌을 주지 않습니다. 우리는 기본적으로 모델을 대신해 문제를 풀어준 셈입니다. 일단 이러한 표현 방식을 시도하겠다는 아이디어가 떠오르면, 패턴이 너무나 명확하기 때문에 회귀를 사용할 필요조차 없습니다.

그렇다면, 이 특정 문제를 해결하기 위해 하드코딩된 것처럼 느껴지지 않는 더 일반적인 모델들을 살펴보겠습니다.
완전 연결 신경망 (Fully Connected Neural Net)
신경망 (Neural networks)은 종종 피처 엔지니어링 (feature engineering)을 피하기 위한 방법으로 홍보되곤 합니다. 때로는 그것이 사실일 수도 있습니다. 하지만 때로는 그저 매우 유연한 모델에게 피처 엔지니어링을 당신 대신 수행하도록 요청하는 것을 의미할 뿐이며, 그 과정은 느리고, 신뢰할 수 없으며, 막대한 비용이 듭니다. 이번 사례가 분명히 그러합니다. 우리가 사용한 거대한 완전 연결 신경망 (fully connected neural net)은 매우 강력하고 매우 일반적인 모델이며, 범주형 인코딩 (categorical encoding) 없이도 원시 피처 (raw features)로부터 작동할 수 있습니다. 하지만 이를 해결하는 데에는 천 개 이상의 예시가 필요합니다.

이것은 하이퍼파라미터 최적화 (hyperparameter optimization)를 거친 이후의 결과라는 점에 주목하십시오. 저는 Optuna가 수백 가지의 설정(활성화 함수 (activation functions), 레이어 크기 (layer sizes), 학습률 (learning rates))을 시도하도록 했으며, 수백만 개의 가능한 FCNN 모델 중에서 이것이 가장 좋은 모델이었습니다. 잠시 이 결과를 두고, 내려진 결정들이 무엇인지, 그리고 왜 그것들이 작동하는지 진지하게 생각해 봅시다.
우선, 이 문제에는 시그모이드 (sigmoid) 활성화 함수가 가장 잘 작동합니다. 이는 흥미로운데, 시그모이드는 ReLU나 SwiGLU와 같은 "힌지 (hinge)" 스타일의 활성화 함수가 보통 더 잘 작동하는 현대적인 딥러닝 (deep learning) 네트워크에서는 최선의 선택이 아닌 경우가 많기 때문입니다. 하지만 시그모이드는 계단 함수 (step functions)를 구성하기 쉽게 만들어주므로, 이 문제에서는 승리했습니다.

하이퍼파라미터의 또 다른 정말 흥미로운 역할은 모델의 전반적인 "복잡도 (complexity)"를 조정하는 것입니다. 예를 들어, 두 번째 은닉층 (hidden layer)의 뉴런이 150개 근처일 때 강력한 전역 최솟값 (global minimum)이 존재합니다.

이제, 단순히 솔루션을 *표현 (represent)*하기 위해서 150개의 은닉 뉴런 같은 것이 반드시 필요한 것은 아닙니다. 하지만 업계의 경험에 따르면, 신경망이 솔루션을 *학습 (learn)*하기 위해서는 많은 "여분의" 은닉 뉴런이 필요하다는 것이 밝혀졌습니다. 왜냐하면 무작위 초기화 (random initialization)로 인해 오직 일부 하위 집합만이 "진정한" 함수를 학습할 준비가 되기 때문입니다. 그럼에도 불구하고, 뉴런을 너무 많이 주면 고차원의 미로 속에서 길을 잃게 되고, 너무 적게 주면 정말 좋은 솔루션을 찾기 전에 지역 최솟값 (local minimum)에 갇히게 됩니다.
제가 하이퍼파라미터 최적화 (hyperparameter optimization)를 언급하는 이유는 귀납적 편향 (inductive bias)이 단순히 당신이 선택한 알고리즘 계열의 함수만이 아니라는 점을 강조하기 위해서입니다. 대부분의 알고리즘은 특정 데이터셋에 딱 맞는 편향을 갖도록 조정될 수 있으며(그리고 조정되어야 하며), 이는 올바른 구조(이 경우에는 시그모이드 활성화 함수 (sigmoid activation))와 적절한 복잡도 수준(은닉 뉴런 (hidden neurons)의 수)을 모두 갖추는 형태로 나타납니다.
FCNN에 대해 마지막으로 한 가지만 더 말씀드리겠습니다. 이 애니메이션(단순화를 위해 처음 두 개의 주사위에 대한 반응 표면 (response surface)만을 보여줍니다)을 통해, 모델의 "이해"가 시간이 지남에 따라 진화하며 점진적으로 실제 솔루션으로 수렴하는 과정을 지켜볼 수 있습니다.

모델이 학습하고 있다는 것을 볼 수 있지만, 인간이 학습하는 방식과는 다릅니다. 모델은 규칙을 찾는 것이 아니라, 어디가 "높고" 어디가 "낮은지"에 대한 직관을 구축하고 다듬어 나갈 뿐입니다.
Deep Sets 신경망 (Deep Sets Neural Net)
더 나은 성능을 내기 위해, 유용한 귀납적 편향 (inductive bias)인 순열 불변성 (permutation invariance)을 가진 다소 생소한 구조인 Deep Sets를 시도해 보겠습니다. Deep Sets 아키텍처*는 주사위의 순서가 중요하지 않다는 가정을 내장하고 있습니다.

이것은 꽤 이색적인 딥러닝 (deep learning) 모델임에도 불구하고, PyTorch를 사용하면 코드가 부끄러울 정도로 간단합니다. PyTorch는 우리가 원하는 어떤 토폴로지 (topology)로든 신경망을 연결할 수 있게 해주는 데 매우 탁월합니다.
class DeepSetNN(nn.Module):
def __init__(self) -> None:
super().__init__()
...
AI 자동 생성 콘텐츠
본 콘텐츠는 Lobste.rs AI의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기