P5-8.3 보충학습: 깊은 계산의 안정화 조건¶
Section ID:
P5-8.3Version:v2026.07.23
보조제목: 초기화, 수치 안정성, 배치 정규화는 깊은 네트워크가 덜 흔들리게 하는 위치가 어떻게 다른가
P5-8.1과 P5-8.2에서는 학습 루프에 목적 함수 제어와 구조 수준 제어를 더하는 방법을 보았습니다. 하지만 그런 제어를 넣어도, 깊은 계산 자체가 불안정하면 학습은 여전히 흔들릴 수 있습니다. P5-6.4에서는 학습 모드(training mode)와 평가 모드(evaluation mode)를 구분하면서 dropout과 batch normalization이 왜 모드 차이에 민감한지 보았습니다. 이제 그 배경 위에서, 초심자에게 자주 남는 질문 하나를 더 붙입니다.
층을 더 깊게 쌓았다고 해서 왜 바로 잘 학습되지 않는가?
이 질문에 답하려면 초기화(initialization), 수치 안정성(numerical stability), 배치 정규화(batch normalization)를 따로따로 외우기보다, 깊은 네트워크가 실제로 덜 흔들리게 된 이유라는 하나의 축으로 함께 읽는 편이 좋습니다. 챕터 8 전체로 보면 앞 절들이 무엇을 덜 선호하게 만들 것인가와 어떤 경로 의존을 줄일 것인가를 다루었다면, 이 절은 그 계산 자체가 버티도록 만드는 조건을 묶는 자리입니다.
초기화는 학습이 시작될 출발점을 정하고, 수치 안정성은 값과 gradient가 계산 중에 너무 커지거나 작아지지 않게 보는 기준이며, batch normalization은 학습 중 활성값 분포를 더 다루기 쉬운 범위로 정리해 주는 장치다.
이 축이 다시 흐려질 때는 개념사전의 학습 모드(training mode), 배치 정규화(batch normalization), 초기화(initialization), 수치 안정성(numerical stability) 항목을 함께 다시 보는 편이 좋습니다.
깊은 계산이 흔들리는 질문¶
- 왜 깊은 네트워크는 층만 늘린다고 바로 잘 학습되지 않는가?
- 초기화(initialization)는 무엇을 정하는가?
- 수치 안정성(numerical stability)은 무엇을 걱정하는 개념인가?
- batch normalization은 왜 학습 안정화 도구로 자주 함께 언급되는가?
- 이 세 개념은 optimizer, regularization과 어떻게 다른 질문에 답하는가?
ReLU 계열과 깊은 학습 확산의 큰 흐름은 P5-3.4에서 다시 연결하고, batch normalization이 학습/평가 모드 차이에 왜 민감한지는 P5-6.4에서 이미 본 기준 위에서 다시 읽습니다. regularization과 normalization을 구분하는 넓은 관점은 P5-8.1에서 이어지고, optimizer update 자체는 P5-7.1, P5-7.2에서 다시 붙입니다.
이 절의 역할은 깊은 계산이 forward와 backward를 견딜 조건을 한자리에 묶는 데 있습니다.
초기화·수치 안정성·배치 정규화 판단 기준¶
- 초기화를
학습 시작점의 값 배치로 설명할 수 있습니다. - 수치 안정성을
값과 gradient가 계산 중에 감당 가능한 범위를 유지하는 문제로 설명할 수 있습니다. - batch normalization을
활성값 분포를 정리해 학습을 덜 흔들리게 하는 장치로 설명할 수 있습니다. - optimizer, regularization, batch normalization이 서로 다른 질문에 답한다는 점을 구분할 수 있습니다.
- 이 절이 챕터 8 안에서
계산 안정화 장치를 맡는 자리라는 점을 설명할 수 있습니다. - 이어지는 P5-8.4의 Python 예제가 왜 필요한지, 그리고 그 예제로 무엇을 확인해야 하는지 설명할 수 있습니다.
왜 이 셋을 한 번에 묶어 읽어야 하나¶
깊은 네트워크를 처음 배우면 다음 오해가 자주 생깁니다.
- 층을 더 쌓으면 자동으로 더 잘 배울 것이다
- optimizer만 Adam으로 바꾸면 대부분 해결될 것이다
- batch normalization은 그냥 라이브러리 옵션 하나일 뿐이다
하지만 실제로는 학습이 시작되는 출발점, 중간 계산에서 값이 어떻게 커지거나 줄어드는지, 각 층이 다음 층으로 어떤 범위의 값을 넘기는지가 함께 맞물립니다.
이 흐름을 아주 짧게 그리면 다음과 같습니다.
flowchart TD
A["초기화<br/>시작값"]
B["순전파 / 역전파<br/>값과 기울기 흐름"]
C["수치 안정성<br/>폭주와 소실 방지"]
D["배치 정규화<br/>활성값 범위 관리"]
A --> B
B --> C
C --> D
핵심은 학습이 잘 안 된다는 현상이 항상 한 가지 원인으로만 생기지 않는다는 점입니다.
- 시작값이 너무 비슷하거나 극단적일 수 있고
- 층을 지나며 값이 너무 커지거나 거의 사라질 수 있고
- 활성값 분포가 다음 계산을 계속 흔들 수 있습니다
그래서 이 절에서는 이 셋을 깊은 학습이 실제로 가능해지는 조건으로 묶어 봅니다.
초기화(initialization)는 무엇을 정하나¶
초기화는 학습을 시작하기 전 파라미터(parameter)에 어떤 숫자를 배치할지 정하는 일입니다.
겉으로 보면 단순히 출발점만 정하는 것처럼 보이지만, 실제로는 다음 두 질문과 직접 연결됩니다.
- 서로 다른 뉴런이 서로 다른 역할을 배우기 시작할 수 있는가?
- 첫 몇 번의 forward와 backward에서 값이 지나치게 커지거나 작아지지 않는가?
예를 들어 모든 가중치를 완전히 같은 값, 특히 0으로 시작하면 여러 뉴런이 같은 입력에 같은 반응을 보이고 같은 gradient를 받을 수 있습니다. 그러면 층을 여러 개 둬도 서로 다른 특징을 나눠 배우기 어렵습니다.
즉, 초기화의 첫 책임은 아무렇게나 시작하지 않는 것보다 모든 뉴런이 똑같이 시작하지 않게 하는 것에 가깝습니다.
왜 출발점이 같으면 안 되나¶
퍼셉트론 하나만 있을 때는 시작값이 약간 엉성해도 큰 문제가 없어 보일 수 있습니다. 하지만 다층 구조에서는 같은 층 안 여러 뉴런이 서로 다른 조합을 배워야 합니다.
만약 출발점이 완전히 같다면:
- 같은 입력을 보고
- 같은 출력을 만들고
- 같은 gradient를 받고
- 같은 방향으로 업데이트됩니다
그 결과 여러 뉴런을 둔 이점이 줄어듭니다.
이 점을 초심자 기준으로 한 줄로 묶으면 다음과 같습니다.
초기화는 단지 첫 숫자를 찍는 일이 아니라, 여러 뉴런이 서로 다른 역할로 갈라질 가능성을 열어 두는 일이다.
수치 안정성(numerical stability)은 무엇을 걱정하나¶
수치 안정성은 계산 과정에서 값이나 gradient가 너무 커지거나 너무 작아져 학습이 흔들리지 않는지 보는 기준입니다.
여기서는 다음 두 장면만 먼저 떠올리면 충분합니다.
- 층을 지날수록 값이 계속 커져 폭발하는 경우
- 층을 지날수록 값이나 gradient가 너무 작아져 사실상 사라지는 경우
딥러닝은 같은 종류의 계산을 층마다 반복합니다. 그래서 한 번의 작은 불안정이 깊은 층을 지나며 더 커질 수 있습니다.
| 문제 장면 | 초심자용 직관 | 학습에서 생기는 결과 |
|---|---|---|
| 값이 너무 커짐 | 다음 층이 지나치게 큰 숫자를 계속 받는다 | 출력과 gradient가 흔들리기 쉽습니다 |
| 값이 너무 작아짐 | 다음 층이 거의 비슷한 작은 값만 본다 | gradient가 약해져 학습이 더뎌질 수 있습니다 |
이 절에서는 수학 증명을 하지 않지만, 중요한 직관은 분명합니다.
깊은 학습은 층을 많이 쌓는 문제이기도 하지만, 그 많은 계산을 숫자 범위 안에서 버티게 하는 문제이기도 하다.
활성화 함수 하나만으로는 왜 부족한가¶
P5-3.4에서 본 것처럼 ReLU 계열은 깊은 네트워크에서 널리 쓰입니다. 하지만 활성화 함수 하나만 바뀌었다고 모든 문제가 자동으로 해결되는 것은 아닙니다.
실제로는 다음 요소들이 함께 맞물립니다.
- 어떤 활성화 함수가 값을 어떻게 통과시키는가
- 너무 작거나 큰 값으로 시작하지 않게 하는 초기화
- optimizer와 학습률 설정
- batch normalization 같은 분포 안정화 장치
즉, 깊은 학습이 실용화되었다는 말은 보통 한 발명만 뜻하지 않고, 여러 안정화 장치가 함께 맞물렸다는 뜻에 더 가깝습니다.
batch normalization은 왜 중요한가¶
batch normalization은 한 배치(batch) 안의 평균(mean)과 분산(variance)을 참고해 활성값 분포를 다시 정리하는 방식입니다.
초심자 기준에서는 다음처럼 이해하면 충분합니다.
- 앞 층 출력이 너무 들쭉날쭉하면
- 다음 층이 계속 흔들리는 분포를 받아 학습해야 하고
- 그러면 학습 속도와 안정성이 함께 영향을 받을 수 있습니다
batch normalization은 이때 현재 배치 기준으로 값을 한 번 더 다루기 쉬운 범위로 정리하고 넘기는 장치처럼 읽을 수 있습니다.
P5-6.4에서 본 mode 차이도 여기서 다시 연결됩니다.
- 학습 중에는 현재 배치 통계를 참고하고
- 평가 중에는 학습 동안 쌓인 기준을 더 많이 참고합니다
즉, batch normalization은 단순히 정규화 이름 하나가 아니라, 학습 안정화와 mode 전환을 함께 읽게 만드는 대표 사례입니다.
regularization과는 무엇이 다른가¶
초심자는 batch normalization, dropout, weight decay를 모두 학습을 돕는 옵션처럼 한 덩어리로 볼 수 있습니다. 하지만 질문이 다릅니다.
| 항목 | 먼저 답하는 질문 |
|---|---|
| initialization | 학습을 어떤 출발점에서 시작할 것인가? |
| numerical stability | 반복 계산 중 값과 gradient가 감당 가능한 범위를 유지하는가? |
| batch normalization | 활성값 분포를 더 다루기 쉬운 범위로 정리할 것인가? |
| optimizer | gradient를 실제로 어떤 보폭과 규칙으로 업데이트할 것인가? |
| regularization | 모델이 너무 복잡한 해법으로 가지 않게 어떤 제약을 둘 것인가? |
이 표를 먼저 고정해 두면, 뒤에서 새로운 기법 이름을 만나도 출발점, 계산 안정성, 업데이트, 일반화 중 어디에 가까운지 분리해 읽기 쉬워집니다.
사례 및 예시¶
앞에서 말한 깊은 네트워크가 실제로 덜 흔들리게 된 이유를 사례로 읽으려면, 세 용어를 따로따로 외우는 대신 하나의 깊은 계산 장면이 어디에서 흔들리고, 무엇이 그 흔들림을 줄이는가를 함께 보는 편이 좋습니다. 아래 두 사례는 같은 깊은 네트워크를 두고 불안정하게 시작한 장면과 덜 흔들리게 정리한 장면을 나눠 보여 줍니다.
사례 1. 깊은 네트워크가 처음부터 흔들리는 장면¶
입력이 x = 2인 작은 깊은 네트워크를 떠올려 보겠습니다. 첫 층에 뉴런 두 개가 있는데 가중치를 모두 0으로 시작했다고 해 보겠습니다. 그러면 두 뉴런은 처음에 같은 출력을 만들고, 역전파에서도 같은 gradient를 받아 0 -> 0.3 -> 0.6처럼 함께 움직이기 쉽습니다. 이 첫 장면에서는 이미 초기화가 출발점을 잘못 잡으면 여러 뉴런이 서로 다른 역할로 갈라지지 못한다는 문제가 생깁니다.
여기에 더해 뒤 층의 시작 가중치 스케일까지 크다고 해 보겠습니다. 앞 층에서 비슷하게 나온 값이 다음 층으로 넘어가고, 큰 가중치가 반복되면 값 범위는 0.6 -> 1.8 -> 5.4처럼 더 빠르게 커질 수 있습니다. 이때 흔들리는 것은 단지 출력 숫자만이 아닙니다. 활성화 함수 반응이 치우치고 gradient 경로도 함께 불안정해질 수 있습니다. 여기서 수치 안정성은 깊은 계산이 이 숫자 범위를 버틸 수 있는가를 묻는 기준으로 등장합니다.
마지막으로 어떤 배치에서는 중간 활성값이 0.5, 0.8, 1.0 근처에 모이고, 다른 배치에서는 15, 20, 24처럼 훨씬 큰 범위로 넘어온다고 해 보겠습니다. 그러면 다음 층은 매번 다른 규모의 입력을 받게 되고 학습은 더 흔들리기 쉽습니다. 이 지점에서 batch normalization은 이미 층 사이에 생긴 활성값 분포를 다음 층이 다루기 쉬운 범위로 다시 정리하는 장치로 필요해집니다.
즉, 이 사례는 세 문제를 따로 보여 주는 것이 아닙니다. 같은 출발점에 묶인 뉴런, 깊이를 지나며 커지는 값 범위, 배치마다 흔들리는 중간 분포가 한 장면 안에서 이어지며, 그래서 깊은 네트워크는 출발점, 반복 계산 범위, 층 사이 분포를 함께 붙잡아야 덜 흔들린다는 점을 보여 줍니다.
사례 2. 깊은 네트워크를 덜 흔들리게 만드는 장면¶
이제 같은 구조를 다시 보되 시작 조건을 바꿔 보겠습니다. 첫 층 뉴런 둘의 가중치를 모두 같게 두지 않고, 하나는 조금 작게 다른 하나는 조금 다르게 시작한다고 해 보겠습니다. 그러면 두 뉴런은 처음부터 완전히 같은 반응을 반복하지 않고, 서로 다른 입력 조합에 조금씩 다른 경로로 반응할 가능성을 얻습니다. 여기서 초기화의 역할은 좋은 숫자 찾기보다 먼저 같은 통로 복제를 피하게 하는 출발점 마련입니다.
다음으로 각 층 가중치 스케일을 지나치게 크게 두지 않으면, 값 범위가 0.6 -> 0.9 -> 1.1처럼 더 완만하게 움직을 수 있습니다. 물론 실제 모델은 이보다 복잡하지만, 초심자 기준에서는 이 장면만으로도 충분합니다. 깊은 네트워크가 덜 흔들리려면 층이 많아도 계산이 한 번에 폭발하거나 사라지지 않게 버텨야 합니다. 여기서 수치 안정성은 어떤 출발 스케일과 계산 흐름이 깊은 반복을 버티게 하는가를 읽는 기준이 됩니다.
마지막으로 층 사이에 넘어온 활성값 분포가 배치마다 달라져도 batch normalization을 끼우면, 다음 층은 완전히 제각각인 규모 대신 비교 가능한 범위로 다시 정리된 입력을 받게 됩니다. 그래서 batch normalization의 첫 역할은 이름을 외우는 것이 아니라, 이미 흔들리기 시작한 중간 분포를 다음 층이 계속 버틸 수 있게 정리하는 데 있습니다.
즉, 이 사례에서 확인해야 할 결과는 분명합니다. 깊은 네트워크가 덜 흔들리게 된 이유는 기법 이름이 많아져서가 아니라, 초기화가 출발점을 갈라 주고, 수치 안정성이 반복 계산 범위를 버티게 하고, batch normalization이 층 사이 분포를 다시 정리해 주기 때문입니다.
초심자 기준에서는 사례 1과 사례 2를 다음 순서로 다시 접어 읽는 편이 좋습니다.
flowchart TD
A["사례 1: 뉴런이 같은 패턴으로 시작"] --> B["초기화가 출발점을 갈라 주는지 확인"]
B --> C["사례 1: 깊은 층을 지나며 값이 커짐"]
C --> D["반복 계산 범위가 버티는지 확인"]
D --> E["사례 1: 배치마다 중간 활성 분포가 크게 흔들림"]
E --> F["배치 정규화가 중간 분포를 다시 정리하는지 확인"]
F --> G["사례 2: 깊은 네트워크가 덜 흔들림"]
이 흐름도에서 먼저 잡아야 할 점은 하나입니다. 깊은 네트워크 안정화는 기법 목록이 아니라 출발점이 갈라지는가 -> 반복 계산 범위가 버티는가 -> 층 사이 분포가 다음 층을 계속 흔드는가를 순서대로 읽는 판단 흐름입니다.

