본문 바로가기
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

곱셈의 자릿수를 덧셈 눈금으로

별의 밝기와 파일 크기, 확률처럼 여러 자릿수를 가로지르는 양은 선형 축에서 작은 값이 한쪽에 눌려 보일 수 있어. 양수 에 로그를 취하면 같은 비율의 변화가 같은 간격으로 바뀌어. 10배, 100배, 1,000배가 로그10 눈금에서는 1, 2, 3의 차이가 되는 식이야.

이것을 정규화와 섞지는 마. 로그 변환은 비선형으로 비율 구조를 펼치지만 평균을 0, 표준편차를 1로 맞추거나 값을 정한 범위에 넣는 연산은 아니야. 0과 음수에는 그대로 적용할 수 없고, 단위와 기준값도 해석에 영향을 줘.

데시벨은 기준에 대한 비율

강도비를 나타내는 데시벨은 로 쓸 수 있어. 강도가 10배가 되면 10 dB, 100배가 되면 20 dB 늘어나. 음압처럼 진폭비를 다룰 때는 전력과의 제곱 관계 때문에 보통 를 써.

0 dB는 ‘소리가 없음’이 아니라 선택한 기준과 같은 수준이라는 뜻이야. 음압레벨에서는 흔히 청력 문턱 근처의 기준을 쓰지만 실제 지각은 주파수와 사람, 환경에 따라 달라. 약 10 dB 증가를 두 배쯤 크게 느낀다는 말도 유용한 근사이지 보편적 법칙은 아니고.

AI에서 로그를 쓰는 세 자리

  1. 수치 안정성: 작은 확률을 많이 곱하면 언더플로가 날 수 있어. 로그를 취하면 곱이 합으로 바뀌어 더 넓은 범위를 안정적으로 다룰 수 있어.
  2. 목적함수: 범주형 교차엔트로피 는 정답에 낮은 확률을 줄수록 손실을 크게 만들어. 실제 구현은 logits에서 log_softmax를 함께 계산해 안정성을 지켜.
  3. 시각화: 양수가 여러 자릿수에 걸쳐 있을 때 로그 축을 쓰면 비율 변화를 비교하기 쉬워. 0과 음수, 오차막대의 해석은 별도로 처리해야 해.
로그는 큰 동적 범위를 비율의 눈금으로 펼치는 변환이야. 정규화와 같은 말이 아니며, 입력의 부호와 0, 밑, 기준값을 확인해야 올바르게 해석할 수 있어.

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

10의 0제곱부터 4제곱 사이에서 지수를 균등하게 뽑아 양수 1,000개를 만들고, 선형 간격과 로그 간격의 bin으로 히스토그램을 각각 그려. 같은 자료가 두 그림에서 어떻게 다르게 보이는지 설명해.
Hint
x = 10 ** np.random.uniform(0, 4, 1000)처럼 로그균등 자료를 만들 수 있어. 로그 축만 켜는 것과 bin 경계를 로그 간격으로 잡는 것이 왜 다른지도 확인해.

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

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