C.W.K.
Stream
Lesson 02 of 05 · published

궁극의 정규화: 극한 스케일 압축

~10 min · normalization, compression, decibels

Level 0수학 초심자
0 XP0/59 lessons0/13 achievements
0/100 XP to next level100 XP to go0% complete

숫자가 우주를 가로지를 때

어떤 양은 미친 스케일에 살아. 별 밝기 — 태양에서 먼 은하까지. 지진 매그니튜드 — 거의 못 느낀 미진에서 대륙 흔드는 재앙까지. 소리 — 속삭임에서 제트 엔진까지. 언어 모델에서 확률 — "매우 흔함" 에서 "사실상 절대".

이걸 선형 스케일에 plot 하면 실패 — 작은 값이 보이지 않게 짓눌림. 로그가 압축. 지수 범위를 선형 느낌으로 변환.

데시벨: 네 귀가 이미 함

데시벨 스케일이 음 강도를 로그로 측정: . 0 dB = 청력 임계. 60 dB = 대화. 120 dB = 제트 엔진. 10 dB 단계마다 실제 음 에너지 10× 변화. 네 귀가 이미 이렇게 인식 — 강도가 ~10× 되면 "두 배 시끄럽다" 들림. 엔지니어가 dB 를 사람 인식에 맞게 만들었고, 그 인식 자체가 로그.

왜 AI 가 로그 사랑

세 가지 일:

  1. 수치 안정성. 작은 확률 곱셈 () 이 float32 에서 0 으로 underflow. 로그 합 (-50 + -50 = -100) 은 안 그래.
  2. 손실 함수. Cross-entropy 손실 = . 로그가 정답 근처엔 부드러운 gradient, 매우-틀림엔 가혹한 페널티 — 정확히 우리가 원하는 비대칭.
  3. 시각화. 손실 곡선이 보통 로그 y축에 — 초기 극적 drop 이 후기 미묘한 개선 묻지 않게.
로그 = 극한 범위용 압축기. 자릿수 가로지르는 데이터엔 선형 사고가 죽음. 로그로 전환하면 구조가 다시 보임.

Code

와일드 범위를 선형 단계로 압축·python
import numpy as np

# 별 밝기 — 자릿수 떨어진
brightness = np.array([1e-3, 1e-1, 1e1, 1e3, 1e5, 1e7])

# 선형 plot 은 작은 거 압축
print(brightness)

# 로그 스케일이 비교 가능하게
print(np.log10(brightness))   # [-3 -1  1  3  5  7]

# 데시벨 — 음 강도에 정확히 같은 아이디어
intensity = np.array([1e-12, 1e-9, 1e-6, 1e-3, 1])
dB = 10 * np.log10(intensity / 1e-12)
print(dB)       # [  0  30  60  90 120]

External links

Exercise

1~10000 임의 100개 생성. 선형 x축에 히스토그램, 그 다음 로그 x축. 로그-스케일 히스토그램이 해석 가능해지고, 선형은 큰 값 몇 개에 지배됨을 봐.
Hint
np.random.uniform(1, 10000, 100)plt.xscale('log'). 많은 실세계 양 (파일 크기, 소득, 도시 인구) 이 읽히려면 로그 스케일 필요.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고
💛 by 피파happy

댓글 2

🔔 답글 알림 (로그인 필요)
로그인댓글을 남기려면 로그인해 주세요.
  1. Elechemist
    Elechemist

    큰 값 몇개에 밀려버리면 선형분포는 그 부분만 우뚝솟아서 다른 항목의 숫자를 잘 인지하지못하도록 압축시켜버림

    로그스케일을 하면 때에 따라 이부분이 개선됨, 이게 맞나? 나는 가로로 로그스케일을 쓰긴했는데 주식차트같은 경우 세로로 로그스케일을 많이씀

    import numpy as np import matplotlib.pyplot as plt

    rng = np.random.default_rng(42)

    1~10000에 걸쳐 자릿수가 고르게 퍼지도록 로그 균등 생성 (현실 데이터의 전형)

    data = 10 ** rng.uniform(0, 4, 100)

    fig, (ax1, ax2) = plt.subplots(1, 2, figsize=(12, 5))

    선형 x축 히스토그램

    ax1.hist(data, bins=30, color='#378ADD', edgecolor='white') ax1.set_title("Linear x-axis") ax1.set_xlabel("value") ax1.set_ylabel("count")

    로그 x축 히스토그램 — 로그 간격 구간 사용

    bins = np.logspace(0, 4, 30) ax2.hist(data, bins=bins, color='#1D9E75', edgecolor='white') ax2.set_xscale('log') ax2.set_title("Log x-axis") ax2.set_xlabel("value (log scale)") ax2.set_ylabel("count")

    plt.tight_layout() plt.savefig('loghist.png', dpi=130)

    💛 by 피파happy
    1. 피파
      피파· warmElechemistElechemist

      맞아요. 큰 값 몇 개가 선형축에서 화면을 지배하면 나머지가 한쪽에 눌려 보이는데, 로그축은 비율 기준으로 간격을 다시 펼쳐줘요. 주식 차트의 세로 로그축은 가격의 “차이”보다 “수익률 비율”을 보려는 선택이고, 이 예제의 가로 로그축은 값의 크기 구간을 비율로 나누려는 선택이에요.