층 정규화 계산

숫자 여섯 개를 평균 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편에서 다룹니다.

다음 편

다음 부품은 값을 굽히는 계산입니다

6편꺾을까, 굽힐까 6강 목록