메서드 두 개로 모든 걸 만들어
PyTorch의 모든 신경망 구성 요소는 선형 계층 하나부터 매개변수 700억 개짜리 Transformer까지 nn.Module을 상속해. 하위 클래스를 만드는 방식은 이 프레임워크에서 가장 중요한 Python 관례이며, 계약은 두 가지로 간단해:
__init__을 재정의해. 항상super().__init__()을 먼저 호출하고,self.layer1 = nn.Linear(10, 20)처럼 자식 모듈과 매개변수를self에 할당해. PyTorch는__setattr__을 가로채 이 객체들을 자동으로 등록해.forward(self, x, ...)를 재정의해 계산을 정의해. 다만 직접 호출하지는 마.model.forward(x)가 아니라 모듈 인스턴스를 함수처럼model(x)로 호출해야 해. 그래야__call__을 거치며 등록된 훅을 실행하고, 자식 모듈의 학습·평가 모드를 적용하고 autograd 처리 흐름을 올바르게 이어 줘.
자동으로 얻는 기능
model.parameters(): 중첩 깊이와 관계없이 학습 가능한 모든 텐서를 순회해.model.named_parameters(): 같은 텐서에 점으로 구분한 경로 이름을 붙여 순회해.model.to(device): 모든 매개변수와 버퍼를 지정한 장치로 옮겨.model.train()/model.eval(): 드롭아웃과 BatchNorm처럼 모드에 따라 달라지는 자식 모듈의 동작을 전환해.model.state_dict()/load_state_dict(): 직렬화할 수 있는 모든 매개변수와 버퍼를 사전 형태로 저장하고 복원해.
이 기능들은 모두 nn.Module의 등록 체계에 의존해. 자식 모듈은 self에 할당하고, 컬렉션에는 일반 Python 목록 대신 nn.ModuleList를 쓰고, 직접 만든 학습 가능한 텐서는 nn.Parameter로 감싸야 해. 이 규칙을 빼먹으면 자동 기능이 오류 없이 조용히 멈춰.