Meta Learning
메타 러닝 / Learning to Learn
학습하는 방법을 학습하는 기계학습 패러다임. 적은 데이터로 새로운 작업에 빠르게 적응하는 Few-shot Learning의 핵심 기술.
메타 러닝 / Learning to Learn
학습하는 방법을 학습하는 기계학습 패러다임. 적은 데이터로 새로운 작업에 빠르게 적응하는 Few-shot Learning의 핵심 기술.
Meta Learning(메타 러닝)은 "학습하는 방법을 학습한다(Learning to Learn)"는 개념의 기계학습 패러다임입니다. 일반적인 딥러닝이 특정 작업을 위해 대량의 데이터로 학습하는 것과 달리, 메타 러닝은 여러 작업에서의 학습 경험을 축적하여 새로운 작업에 빠르게 적응하는 능력을 배웁니다.
이 개념은 1990년대부터 연구되었지만, 2017년 MAML(Model-Agnostic Meta-Learning) 논문 발표 이후 폭발적으로 발전했습니다. 인간이 몇 개의 예시만 보고도 새로운 개념을 학습하는 것처럼, AI도 적은 데이터로 학습할 수 있어야 한다는 아이디어에서 출발했습니다.
메타 러닝의 핵심은 "Inner Loop"와 "Outer Loop"의 이중 최적화 구조입니다. Inner Loop에서는 개별 작업(Task)에 대해 빠르게 학습하고, Outer Loop에서는 여러 작업에 걸쳐 학습 방법 자체를 개선합니다. 이를 통해 모델은 좋은 초기 파라미터, 효과적인 학습률, 적절한 표현(representation)을 습득합니다.
실무에서 메타 러닝은 데이터가 부족한 도메인, 개인화 추천 시스템, 로보틱스에서의 빠른 환경 적응 등에 활용됩니다. 특히 Few-shot Learning(1-5개 예시로 학습)과 Zero-shot Learning(예시 없이 학습)의 기반 기술로서 현대 AI의 데이터 효율성을 크게 향상시키고 있습니다.
# MAML(Model-Agnostic Meta-Learning) 간단 구현 예제
import torch
import torch.nn as nn
import torch.optim as optim
from copy import deepcopy
class SimpleModel(nn.Module):
"""Few-shot 분류를 위한 간단한 신경망"""
def __init__(self, input_dim=784, hidden_dim=64, output_dim=5):
super().__init__()
self.net = nn.Sequential(
nn.Linear(input_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, hidden_dim),
nn.ReLU(),
nn.Linear(hidden_dim, output_dim)
)
def forward(self, x):
return self.net(x)
class MAML:
"""MAML 메타 러닝 알고리즘"""
def __init__(self, model, inner_lr=0.01, outer_lr=0.001):
self.model = model
self.inner_lr = inner_lr # Task-specific 학습률
self.outer_lr = outer_lr # Meta 학습률
self.meta_optimizer = optim.Adam(model.parameters(), lr=outer_lr)
def inner_update(self, model, support_x, support_y, steps=5):
"""Inner Loop: 개별 Task에 대한 빠른 적응"""
adapted_model = deepcopy(model)
optimizer = optim.SGD(adapted_model.parameters(), lr=self.inner_lr)
criterion = nn.CrossEntropyLoss()
for _ in range(steps):
logits = adapted_model(support_x)
loss = criterion(logits, support_y)
optimizer.zero_grad()
loss.backward()
optimizer.step()
return adapted_model
def meta_train_step(self, tasks):
"""Outer Loop: 여러 Task에 걸친 메타 학습"""
self.meta_optimizer.zero_grad()
total_loss = 0.0
criterion = nn.CrossEntropyLoss()
for task in tasks:
support_x, support_y = task['support'] # K-shot examples
query_x, query_y = task['query'] # 평가용 데이터
# Inner Loop: Task에 빠르게 적응
adapted_model = self.inner_update(
self.model, support_x, support_y
)
# Query set으로 메타 손실 계산
query_logits = adapted_model(query_x)
task_loss = criterion(query_logits, query_y)
total_loss += task_loss
# Outer Loop: 메타 파라미터 업데이트
meta_loss = total_loss / len(tasks)
meta_loss.backward()
self.meta_optimizer.step()
return meta_loss.item()
# 사용 예시
model = SimpleModel()
maml = MAML(model, inner_lr=0.01, outer_lr=0.001)
# 5-way 5-shot 학습 (5개 클래스, 클래스당 5개 예시)
print("=== Meta Learning Training ===")
print("Inner LR: 0.01 | Outer LR: 0.001")
print("Few-shot 설정: 5-way 5-shot")
print("\n메타 러닝은 여러 작업에서 학습 경험을 축적하여")
print("새로운 작업에 빠르게 적응하는 능력을 배웁니다.")
"신규 카테고리마다 데이터 수집하기 어려우니, Meta Learning으로 접근해보죠. 5-shot으로도 분류기를 빠르게 적응시킬 수 있고, 기존 제품 데이터로 사전 학습하면 될 것 같습니다."
"Meta Learning은 '학습하는 방법을 학습'하는 패러다임입니다. MAML을 예로 들면, Inner Loop에서 Task별로 빠르게 적응하고, Outer Loop에서 좋은 초기화 지점을 찾습니다. 실제로 이미지 분류 프로젝트에서 5-shot으로 새 클래스 추가 시간을 90% 단축한 경험이 있습니다."
"Prototypical Network는 메트릭 기반이라 간단하고 해석 가능하지만, MAML은 모델에 구애받지 않아서 범용적이에요. 최근엔 Transformer 기반 In-context Learning이 메타 러닝의 새로운 형태로 주목받고 있죠."
메타 학습 시 비슷한 Task만 사용하면 새로운 유형의 Task에 일반화되지 않습니다. Task 분포의 다양성이 핵심입니다.
Inner Loop 스텝이 너무 많으면 Outer Loop 그래디언트가 소실되고 계산 비용이 급증합니다. 보통 1-5 스텝이 적당합니다.
N-way K-shot 설정에서 N(클래스 수)과 K(예시 수)를 다양하게 섞어 학습하면 더 강건한 메타 학습이 가능합니다. 평가 시에도 학습과 유사한 설정을 사용하세요.