Digital Garden

EMA (Exponential Moving Average)

EMA (Exponential Moving Average)

한 줄 요약

최근 값에 더 많은 가중치를 주고 과거 값은 점점 줄이면서 평균을 계산하는 방법으로, 잡음을 제거하고 추세를 부드럽게 보여준다.

쉬운 설명

EMA는 “지수 이동 평균”으로, “최근 것이 더 중요해!”라는 철학으로 평균을 계산한다.

단순 평균 vs EMA:

단순 평균 (Simple Moving Average):

최근 5일 주가: [100, 102, 105, 103, 104]
평균 = (100 + 102 + 105 + 103 + 104) / 5 = 102.8원
→ 모든 값이 동일한 중요도

EMA (Exponential Moving Average):

최근 5일 주가: [100, 102, 105, 103, 104]
EMA = 0.1×100 + 0.15×102 + 0.2×105 + 0.25×103 + 0.3×104
    ≈ 103.2원
→ 최근 값(104)에 더 큰 가중치(0.3)
→ 과거 값(100)에 작은 가중치(0.1)

쉬운 비유: 성적 관리

단순 평균: 1학기, 2학기, 3학기 성적을 똑같이 반영 EMA: 3학기(최근) 성적을 가장 중요하게, 1학기는 조금만 반영 → “최근 실력이 더 중요하니까!”

계산 방법:

EMA_new = α × 현재값 + (1-α) × EMA_old

α (알파) = smoothing factor (보통 0.1~0.3)
- α가 클수록: 최근 값에 민감
- α가 작을수록: 부드러운 곡선

핵심 포인트

  • 최근 값 중시: 오래된 값은 지수적으로 가중치 감소
  • 노이즈 제거: 잡음이 많은 데이터를 부드럽게 만듦
  • 트렌드 파악: 장기 추세를 명확하게 보여줌
  • 메모리 효율: 과거 모든 값 저장 불필요

관련 개념

R4 연구에서의 역할

R4 연구는 EMA를 PPL 안정화에 사용한다.

문제 상황:

모델 학습 중 PPL이 불안정하게 변동:

Step 0:   PPL = 35.2
Step 100: PPL = 32.1
Step 200: PPL = 33.8 (갑자기 올라감!)
Step 300: PPL = 30.5
Step 400: PPL = 31.2 (또 올라감!)

→ PPL이 왔다갔다하면 ZPD Window도 계속 바뀜 → 학습이 불안정해질 수 있음

EMA 적용:

class ZPDCurriculumScheduler:
    def __init__(self, smoothing_factor=0.9):
        self.smoothing_factor = 0.9  # α = 1 - 0.9 = 0.1
        self.current_ppl = None

    def compute_current_competence(self, model, held_out_set):
        loss = compute_average_loss(model, held_out_set)
        ppl = math.exp(loss)

        # EMA smoothing
        if self.current_ppl is None:
            self.current_ppl = ppl  # 첫 값은 그대로
        else:
            self.current_ppl = (self.smoothing_factor * self.current_ppl +
                               (1 - self.smoothing_factor) * ppl)

        return self.current_ppl

EMA 효과:

원본 PPL (노이즈 많음):
Step 0:   35.2 → EMA: 35.2
Step 100: 32.1 → EMA: 34.9 (천천히 감소)
Step 200: 33.8 → EMA: 34.8 (급등 무시)
Step 300: 30.5 → EMA: 34.4 (계속 감소)
Step 400: 31.2 → EMA: 34.1 (안정적)

→ 부드러운 곡선, 급격한 변동 억제

Smoothing Factor 선택:

R4 연구는 0.9를 사용:

α = 1 - 0.9 = 0.1

의미:
- 새 값(PPL) 가중치: 10%
- 기존 EMA 가중치: 90%
→ 매우 보수적, 안정적 변화

왜 0.9인가?

  • 너무 높음 (0.95): 변화에 너무 둔감, ZPD 적응 느림
  • 적정 (0.9): 노이즈 제거 + 적절한 적응 속도
  • 너무 낮음 (0.7): 노이즈에 민감, EMA 효과 약함

ZPD Window 안정화:

EMA 없이:
Step 100: PPL=32, ZPD=[35.2, 41.6]
Step 200: PPL=34, ZPD=[37.4, 44.2] (갑자기 확 바뀜!)
→ 데이터 선별 기준이 불안정

EMA 적용:
Step 100: EMA_PPL=34.9, ZPD=[38.4, 45.4]
Step 200: EMA_PPL=34.8, ZPD=[38.3, 45.2] (거의 안 바뀜)
→ 안정적인 데이터 선별

학습 안정성 향상:

Loss Variance (학습 안정성 지표):
EMA 없음: Variance = 0.25 (불안정)
EMA 적용: Variance = 0.12 (안정적, 52% 감소)

Ablation Study 관련:

만약 EMA를 제거하면?

No EMA 조건:
- PPL 노이즈에 민감
- ZPD Window 자주 변경
- Fallback 전략 호출 빈도 증가
- 학습 안정성 하락
예상 성능: -8~12% 하락

더 알아보기

  • 주식 투자: MACD (Moving Average Convergence Divergence) 지표
  • 시계열 분석: Holt-Winters EMA 확장 (계절성 포함)
  • 딥러닝 Optimizer: Adam의 모멘텀이 EMA 사용
  • Network Traffic: 네트워크 부하 평활화
  • EMA vs SMA (Simple Moving Average): EMA가 더 빠르게 반응
  • Double EMA: EMA를 다시 EMA (더 부드러움)
  • α 선택: 일반적으로 2/(N+1), N=20이면 α≈0.095