벡터의 크기를 재는 자
스칼라의 크기는 절댓값으로 재지만 벡터에는 여러 자가 있어.
- L2 노름: . 원점에서의 유클리드 거리야.
- L1 노름: . 격자 길을 따라 움직이는 맨해튼 거리와 이어져.
- L∞ 노름: . 가장 큰 성분 하나를 기준으로 삼아.
‘노름’이라고만 쓰면 L2를 뜻하는 경우가 많지만 API마다 기본값을 확인해야 해. 같은 벡터도 어떤 노름을 택하느냐에 따라 크기와 가까움의 모양이 달라져.
정규화와 규제는 다른 말
- 벡터 정규화: 처럼 노름으로 나눠 길이를 1로 맞춰. 0벡터에는 바로 적용할 수 없어.
- L1 규제: 목적함수에 을 더해 희소한 해를 선호하게 해. LASSO가 대표적이야.
- L2 규제: 페널티로 큰 가중치를 억제해. SGD에서는 전통적 weight decay와 연결되지만, AdamW의 decoupled weight decay처럼 최적화기에서는 구현과 효과를 구분해야 해.
- 기울기 클리핑: 기울기 노름이 임계값을 넘을 때 전체 크기를 줄여 폭발을 완화해.
한국어로 둘 다 ‘정규화’라고 부르는 자료가 있지만, normalization과 regularization은 목적부터 달라. 하나는 표현의 스케일을 맞추고, 다른 하나는 학습 목적에 제약을 더해.
노름은 크기를 재는 자야. 그 자로 나누는지, 목적함수에 벌점을 더하는지까지 말해야 연산의 뜻이 완성돼.
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