핵심 기법 · 4
레이어 정규화
레이어 정규화 — Ba, Kiros & Hinton, 2016 — 는 배치 정규화처럼 배치 전체가 아니라 각 샘플을 자기 feature 들로 정규화한다. 그래서 배치 크기와 무관하고 train·eval 에서 동일하다 — 그래서 트랜스포머가 대신 이걸 쓴다. 아래 모든 것은 이 페이지에서, 양 언어로 돈다.
각 행을 자기 feature 들로 정규화
평균과 퍼짐이 제각각인 행들을 준다. LayerNorm([4]) 는 각 행을 따로,
그 네 feature 에 걸쳐 중심화하고 스케일한다 — 그래서 출력의 모든 행이 평균 약 0 으로
나온다.
배치 무관, 그리고 train·eval 동일
각 행이 따로 정규화되므로, 한 행의 답은 주변 배치에 의존하지 않는다 — 그리고 running
통계가 없어서 train() 과 eval() 이 같은 일을 한다. 이것이 바로
배치 정규화에 없는 성질이다.
직접: 행을 중심화하기
이 블록은 출력의 가장 큰 행 평균을 보고한다. 날것의 행은 큰 평균을 지녀 0 에서 멀다 —
x 를 LayerNorm 에 통과시켜 각 행을 중심화하면 가장 큰 행
평균이 0 으로 떨어진다.
행이 중심화되는 것, 그려보기
행 평균이 들쭉날쭉한 배치가 들어가(위) 모든 행이 중심화되어 나온다(아래). 배치 정규화가 열을 고르게 했다면, 레이어 정규화는 행을 고르게 한다 — 각 샘플을 따로, 그래서 배치가 필요 없다.
기억할 것
- 레이어 정규화는 각 샘플을 자기 feature(행)로 정규화한다, 배치가 아니라.
- 그래서 배치 무관하고 train·eval 이 같다 — running 통계가 없다.
- 그래서 트랜스포머가 쓴다: 어텐션엔 정규화할 고정 배치 구조가 없다.
- borch 에서는
nn.LayerNorm([features]).
위 블록이 에러를 내면, 그것도 알아둘 값이다. 이 페이지의 모든 예제는
테스트가 도는 그 라이브러리를 상대로 돈다 — 스크린샷이 아니다. 되돌리려면 Reset 을
누른다.