Ch.06
정규화 층: 층마다 스케일을 맞추는 법
딥러닝을 공부하다 보면 '정규화'라는 단어를 자주 마주치게 됩니다. 하지만 한글로는 똑같이 불리더라도, 과적합을 막기 위한 정규화(Regularization, 예: L2 규제, 드롭아웃)와 층마다 신호의 크기를 맞춰주는 정규화(Normalization, 예: 배치 정규화, 층 정규화)는 완전히 다른 역할을 합니다. 이번 장에서는 모델 내부에서 층이 전달하는 값(활성화값)이 너무 커지거나 작아지는 것을 방지하여, 모델이 흔들림 없이 안정적으로 학습할 수 있도록 돕는 정규화 층(Normalization Layer)에 대해 깊이 있게 다룹니다.
오케스트라 합주를 상상해 보세요. 바이올린은 소리가 너무 크고 피아노는 소리가 너무 작다면, 지휘자가 아무리 박자를 잘 맞춰도 아름다운 음악이 될 수 없습니다. 깊은 인경신경망도 마찬가지입니다. 층을 지날 때마다 신호의 크기가 들쭉날쭉해지면 학습 속도가 느려지거나 아예 학습이 멈춰버리는 현상이 발생합니다. 이를 해결하기 위해 여러 샘플을 한 묶음으로 보고 기준을 맞추는 배치 정규화(Batch Normalization)와, 샘플 단 하나 안에서 자체적으로 기준을 맞추는 층 정규화(Layer Normalization)가 등장했습니다. 학습할 때와 실제 서비스할 때 기준을 잡는 방식이 어떻게 달라지는지, 초보자도 이해하기 쉬운 비유와 함께 차근차근 정리해 드립니다.
아래 그림은 배치 정규화·층 정규화·학습/추론·역할 구분을 적용 전 → 적용 후로 쉽게 보여 줍니다.
왼쪽은 적용 전, 오른쪽은 적용 후입니다. 배치 정규화는 여러 샘플을 묶어 맞추고, 층 정규화는 샘플 하나 안에서 맞춥니다. 학습 때는 지금 배치 기준, 서비스 때는 쌓아 둔 기준을 씁니다. 과적합 방지(L2·드롭아웃)는 외우기·가중치, 정규화 층은 신호 크기를 다룹니다.
층마다 신호 크기 맞추기
학습을 안정화하고, 역할을 구분하기
정규화 층: 층마다 스케일을 맞추는 법
1. 왜 층마다 스케일을 맞춰야 할까요?
쉬운 설명: 신경망은 여러 개의 층(Layer)을 통과하며 정답을 찾아갑니다. 그런데 앞쪽 층의 가중치가 학습 과정에서 미세하게 변하면, 뒤쪽 층이 전달받는 데이터의 크기나 분포는 눈덩이처럼 크게 달라질 수 있습니다. 이렇게 층마다 들어오는 신호가 요동치는 현상(내부 공변량 변화)이 생기면 모델은 헷갈려서 학습을 제대로 하지 못합니다.
비유: 이어달리기를 할 때 앞 주자가 일정한 속도로 달려와야 다음 주자가 바통을 안정적으로 받을 수 있습니다. 앞 주자가 갑자기 전력 질주를 하다가 다음번엔 기어오면, 다음 주자는 타이밍을 맞출 수 없겠죠. 정규화 층은 각 층이 전달하는 신호의 '보폭'을 일정하게 맞춰주어 다음 층이 항상 안정적인 범위의 신호를 받게 해줍니다.
실전 팁: 모델 학습 중 손실(Loss) 값이 갑자기 미친 듯이 튀거나 기울기가 사라지는(Vanishing) 문제가 발생할 때, 무작정 학습률(Learning Rate)만 조절하기 전에 정규화 층이 올바르게 들어가 있는지, 학습/추론 모드가 잘 설정되어 있는지 먼저 확인하는 것이 좋습니다.
2. 배치 정규화(Batch Normalization) — 여러 샘플을 한 묶음으로 맞추기
쉬운 설명: 모델에 데이터를 넣을 때는 보통 여러 개를 한 묶음(미니배치)으로 넣습니다. 배치 정규화는 이 한 묶음의 데이터 전체를 기준으로, 각 데이터의 값이 묶음의 평균에서 얼마나 벗어나 있는지를 계산해 크기를 조절합니다. 너무 딱딱하게 0과 1 사이로만 고정하면 모델의 표현력이 떨어질 수 있으므로, 다시 크기와 위치를 유연하게 조절할 수 있는 학습 가능한 파라미터(, )를 곱하고 더해줍니다.
핵심 수식:
수식 한 줄 설명: 입력값 에서 현재 묶음의 평균 (뮤)를 빼고, 표준편차 (시그마)로 나누어줍니다. (입실론)은 분모가 0이 되어 계산이 터지는 것을 막아주는 아주 작은 안전장치입니다.
비유: 학교에서 시험을 본 뒤, 단순히 내 원점수가 아니라 '우리 반 전체 학생들의 평균과 표준편차'를 기준으로 내 성적이 어느 위치에 있는지(표준점수)를 계산하는 것과 같습니다.
실전 팁: 컴퓨터 비전(CNN) 모델에서 이미지를 32장, 64장씩 충분히 많이 묶어서 넣을 수 있을 때 매우 효과적이며, 주로 합성곱(Conv) 층이나 선형(Linear) 층 바로 뒤에 배치합니다.
3. 층 정규화(Layer Normalization) — 샘플 하나 안에서 밸런스 맞추기
쉬운 설명: 배치 정규화는 다른 샘플들을 참고해야 한다는 단점이 있습니다. 층 정규화는 다른 데이터는 전혀 신경 쓰지 않고, 오직 데이터 샘플 딱 1개가 가진 여러 특징(Feature) 값들의 평균과 분산만을 구해서 기준을 맞춥니다. 한 번에 데이터를 1개씩만 처리해야 하거나, 문장 길이가 제각각인 자연어 처리 모델(Transformer, RNN)에서 진가를 발휘합니다.
비유: 반 전체 학생들의 수학 점수 평균을 구하는 것이 '배치 정규화'라면, '층 정규화'는 한 학생이 본 국어, 영어, 수학, 과학 점수들의 자체 평균을 내서 그 학생 안에서만 과목별 밸런스를 맞추는 것입니다. 옆자리에 앉은 다른 학생의 성적은 전혀 신경 쓰지 않죠.
실전 팁: ChatGPT의 뼈대가 되는 Transformer 블록이나 RNN/LSTM에서는 층 정규화가 필수 공식처럼 쓰입니다. 메모리가 부족해 미니배치 크기를 1~2로 둬야 할 때도 배치 정규화 대신 층 정규화를 사용하는 것이 안전합니다.
4. 학습(Train) vs 추론(Inference) — 배치 정규화의 두 얼굴
쉬운 설명: 배치 정규화는 학습할 때와 서비스(추론)할 때 행동 양식이 다릅니다. 학습할 때는 '지금 막 들어온 미니배치'를 기준으로 정규화하면서, 동시에 전체 데이터의 평균과 퍼짐 정도(이동 평균)를 몰래 차곡차곡 기록해 둡니다. 반면 실제 서비스할 때는 사용자가 1장의 사진만 입력하더라도 당황하지 않고, 그동안 학습하며 쌓아 둔 통계 기준을 사용하여 정규화를 수행합니다.
비유: 축구 국가대표팀 훈련(학습) 때는 '오늘 연습에 참여한 선수들'의 컨디션을 기준으로 훈련 강도를 맞춥니다. 하지만 실제 월드컵 경기(추론)에서는 '그동안 수십 번의 A매치를 거치며 쌓인 경험치'를 기준으로 선수들을 기용하고 전술을 펼치는 것과 같습니다.
실전 팁: PyTorch 같은 프레임워크에서는 `model.train()`과 `model.eval()` 코드로 이 모드를 전환합니다. 서비스를 배포할 때 `model.eval()`을 빼먹으면, 사용자가 사진을 올릴 때마다 기준이 달라져 엉뚱한 결과가 나옵니다. 반드시 배포 전 추론 모드를 켜는 습관을 들이세요.
한눈에 짚어보는 핵심 개념과 공식
배치 정규화(Batch Normalization) — 미니배치를 기준으로 전체적인 밸런스를 맞춥니다.
쉬운 설명: 깊은 신경망에서는 중간의 어떤 층이 갑자기 비정상적으로 큰 값이나 작은 값을 뱉어내면 다음 층이 충격을 받습니다. 배치 정규화는 한 번에 모델에 입력된 데이터 묶음(미니배치)의 수치들을 모아보고, "너는 우리 묶음 평균보다 좀 크니까 줄이고, 너는 작으니까 키우자" 식으로 밸런스를 조절합니다.
핵심 포인트: 한 번에 32개 이상 충분한 데이터를 넣을 수 있을 때 가장 강력합니다. 반면 한 번에 1~2개밖에 못 넣을 때는 기준이 흔들려 오히려 해로울 수 있습니다.
실생활 비유: 학교에서 시험을 본 후, 내 점수가 '우리 반 전체 평균'보다 얼마나 높은지를 기준으로 표준점수를 내는 것과 완벽히 같습니다.
층 정규화(Layer Normalization) — 샘플 하나 안에서 독립적으로 밸런스를 맞춥니다.
쉬운 설명: 챗봇 모델처럼 문장 길이가 제각각인 데이터를 다룰 때는 데이터를 한 번에 예쁘게 묶기가 어렵습니다. 이때는 다른 데이터를 전혀 참고하지 않고, 단 하나의 샘플(하나의 문장)이 가진 정보들 안에서 자체적으로 평균을 내고 기준을 맞춥니다.
핵심 포인트: 한 번에 데이터를 1개씩만 처리해도 완벽하게 작동합니다. Transformer 기반 대형 언어 모델(LLM)의 핵심 부품입니다.
실생활 비유: 남들과 성적을 비교하는 대신, '내가 본 국·영·수·과 점수'들의 평균을 내어 내 안에서 어떤 과목을 더 잘했는지 밸런스를 맞추는 것과 같습니다.
학습(Train) vs 추론(Inference) — 연습과 실전은 다르게 움직여야 합니다.
쉬운 설명: 배치 정규화는 학습할 때 "지금 들어온 미니배치"의 통계를 사용하지만, 몰래 전체 데이터의 누적 평균도 계산해 둡니다. 그리고 실제 서비스(추론)할 때는 데이터가 1장만 들어와도 당황하지 않도록 이 누적된 기준을 사용합니다.
핵심 포인트: 서비스를 배포할 때는 반드시 PyTorch의 `model.eval()`을 호출하여 모델을 '추론 모드'로 바꿔야 합니다. 그렇지 않으면 예측값이 계속 달라지는 대형 버그가 발생합니다.
실생활 비유: 연습 경기(학습) 때는 오늘 모인 팀원들의 컨디션에 맞춰 전술을 짜지만, 실제 월드컵 경기(추론)에서는 그동안 수십 경기에서 쌓인 누적된 경험을 바탕으로 굳건하게 플레이하는 것과 같습니다.
헷갈리기 쉬운 두 가지 '정규화' 완벽 구분법
쉬운 설명: 한글로 똑같이 번역되지만 하는 일은 완전히 다릅니다. 과적합 방지 정규화(L2, 드롭아웃)는 모델이 융통성 없이 정답을 달달 외우는 것을 막아줍니다. 반면 배치/층 정규화(정규화 층)는 모델 내부를 흐르는 데이터의 압력을 일정하게 조절해 학습 자체가 터지지 않게 돕습니다.
핵심 포인트: 훈련 점수는 높은데 실전 점수가 낮다면(과적합) 전자를 고민하고, 훈련 과정 자체에서 에러(NaN)가 뜨거나 Loss가 미친 듯이 널뛰기한다면 후자를 처방하세요.
실생활 비유: 전자는 배낭여행을 갈 때 짐이 너무 무거워지지 않게 짐을 빼는 것(가중치 억제)이고, 후자는 오케스트라 악기들의 음량을 조화롭게 믹싱하는 것(신호 크기 조절)입니다.
왜 중요한가요?
1. 상상 속의 깊은 신경망을 '실제로' 구현하게 해줍니다
이론상으로는 신경망을 수백 층으로 쌓으면 똑똑해져야 하지만, 과거에는 활성화값과 기울기가 폭발하거나 사라져서 아예 학습이 불가능했습니다. 배치 정규화와 층 정규화는 이러한 고질적인 불안정을 잡아주어, 실무에서 더 높은 학습률(Learning Rate)을 과감하게 사용하고 훨씬 더 깊은 모델을 학습시킬 수 있게 만든 1등 공신입니다.
2. 동명이인 '정규화(Regularization vs Normalization)'의 역할을 헷갈리지 않게 해줍니다
한국어로는 둘 다 '정규화'라고 번역되어 초보자들이 가장 많이 헷갈리는 개념입니다. L2 규제나 드롭아웃(Regularization)은 모델이 학습 데이터를 너무 똑같이 외워버리는 '과적합(Overfitting)'을 막고 가중치를 다이어트시키는 역할입니다. 반면, 이 장의 배치/층 정규화(Normalization)는 층 사이로 흘러가는 '신호의 크기'를 예쁘게 다듬어주는 역할입니다. 연습문제는 잘 푸는데 실전 시험만 망치면 전자를, 모델이 시작부터 덜컹거리고 Loss가 이상하게 뜨면 후자를 처방해야 합니다.
3. 데이터와 모델 성격에 맞는 맞춤형 옷을 입혀야 합니다
아무리 좋은 정규화 기법이라도 상황에 맞게 써야 합니다. 이미지를 다루는 CNN에는 배치 정규화를 찰떡같이 붙이지만, 텍스트를 다루는 Transformer나 RNN에 배치 정규화를 억지로 끼워 넣으면 오히려 학습이 망가집니다. 모델의 특성(배치 크기, 데이터의 순서와 길이 등)을 이해하고 알맞은 정규화 층을 골라야 최고의 성능을 끌어낼 수 있습니다.
실무에서는 이렇게 쓰입니다
① 진단: 우리 모델의 엔진이 덜컹거리나요?
실생활 예시: 자동차를 운전하는데 엔진이 심하게 떨리고 속도계가 미친 듯이 오르락내리락한다면 정상적인 주행이 불가능하겠죠? 딥러닝에서 화면에 출력되는 Loss 값이 널뛰기를 하거나 아예 `NaN`(숫자가 아님)이라는 에러가 뜬다면 데이터 흐름이 고장 난 것입니다. 이럴 땐 무작정 엑셀(학습률)을 밟기보다 엔진오일을 갈아주듯 정규화 층을 적절한 위치에 추가해 보세요.
반대로, 훈련 정확도는 99%인데 새로운 데이터에서는 50%밖에 못 맞추는 상황(과적합)이라면 정규화 층(Normalization)보다는 드롭아웃이나 데이터 증강(Regularization)을 추가하는 것이 올바른 해결책입니다.
② 사진과 비전 모델: 배치 정규화(Batch Normalization)의 주무대
실생활 예시: 스마트폰에서 강아지와 고양이를 구분하는 AI를 만든다고 해봅시다. 그래픽 카드(GPU) 메모리가 넉넉해서 한 번에 사진을 32장, 64장씩 와르르 넣고 학습시킬 수 있습니다. 이때는 "지금 들어온 64장 묶음" 전체의 밝기나 특징 분포를 평균 내어 스케일을 맞추는 배치 정규화가 아주 훌륭하게 작동합니다.
하지만 고화질 의료 영상처럼 용량이 너무 커서 한 번에 사진을 1~2장밖에 못 넣는다면? 묶음의 기준이 계속 흔들려서 역효과가 납니다. 이럴 때는 배치 크기를 늘리는 꼼수를 쓰거나 다른 정규화 방식을 고민해야 합니다.
③ 챗봇과 번역기: 층 정규화(Layer Normalization)의 독무대
실생활 예시: 챗봇에게 사용자들이 건네는 말은 "안녕?"처럼 2글자일 수도 있고, "이 기사 좀 3줄로 요약해 줘"처럼 아주 길 수도 있습니다. 문장의 길이가 제각각인 데이터를 억지로 묶어서 평균을 내는 것은 무리입니다.
그래서 텍스트 모델에서는 옆 문장이 어떻게 생겼는지 신경 쓰지 않고, 오직 현재 분석 중인 단 하나의 문장 안에서만 단어들의 신호 크기를 조절하는 층 정규화를 사용합니다. 나 자신만의 페이스를 유지하며 달리는 마라토너와 같습니다.
④ 서비스 배포 전 필수 체크: 추론 모드(eval) 스위치 켜기
실생활 예시: 열심히 AI 모델을 학습시켜 드디어 웹 서비스로 런칭했습니다. 그런데 사용자가 이미지를 올릴 때마다 결과가 오락가락합니다. 원인은 배포할 때 모델을 '공연 모드(추론 모드)'로 바꾸지 않았기 때문입니다.
PyTorch 기준 `model.eval()`이라는 명령어 하나를 입력하면, 모델은 더 이상 새로운 데이터로 묶음 평균을 구하지 않고 '학습 때 단단하게 쌓아 둔 신뢰할 수 있는 과거 통계치'를 사용하여 정규화합니다. 연습 때의 버릇을 버리고 실전 매뉴얼대로 행동하게 만드는 가장 중요한 마지막 단계입니다.
핵심 3줄 요약
이번 장의 핵심은 층마다 오가는 신호의 크기를 일정하게 맞춰 모델의 학습을 안정화하는 '배치 정규화'와 '층 정규화'입니다. L2 규제나 드롭아웃 같은 과적합 방지용 정규화(Regularization)와 이름은 비슷하지만 헷갈려서는 안 됩니다. 과적합 방지가 모델이 정답을 맹목적으로 외우지 않게 억제하는 역할이라면, 정규화 층(Normalization)은 데이터가 흐르는 통로의 수압(신호 크기)을 고르게 유지시켜 주는 역할입니다.
배치 정규화는 한 번에 모델에 들어온 여러 데이터(미니배치)를 한데 묶어서 평균을 내고 기준을 맞춥니다. 주로 이미지 분야(CNN)에서 활약하며, 서비스 배포 시에는 반드시 학습 때 쌓아 둔 통계치를 사용하도록 설정해야 합니다. 반면 층 정규화는 다른 데이터의 눈치를 보지 않고 단 하나의 데이터 샘플 안에서 기준을 맞춥니다. 문장 길이가 매번 다른 자연어 처리(Transformer)나 배치 크기가 아주 작을 때 필수적으로 사용됩니다.
실무 팁: 모델이 학습을 거부하며 Loss가 터진다면 정규화 층(Normalization)을 추가해 진정시키고, 실전 평가(Validation) 점수만 자꾸 떨어진다면 과적합 방지 기법(Regularization)을 사용하는 등 상황과 역할에 맞게 처방하는 것이 중요합니다.
문제 풀이를 위한 설명
이 장 문제는 학습 불안정 진단, 배치 vs 층 정규화 선택, 이름이 같은 '정규화' 구분 세 줄기로 풀면 됩니다.
학습이 흔들릴 때 먼저 볼 것은 loss NaN, 기울기 폭발·소실, train loss의 심한 요동입니다. 모델을 더 깊게 쌓기 전에 정규화 층 위치와 학습/추론 모드를 점검하세요.
train은 좋은데 val만 나쁜 패턴은 과적합(외우기) 신호입니다. 이때 정규화 층만 추가한다고 항상 해결되지는 않습니다. L2·드롭아웃·조기 종료·데이터 증강도 함께 검토할 수 있습니다.
배치 정규화는 여러 샘플을 묶어 신호 크기를 맞춥니다(batch 32+ 등). 층 정규화는 샘플 하나 안에서 맞춥니다(batch=1, Transformer·RNN). 학습은 지금 배치+경험치 누적, 추론은 쌓아 둔 기준 — 배포 전 `model.eval()` 필수.
문항 키워드: 'batch=1'→층 정규화, 'Transformer'→층 정규화, '추론 모드'·'쌓아 둔 기준'→배치 정규화, 'loss NaN'→정규화 층, '가중치 벌점'·'뉴런 끄기'→과적합 방지 쪽(이 장 정답 아님).
정의형 문제를 풀 때는 보기 번호와 역할을 먼저 맞춥니다.
"정규화 층의 핵심 목적?"이라면
① 가중치 L2 벌점·
③ 뉴런 끄기는 과적합 방지 쪽입니다.
② 층마다 신호 크기(활성화 스케일) 안정화가 이 장의 핵심이므로 정답 2입니다.
"배치 정규화는 어디를 기준?"이라면
① 여러 샘플을 한 묶음(미니배치)이 배치 정규화입니다.
② 샘플 하나 안은 층 정규화이므로 배치 정규화 문항이면 정답 1입니다.
"추론 시 배치 정규화?"이라면
① 학습 중 쌓아 둔 평균·퍼짐을 씁니다.
② 지금 배치만 쓰는 것은 학습에 가깝습니다. → 정답 1
응용형 문제에서는 상황을 먼저 읽습니다.
loss NaN·기울기 불안정 →
① 층을 더 깊게보다
② 정규화 층 추가가 먼저입니다. → 정답 2
Transformer·batch=1 →
② 층 정규화가 자연스럽습니다. → 정답 2
배포 후 성능 흔들림 →
① 추론 모드(`model.eval()`) 확인이 우선입니다. → 정답 1
`model.train()` 상태로 배포되면 배치 정규화가 매번 다른 미니배치 통계를 써 결과가 들쭉날쭉해질 수 있습니다. → 정답 2
계산형 문제에서는 식을 단계별로 씁니다.
평균 2, 값 5, 퍼짐 9 → √(퍼짐)=3, (5−2)÷3 = 1 → 해당 보기
②. → 정답 2
정규화 결과 −1, ×4 +2 → −4+2 = −2 → 정답 2
참/거짓 문제 — "추론할 때도 매번 지금 미니배치만 기준"은 흔한 오해입니다. 추론은 쌓아 둔 기준을 쓰므로 거짓(0) 이 맞습니다.
"배치 정규화와 L2의 주된 목적이 같다" → L2는 가중치·외우기, 배치 정규화는 신호 크기이므로 거짓(0) 입니다.
"학습 중 배치 정규화가 running mean·running variance를 갱신할 수 있다" → 맞는 말이므로 참(1) 입니다.
"batch가 너무 작으면 배치 정규화 기준이 흔들린다" → 맞는 말이므로 참(1) 입니다.
선택형 문제 — "평균에서 얼마나 벗어났는지로 맞춘다" → 정규화 층의 핵심 형태이므로 정답 1입니다.
"과적합 방지 정규화 vs 정규화 층" →
① 동일·
③ 무관이 아니라 목적이 다름
② (가중치·외우기 vs 신호 크기). → 정답 2
개념형 문제 — batch=1에서 배치 정규화만 고집하면 기준이 불안정합니다. 층 정규화
②가 맞습니다. → 정답 2
Transformer·문장 모델 → 층 정규화
②가 표준에 가깝습니다. → 정답 2
계산형 문제 — 정규화 결과 2, ×3 +1 → 6+1 = 7 → 정답 3입니다.
추론 때 쌓아 둔 기준을 쓰는 정규화는 배치 정규화
②입니다. → 정답 2