핵심 기법 · 2
Dropout: 노이즈로 학습하기
Dropout — Srivastava et al., 2014 — 은 학습 중 활성값을 무작위로 0 으로 만들어, 망이 어느 한 유닛에 기대지 못하게 한다. 값싸고 강한 정규화다. 평가 때는 꺼져서 항등이 되는데 — 그 전환을 잊는 것이 가장 흔한 초심자 버그다. 아래 모든 것은 이 페이지에서, 양 언어로 돈다.
활성값을 무작위로 0 으로
Dropout(0.5) 층은 학습 중 각 값을 확률 1 - p 로 남기고
나머지를 0 으로 만든 뒤, 남은 것을 1 / (1 - p) 로 키운다 — 평균 크기가
바뀌지 않도록 (inverted dropout).
매번 다르다 — eval() 전까지
마스크가 무작위라, 학습 모드의 두 forward 는 서로 다르다. eval() 을
부르면 층은 항등이 된다: 같은 입력이 매번 같은 출력을 낸다. train() 은
다시 켠다.
직접: eval 모드에서 측정하기
이 블록은 같은 입력을 두 번 재고 두 run 사이의 gap 을 보고한다. 측정은 반복 가능해야
하니 gap 은 0 이어야 하는데 — 층이 아직 drop 하고 있다. eval() 로 바꿔
두 run 이 일치하게 하라.
Dropout, 그려보기
1 로 채운 격자를 학습 모드의 dropout 층에 통과시키면 — 절반쯤은 어두워지고(0) 나머지는 밝아진다(스케일업). 다시 돌리면 다른 마스크 — 그 무작위성이 정규화다.
기억할 것
- Dropout 은 학습 중 각 활성값을 확률
p로 0 으로 만들고, 남은 것을1/(1-p)로 키운다. - 망이 어느 한 유닛에 기대지 못하게 한다 — 값싸고 강한 정규화.
eval()에서는 꺼져 항등이 된다; 그 전환을 잊는 게 고전적 버그.- borch 에서는
nn.Dropout(p),train()/eval()로 전환.
위 블록이 에러를 내면, 그것도 알아둘 값이다. 이 페이지의 모든 예제는
테스트가 도는 그 라이브러리를 상대로 돈다 — 스크린샷이 아니다. 되돌리려면 Reset 을
누른다.