이 그래프는 흔들림 장면의 뉴런 둘이 거의 겹쳐 움직이고, 안정화 장면의 뉴런 둘은 완전히 같은 경로를 반복하지 않는다는 점을 함께 보여 줍니다.

이 그래프는 깊은 층으로 갈수록 흔들림 장면의 범위가 더 빠르게 커지고, 안정화 장면의 범위는 더 완만하게 움직인다는 점을 보여 줍니다.

이 그래프는 흔들림 장면에서는 배치별 중간 분포 차이가 크고, 안정화 장면에서는 다음 층이 비교 가능한 규모를 더 쉽게 받는다는 점을 보여 줍니다.
두 사례를 한 흐름으로 다시 접으면, 이 절에서 묶어 읽으려는 안정화 축은 다음처럼 정리됩니다.
| 단계 | 먼저 흔들리는 것 | 먼저 붙잡아야 할 장치 |
|---|---|---|
| 학습 시작 전 | 뉴런들이 같은 출발점에 묶이는가 | initialization |
| 층을 반복하며 계산할 때 | 값과 gradient 범위가 커지거나 작아지는가 | numerical stability 관점 |
| 층과 층 사이를 넘길 때 | 중간 활성값 분포가 다음 층을 계속 흔드는가 | batch normalization |
즉, 두 사례는 문제 사례 하나와 해결 사례 하나처럼 보이더라도, 실제로는 출발점, 반복 계산 범위, 층 사이 분포를 각각 붙잡아 깊은 학습을 덜 흔들리게 만드는 하나의 안정화 축으로 읽어야 합니다.
| 사람이 먼저 보기 쉬운 기준 | 초기화·수치 안정성·batch normalization 관점으로 다시 읽는 기준 |
|---|---|
| 층만 더 쌓으면 표현력이 늘어 자동으로 더 잘 배울 것 같다고 느끼기 쉽다 | 층을 깊게 쌓을수록 출발점, 값 범위, 활성 분포가 함께 흔들릴 수 있어 안정화 조건을 같이 봐야 한다 |
| optimizer만 Adam으로 바꾸면 대부분 해결될 것 같다고 느끼기 쉽다 | optimizer는 업데이트 규칙이고, 초기화·수치 안정성·batch normalization은 그 이전에 계산이 버틸 조건을 다룬다 |
| batch normalization은 라이브러리 옵션 하나라고 생각하기 쉽다 | batch normalization은 학습 중 활성 분포를 정리하고 mode 차이까지 함께 읽게 만드는 안정화 장치다 |
| 뉴런 수나 층 수만 늘리면 서로 다른 특징을 자동으로 배울 것 같다고 느끼기 쉽다 | 초기화가 같으면 여러 뉴런이 같은 경로로 움직일 수 있고, 큰 값은 반복 계산 중 불안정을 키울 수 있다 |
이 사례들에서 최종적으로 확인해야 할 결과는 분명합니다. 깊은 네트워크 안정화의 핵심은 기법 이름을 많이 외우는가가 아니라, 초기화는 출발점을, 수치 안정성은 반복 계산 범위를, batch normalization은 중간 분포를 다루며 셋이 함께 학습을 덜 흔들리게 만든다는 점입니다.
연습 및 예제¶
다음 질문에 답할 수 있으면 이 절의 역할은 충분히 닫힙니다.
| 질문 | 확인할 관점 |
|---|---|
| 초기화는 무엇을 정하는가? | 여러 뉴런이 서로 다른 출발점에서 역할을 나눌 가능성을 엽니다. |
| 수치 안정성은 무엇을 걱정하는가? | 깊은 반복 계산에서 값과 gradient가 감당 가능한 범위에 남는지 봅니다. |
| batch normalization은 어디에 개입하는가? | 중간 활성값 분포를 다음 층이 다루기 쉬운 기준으로 다시 정리합니다. |
이 절은 개념 지도를 먼저 닫는 자리이므로, 실행 코드는 여기서 바로 다시 반복하지 않습니다. 대신 바로 다음 P5-8.4에서 큰 초기화 스케일이 깊은 층을 지나며 값을 어떻게 키우는지, 그리고 batch normalization을 끼우면 무엇이 어떻게 달라지는지를 Python 예제와 그래프로 따로 확인합니다.
체크리스트¶
- 깊은 네트워크는 구조를 쌓는 문제이면서 동시에 계산을 버티게 하는 문제라는 점을 설명할 수 있는가?
- 초기화(initialization)를
출발 가중치 배치라는 관점으로 설명할 수 있는가? - 수치 안정성(numerical stability)을
깊은 반복 계산이 숫자 범위를 어떻게 흔드는가라는 관점으로 설명할 수 있는가? - batch normalization이 왜 학습 안정화와 mode 차이 설명에 함께 등장하는지 말할 수 있는가?
- batch normalization은 활성값 분포를 더 다루기 쉬운 범위로 정리하는 학습 안정화 장치라는 점을 설명할 수 있는가?
- optimizer, regularization, batch normalization이 서로 다른 질문에 답한다는 점을 구분할 수 있는가?
출처와 참고 자료¶
- Aston Zhang, Zachary C. Lipton, Mu Li, Alexander J. Smola,
Dive into Deep Learning,5.4 Numerical Stability and Initialization,8.5 Batch Normalization,12 Optimization Algorithms, 확인 날짜: 2026-07-11. https://d2l.ai/ - Ian Goodfellow, Yoshua Bengio, Aaron Courville,
Deep Learning, Part IIModern Practical Deep Networks, 확인 날짜: 2026-07-11. https://www.deeplearningbook.org/ - Stanford
CS231n: Deep Learning for Computer Vision, Schedule and course notes onRegularization and Optimization,Neural Networks and Backpropagation,CNN Architectures, 확인 날짜: 2026-07-11. https://cs231n.stanford.edu/