지난 10년을 바꾼 가장 중요한 아키텍처 기법
잔차 연결은 y = x + f(x)로 표현해. 블록의 출력은 입력에 블록이 변환한 결과를 더한 값이야. 이 건너뛰기 경로 덕분에 기울기는 각 블록의 로컬 Jacobian을 계속 곱하지 않고도 깊은 층까지 흐를 수 있어. 100-층 신경망인 ResNet과 175-billion-매개변수 Transformer인 GPT-3 이상을 실제로 학습할 수 있는 이유야.
잔차 연결이 나오기 전에는 층을 20-30 넘게 추가하면 오히려 학습이 나빠졌어. 잔차 연결이 등장한 뒤에는 깊이를 늘린 효과가 끝까지 돌아왔지. 이건 규제 기법이 아니라 깊은 신경망을 가능하게 하는 기법이야.
팁: 코드에서
x + sublayer(x)가 보이면 잔차 연결이야. 건너뛰기 경로와 변환 경로의 텐서 형태가 같은지 빠르게 확인해 봐. 형태가 맞지 않으면 건너뛰기 경로에 투영이 필요해. 이때 nn.Linear 또는 stride가 있는 nn.Conv2d를 사용해.잔차 연결은 어디에 쓰일까
현대 아키텍처라면 거의 어디서나 볼 수 있어. ResNet에서는 CNN 블록에 쓰이고, Transformer에서는 모든 블록의 어텐션과 FFN에 각각 하나씩 들어가. DenseNet은 더하는 대신 이어 붙이고, U-Net은 인코더에서 디코더로 건너뛰기 연결을 이어 줘. Mamba/SSM 블록에도 쓰여. 이 패턴은 아키텍처 계열을 가리지 않아.
간단한 수학
y = x + f(x)라면 dy/dx = 1 + f'(x)야. 기울기 소실로 f'(x)가 작아져도 +1이 기울기를 살아 있게 유지해. 연쇄 법칙에서 이어지던 곱셈이 곱의 합 형태로 바뀌기 때문에 수치적으로 훨씬 안정적이야.
원칙: 잔차 연결은 딥러닝에서 별도 대가 없이 얻을 수 있는 아키텍처 개선에 가장 가까워. 직접 설계하든 다른 곳에서 가져오든, 모든 아키텍처에는 처음부터 잔차 연결을 넣어야 해. 나중에 덧붙일 기능이 아니야.