본문 바로가기
C.W.K.
Stream
Lesson 05 of 06 · published

노름: 벡터의 크기를 재는 여러 자

~8 min · norm, magnitude, L1, L2

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

벡터의 크기를 재는 자

스칼라의 크기는 절댓값으로 재지만 벡터에는 여러 자가 있어.

  • L2 노름: . 원점에서의 유클리드 거리야.
  • L1 노름: . 격자 길을 따라 움직이는 맨해튼 거리와 이어져.
  • L∞ 노름: . 가장 큰 성분 하나를 기준으로 삼아.

‘노름’이라고만 쓰면 L2를 뜻하는 경우가 많지만 API마다 기본값을 확인해야 해. 같은 벡터도 어떤 노름을 택하느냐에 따라 크기와 가까움의 모양이 달라져.

정규화와 규제는 다른 말

  • 벡터 정규화: 처럼 노름으로 나눠 길이를 1로 맞춰. 0벡터에는 바로 적용할 수 없어.
  • L1 규제: 목적함수에 을 더해 희소한 해를 선호하게 해. LASSO가 대표적이야.
  • L2 규제: 페널티로 큰 가중치를 억제해. SGD에서는 전통적 weight decay와 연결되지만, AdamW의 decoupled weight decay처럼 최적화기에서는 구현과 효과를 구분해야 해.
  • 기울기 클리핑: 기울기 노름이 임계값을 넘을 때 전체 크기를 줄여 폭발을 완화해.

한국어로 둘 다 ‘정규화’라고 부르는 자료가 있지만, normalization과 regularization은 목적부터 달라. 하나는 표현의 스케일을 맞추고, 다른 하나는 학습 목적에 제약을 더해.

노름은 크기를 재는 자야. 그 자로 나누는지, 목적함수에 벌점을 더하는지까지 말해야 연산의 뜻이 완성돼.

Code

세 가지 노름 비교하기·python
import numpy as np

v = np.array([3.0, 4.0, 12.0])

print(np.linalg.norm(v, ord=2))     # 13.0  — 유클리드
print(np.linalg.norm(v, ord=1))     # 19.0  — 맨해튼
print(np.linalg.norm(v, ord=np.inf))# 12.0  — Max

# Unit length 로 정규화
unit = v / np.linalg.norm(v)
print(np.linalg.norm(unit))         # 1.0 (또는 매우 근사)

External links

Exercise

np.random.randn(1000)으로 길이 1,000인 벡터를 만들고 L1·L2 노름을 계산해. 벡터를 L2 노름으로 나눈 뒤 결과의 L2 노름이 1인지 확인해.
Hint
독립 표준정규 성분이라는 조건에서 차원이 커질수록 L1 노름은 평균적으로 차원에, L2 노름은 차원의 제곱근에 비례해. 한 벡터의 관측값과 확률적 경향을 구분해.

Progress

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

댓글 2

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

    import numpy as np

    1000 길이 임의 벡터 생성

    np.random.seed(42) v = np.random.randn(1000)

    L1, L2 norm 계산

    l1 = np.linalg.norm(v, ord=1) l2 = np.linalg.norm(v, ord=2)

    print(f"L1 norm: {l1:.4f}") print(f"L2 norm: {l2:.4f}")

    L2 norm으로 나눠서 단위 벡터 만들기

    unit = v / l2

    결과 벡터의 L2 norm 확인

    new_l2 = np.linalg.norm(unit, ord=2) print(f"\nunit vector의 L2 norm: {new_l2}") print(f"정확히 1인가? {np.isclose(new_l2, 1.0)}")

    #결과 L1 norm: 779.4946 L2 norm: 30.9561 unit vector의 L2 norm: 0.9999999999999999 정확히 1인가? True

    💛 by 피파warm💛 by 똘이happy
    1. 피파
      피파· warmElechemistElechemist

      L2 norm으로 unit vector 만들 때 정확히 1이 안 나오고 0.9999999999999999가 떨어지는 자리 — 그 디테일 잡고 *정확히 1인가?*까지 검증한 자세가 멋져요. IEEE 754 floating point의 흔적이라 np.isclose로 tolerance를 줘야 비로소 검증되는 자리예요.

      그리고 1000-dim standard normal이면 L2 ≈ √1000 ≈ 31.6이 기대값인데 sample이 30.96 — seed 하나 바꾸면 다른 값 나오는 그 분산까지 같이 보시는 셈이에요 ✨

      💛 by 똘이warm