표현을 배우는 것과 답을 내는 것
표현 representation은 입력을 과제에 유용한 수치 특징으로 바꾼 결과다. 영상의 원시 픽셀에서 가장자리/형태/장면 문맥 같은 특징을 만들고 task head가 분류 점수·상자·마스크·연속값 등을 예측할 수 있다. backbone은 공통 특징을 만드는 부분, head는 목표 출력에 맞춰 읽는 부분이라는 구분으로 사용한다. 특징의 각 성분이 자동으로 m 단위 물리 좌표나 설명 가능한 개념 하나를 뜻하는 것은 아니다.
CNN과 Transformer는 표현을 계산하는 서로 다른 구조의 예다. 어느 이름을 골랐다고 데이터의 라벨·보정·시간 정렬 문제가 해결되지는 않는다. 결합된 CNN/attention 구조도 있으므로 두 종류를 서로 배타적인 전체 제품으로 보지 않는다. 먼저 작은 연산의 수치와 어떤 정보를 사용하는지를 확인하면 큰 모델 이름을 외우는 것보다 출력 의미를 추적하기 쉽다.
국소 가중치를 여러 위치에 공유한다
CNN은 이웃 위치의 값을 같은 kernel 가중치로 결합하는 연산을 사용한다. PyTorch의 Conv 계열이 계산하는 것은 보통 kernel을 뒤집지 않는 cross-correlation이다. 수학적 convolution의 뒤집기와 혼동하지 않도록 여기서는 연산을 명시한다. 1차원 합성 입력 x=[1,2,0,1], kernel k=[1,−1], stride=1, padding=0, bias=0이라 하자. stride는 창을 옮기는 간격, padding은 경계에 덧대는 값/범위다.
그림 M11.04-1. 각 칸은 서로 다른 역할/근거다. 나란히 비교할 항목이며 위아래가 시간 순서를 뜻하지 않는다. 직접 제작한 개념도이며 본문의 조건과 함께 읽는다.
두 값씩 보고 곱해 더하면 첫 위치 1×1+2×(−1)=−1, 둘째 2×1+0×(−1)=2, 셋째 0×1+1×(−1)=−1이다. 출력은[−1,2,−1]이고 ReLU(z)=max(0,z)를 적용하면[0,2,0]이다. ReLU는 음수를 0으로 보내는 비선형 함수다. 이런 비선형이 없이 선형 층만 계속 합치면 표현력의 제한이 남는다. 실제 kernel은 데이터로 학습할 수 있지만 이번 숫자는 연산을 보기 위해 정했다.
같은 두 가중치를 세 위치에 공유하므로 이 예의 학습 가중치는 2개다. 같은 네 입력에서 세 출력을 자유롭게 만드는 dense 선형층은 bias 없이 12개 가중치를 갖는다. 둘이 같은 함수를 표현한다거나 항상 CNN이 더 정확하다는 뜻은 아니다. 공유/국소성이라는 가정을 비교한 것이다. 영상에서는 높이/너비와 여러 채널로 확장하고 층을 쌓아 더 넓은 영역의 정보를 결합한다.
가중치 공유는 위치를 옮긴 패턴을 같은 방식으로 처리하는 직관을 주지만 경계·stride·pooling의 효과가 있으며 임의 회전/크기 변화에 대한 불변성을 자동 보장하지 않는다. 다운샘플링하면 가는 선이나 작은 물체 정보도 잃을 수 있다. 공식 Conv2d 설명의 입력/출력 축과 kernel/stride를 함께 읽는다.
attention은 내용에 따라 값을 섞는다
토큰 token은 영상 patch나 단어/관측의 한 조각을 벡터로 나타낸 단위다. attention에서는 query q가 찾으려는 정보, key k_i가 비교용 벡터, value v_i가 섞을 내용이라고 생각할 수 있다. q와 k_i의 성분 수 d_k는 같아 내적을 계산할 수 있고 value의 성분 수는 다른 d_v일 수 있다. i는 n개 토큰 중 번호다. 아래는 mask 없는 단일 query/한 head의 계산이며 모든 값은 무차원 합성 벡터다.
s는 점수, exp는 지수함수, α는 합이 1인 softmax 가중치, o는 출력이다. d_k로 나누는 것이 아니라 그 제곱근으로 나눈다. q=[1,0], k₁=[1,0], k₂=[0,1]이면 d_k=2, 점수는[1/√2,0]≈[0.707107,0]이다. exp 값은 약 2.028115와 1이므로 가중치는 약[0.669762,0.330238]이다. v₁=[2,0], v₂=[0,4]라면 출력은 약[1.339523,1.320954]다. 첫 토큰만 그대로 고르는 argmax와 달리 두 value가 함께 기여한다.
q를[0,0]으로 바꾸면 두 점수가 0, 가중치가[0.5,0.5], 출력은[1,2]다. 위치/순서 정보를 별도로 넣지 않으면 내용만 같은 토큰들의 공간/시간 배치를 구분하기 어렵다. 미래 토큰을 보면 안 되는 과제에는 causal mask 같은 접근 제한이 필요하다. attention이 있다는 이유로 과거 정보만 사용한다는 보장은 없다.
self-attention은 같은 입력 표현에서 query/key/value를 만들고, cross-attention은 다른 문맥의 key/value를 참조하는 방식으로 쓸 수 있다. 실제 Transformer는 학습된 projection·여러 head·잔차 연결·정규화·feed-forward 등 추가 구조를 가진다. 위 한 식만이 전체 Transformer인 것은 아니다. Vaswani 등 원논문의 scaled attention과 위치 정보가 이 개념의 근거다. attention 가중치가 크다는 사실을 곧바로 물리적 원인이나 정답 확률로 해석하지 않는다.
사전학습된 특징도 검증을 거친다
사전학습은 다른 자료/목표로 배운 파라미터를 출발점으로 쓰는 것이다. 특징 추출기를 고정하고 head만 학습하거나 일부/전체를 미세조정할 수 있다. 고정했다는 것은 optimizer의 학습 대상과 경사/상태의 정책을 정한다는 뜻이며 eval/no_grad와 같은 말이 아니다. 어떤 모듈이 실제로 바뀌는지, BatchNorm 같은 상태가 어떻게 처리되는지도 확인한다. PyTorch 공식 전이학습 자료는 두 접근을 구분한다.
예를 들어 장면 특징벡터를 얻었다고 그리퍼의 집기 위치가 생기지는 않는다. 물체 클래스 head는 종류를, 상자 head는 영상 영역을, 행동 head는 정한 표현의 명령 후보를 출력한다. 3차원 집기에는 깊이/보정·프레임/시간과 충돌/접근 조건 등이 추가로 필요하다. 같은 backbone이라도 head의 라벨/손실/평가 계약은 다르다.
새 조명/카메라/물체/로봇으로 옮길 때 M11.03의 그룹 분리와 입력 전처리·분포 이동 검사를 적용한다. 사전학습이 데이터 요구를 줄일 수 있어도 현재 로봇에서의 정확도/기한/안전성을 자동 보장하지 않는다. 모델/가중치 개정·전처리·학습 대상·검증 자료를 함께 기록한다. 기존 5.6 SmolVLA 구조를 읽을 때도 시각/언어 표현과 행동 출력의 역할을 나누어 본다.
선택 CPU 연산 확인
다음 완전 코드는 작성 시 Darwin/PyTorch 2.13.0 CPU에서 실제 실행했다. 다운로드나 학습 없이 수동 kernel/벡터의 연산만 확인한다. 기본 실습은 같은 계산을 종이로 수행한다.
import math
import torch
x = torch.tensor([[[1., 2., 0., 1.]]], dtype=torch.float64)
k = torch.tensor([[[1., -1.]]], dtype=torch.float64)
z = torch.nn.functional.conv1d(x, k)
scores = torch.tensor([1., 0.], dtype=torch.float64) / math.sqrt(2)
alpha = torch.softmax(scores, dim=0)
values = torch.tensor([[2., 0.], [0., 4.]], dtype=torch.float64)
print("conv", z.flatten().tolist())
print("relu", z.relu().flatten().tolist())
print("attention", [round(v, 6) for v in alpha.tolist()])
print("mixed", [round(v, 6) for v in (alpha @ values).tolist()])
conv [-1.0, 2.0, -1.0]
relu [0.0, 2.0, 0.0]
attention [0.669762, 0.330238]
mixed [1.339523, 1.320954]