동그라미/네모를 가르쳤는데 AI가 몰래 색깔만 보고 있다면? 함정 시험과 반사실 실험으로 AI의 진짜 판단 근거를 수사합니다.
AI에게 보여줄 그림 카드 80장이에요. 목표는 모양(●/■) 구분인데 — 데이터를 잘 살펴보세요. 색과 모양이 어떻게 짝지어져 있나요?
데이터를 바꾸면 모델은 백지 상태로 새로 시작해요. 시험 문제는 그대로 유지돼 공정하게 비교할 수 있어요.
👀 관찰: 동그라미는 전부 빨강, 네모는 전부 파랑이에요. 사람은 모양을 보지만… AI도 그럴까요?
학습 때와 같은 색 규칙 (빨간●·파란■)
색을 반대로! (파란●·빨간■) — 모양은 그대로예요
읽는 법: 그림 아래 기호가 모델의 답이에요. 초록 테두리 = 정답, 빨강 테두리 = 오답. 사람에겐 두 시험이 똑같이 쉬워요 — 두 점수가 크게 다르다면, 모델은 모양이 아닌 다른 무언가를 보고 있다는 뜻이에요.
완전히 똑같은 도형을 색만 바꿔 두 번 물어봐요. 모양을 보는 모델이라면 두 답이 같아야 해요. 색을 바꿨을 뿐인데 답이 뒤집히면 — 색을 보고 있다는 결정적 증거!
먼저 학습을 시켜야 실험 결과가 의미 있어요 (백지 모델은 아무 근거도 없이 찍는 중).
픽셀 12×12×3 = 432개를 입력받는 작은 신경망(은닉 28개)이 경사하강법으로 배워요. 몇 초면 학습 정확도가 100%에 닿아요.
학습 정확도만 높은 건 반쪽 성공이에요. 함정 시험까지 높아야 "모양"이라는 진짜 개념을 배운 거예요.
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(골고루)로 다시 만들어 재학습하면 함정도 통과