층 정규화 계산
숫자 여섯 개를 평균 0, 분산 1로 바꾸려면?
1단계
모든 숫자에서 평균을 뺍니다
앞 편에서 본 숫자 여섯 개입니다. 평균 0.1324를 빼면 가운데가 0으로 옵니다.
2단계
흩어진 정도로 나눕니다
분산 0.0231의 제곱근인 0.152로 나눕니다. 제곱근은 두 번 곱하면 그 수가 되는 수입니다(0.152 × 0.152 ≈ 0.0231). 좁게 모여 있던 숫자들이 넓게 펴져 분산이 1이 됩니다.
분산은 평균에서 떨어진 거리를 제곱해서 모은 값이라, 제곱근을 구해야 원래 숫자와 같은 눈금으로 돌아옵니다. 이 값을 표준편차라고 합니다. 분산이 0이면 나눌 수 없어서, 실제 코드는 분산에 0.00001을 더한 뒤 계산합니다.
결과
두 입력 모두 평균 0, 분산 1
눈금이 달랐던 두 입력이 같은 눈금 위에 놓였습니다. 숫자 사이의 크고 작은 순서는 그대로입니다.
덧붙이는 것
훈련으로 조절하는 손잡이 두 개
정규화한 값에 수 하나를 곱하고 수 하나를 더할 수 있게 해 둡니다. 처음에는 1을 곱하고 0을 더해 아무것도 바꾸지 않습니다. 알맞은 값은 훈련하면서 찾습니다.
코드에서는 scale, shift라는 이름입니다. 그림에서 움직이는 값은 예시입니다.
맞추는 방향
입력 하나 안에서만 맞춥니다
층 정규화는 함께 들어온 다른 문장을 보지 않습니다. 그래서 한꺼번에 넣는 문장 수가 바뀌어도 결과가 같습니다.
배치 정규화는 여러 입력에 걸쳐 맞추는 다른 방식입니다.
GPT에서의 자리
세 군데에 들어갑니다
블록 안에서 어텐션 앞과 피드 포워드 앞에 하나씩, 맨 끝 출력 층 앞에 하나 더 있습니다. 부품에 넣기 전에 눈금부터 맞추는 셈입니다.
피드 포워드는 6편과 7편에서 다룹니다.
다음 편