① 개념
신경망 학습 시, 각 파라미터 에 대한 손실 함수의 기울기를 계산하고 그 반대 방향으로 갱신하는 기본 기법
② 업데이트 식
(: 학습률, : 손실 함수 기울기)
③ 장·단점
장점: 단순하고 구현 용이
단점: 좁은 골짜기에서 진동, flat region에서 느린 수렴
① 개념
이전 업데이트 관성을 반영해, 현재 그래디언트와 과거 방향을 결합하여 갱신하는 기법
② 업데이트 식
(: 모멘텀 계수, : 속도 벡터)
③ 효과
진동 감소
평지 통과 속도 향상
① 공통 개념
파라미터별 과거 그래디언트 이력을 활용해 학습률을 자동 조정
② AdaGrad
누적 제곱합
업데이트:
장점: 희소 특성 강점
단점: 학습률 과도 감소
③ RMSProp
제곱합을 지수이동평균으로 계산:
업데이트:
안정적 학습률 조정
① Adam
모멘텀(Momentum) 방식과 RMSProp 방식을 융합하여 1차 및 2차 모멘텀을 활용한 adaptive 학습률로 가중치 업데이트 수행
② AdamW & LAMB
대표적인 Adam 계열 optimizer로, 하이퍼파라미터 및 사용 목적에 따라 선택됨
③ 장·단점
① 개념
매 epoch마다 학습률을 일정 비율 만큼 지수적으로 감소시켜 안정적인 수렴을 유도하는 스케줄러
② PyTorch 예시
scheduler = torch.optim.lr_scheduler.ExponentialLR(optimizer, gamma=0.99)
위 코드는 매 epoch이 끝날 때마다 다음의 연산을 진행한다.
① 개념
지정한 epoch 간격(step_size)마다 학습률을 배로 감소시키는 스케줄러
② PyTorch 예시
scheduler = torch.optim.lr_scheduler.StepLR(optimizer, step_size=100, gamma=0.9)
③ 동작 방식
if epoch % step_size == 0:
lr = gamma * lr
① 개념
여러 개의 기준점(milestones)에서 학습률을 한 번에 감소시키는 스케줄러
② PyTorch 예시
scheduler = torch.optim.lr_scheduler.MultiStepLR(
optimizer,
milestones=[30, 80],
gamma=0.1
)
③ 동작 방식
if epoch in milestones:
lr = gamma * lr
① 개념
에폭이 진행될수록 학습률을 부드럽게 감소시키거나, 일정 주기마다 리스타트하여 다시 높은 학습률을 유지하도록 설계된 스케줄러
② CosineAnnealingLR: 코사인 곡선 형태로 lr이 η_min까지 부드럽게 감소
scheduler = torch.optim.lr_scheduler.CosineAnnealingLR(
optimizer,
T_max=50,
eta_min=0
)
③ CosineAnnealingWarmRestarts: 매 T_0, T_0×T_mult, … epoch마다 스케줄을 리스타트하여 lr이 다시 최고치로 올라갔다가 감소하도록 함
scheduler = torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(
optimizer,
T_0=10,
T_mult=2
)
④ 특징
주기적 리스타트를 통해 모델이 새로운 지역 최적점을 탐색하도록 돕는다.
① 개요
가중치 초기값에 따라 손실 함수의 최저점으로 수렴할 수 있거나 그렇지 않을 수 있으며, 수렴 속도에도 큰 영향을 미침
일반적으로 정규 분포 함수의 표준편차를 적절하게 설정하여 초기값을 결정함
① 목적
sigmoid 등 포화 영역이 있는 활성화 함수를 사용할 때, 각 층의 출력 분산이 일정하게 유지되어 gradient vanishing 문제를 완화
② 방법
앞 층의 노드 수 에 대해, 정규 분포의 표준편차 로 초기값 설정
① 목적
ReLU 계열 활성화 함수를 사용할 때, 출력 분산 유지와 gradient 흐름을 원활하게 하여 학습 안정성 향상
② 방법
앞 층의 노드 수 에 대해, 정규 분포의 표준편차 로 초기값 설정
① 개념
순전파(feedforward)의 역순으로 계산 그래프를 따라 오차 신호를 전파하며, 각 노드에서 국소적 미분값을 곱해 상류(upstream)로 전달
① 현상
네트워크 깊이가 깊어질수록 초기 층(downstream)으로 전달되는 기울기가 점점 작아져 거의 0이 되어, 가중치 업데이트가 이루어지지 않음
② 영향
입력 변화가 출력에 영향을 미치지 않아 학습이 정체됨
① 적절한 가중치 초기화: Xavier Glorot 또는 Kaiming He 초기화로 출력 분산을 일정하게 유지
② ReLU 계열 활성화 함수 사용: Sigmoid 대비 0 이상의 영역에서 기울기 소실을 완화
③ 레이어 수 축소: 불필요하게 깊은 구조를 줄여 기울기 소실 위험 감소
④ Skip Connection 적용: 입력을 출력에 직접 더해 residual learning을 수행, 기울기 흐름을 개선
① 개념
서로 다른 미니배치에서 활성화 값 분포의 차이(Internal Covariate Shift)를 줄이기 위해, 각 층의 입력을 정규화하는 기법
학습 중 활성화 분포가 일정하게 유지되어, 네트워크가 더 안정적·빠르게 수렴하도록 도움
② 수식
③ PyTorch 예시
import torch.nn as nn
# 1D 입력 (예: Fully-connected layer 뒤)
bn1 = nn.BatchNorm1d(num_features)
# 2D 입력 (예: Conv 계층 뒤)
bn2 = nn.BatchNorm2d(num_features)
# 순전파 예시
x = ...
y = bn2(x)
④ 장·단점
장점
학습률을 높여도 발산하지 않고 안정적 수렴 가능
가중치 초기화 및 활성화 함수 선택에 덜 민감
단점
배치 크기가 너무 작으면 통계 추정이 불안정
추가 연산 및 메모리 오버헤드 발생
① 정의
신경망이 학습 데이터에만 지나치게 적응되어, 학습 데이터에서는 높은 성능을 보이지만 새로운 시험 데이터에 대해서는 성능이 떨어지는 현상
② 원인
매개 변수가 많고 표현력이 높은 모델 사용
훈련 데이터 수가 부족하거나 다양성이 낮음
① 정의
모델이 너무 단순하거나 학습이 충분치 않아 학습 데이터의 패턴을 제대로 학습하지 못해, 학습 데이터와 시험 데이터 모두에서 성능이 낮은 상태
② 원인
모델 복잡도(표현력)가 낮음
학습 에폭 수가 부족하거나 학습률이 너무 낮음
① 개념
validation 데이터의 성능이 더 이상 개선되지 않을 때 학습을 조기에 종료하여 과적합을 방지하는 정규화 기법
② 동작 방식
매 epoch마다 validation loss 또는 validation accuracy 평가
지정된 patience(허용 epoch) 동안 개선이 없으면 학습 종료
③ 효과
과적합 시점을 자동으로 찾아 학습을 멈춤으로써, 일반화 성능을 향상
불필요한 추가 학습을 줄여 연산 자원 절약에도 기여
① 개념
기본 손실에 가중치 절댓값 합을 penalty로 추가하여 모델 복잡도를 제한하고, 불필요한 특성을 제거하는 효과를 가짐
② 수식
여기서 는 정규화 강도를 조절하는 하이퍼파라미터
③ 특징
- 일부 가중치를 정확히 0으로 만들어 불필요한 특성을 제거(희소성 유도)
- 모델 해석성을 높이고 과적합을 줄임
④ PyTorch 적용 예시
optimizer = torch.optim.SGD(
model.parameters(),
lr=0.01,
weight_decay=0, # 기본 weight decay는 L2이므로 0 설정
l1_lambda=1e-4 # L1 정규화 λ 값 (직접 구현 필요)
)
# L1 패널티를 직접 계산해 loss에 더해주는 예
l1_penalty = sum(p.abs().sum() for p in model.parameters())
loss = criterion(output, target) + 1e-4 * l1_penalty
① 개념
기본 손실 함수에 각 가중치의 제곱합을 penalty로 추가하여, 과도하게 큰 가중치 값을 억제함으로써 모델의 복잡도를 낮추고 일반화 성능을 향상시키는 기법
② 수식
: 원래의 손실 함수
: 정규화 강도를 조절하는 하이퍼파라미터
: 각 파라미터 값
③ 특징
모든 가중치를 0에 가깝게 축소하지만 완전히 0으로 만들지는 않음
weight decay라고도 불리며, 학습 시 optimizer의 weight_decay 파라미터로 간편하게 적용 가능
④ PyTorch 적용 예시
optimizer = torch.optim.SGD(
model.parameters(),
lr=0.01,
weight_decay=1e-4 # L2 정규화 λ 값 설정
)
① 회전(Rotation)
이미지를 임의의 각도로 회전시켜 다양한 방향의 객체를 학습할 수 있도록 함
② 확대/축소(Scaling)
객체를 확대하거나 축소하여 다양한 크기에 대한 강인성을 높임
③ 이동(Shift)
이미지를 좌우·상하로 이동시켜 위치 변화에 대한 일반화 성능을 개선
④ 자르기(Crop)
이미지의 일부 영역을 잘라내어 부분 정보만으로도 인식할 수 있도록 훈련
⑤ 뒤집기(Flip)
수평 또는 수직으로 반전시켜 좌우·상하 대칭 상황에 대응
⑥ 노이즈 추가(Noise Injection)
가우시안 노이즈 등 임의의 잡음을 더해 잡음에 강한 모델로 학습
⑦ 기타(밝기·대비 변화 등)
밝기나 대비를 조절해 조명 변화에 대한 일반화 성능 향상
① Cut-Out
이미지의 일부 영역을 검은색 패치로 마스킹(제거)하여, 모델이 주변 맥락을 이용해 인식하도록 유도
② CutMix
두 이미지를 패치 단위로 합성하고, 대응하는 레이블도 혼합하여 학습 데이터 다양성을 극대화
③ MixUp
두 이미지를 픽셀 단위로 선형 결합하고, 레이블 역시 동일 비율로 혼합하여 부드러운 결정 경계를 학습
① 개념
서로 다른 방식으로 학습된 여러 개의 신경망 모델의 예측 결과를 종합하여 최종 결론을 도출하는 기법
② Voting
③ Averaging
회귀 문제에서 각 모델이 예측한 실수 값을 단순 평균 또는 가중 평균하여 최종 예측값 산출
④ 효과
개별 모델의 약점을 서로 보완하여 일반화 성능 향상
과적합 억제에 효과적인 일반화 기법 중 하나
① 개념
학습 과정에서 은닉층의 뉴런을 확률 만큼 무작위로 비활성화(drop)하며 학습함으로써, 특정 뉴런이나 경로(path)에 과도하게 의존하지 않도록 만드는 정규화 기법
② 동작 방식
학습 중 각 순전파(forward pass)에서 뉴런 하나를 확률 로 비활성화
비활성화된 뉴런은 해당 학습 단계의 순전파·역전파 모두에서 제외
evaluation 시에는 모든 뉴런을 사용하되, 학습 중 적용된 비율에 맞춰 출력값을 스케일 보정
③ 효과
무작위로 다양한 sub-network을 학습시켜 앙상블 효과를 내고 과적합을 억제
네트워크의 robustness 및 일반화 성능 향상
PyTorch 적용 예시
# 1) 단일 드롭아웃 레이어
import torch.nn as nn
# 은닉층 뉴런을 50% 확률로 드롭
dropout = nn.Dropout(p=0.5)
x = ... # 입력 텐서
y = dropout(x)
# 2) 모델 정의 내부에서 사용
import torch.nn as nn
import torch.nn.functional as F
class SimpleMLP(nn.Module):
def __init__(self, input_dim, hidden_dim, output_dim, p=0.5):
super().__init__()
self.fc1 = nn.Linear(input_dim, hidden_dim)
self.dropout = nn.Dropout(p=p)
self.fc2 = nn.Linear(hidden_dim, output_dim)
def forward(self, x):
x = F.relu(self.fc1(x))
x = self.dropout(x) # 드롭아웃 적용
return self.fc2(x)
model = SimpleMLP(784, 256, 10, p=0.5)
# 3) 2D 드롭아웃 (Conv 레이어 뒤)
class ConvNet(nn.Module):
def __init__(self, p=0.3):
super().__init__()
self.conv = nn.Conv2d(3, 32, kernel_size=3, padding=1)
self.drop2d = nn.Dropout2d(p=p)
self.fc = nn.Linear(32*32*32, 10)
def forward(self, x):
x = F.relu(self.conv(x))
x = self.drop2d(x) # 2D 드롭아웃 적용
x = x.view(x.size(0), -1)
return self.fc(x)
model = ConvNet(p=0.3)
# 4) 학습/평가 모드 전환
# 학습 모드 (드롭아웃 활성화)
model.train()
output = model(input_batch)
# 평가 모드 (드롭아웃 비활성화)
model.eval()
with torch.no_grad():
preds = model(input_batch)
① 개념
이미 A 작업(task A)에 대해 풍부한 학습 데이터로 사전 학습(pre-training)된 네트워크를 가져와, 데이터가 부족한 B 작업(task B)에 적용하는 기법
② 적용 조건
③ 적용 방법
<참고 자료>
유성욱 교수님, 지능형 영상처리, 중앙대학교 전자전기공학부, 2024