세 container, 하나의 pattern
PyTorch 의 세 핵심 composition module:
nn.Sequential(*modules)— module 을 순서대로 돌리고, 한 output 이 다음에 feed. customforward()불필요.nn.ModuleList([modules])— PyTorch 가 볼 수 있는 Python list.forward()직접 짜고 원하는 대로 iterate.nn.ModuleDict({name: module})— 같은 idea, dict 모양. multi-head model 이나 branching architecture 에 유용.
'가능하면 Sequential, 어쩔 수 없으면 ModuleList' 룰이 코드의 ~80% 에 맞아. Sequential 이 깔끔하게 읽히고 print(model) 에 잘 나타남. ModuleList 는 branch, skip connection, 또는 dynamic depth (예: N 이 config 에서 오는 N-layer Transformer) 가 있는 거 위.
함정: 일반 Python collection 안 됨
plain list 나 dict (nn 버전 아님) 에 layer 저장하면, 못 model.parameters() 에 등장, 못 .to(device) 로 이동, 못 state_dict() 에 저장. 버그가 silent — model 은 train 하지만 PyTorch 가 볼 수 있는 layer 만. 항상 nn.Module* 버전 사용.