학습시키는 것과 일반화시키는 것
손실이 ln 2에서 움직이지 않는 6층 네트워크를 측정 하나씩 고칩니다. 그리고 40개 점에 5,000개 파라미터를 쓰는 double descent까지.
이 페이지에서
5장의 네트워크는 동작합니다. 파라미터는 아홉 개이고, XOR을 학습하며, gradient는 PyTorch와 소수점 16자리까지 일치합니다.
이를 6층 깊이로 만들면 학습이 완전히 멈춥니다. 느린 것이 아니라 — 완전히 멈춥니다. 다음은 두 나선 분류 문제에서 6층 네트워크를 5000 step 동안 학습한 결과입니다.
step 1: loss 0.693147
step 5000: loss 0.693147
accuracy: 50.0 %저 숫자는 임의가 아닙니다. 는 모든 것에 대해 확률 를 출력하는 모델의 binary cross-entropy이고, 50 %는 균형 잡힌 데이터셋에서 동전 던지기와 같습니다. 5천 step이 지나도 네트워크는 숫자 하나 움직이지 않았습니다. 아무것도 crash하지 않았고, 경고도 없었으며, gradient는 여전히 정확히 맞습니다.
이 장은 실행되는 네트워크와 작동하는 네트워크 사이의 간극에 관한 이야기입니다. 서로 다른 주제처럼 보이지만 사실 같은 일을 하는 두 절반으로 이루어져 있습니다. loss를 내려가게 만들기, 그리고 모델이 한 번도 본 적 없는 데이터에서도 loss가 내려가게 만들기입니다.
6층 네트워크가 죽은 이유
섹션 링크: 6층 네트워크가 죽은 이유추측하지 말고 먼저 들여다봅니다. 입력 batch를 통과시킨 뒤 각 층의 activation 표준편차를 출력하고, 이어서 weight gradient의 표준편차를 출력합니다.
def profile(model, x):
h = x
for layer in model:
h = layer(h)
if isinstance(layer, (nn.Tanh, nn.ReLU)):
print(f"activation std: {h.std().item():.4f}")
model(x).sum().backward()
for p in model.parameters():
if p.dim() == 2:
print(f"gradient std: {p.grad.std().item():.2e}")초기화 세 가지, 같은 아키텍처, 여섯 층입니다.
| 초기화 | activation std, 층 1→6 |
|---|---|
| normal, std | 0.0145 · 0.0016 · 0.0002 · 0.0000 · 0.0000 · 0.0000 |
| normal, std | 0.6573 · 0.9296 · 0.9585 · 0.9634 · 0.9637 · 0.9625 |
| Xavier | 0.1579 · 0.1493 · 0.1353 · 0.1333 · 0.1325 · 0.1403 |
| 초기화 | gradient std, 첫 층 → 마지막 층 |
|---|---|
| normal, std | 3.20e-06 · 4.97e-07 · … · 6.40e-06 |
| normal, std | 1.94e+03 · 2.28e+02 · 1.22e+02 · 4.43e+01 · 1.85e+01 · 7.30e+00 |
| Xavier | 2.31e+00 · 4.50e-01 · 4.26e-01 · 3.89e-01 · 4.39e-01 · 4.73e-01 |
첫 번째 행이 위의 네트워크입니다. 이 네트워크는 천천히 배우는 것이 아니라 — 남은 신호가 없습니다. 네 번째 층에 이르면 activation 표준편차가 소수점 네 자리 기준으로 0으로 underflow됩니다. 모든 입력이 같은 출력을 만들고, 출력은 상수가 되며, 상수의 gradient는 아무것도 아닙니다. weight를 “안전하게” 작게 초기화했지만, 작은 값이 치명적이었습니다.
두 번째 행은 반대쪽 실패입니다. 직관에 어긋나기 때문에 이해할 가치가 있습니다. activation은 약 0.96으로 건강해 보입니다. 하지만 이는 가 포화되어 한계값 근처에 고정된 상태이며, 바로 5장에서 gradient가 거의 만 분의 일 수준으로 사라진다고 측정했던 영역입니다. 그런데도 gradient는 거대합니다. 첫 층에서 1940입니다. 두 가지가 동시에 참입니다. 각 backward step은 를 곱하고, unit variance의 입력 128개에서는 그 factor가 약 의 gain을 가지며, 이는 포화된 에서 오는 축소를 압도합니다. gradient는 되돌아가는 동안 기하급수적으로 커집니다. 이것이 exploding gradient이고, 실제 training run에서는 몇 step 안에 loss 값이 nan가 됩니다.
세 번째 행이 원하는 모습입니다. activation의 scale이 깊이에 걸쳐 대략 일정하고, gradient의 scale도 깊이에 걸쳐 대략 일정합니다. 아무것도 죽지 않고, 아무것도 폭발하지 않습니다.
정규화, 그리고 살아남은 방식
섹션 링크: 정규화, 그리고 살아남은 방식좋은 초기화는 step 0에서 scale을 고칩니다. 하지만 그것을 계속 고정해 주지는 않습니다. weight는 움직이고, 5천 step쯤 되면 신중한 variance 논증은 더 이상 적용되지 않습니다.
정규화 층은 scale을 계속 강제합니다. activation vector가 주어지면 평균을 빼고, 표준편차로 나눈 다음, 학습되는 scale 와 shift 를 적용합니다. 그래야 그 층이 원한다면 정규화를 되돌릴 수 있습니다.
진짜 질문은 무엇을 기준으로 평균을 낼 것인가뿐입니다. Batch normalization3은 batch 차원 전체에서 와 를 구합니다. feature마다 하나의 통계량입니다. Layer normalization4은 feature 전체에서 이를 구합니다. 예시마다 하나의 통계량입니다.
그 선택은 사소해 보이지만 이후 거의 모든 것을 결정합니다.
BatchNorm은 각 예시의 출력이 같은 batch에 우연히 들어온 다른 예시들에 의존하게 만듭니다. training 때는 이것이 약한 regularizer가 됩니다. inference 때는 batch가 없으므로 training 중 수집한 통계량의 running average를 유지해야 합니다. 즉 이 층은 training mode와 evaluation mode에서 다르게 동작하며, mode 전환을 잊는 것은 이 분야에서 가장 흔한 bug 중 하나입니다. 또한 작은 batch에서 성능이 떨어지고, variable-length sequence에서는 awkward합니다. “position 40에서 batch 평균”은 우연히 그 길이까지 있는 sequence가 몇 개냐에 따라 계산되기 때문입니다.
LayerNorm은 각 예시를 독립적으로 정규화합니다. batch 의존성이 없고, running statistic도 없으며, training과 inference에서 동작이 같고, batch size에도 sequence length에도 무관합니다. 한 사용자에게 한 번에 token 하나씩 생성하는 상황에서는 이 속성들이 편의가 아니라 요구사항이 됩니다. 13장이 도달하는 곳이 바로 그 지점입니다.
그래서 LayerNorm은 9장에서 그대로 다시 등장합니다. transformer block이 그것을 사용하며, 추상적으로 더 잘 작동해서가 아니라 오른쪽 열의 이유들 때문에 사용합니다.
한 번에 하나씩 고치기, 그것이 실제 skill입니다
섹션 링크: 한 번에 하나씩 고치기, 그것이 실제 skill입니다죽은 네트워크를 고칠 후보는 네 가지입니다. Xavier 초기화, LayerNorm, residual connection, 그리고 SGD 대신 Adam입니다. 유혹은 네 가지를 모두 적용하고 넘어가는 것입니다. 그렇게 하면 무엇이 중요했는지 결코 알 수 없고, 다음에 같은 일이 생겼을 때 방법은 없고 의식만 남습니다.
그래서 하나씩 적용합니다. 같은 seed, 같은 데이터, 같은 아키텍처, 800 step입니다.
| 추가한 것 | 최종 loss | accuracy |
|---|---|---|
| 없음 | 0.6931 | 50.0 % |
| Xavier 초기화 | 0.5692 | 60.4 % |
| LayerNorm | 0.6230 | 61.5 % |
| residual connection | 0.6651 | 56.6 % |
| Adam | 0.6787 | 58.7 % |
| 네 가지 모두 | 0.0000 | 100.0 % |
새벽 2시에 이 표를 읽는 방식으로 읽으면 결론은 이렇습니다. 단독으로는 아무것도 안 되고, 함께 쓰면 모두 된다. 그러므로 deep learning은 연금술이다. 이 결론은 틀렸고, 왜 틀렸는지 알아내는 것이 이 장에서 가장 유용한 부분입니다.
각 run에 여섯 배의 budget을 줍니다. 800 step 대신 5000 step입니다. 그러면 완전히 달라집니다.
| 추가한 것 | 최종 loss @ 5000 | accuracy |
|---|---|---|
| 없음 | 0.6931 | 50.0 % |
| Xavier 초기화 | 0.0007 | 100.0 % |
| LayerNorm | 0.0002 | 100.0 % |
| residual connection | 0.6653 | 56.7 % |
| Adam | 0.6908 | 53.4 % |
| Xavier + Adam | 0.0000 | 100.0 % |
| Xavier + LayerNorm | 0.0001 | 100.0 % |
이제 그림이 선명해지고, 의식이 아니라 진단이 됩니다.
초기화만으로 고쳐집니다. 정규화만으로도 고쳐집니다. 둘 다 실제 병, 즉 forward signal이 0으로 붕괴하는 문제를 다루며, 둘 중 하나만으로 충분합니다. 800 step에서는 partial credit처럼 보였을 뿐입니다. 문제는 이미 풀렸지만 아직 올라오는 중이었기 때문입니다.
Residual connection과 Adam은 어떤 budget에서도 고치지 못합니다. 나빠서가 아니라 다른 병을 치료하기 때문입니다. residual connection은 gradient가 막힌 층을 우회할 경로를 제공합니다. gradient가 문제일 때는 매우 가치 있지만, forward signal이 이미 0이면 아무 가치가 없습니다. 죽은 층을 우회하는 shortcut도 죽은 값을 운반하기 때문입니다. Adam은 각 파라미터의 step을 자체 gradient 이력으로 rescale합니다. gradient magnitude가 제각각일 때 도움이 되지만, 출력이 입력에 의존하지 않는 네트워크를 되살릴 수는 없습니다.
그리고 “없음”은 5천 step 후에도 여전히 정확히 0.6931입니다. 0.6929가 아닙니다. 느린 것이 아니라 죽은 것입니다. 이제는 그 차이가 보입니다. 비교할 수 있는 “고치면 된다” 행이 있기 때문입니다.
PyTorch를 쓸 자격 얻기
섹션 링크: PyTorch를 쓸 자격 얻기이제부터 이 과정은 PyTorch를 사용합니다. 그냥 선언하는 대신 그럴 만한 이유를 얻어야 하므로, PyTorch가 하는 일 중 여러분이 이미 할 줄 아는 것을 정확히 보여드립니다.
optimiser는 gradient를 파라미터 업데이트로 바꾸는 규칙입니다. Plain gradient descent는 gradient를 사용합니다. Momentum은 그 running average를 사용해 noise를 부드럽게 하고, 일관되게 유지되는 방향을 따라 속도를 쌓습니다.
v = beta * v + p.grad
p -= lr * v Adam5은 두 개의 running average를 유지합니다. gradient와 gradient 제곱의 running average입니다. 그리고 하나를 다른 하나의 제곱근으로 나누어, 각 파라미터가 자신의 최근 gradient magnitude에 맞춰진 step을 받게 합니다.
m = b1 * m + (1 - b1) * g # mean of the gradient
v = b2 * v + (1 - b2) * g * g # mean of the squared gradient
m_hat = m / (1 - b1 ** t) # bias correction: both averages start at zero
v_hat = v / (1 - b2 ** t)
p -= lr * m_hat / (v_hat.sqrt() + eps) 열 줄입니다. 같은 문제에서 torch.optim와 둘을 50 step 동안 실행합니다.
SGD+momentum by hand [2.7781870365142822, -1.0304985046386719]
torch [2.7781870365142822, -1.0304983854293823] max |diff| = 1.19e-07
Adam by hand [0.4893140196800232, -0.46317872405052185]
torch [0.48931416869163513, -0.46317875385284424] max |diff| = 1.49e-07float32 precision까지 동일합니다. torch.optim.Adam는 저 다섯 줄에 edge case에 대한 수십 년의 관리와 C++ kernel을 더한 것입니다. 이제부터 여러분이 하는 교환은 이것입니다. 이해를 마법으로 대체하는 것이 아니라, 이미 작성한 줄들을 속도로 대체하는 것입니다.
Adam이 존재하는 이유: curvature
섹션 링크: Adam이 존재하는 이유: curvatureAdam에 대한 일반적인 설명은 “adaptive per-parameter learning rates”입니다. 이는 이유라기보다 묘사입니다. 이유는 geometry이고, 측정할 수 있습니다.
방향마다 curvature가 다른 loss를 생각해 봅니다. 한 방향은 가파르고, 다른 방향은 완만합니다. SGD에는 global learning rate가 하나뿐이므로 가장 가파른 방향에서 안정적일 만큼 작은 값을 골라야 합니다. 그러면 그 값은 완만한 방향에는 너무 작아서 progress가 기어가듯 느려집니다. 이것이 gradient descent가 좁은 계곡을 zig-zag하며 내려가는 고전적인 그림을 만드는 원인입니다.
두 curvature ratio, 세 optimiser, 300 step, 그리고 누구도 불리하지 않도록 각 optimiser에는 sweep에서 찾은 최적 learning rate를 부여했습니다.
| curvature ratio | SGD | SGD + momentum | Adam |
|---|---|---|---|
| 10 : 1 | error 0.000002 | error 0.000000 | error 0.000000 |
| 1000 : 1 | error 1.925485 | error 0.001432 | error 0.000000 |
| diverged at (1000:1) | 4 of 8 rates | 4 of 8 rates | 0 of 6 rates |
ratio가 10이면 모두 작동하고 논할 것이 없습니다. 1000이면 plain SGD는 시도한 어떤 learning rate에서도 답에 도달하지 못합니다. 최선의 결과도 error 1.93이고, rate의 절반에서는 outright diverge합니다. Adam은 target에 정확히 도달하고, 하나도 diverge하지 않습니다.
마지막 열이 Adam이 default인 실용적 이유입니다. Adam이 더 나은 해를 찾기 때문은 아닙니다. well-conditioned problem에서는 잘 튜닝된 SGD가 종종 Adam과 같거나 이깁니다. Adam이 여러분이 고른 learning rate에 훨씬 덜 민감하기 때문입니다. 실제 네트워크는 수백만 파라미터 전반에 걸쳐 1000보다 훨씬 나쁜 curvature ratio를 갖습니다.
여기에 속하는 조각이 두 개 더 있고, 둘 다 한 줄입니다. Gradient clipping은 gradient vector의 norm이 threshold를 넘을 때마다 그것을 rescale하여, 진단 표의 “loss가 갑자기 거대한 값으로 점프” 행을 별일 아니게 만듭니다. 그리고 learning rate schedule입니다. 처음 몇백 step 동안 거의 0에서 시작하는 짧은 warmup이 필요합니다. Adam의 variance estimate는 몇 번의 gradient를 보기 전까지 엉망이고, 엉망인 값 위에서 full-size step을 밟으면 초기화를 망칠 수 있기 때문입니다. 그다음에는 0을 향한 cosine decay입니다. 시작할 때와 같은 step size로 run을 끝낸다는 것은 minimum에 settle하는 대신 그 주변에서 jitter한다는 뜻이기 때문입니다.
두 번째 절반: 완벽하게 맞추지만 아무것도 예측하지 못하는 모델
섹션 링크: 두 번째 절반: 완벽하게 맞추지만 아무것도 예측하지 못하는 모델지금까지의 모든 것은 loss를 내려가게 만드는 이야기였습니다. 이제 더 어려운 절반입니다. loss가 내려가는 것이 목표가 아니기 때문입니다. 그것은 목표의 proxy이고, 그 proxy는 특정하고 유명한 방식으로 실패합니다.
약간의 noise가 있는 smooth function에서 점 열두 개를 뽑습니다. 차수를 높여 가며 polynomial을 fit합니다.
| degree | train RMSE | test RMSE |
|---|---|---|
| 1 | 0.764499 | 0.6985 |
| 3 | 0.252605 | 0.3031 |
| 5 | 0.164437 | 0.1568 |
| 9 | 0.088960 | 0.2347 |
| 11 | 0.000000 | 1.2094 |
12개 점에 degree 11을 쓰면 모든 점을 정확히 지나갑니다. train error는 소수점 여섯 자리까지 0입니다. 하지만 보지 않은 데이터에서는 degree 5보다 여덟 배 나쁩니다. degree 3과 degree 11에게 training range 바로 바깥인 에서 예측하게 해 봅니다.
degree 3: predicts -1.053 (truth -0.012)
degree 11: predicts +61.224 (truth -0.012)정답은 대략 0인데 61입니다. 모델은 함수를 배운 것이 아니라 열두 점을 배웠고, 그 사이에서는 산술이 요구하는 무엇이든 합니다.
이것이 overfitting입니다. 그 반대는 degree 1처럼 curve를 전혀 표현하지 못해 어디서나 나쁜 underfitting입니다. 고전적인 설명은 모델의 expected error를 세 부분으로 나눕니다. bias는 모델이 진실을 표현하기에 너무 rigid해서 생기는 error이고, variance는 모델이 너무 flexible해서 이 특정 sample의 noise를 쫓기 때문에 생기는 error이며, 마지막은 무엇으로도 고칠 수 없는 irreducible noise입니다. 단순한 모델은 biased되어 있고, flexible한 모델은 high-variance입니다. 고전적인 처방은 중간의 sweet spot을 찾는 것입니다. 위 표에서는 degree 5입니다.
표준 도구들은 모두 variance 항을 공격합니다.
- L2 regularisation(weight decay)은 loss에 를 더해 weight를 0 쪽으로 당기고 함수를 더 smooth하게 만듭니다. 위 표에서 degree 11의 가장 큰 coefficient가 문제를 일으킵니다. 크기에 penalty를 주면 이를 완화합니다.
- L1은 대신 를 더합니다. 차이는 cosmetic하지 않습니다. L2의 gradient는 weight에 비례하므로 weight가 줄어들수록 작아져 0에 가까워지지만 도달하지는 않습니다. 반면 L1의 gradient는 상수 라서 끝까지 계속 밀어붙입니다. 따라서 L1은 정확히 0인 weight를 만듭니다. feature를 선택하는 것입니다. L2는 작은 weight를 만듭니다. smoothness를 원하면 L2를, sparsity를 원하면 L1을 사용합니다.
- Dropout7은 각 training step에서 activation의 random subset을 0으로 만들어 어떤 unit도 특정 다른 unit이 존재한다고 rely하지 못하게 합니다.
- Early stopping은 validation loss를 지켜보다가 올라가기 시작하면 멈춥니다.
- Data augmentation은 가진 example로부터 더 많은 training example을 만들어 냅니다. 문제의 근원을 공격하는 것입니다. overfitting은 파라미터 과잉만큼이나 데이터 부족입니다.
- Cross-validation은 데이터를 개 방식으로 나누고 번 학습합니다. held-out set을 따로 둘 만큼 데이터가 많지 않을 때 test error의 reliable estimate를 사는 방법입니다.
Double descent, 또는 앞 절이 전체 이야기가 아닌 이유
섹션 링크: Double descent, 또는 앞 절이 전체 이야기가 아닌 이유이제 그 그림을 깨는 사실입니다.
bias-variance 이야기는 sweet spot을 지나면 파라미터가 많을수록 generalisation이 나빠진다고 말합니다. 현대 language model은 고전 규칙이 허용하는 것보다 훨씬 많은 파라미터를 가지고, 자신이 보는 데이터에 비해 거대하며, 그럼에도 훌륭하게 generalise합니다. 두 문장은 모두 참이고, 둘을 화해시키는 것이 이 장에서 가장 유용한 부분입니다.
training point 40개, 20차원 input, random ReLU feature, 그리고 feature 수 를 2에서 5000까지 sweep합니다. fit하는 해가 여러 개 있을 때는 minimum-norm solution을 고릅니다.
| train RMSE | test RMSE | |||
|---|---|---|---|---|
| 10 | 0.25 | 0.8822 | 1.2520 | 1.89 |
| 20 | 0.50 | 0.5962 | 1.1634 | 2.59 |
| 30 | 0.75 | 0.3896 | 1.5323 | 4.15 |
| 38 | 0.95 | 0.1769 | 3.7163 | 10.25 |
| 40 | 1.00 | 0.0000 | 5.8140 | 14.83 |
| 42 | 1.05 | 0.0000 | 3.1623 | 9.35 |
| 60 | 1.50 | 0.0000 | 1.1058 | 2.78 |
| 200 | 5.00 | 0.0000 | 0.6638 | 0.98 |
| 1500 | 37.50 | 0.0000 | 0.5859 | 0.33 |
| 5000 | 125.00 | 0.0000 | 0.5664 | 0.18 |
세 부분으로 읽어 봅니다. 까지는 고전 이야기가 정확히 맞습니다. error가 떨어지다가 다시 오르기 시작합니다. 에서 — 모델이 모든 training point를 정확히 지나갈 만큼의 파라미터를 갖는 interpolation threshold에서 — test error는 5.81로 정점을 찍습니다. 작은 모델보다 다섯 배 나쁩니다. 이 peak는 고전적인 경고이고, 실제입니다.
그다음 다시 내려갑니다. 그리고 계속 내려갑니다. 을 지나고, 를 지나, 까지 내려갑니다. test error 0.5664는 최고의 under-parameterised model이 달성한 값보다 더 좋습니다. 40개 점에 fit한 5000개 파라미터 모델이 이 표에서 가장 좋은 모델입니다.
이것이 double descent89이며, mechanism은 마지막 열에 보입니다. 가 되면 training data를 정확히 fit하는 파라미터 설정이 무한히 많고, 어떤 것을 얻느냐는 선택 방식에 달려 있습니다. minimum-norm solution은 가장 작은 것을 고르고, 는 그 의미를 보여 줍니다. threshold에서 14.83으로 peak를 찍습니다. 그 지점에는 interpolation solution이 정확히 하나뿐이라, 아무리 극단적이어도 그것에 갇힙니다. 그리고 가 커질수록 단조롭게 감소합니다. 파라미터가 많다는 것은 선택할 수 있는 interpolation solution이 더 많다는 뜻이고, 따라서 사용할 수 있는 것 중 가장 작은 해가 더 작아진다는 뜻입니다. 에서 norm은 0.18로, threshold에서보다 80배 작습니다.
그러므로 추가 파라미터는 complexity를 더하는 것이 아닙니다. 선택권을 더합니다. 그리고 selection rule은 그 선택권을 simplicity에 씁니다. regularisation은 loss function 안에 있지 않습니다. algorithm 안에 있습니다. 작은 초기화에서 시작한 gradient descent는 small-norm solution 쪽으로 documented bias를 갖습니다. 그래서 이 behavior는 위의 linear algebra에서만이 아니라 일반적인 방식으로 학습한 실제 네트워크에서도 나타납니다.
10장이 의존하는 실용적 결론은 이것입니다. “모델의 파라미터가 데이터보다 많으니 overfit할 것이다”는 유효한 주장이 아닙니다. 모델이 threshold의 왼쪽에 있던 시절에는 좋은 규칙이었습니다. 지금 흥미로운 모든 것은 그 오른쪽 멀리에 있고, 그곳에서는 규칙이 뒤집힙니다.
다음으로 가는 곳
섹션 링크: 다음으로 가는 곳이 장의 도구만으로도 표에 넣을 수 있는 데이터, 즉 숫자 행과 label 열이 있는 데이터에서 작동하는 네트워크를 학습할 수 있습니다.
언어는 그렇지 않습니다. 모델이 다음 단어를 예측하기 전에, 무엇이 “단어”인지부터 누군가 결정해야 합니다. 그리고 답은 글자도 단어도 아니라, training data의 raw byte에서 모델이 배우는 vocabulary입니다. training이 시작되기 전에 한 번 내려지는 이 결정은 모델이 말할 수 있는 것의 수, 요청 비용, 그리고 법학 시험을 통과할 수 있는 모델이 strawberry의 글자 수를 안정적으로 세지 못하는 이유를 결정합니다.
7장에서는 tokenizer를 만듭니다.
출처와 방법
섹션 링크: 출처와 방법위에서 사용한 residual connection에 대해서는 He et al., Deep Residual Learning for Image Recognition (arXiv:1512.03385)를 참고하세요. Andrej Karpathy의 Building makemore Part 3: Activations & Gradients, BatchNorm은 실제 모델에서 activation-histogram 진단을 따라가며, 이 장의 전반부를 다루는 최고의 hands-on 자료입니다. Yaser Abu-Mostafa의 Learning From Data 강의 8과 11–13은 이 장이 한 문단으로 압축한 부분까지 포함해 고전적인 generalisation theory를 제대로 설명합니다.
-
Glorot, X. and Bengio, Y. Understanding the difficulty of training deep feedforward neural networks. AISTATS (2010). 위 박스에 재현한 variance-preservation 논증입니다. ↩
-
He, K., Zhang, X., Ren, S. and Sun, J. Delving Deep into Rectifiers: Surpassing Human-Level Performance on ImageNet Classification. arXiv:1502.01852 (2015). ↩
-
Ioffe, S. and Szegedy, C. Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift. arXiv:1502.03167 (2015). 제목의 “internal covariate shift” 설명은 이후 상당한 반박을 받았습니다. layer는 작동하지만, 왜 작동하는지에 대한 원래 설명은 논쟁 중입니다. ↩
-
Ba, J. L., Kiros, J. R. and Hinton, G. E. Layer Normalization. arXiv:1607.06450 (2016). ↩
-
Kingma, D. P. and Ba, J. Adam: A Method for Stochastic Optimization. arXiv:1412.6980 (2014). ↩
-
Loshchilov, I. and Hutter, F. Decoupled Weight Decay Regularization. arXiv:1711.05101 (2017). ↩
-
Srivastava, N., Hinton, G., Krizhevsky, A., Sutskever, I. and Salakhutdinov, R. Dropout: A Simple Way to Prevent Neural Networks from Overfitting. JMLR 15, pp. 1929–1958 (2014). ↩
-
Belkin, M., Hsu, D., Ma, S. and Mandal, S. Reconciling modern machine-learning practice and the classical bias–variance trade-off. PNAS 116(32), pp. 15849–15854 (2019). 이 현상에 이름을 붙인 논문입니다. ↩
-
Nakkiran, P., Kaplun, G., Bansal, Y., Yang, T., Barak, B. and Sutskever, I. Deep Double Descent: Where Bigger Models and More Data Hurt. arXiv:1912.02292 (2019). 실제 deep network에서, 그리고 model size 축뿐 아니라 training time 축에서도 이 효과를 보여 줍니다. ↩