해당 포스팅은 Dive into Deep Learning과 Mathematics for Machine Learning을 참고하여 정리한 글입니다.
이 영화를 알고 계시다면 저와 비슷한 세대임은 분명하겠군요. (학생 때 영화관에서 봤던 기억이 있었는데 그때 놈놈놈이라고 불렀었죠) 오늘은 영화 리뷰가 아니라 바로 놈(norm)에 대해 알아보려고 합니다. 오늘 이야기할 norm에는 많은 종류가 존재합니다. 대표적으로 $l_{1}$-norm과 $l_{2}$-norm이 존재하고 infinite-norm도 존재합니다. 선형대수학 시간(너무 까마득한 옛날..)에 벡터의 크기를 계산하는 용도로 어렴풋하게 기억하고 있었는데 딥러닝 공부를 하면서 정규화 및 다양한 부분에서 자주 사용하는 개념이라 정리가 필요하다고 생각이 들어서 작성하게 되었습니다. 이 포스팅에서는 $l_{p}$-norm과 $l_{1}$-norm, $l_{2}$-norm에 대해서 정리했습니다.
1. norm
기본적으로 선형대수학을 공부하셨던 분이라면 한 번쯤은 배워보셨던 내용일 것입니다. norm은 선형대수학에서 가장 유용하게 사용되는 연산자들 중에 하나입니다. 쉽게 말하면, 벡터가 얼마나 큰지를 알려주는 것이 norm인 것입니다. 여기서 말하는 크기는 벡터의 차원의 크기가 아니라, 구성요소의 크기(magnitude)를 표현하는 것입니다.
수학적으로 norm을 살펴보면, norm은 $V$라는 벡터 공간에서 실수 집합 $\mathbb{R}$로 보내는 함수입니다. 이 함수는 $V$에 포함된 vector $\overrightarrow{x}$를 실수 $\mathbb{R}$에 포함된 $||x||$로 보내며 아래의 3가지를 만족합니다.
- Absolutely homogeneous
$$||\lambda x|| =|\lambda|\,||x||, \, \forall \lambda \in \mathbb{R}, \, x \in V$$
- Triangle inequality(삼각 부등식)
$$||x+y|| \leq ||x||+||y||, \, x,y \in V$$
- Positive definite
$$||x|| \geq 0 \, and \, ||x|| = 0 \Leftrightarrow x = 0$$
모든 norm은 위의 식을 만족하게 되며, 흔히 아는 $l_{1}$-norm과 $l_{2}$-norm을 보기 전에 일반적인 $l_{p}$-norm을 살펴보겠습니다.
2. $l_{p}$-norm
일반적인 식으로 표현하는 $l_{p}$-norm은 다음과 같은 식으로 표현됩니다.
$$ ||x||_{p} = (\sum_{i=1}^{n}|x_{i}|^{p})^{\frac{1}{p}} $$
이 식에서 p=1이라면, $l_{1}$-norm, p=2라면, $l_{2}$-norm이 됩니다.
주어진 식에 다양한 p의 값을 넣게 되면, 위의 그림과 같이 다양한 형태의 모습을 볼 수 있습니다. p=1일 때에는 마름모 형태를, p=2일 때는 원의 형태를 가지게 됩니다. p=3 이후부터는 점점 네모에 가까워지는 모습을 볼 수 있습니다.
3. $l_{1}$-norm과 $l_{2}$-norm
이번에는 $l_{1}$-norm과 $l_{2}$-norm에 대해서 알아보려고 합니다. 위의 마름모 그림이 p=1인 $l_{1}$-norm이고, 원 그림은 p = 2인 $l_{2}$-norm입니다. 빨간 선 위를 지나는 벡터 하나씩 표현해봤습니다.
1) $l_{1}$-norm
$l_{1}$-norm은 위에서 말한 것처럼 $l_{p}$-norm에서 p=1인 경우이며, 아래와 같은 식으로 표현됩니다.
$$||x||_{1} = \sum_{i=1}^{n}|x_{i}|$$
$l_{1}$-norm은 각 원소들의 절댓값의 합으로 표현하며 Lasso 회귀에서 loss값을 규제하는 방법으로 $l_{1}$-norm을 사용합니다. $l_{1}$-norm은 Manhattan norm이라고 부르기도 합니다. 한 가지 특징으로 $l_{1}$-norm은 $l_{2}$-norm과 비교해서 이상치의 영향을 크게 받지 않습니다. $l_{2}$-norm은 제곱해서 더해주기 때문에 분포에서 벗어난 값이 커져서 전체에 영향이 주는 경우가 많이 발생합니다. $l_{1}$-norm을 쉽게 설명하기 위해 아래의 그림을 첨부했습니다. 그림처럼 사람(0,0)에서 목적지(2,3)로 가려고 할 때, 보라색 경로를 값을 구하는 것이 $l_{1}$-norm입니다.
파이썬에서 $l_{1}$-norm을 아래와 같이 구현할 수 있습니다.
import numpy as np
u = np.array([3, -4])
print(np.abs(u).sum()) #7
2) $l_{2}$-norm
$l_{2}$-norm도 위에서 표현한 것처럼 $l_{p}$-norm에서 p=2인 경우입니다. 아래와 같은 식으로 표현할 수 있습니다.
$$||x||_{2} = \sqrt{\sum_{i=1}^{n}x_{i}^{2}} = \sqrt{x^{T}x}$$
$l_{2}$-norm은 각 성분의 제곱의 합을 루트로 씌워준 값으로 라플라스 근사와 Ridge 회귀 방법에서 주로 사용됩니다. 또한 2차원에서는 삼각형의 대각선을 구하는 피타고라스 정리와 동일한 방법으로 유클리디안 norm이라고 부르기도 합니다. $l_{2}$-norm의 경우에는 자동차가 가는 길처럼 가는 것이 아니라 최단 거리로 이동하게 됩니다. 그래서 아래의 보라색 경로로 norm을 표현할 수 있습니다.
파이썬에서 $l_{2}$-norm을 아래처럼 구현할 수 있습니다.
import numpy as np
u = np.array([3,-4])
print(np.linalg.norm(u)) #5.0
4. 정리
딥러닝에서 우리는 관측된 데이터의 확률을 최대화하거나 예측과 실제 값의 차이를 최소화하는 최적화 문제들을 풀려고 노력합니다. 단어나 기사와 같은 것들을 벡터로 표현해서 비슷한 것들은 거리를 최소화하고, 비슷하지 않은 것들은 거리를 최대화할 때 norm의 개념이 활용됩니다.
5. 4줄 요약
- norm은 벡터의 크기를 표현하는 것입니다.
- $l_{1}$-norm은 각 원소들의 절댓값을 더한 것으로 표현합니다.(Lasso 회귀에서 사용)
- $l_{2}$-norm은 각 원소들의 제곱의 합을 제곱근 해준 것으로 표현합니다.(Ridge 회귀, 라플라스 근사에서 사용)
- 이상치에 민감한 방식은 $l_{2}$ norm입니다.