C.W.K.
Stream
Lesson 06 of 08 · published

Width, Depth, Expressive Power

~18 min · capacity, depth, scaling

Level 0Curious
0 XP0/73 lessons0/11 achievements
0/120 XP to next level120 XP to go0% complete

비슷해 보이지만 다른 두 axis

Width (layer 당 hidden unit 더) 는 각 abstraction level 에서 network 가 병렬로 계산할 수 있는 feature 수를 늘려. Depth (더 많은 layer) 는 단순 feature 에서 복잡한 feature 를 만드는 compositional step 수를 늘려.

Universal approximation theorem 은 충분한 width 의 single hidden layer 로 모든 continuous function 을 근사할 수 있다고 말해. 실전에서 hierarchical structure 있는 문제 (vision, text, code) 에는 depth 가 width 보다 exponentially parameter-efficient. 같은 parameter count 의 deep net 이 wide-and-shallow net 을 자주 이겨.

팁: 하나만 고를 수 있다면, compositional structure 있는 natural data 에는 depth 가 보통 가장 도움. Width 는 단일 abstraction level 의 다양성에 가장 도움. 대부분의 modern design 은 적당한 width 의 deep, 반대 아냐.

Gotcha: Deep net 은 자기 train 안 해

Modern toolbox 도착 전엔 50 layer 를 naively 쌓으면 network 가 나빠지고, 안 좋아져. Vanishing gradient, dead neuron, unstable activation 이 다 training 죽여. ResNet, batch normalization, careful initialization, skip connection 이 다 있는 이유 — depth 가 보답하게 만들기 위해서.

Width 도 자기 gotcha 가 있어 — VRAM 이 attention 의 hidden dimension 제곱으로, MLP layer 의 hidden dimension 선형으로 자라. 4096-wide layer 는 feasible, 16384-wide 는 single H100 에서도 자주 안 됨.

실전에서 어디가 중요한가

연구와 진지한 production 에는 scaling law (더 많은 parameter, 더 많은 token) 가 알려진 곡선 따라 reliably loss 줄여. 학습자에게 올바른 수: published architecture 와 parameter count 골라서 다루기 쉬운 문제에 train, 그 다음 width 와 depth 를 한 knob 씩 실험.

원칙: Capacity 는 무료 아냐. 어떤 axis 를 먼저 키울지는 본인이 compositional depth 가 부족한지 parallel feature 가 부족한지에 따라 달라.

Code

Width vs depth at constant parameter budget·python
import torch.nn as nn

def make_mlp(in_dim, widths, out_dim):
    layers, prev = [], in_dim
    for w in widths:
        layers += [nn.Linear(prev, w), nn.ReLU()]; prev = w
    layers += [nn.Linear(prev, out_dim)]
    return nn.Sequential(*layers)

wide_shallow = make_mlp(784, [512, 512],   10)
deep_narrow  = make_mlp(784, [128]*16,     10)

def n_params(m): return sum(p.numel() for p in m.parameters())
print("wide_shallow:", n_params(wide_shallow))
print("deep_narrow: ", n_params(deep_narrow))

External links

Exercise

같은 parameter count 의 MLP 두 개 만들어: 하나는 wide-and-shallow ([512, 512]), 다른 하나는 deep-and-narrow ([128]*16). 둘 다 non-trivial dataset 에 train. 어느 게 빨리 converge 하고, 어느 게 더 잘 generalize?

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.