레이어 정규화(Layer Normalization)란? AI가 특징값의 척도를 맞추는 방법
TL;DR
레이어 정규화는 각 입력을 다른 입력과 섞지 않고 지정된 특징 축의 평균과 분산으로 정규화하는 신경망 층입니다. 정규화한 값에는 학습 가능한 감마와 베타를 적용해 필요한 크기와 위치를 다시 배웁니다. 배치 통계나 이동 평균에 기대지 않아 학습과 추론에서 같은 방식으로 계산하지만 정규화할 축과 텐서 모양을 잘못 지정하면 의도와 다른 값이 만들어집니다.
핵심 3줄 요약
- 핵심 1
한 입력 안에서 계산합니다. 다른 샘플의 값이나 미니배치 크기에 의존하지 않습니다. - 핵심 2
평균 0·분산 1에 가깝게 표준화합니다. 그 뒤 감마와 베타로 필요한 표현 범위를 다시 조정합니다. - 핵심 3
축 설정이 결과를 좌우합니다. 마지막 특징 축만 볼지 여러 축을 함께 볼지 텐서 모양에 맞춰 정해야 합니다.
이 글에서 다룰 내용
- 레이어 정규화의 한 문장 정의
- 세 개의 특징값으로 보는 쉬운 계산 예시
- 평균·분산·엡실론·감마·베타가 맡는 역할
- 배치 정규화·인스턴스 정규화·그룹 정규화·RMSNorm과의 차이
- 트랜스포머와 다른 신경망에서 쓰는 이유
- 프레임워크 구현과 모델 변환 전 확인할 항목
- AI 초보자가 자주 묻는 질문
레이어 정규화를 한 문장으로 정의하면 무엇인가요?
레이어 정규화(Layer Normalization)는 각 입력 사례 안에서 지정된 특징 축의 평균과 분산을 계산해 값을 표준화한 뒤, 학습 가능한 크기와 편향을 적용하는 신경망 층입니다.
원 논문은 한 학습 사례의 층 내부 뉴런 입력들에서 평균과 분산을 구하는 방식으로 레이어 정규화를 설명합니다. 핵심은 통계를 구할 때 같은 미니배치의 다른 사례를 섞지 않는다는 데 있습니다. 샘플마다 자체 통계를 사용하므로 배치에 어떤 사례가 함께 들어왔는지가 계산의 직접 조건이 되지 않습니다.
PyTorch에서는 normalized_shape가 가리키는 마지막 차원들에서 평균과 표준편차를 계산합니다. TensorFlow에서는 axis로 정규화할 축을 지정합니다. 두 구현 모두 보통 정규화 뒤에 학습 가능한 감마와 베타를 적용하지만 기본 엡실론 같은 세부값은 프레임워크마다 다를 수 있습니다.
한 줄 정리: 레이어 정규화는 한 샘플의 특징값끼리 기준을 맞추고 필요한 크기와 위치는 다시 학습하게 하는 층입니다.
쉬운 예시로 이해해 볼까요?
한 토큰을 나타내는 특징 벡터가 [2, 4, 6]이라고 가정해 보겠습니다. 이 세 값은 같은 토큰의 서로 다른 특징이며 레이어 정규화가 마지막 특징 축을 대상으로 계산한다고 하겠습니다.
- 평균: 세 값을 더해 3으로 나눈 4
- 분산: 평균에서 떨어진 정도를 제곱해 평균한 약 2.67
- 표준화 결과: 엡실론을 잠시 생략하면 약 [-1.22, 0, 1.22]
가운데 값 4는 평균과 같아서 0이 되고 2와 6은 평균에서 같은 거리만큼 떨어져 부호가 반대인 값이 됩니다. 이 단계만 보면 값의 중심은 0, 분산은 1에 가까워집니다.
실제 층은 여기서 끝나지 않습니다. 표준화 결과에 감마를 곱하고 베타를 더합니다. 모델은 학습 과정에서 감마와 베타를 조정해 각 특징을 다시 키우거나 줄이고 중심을 옮길 수 있습니다. 따라서 레이어 정규화의 최종 출력이 언제나 평균 0과 분산 1인 것은 아닙니다.
쉬운 예시: 사진의 밝기 자체를 없애는 것이 아니라 서로 다른 특징의 눈금을 먼저 맞춘 뒤, 모델이 필요한 강조를 다시 배우게 한다고 생각하면 됩니다.
왜 AI 모델에서 레이어 정규화가 중요한가요?
배치 구성에 덜 의존합니다
배치 정규화는 보통 미니배치에서 각 특징의 통계를 구합니다. 레이어 정규화는 각 사례 안에서 통계를 구하므로 배치 크기가 작아지거나 사례가 한 건씩 들어오는 상황에서도 같은 계산 원리를 유지합니다. 온라인 처리나 길이가 제각각인 시퀀스에서 이 차이가 중요해집니다.
배치에 다른 샘플이 추가됐다고 해서 한 샘플의 정규화 통계가 함께 바뀌지 않습니다. 다만 배치에 독립적이라는 말이 모델 전체 출력까지 항상 같다는 뜻은 아닙니다. 드롭아웃, 마스킹, 수치 정밀도와 다른 연산은 별도로 영향을 줄 수 있습니다.
학습과 추론의 계산이 같습니다
원 논문과 PyTorch 문서는 레이어 정규화가 학습과 평가에서 입력으로부터 통계를 계산한다고 설명합니다. 배치 정규화처럼 학습 중 누적한 이동 평균과 이동 분산을 추론 때 따로 불러오는 방식이 아닙니다.
따라서 train 모드와 eval 모드 전환 때문에 정규화 통계가 바뀌는 문제는 줄어듭니다. 그렇다고 모드 전환이 필요 없다는 뜻은 아닙니다. 모델 안의 드롭아웃처럼 학습과 추론 동작이 다른 다른 층은 여전히 올바른 모드로 설정해야 합니다.
트랜스포머 블록의 값 범위를 관리합니다
원래 트랜스포머 논문은 인코더와 디코더의 각 하위 층에 잔차 연결을 두고 그 뒤에 레이어 정규화를 적용했습니다. TensorFlow 트랜스포머 튜토리얼도 Add & Norm 블록에서 잔차 연결 결과를 LayerNormalization에 넣어 출력의 척도를 관리하는 구조를 보여 줍니다.
현대 모델에는 정규화 위치와 형태가 다른 변형도 많습니다. 레이어 정규화가 들어간다는 사실만 보고 구조가 모두 같다고 판단하지 말고 정규화를 하위 층 앞에 두는지 뒤에 두는지와 실제 구현을 확인해야 합니다.
레이어 정규화는 어떻게 작동하나요?
1. 정규화할 축을 정합니다
입력 텐서가 [배치, 토큰, 특징] 모양이고 마지막 특징 축의 크기가 768이라면, 각 배치의 각 토큰마다 768개 특징에서 평균과 분산을 따로 계산하는 구성이 흔합니다. PyTorch의 nn.LayerNorm(768)과 TensorFlow의 LayerNormalization(axis=-1)이 대표적인 예입니다.
이미지 텐서에서는 마지막 채널만 정규화할 수도 있고 채널·높이·너비를 함께 대상으로 삼을 수도 있습니다. 어느 방식이 맞는지는 모델 설계와 텐서 배치 순서에 달려 있습니다. 이름이 LayerNorm이라고 해서 모든 차원을 자동으로 알맞게 고르는 것은 아닙니다.
2. 평균과 분산으로 표준화합니다
선택한 축의 평균을 각 값에서 빼고 분산에 작은 엡실론을 더한 뒤 제곱근으로 나눕니다. 평균을 빼면 값의 중심이 0 쪽으로 이동하고 표준편차로 나누면 서로 다른 입력의 척도를 맞추기 쉬워집니다.
엡실론은 분산이 0이거나 매우 작을 때 0으로 나누거나 수치가 불안정해지는 문제를 줄입니다. PyTorch와 TensorFlow 문서의 기본 엡실론은 서로 다르므로 모델을 옮기거나 결과를 맞출 때 설정값을 명시해서 비교해야 합니다.
3. 감마와 베타를 적용합니다
표준화한 값에는 학습 가능한 감마를 곱하고 베타를 더합니다. 감마는 특징별 크기를 조정하고 베타는 중심을 옮깁니다. 초기값은 보통 감마 1, 베타 0이어서 학습 시작 시 표준화 결과를 크게 바꾸지 않습니다.
PyTorch는 elementwise_affine 옵션으로 이 학습 가능한 변환을 켜거나 끕니다. TensorFlow는 scale과 center 옵션으로 감마와 베타 사용 여부를 나눕니다. 이름과 옵션이 다르므로 설정 파일을 단순히 글자 단위로 옮기면 같은 모델이 되지 않을 수 있습니다.
4. 입력과 같은 모양으로 출력합니다
레이어 정규화는 값을 바꾸지만 일반적으로 입력 텐서의 차원과 크기는 유지합니다. ONNX의 LayerNormalization 연산자도 출력 Y와 입력 X가 같은 모양이라고 정의합니다. 그래서 잔차 연결처럼 두 텐서를 더해야 하는 구조에 넣기 쉽습니다.
핵심 인사이트: 레이어 정규화의 핵심 설정은 정규화 층의 이름보다 어떤 축에서 통계를 구하고 감마·베타를 어떤 모양으로 적용하는지에 있습니다.
레이어 정규화와 헷갈리는 용어는 무엇이 다른가요?
배치 정규화와 레이어 정규화의 차이
배치 정규화는 같은 특징을 여러 샘플에서 모아 미니배치 통계를 구하는 방식이 일반적입니다. 레이어 정규화는 한 샘플 안의 지정된 특징들을 모아 통계를 구합니다. 전자는 배치 축과 학습·추론 모드가 중요하고 후자는 특징 축과 normalized_shape 또는 axis 설정이 중요합니다.
둘 다 평균과 분산, 감마와 베타를 사용할 수 있지만 교환 가능한 같은 층은 아닙니다. 이미 학습한 모델에서 BatchNorm을 LayerNorm으로 단순 교체하면 계산 대상과 학습된 파라미터의 의미가 달라져 성능이 유지된다고 볼 수 없습니다.
인스턴스 정규화와의 차이
인스턴스 정규화도 샘플별로 계산하지만 이미지에서는 보통 각 채널의 공간 축에서 통계를 구합니다. 레이어 정규화는 설정한 마지막 차원들이나 axis 전체를 기준으로 삼습니다. 같은 입력이라도 어떤 차원을 함께 묶는지가 다릅니다.
그룹 정규화와의 차이
그룹 정규화는 채널을 여러 그룹으로 나누고 각 그룹 안에서 정규화합니다. 배치 크기에 덜 의존한다는 공통점은 있지만 채널을 그룹으로 나눈다는 설계가 추가됩니다. TensorFlow 문서는 감마·베타를 두는 축에 따라 그룹 크기 1인 구현도 해당 LayerNormalization 구현과 정확히 같지 않을 수 있다고 경고합니다.
RMSNorm과의 차이
RMSNorm은 제곱평균제곱근을 이용해 크기를 조정하며 일반적인 레이어 정규화처럼 평균을 빼는 중심화 단계를 생략합니다. 비슷한 위치에 쓰일 수 있어도 계산식과 파라미터가 다릅니다. 모델 문서에 RMSNorm이라고 적혀 있다면 LayerNorm으로 바꿔 읽지 않아야 합니다.
정규화와 정규화 규제의 차이
레이어 정규화의 normalization은 활성값의 중심과 척도를 다루는 계산입니다. 과적합을 줄이려고 손실에 벌점을 더하는 regularization과는 다른 개념입니다. 한국어에서 둘 다 정규화라고 부르는 경우가 있어 원문 용어와 계산 목적을 함께 확인하는 편이 안전합니다.
비교 정리: 배치 정규화는 여러 샘플의 같은 특징, 레이어 정규화는 한 샘플의 지정된 특징, 그룹 정규화는 한 샘플 안의 채널 그룹에서 통계를 구합니다.
실전에서는 어디에 쓰이나요?
트랜스포머의 Add & Norm 블록
어텐션이나 피드포워드 하위 층의 출력에 잔차 연결을 더한 뒤 값의 척도를 관리하는 데 쓰입니다. 원래 트랜스포머는 하위 층 뒤에 정규화를 두었지만 다른 모델은 앞에 두기도 합니다. 모델을 읽을 때는 LayerNorm 존재 여부와 함께 위치를 확인해야 합니다.
RNN과 시퀀스 모델
원 논문은 레이어 정규화를 순환 신경망에 적용하기 쉽다고 설명합니다. 각 시간 단계의 한 사례 안에서 통계를 계산하므로 시퀀스 길이에 따라 별도의 미니배치 통계를 관리하는 부담을 줄입니다.
작은 배치의 학습과 추론
메모리 제약으로 배치를 크게 만들기 어렵거나 한 요청씩 처리하는 서비스에서는 배치 통계에 기대지 않는 성질이 유용합니다. 다만 레이어 정규화가 작은 배치에서 언제나 최고의 성능을 보장하는 것은 아닙니다. 모델 구조와 학습 조건에 맞춰 비교해야 합니다.
모델 교환과 추론 엔진
ONNX는 LayerNormalization을 정식 연산자로 정의하고 평균, 분산, 엡실론, 스케일과 편향의 계산을 명시합니다. PyTorch나 TensorFlow 모델을 다른 추론 엔진으로 내보낼 때는 이 연산자로 변환됐는지, 축과 엡실론과 계산 정밀도가 보존됐는지 확인합니다.
실전 팁: 모델 요약에서 LayerNorm 이름만 찾지 말고 입력 모양, 정규화 축, 엡실론, 감마·베타 사용 여부를 한 묶음으로 기록하세요.
레이어 정규화를 적용할 때 어떤 순서로 확인하나요?
1. 입력 텐서의 차원 순서를 적습니다
먼저 텐서가 [배치, 토큰, 특징]인지 [배치, 채널, 높이, 너비]인지 확인합니다. 차원 이름을 모른 채 -1이나 normalized_shape를 복사하면 우연히 실행은 되더라도 의도와 다른 축을 정규화할 수 있습니다.
2. 정규화 축과 파라미터 모양을 맞춥니다
PyTorch에서는 normalized_shape가 입력의 마지막 차원들과 정확히 맞는지 봅니다. TensorFlow에서는 axis에 지정한 차원의 크기가 빌드 시점에 정의돼 있는지 확인합니다. 감마와 베타가 어느 축으로 방송되는지도 함께 봅니다.
3. 엡실론과 데이터 형식을 기록합니다
엡실론은 작아 보여도 저정밀도 계산이나 분산이 작은 입력에서 결과에 영향을 줄 수 있습니다. float32, float16, bfloat16처럼 계산 형식이 달라질 때는 정규화 내부가 어떤 정밀도로 실행되는지 확인합니다. ONNX의 stash_type도 이런 계산 정밀도와 관련됩니다.
4. 학습과 추론 출력을 비교합니다
같은 입력과 같은 가중치라면 레이어 정규화 자체는 학습과 평가에서 같은 통계를 사용해야 합니다. 차이가 난다면 드롭아웃, 혼합 정밀도, 융합 연산, 파라미터 로딩과 주변 층을 분리해서 점검합니다.
5. 모델 변환 뒤 수치 차이를 검사합니다
프레임워크에서 내보낸 모델과 추론 엔진 모델에 같은 작은 입력을 넣고 중간 출력과 최종 출력을 비교합니다. 허용 오차만 보지 말고 축, 엡실론, 감마·베타, 연산 순서가 그대로 옮겨졌는지 확인해야 원인을 찾기 쉽습니다.
한 줄 정리: 입력 모양을 적고 축을 정한 뒤 엡실론·파라미터·정밀도를 고정하고 같은 입력으로 변환 전후 출력을 비교합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 배치 정규화와 같은 층으로 취급하지 않습니다. 통계를 구하는 축과 학습·추론 동작이 다릅니다. 최근 글에서 다룬 배치 정규화의 이동 통계를 레이어 정규화에 그대로 적용하지 않습니다.
둘째, 마지막 축이라는 가정을 확인합니다. 언어 모델의 [배치, 토큰, 특징] 배열에서는 마지막 특징 축이 자연스러운 경우가 많지만 모든 텐서가 이 순서를 따르지는 않습니다. 전치와 reshape 뒤에는 축 번호가 달라질 수 있습니다.
셋째, 최종 출력이 항상 평균 0·분산 1이라고 단정하지 않습니다. 표준화 단계 뒤에 감마와 베타가 적용되므로 학습된 출력의 중심과 분산은 달라질 수 있습니다.
넷째, 프레임워크 기본값을 같다고 가정하지 않습니다. PyTorch와 TensorFlow의 기본 엡실론은 다르고 파라미터 옵션 이름도 다릅니다. 모델 이식 때는 값을 명시해서 맞춥니다.
다섯째, 정규화만으로 학습 안정성을 보장한다고 보지 않습니다. 학습률, 옵티마이저, 초기화, 잔차 연결, 데이터와 수치 정밀도도 함께 영향을 줍니다. 손실이 불안정하면 레이어 정규화 하나만 바꾸기보다 전체 학습 설정을 점검합니다.
주의: 축을 잘못 지정한 레이어 정규화는 모양 오류를 내기도 하지만 방송 규칙 때문에 조용히 실행될 수도 있습니다. 실행 성공보다 의도한 차원에서 평균과 분산을 구했는지 확인하는 일이 먼저입니다.
자주 묻는 질문
Q1. 레이어 정규화와 배치 정규화는 무엇이 가장 다른가요?
통계를 구하는 범위가 가장 다릅니다. 배치 정규화는 보통 여러 샘플에서 같은 특징을 모으고 레이어 정규화는 한 샘플 안의 지정된 특징들을 모읍니다. 그래서 레이어 정규화는 미니배치 크기와 다른 샘플의 값에 직접 의존하지 않습니다.
Q2. 레이어 정규화는 학습할 때만 쓰나요?
아닙니다. 학습과 추론 모두에서 실행됩니다. 두 모드에서 현재 입력으로 평균과 분산을 계산하며 학습된 감마와 베타도 함께 적용합니다.
Q3. LayerNorm을 쓰면 배치 크기는 아무 상관이 없나요?
레이어 정규화 계산 자체는 다른 샘플의 배치 통계에 기대지 않습니다. 하지만 배치 크기는 기울기 노이즈, 메모리 사용량, 학습 속도와 옵티마이저 동작에 여전히 영향을 줍니다.
Q4. 감마와 베타는 왜 필요한가요?
표준화만 하면 모든 특징을 정해진 중심과 척도로 묶습니다. 감마와 베타는 모델이 특징별로 필요한 크기와 위치를 다시 학습하게 해 표현력을 보완합니다.
Q5. 엡실론은 작을수록 좋은가요?
그렇지 않습니다. 엡실론은 0으로 나누는 문제와 작은 분산에서의 수치 불안정을 줄이는 값입니다. 지나치게 작거나 다른 프레임워크와 다른 값을 쓰면 저정밀도 계산이나 모델 이식에서 차이가 커질 수 있으므로 구현 기본값과 원래 모델 설정을 따릅니다.
Q6. 트랜스포머는 모두 같은 위치에 LayerNorm을 두나요?
아닙니다. 원래 트랜스포머는 하위 층과 잔차 연결 뒤에 레이어 정규화를 두었지만 다른 구조는 하위 층 앞에 두거나 다른 정규화 변형을 씁니다. 모델 구조도와 실제 코드를 함께 확인해야 합니다.
출처
마무리
레이어 정규화는 한 입력 안의 지정된 특징 축에서 평균과 분산을 구해 값을 표준화하고 감마와 베타로 필요한 표현 범위를 다시 학습하는 층입니다. 다른 샘플의 미니배치 통계나 이동 평균을 쓰지 않아 학습과 추론에서 같은 계산 방식을 유지합니다.
초보자라면 세 가지만 기억하면 충분합니다. 배치 정규화와 통계 범위가 다르고 정규화 축이 결과를 결정하며 프레임워크마다 엡실론과 옵션 기본값이 다를 수 있습니다. 이 세 가지를 확인하면 트랜스포머 구조도와 모델 설정에서 LayerNorm이 왜 있고 무엇을 점검해야 하는지 훨씬 쉽게 읽을 수 있습니다.
