← AI 놀이터 홈으로

🕵️ AI는 뭘 보고 맞힐까? (Shortcut Learning)

동그라미/네모를 가르쳤는데 AI가 몰래 색깔만 보고 있다면? 함정 시험과 반사실 실험으로 AI의 진짜 판단 근거를 수사합니다.

📖 따라하기 가이드 — 1 / 7 단계

Step 1. AI에게 모양 구분을 가르쳐요 — 그런데…

오늘의 목표: AI에게 동그라미●와 네모■ 구분을 가르치기예요. 그런데 중요한 비밀이 하나 있어요 — 우리는 AI에게 "모양을 봐!"라고 말해줄 수 없어요. 그림(픽셀 숫자들)과 정답만 주면 AI가 스스로 근거를 찾아서 배워요. 과연 우리가 원하는 대로 모양을 볼까요?

📸 1단계 — 학습 데이터 고르기

AI에게 보여줄 그림 카드 80장이에요. 목표는 모양(●/■) 구분인데 — 데이터를 잘 살펴보세요. 색과 모양이 어떻게 짝지어져 있나요?

데이터를 바꾸면 모델은 백지 상태로 새로 시작해요. 시험 문제는 그대로 유지돼 공정하게 비교할 수 있어요.

👀 관찰: 동그라미는 전부 빨강, 네모는 전부 파랑이에요. 사람은 모양을 보지만… AI도 그럴까요?

🧪 2단계 — 시험 보기 (모델의 답이 실시간으로 갱신돼요)

보통 시험0%

학습 때와 같은 색 규칙 (빨간●·파란■)

🪤 함정 시험0%

색을 반대로! (파란●·빨간■) — 모양은 그대로예요

읽는 법: 그림 아래 기호가 모델의 답이에요. 초록 테두리 = 정답, 빨강 테두리 = 오답. 사람에겐 두 시험이 똑같이 쉬워요 — 두 점수가 크게 다르다면, 모델은 모양이 아닌 다른 무언가를 보고 있다는 뜻이에요.

🔍 3단계 — 색깔 탐정 (반사실 실험)

완전히 똑같은 도형을 색만 바꿔 두 번 물어봐요. 모양을 보는 모델이라면 두 답이 같아야 해요. 색을 바꿨을 뿐인데 답이 뒤집히면 — 색을 보고 있다는 결정적 증거!

vs

먼저 학습을 시켜야 실험 결과가 의미 있어요 (백지 모델은 아무 근거도 없이 찍는 중).

🎛️ 학습 조종하기

픽셀 12×12×3 = 432개를 입력받는 작은 신경망(은닉 28개)이 경사하강법으로 배워요. 몇 초면 학습 정확도가 100%에 닿아요.

📊 지금 상태

학습 반복 (epoch)
0
손실 (loss)
—
학습 정확도
0%
🪤 함정 시험
0%

학습 정확도만 높은 건 반쪽 성공이에요. 함정 시험까지 높아야 "모양"이라는 진짜 개념을 배운 거예요.

🧪 이렇게 실험해 보세요

  1. ⚠️ 데이터로 학습 → 보통 시험 100% vs 함정 시험 0% — 점수 차이가 곧 지름길의 크기예요.
  2. 색깔 탐정에서 ●와 ■ 모두 실험해 보세요 — 편향 모델은 둘 다 색을 따라가요.
  3. 🌈 데이터로 재학습 → 함정 시험이 80~100%로! 같은 모델, 같은 시간인데 데이터만 바꿨을 뿐이에요.
  4. 🌈 모델로 색깔 탐정을 다시 — 이제 색을 바꿔도 답이 안 흔들려요.
  5. 생각해 보기: 사진으로 소/말을 구분하는 AI를 만든다면 어떤 지름길이 숨어들 수 있을까요? (힌트: 초원, 마구간…)

🧮 수식과 파이썬

P(모양 | 픽셀들) = softmax( W₂ · tanh(W₁ · 픽셀들 + b₁) + b₂ )
모델은 픽셀 숫자들에서 확률을 계산할 뿐 — '모양'과 '색깔' 중 무엇에 가중치를 둘지는 데이터가 결정해요.
🐍 파이썬 코드로 보면? (펼치기)
import torch, torch.nn as nn

# 1) 12×12 RGB 도형 이미지 만들기 (동그라미=0, 네모=1)
def make_shapes(n, biased, swap=False):
    X, y = [], []
    for i in range(n):
        shape = i % 2
        if biased: red = (shape == 0) != swap   # 편향: ●는 빨강, ■는 파랑
        else:      red = torch.rand(1).item() < 0.5
        color = [0.88, 0.15, 0.18] if red else [0.16, 0.32, 0.85]
        img = torch.full((12, 12, 3), 0.93)     # 밝은 배경
        cx, cy = 5.5 + torch.rand(2) * 2 - 1    # 위치 흔들기
        r = 3.2 + torch.rand(1).item()
        for yy in range(12):
            for xx in range(12):
                inside = ((xx-cx)**2 + (yy-cy)**2 <= r*r) if shape == 0 \
                         else (abs(xx-cx) <= r*0.88 and abs(yy-cy) <= r*0.88)
                if inside: img[yy, xx] = torch.tensor(color)
        X.append(img.flatten() - 0.5); y.append(shape)
    return torch.stack(X), torch.tensor(y)

X_train, y_train = make_shapes(80, biased=True)          # 수상한 데이터
X_trap,  y_trap  = make_shapes(24, biased=True, swap=True)  # 🪤 색 반전

# 2) 작은 신경망 학습
model = nn.Sequential(nn.Linear(12*12*3, 28), nn.Tanh(), nn.Linear(28, 2))
opt = torch.optim.SGD(model.parameters(), lr=0.5)
for epoch in range(700):
    loss = nn.functional.cross_entropy(model(X_train), y_train)
    opt.zero_grad(); loss.backward(); opt.step()

# 3) 성적표 — 학습은 만점, 함정 시험은 전멸!
acc = lambda X, y: (model(X).argmax(1) == y).float().mean().item()
print("학습 데이터:", acc(X_train, y_train))   # ≈ 1.00
print("함정 시험:",   acc(X_trap,  y_trap))    # ≈ 0.00  ← 색만 보고 있었다!

# 4) 고치기: biased=False(골고루)로 다시 만들어 재학습하면 함정도 통과