L2 정규화(L2 Normalization)란? AI가 벡터 길이를 1로 맞추는 방법
TL;DR
L2 정규화(L2 Normalization)는 벡터의 각 값을 그 벡터의 L2 노름으로 나누어 길이를 1로 맞추는 연산입니다. 값의 전체 크기는 맞추고 0이 아닌 벡터의 방향은 유지하므로 임베딩 비교, 검색, 특징 전처리에서 자주 씁니다. 어느 축을 벡터로 볼지와 영벡터를 어떻게 처리할지에 따라 결과가 달라지며, L2 규제나 레이어 정규화와는 목적과 계산이 다릅니다.
핵심 3줄 요약
- 핵심 1
제곱합의 제곱근으로 나눕니다. 0이 아닌 벡터의 L2 노름은 1이 됩니다. - 핵심 2
방향 비교에 유용합니다. 크기가 다른 임베딩을 단위 벡터로 맞춰 각도 중심으로 비교할 수 있습니다. - 핵심 3
축과 영벡터 처리가 핵심입니다. 잘못된 축이나 다른 엡실론 규칙은 실행 가능한 오답을 만듭니다.
이 글에서 다룰 내용
- L2 정규화의 한 문장 정의와 단위 노름의 뜻
- 3과 4로 이해하는 계산 예시
- 임베딩 검색과 특징 비교에서 중요한 이유
- 제곱합·제곱근·나눗셈으로 이어지는 작동 순서
- 축·p 값·엡실론·영벡터 처리의 의미
- L1 정규화·표준화·레이어 정규화·L2 규제와의 차이
- 학습·추론·모델 변환에서 확인할 실전 순서
L2 정규화를 한 문장으로 정의하면 무엇인가요?
L2 정규화는 벡터 성분의 제곱을 모두 더한 뒤 제곱근을 구하고, 각 성분을 그 값으로 나누어 단위 길이의 벡터로 바꾸는 연산입니다. L2 노름은 유클리드 노름이라고도 부릅니다.
입력 벡터가 0이 아니라면 정규화한 결과의 제곱합은 1이 되고 L2 노름도 1이 됩니다. 모든 성분을 같은 양수로 나누므로 벡터가 가리키는 방향은 유지됩니다. 크기 정보는 사라지므로 원래 벡터의 노름이 필요한 작업이라면 정규화 전에 따로 보관해야 합니다.
PyTorch의 normalize 함수는 지정한 차원에서 p-노름을 구해 입력을 나누며 기본 p 값은 2입니다. TensorFlow의 l2_normalize도 지정한 축의 제곱합을 이용합니다. ONNX는 같은 계열 연산을 LpNormalization이라는 이름으로 정의합니다.
한 줄 정리: L2 정규화는 벡터를 같은 방향의 길이 1인 단위 벡터로 바꿉니다.
쉬운 예시로 이해해 볼까요?
두 성분으로 이루어진 벡터 [3, 4]를 생각해 보겠습니다. 각 성분의 제곱은 9와 16이고 합은 25입니다. 25의 제곱근은 5이므로 이 벡터의 L2 노름은 5입니다.
- 첫째, 3의 제곱과 4의 제곱을 더해 25를 구합니다.
- 둘째, 25의 제곱근을 구해 L2 노름 5를 얻습니다.
- 셋째, 각 값을 5로 나누면 [0.6, 0.8]이 됩니다.
- 마지막으로 0.6의 제곱과 0.8의 제곱을 더하면 1이므로 결과 길이는 1입니다.
원래 벡터와 정규화한 벡터는 같은 방향을 가리킵니다. 달라진 것은 길이뿐입니다. [30, 40]도 L2 정규화하면 [0.6, 0.8]이 되므로 서로 다른 크기의 벡터가 방향상 같은 패턴을 가졌다는 점을 쉽게 비교할 수 있습니다.
쉬운 예시: 같은 방향을 가리키는 길이 5짜리 화살표와 길이 50짜리 화살표를 모두 길이 1로 줄여 방향만 비교하는 과정입니다.
왜 AI에서 L2 정규화가 중요한가요?
임베딩의 크기보다 방향을 비교하기 쉬워집니다
문장·이미지·상품을 임베딩으로 표현하면 벡터마다 길이가 다를 수 있습니다. L2 정규화는 각 벡터의 길이를 1로 맞춰 방향 차이에 집중하게 합니다. 정규화된 두 벡터가 모두 영벡터가 아니라면 두 벡터의 내적은 코사인 유사도와 같습니다.
검색 계산을 단순하게 만들 수 있습니다
문서와 질의 임베딩을 같은 방식으로 L2 정규화하면 내적 검색으로 코사인 유사도 순위를 구현할 수 있습니다. 다만 저장할 때만 정규화하고 질의에는 적용하지 않거나 서로 다른 모델의 벡터를 섞으면 기대한 관계가 깨집니다. 색인과 질의 양쪽의 처리 규칙을 함께 기록해야 합니다.
특징값 크기의 영향을 통제합니다
분류·클러스터링·추천 작업에서는 표본마다 특징 벡터의 전체 크기가 크게 다를 수 있습니다. 크기 자체가 의미가 없고 성분의 상대적 패턴이 중요하다면 단위 노름으로 맞추는 편이 유용합니다. 반대로 신호 세기나 빈도 총량이 중요한 문제에서는 정규화가 필요한 정보를 없앨 수 있습니다.
핵심 인사이트: L2 정규화는 모든 데이터에 자동으로 좋은 전처리가 아닙니다. 벡터의 크기를 버리고 방향을 비교해도 되는 작업인지가 먼저입니다.
L2 정규화는 어떻게 작동하나요?
1. 정규화할 벡터 축을 정합니다
배치 형태가 [표본 수, 특징 수]라면 보통 각 표본의 특징 축을 따라 노름을 구합니다. 이미지 특징 텐서나 다차원 임베딩은 채널·공간·토큰 중 어느 차원을 묶을지 명시해야 합니다. 모양만 같아도 축이 다르면 전혀 다른 벡터를 정규화합니다.
2. 각 성분의 제곱합을 구합니다
선택한 축의 값을 각각 제곱해 더합니다. 음수도 제곱하므로 서로 상쇄되지 않습니다. 값의 범위가 매우 크거나 작은 경우에는 자료형과 구현 방식에 따라 반올림이나 넘침 위험이 달라질 수 있습니다.
3. 제곱근으로 L2 노름을 만듭니다
제곱합의 제곱근이 L2 노름입니다. 벡터 [3, 4]에서는 5입니다. 모든 성분이 0이면 노름도 0이므로 그대로 나눌 수 없습니다. 이 경우를 처리하려고 프레임워크는 작은 하한값이나 별도 영벡터 규칙을 둡니다.
4. 원래 값을 노름으로 나눕니다
각 성분을 같은 노름으로 나누면 0이 아닌 벡터의 길이가 1이 됩니다. TensorFlow는 제곱합과 epsilon 중 큰 값을 이용해 분모를 만들고 PyTorch는 노름과 eps 중 큰 값으로 나눕니다. 같은 eps 숫자를 넣어도 해석이 완전히 같다고 가정해서는 안 됩니다.
한 줄 정리: 축 선택 → 제곱합 → 제곱근 → 영벡터 보호 → 성분별 나눗셈 순서입니다.
주요 설정과 예외는 무엇인가요?
axis 또는 dim
axis와 dim은 어느 차원을 하나의 벡터로 볼지 정합니다. scikit-learn의 normalize는 기본적으로 각 표본 행을 따로 정규화하지만 axis를 바꾸면 각 특징 열을 정규화할 수 있습니다. 프레임워크를 옮길 때 기본 축을 그대로 믿지 말고 입력 모양과 함께 확인합니다.
p 값과 L2의 범위
일반적인 Lp 정규화에서 p는 노름의 차수를 뜻합니다. p가 2이면 제곱합의 제곱근을 쓰는 L2 정규화입니다. PyTorch는 p를 인자로 받고 ONNX LpNormalization은 1 또는 2를 지원합니다. 이름이 normalize여도 기본 p 값과 허용 범위는 API마다 다릅니다.
eps 또는 epsilon
eps는 노름이 0이거나 매우 작을 때 0으로 나누는 일을 피하려는 안전값입니다. PyTorch 문서는 노름과 eps 중 큰 값을 분모로 사용한다고 설명합니다. TensorFlow 문서는 제곱합과 epsilon 중 큰 값의 제곱근을 분모로 씁니다. 변환 전후 결과를 맞추려면 숫자뿐 아니라 적용 위치도 비교해야 합니다.
영벡터
모든 성분이 0인 영벡터에는 방향이 없습니다. ONNX LpNormalization은 지정한 축의 노름이 0이면 출력을 0으로 정의합니다. 다른 구현에서도 안전값 때문에 0이 유지될 수 있지만, 유사도 계산에서 영벡터를 정상 방향 벡터처럼 취급하면 안 됩니다.
실전 팁: 작은 정상 벡터 하나와 영벡터 하나를 함께 넣어 축·출력 노름·NaN 발생 여부를 먼저 확인하세요.
헷갈리는 정규화와 무엇이 다른가요?
L1 정규화와 L2 정규화의 차이
L1 정규화는 절댓값의 합으로 벡터를 나누고 L2 정규화는 제곱합의 제곱근으로 나눕니다. 둘 다 벡터 크기를 맞추지만 결과의 기하학적 의미와 각 성분의 비율이 다릅니다. scikit-learn과 ONNX는 두 방식을 구분해 선택하도록 합니다.
표준화와 L2 정규화의 차이
표준화는 보통 각 특징에서 평균을 빼고 표준편차로 나눠 평균 0과 분산 1에 가깝게 맞춥니다. L2 정규화는 한 벡터의 평균을 빼지 않고 벡터 전체 길이를 1로 맞춥니다. 표본 축과 특징 축을 뒤바꾸면 두 개념을 혼동하기 쉽습니다.
레이어 정규화·RMSNorm과의 차이
레이어 정규화는 지정한 특징 축의 평균과 분산을 사용하고 학습 가능한 스케일과 이동 값을 둘 수 있습니다. RMSNorm은 제곱평균제곱근으로 특징값을 조정합니다. L2 정규화는 단위 노름을 만드는 벡터 연산이며 같은 이름의 신경망 층 정규화와 목적이 다릅니다.
L2 규제와 L2 정규화의 차이
L2 규제는 학습 손실에 가중치 제곱 크기와 관련된 벌점을 더해 큰 가중치를 억제하는 방법입니다. L2 정규화는 입력이나 출력 벡터를 노름으로 직접 나눕니다. 정규화와 규제는 영어로도 normalization과 regularization으로 구분됩니다.
코사인 유사도와 L2 정규화의 차이
코사인 유사도는 두 벡터 사이 각도를 바탕으로 유사성을 계산하는 지표입니다. L2 정규화는 각 벡터의 길이를 1로 만드는 전처리 연산입니다. 단위 벡터끼리의 내적이 코사인 유사도와 같다는 관계가 있지만 두 용어가 같은 뜻은 아닙니다.
비교 정리: L2 정규화는 벡터 길이, 표준화는 특징의 평균·분산, 레이어 정규화와 RMSNorm은 신경망 활성값, L2 규제는 학습 손실을 다룹니다.
실전에서는 어디에 쓰이나요?
임베딩 검색과 추천
문서·질의·상품·사용자 임베딩을 같은 규칙으로 정규화해 방향 기반 유사도를 비교합니다. 색인 생성 시점과 온라인 질의 시점의 모델 버전, 축, 자료형, 정규화 여부가 같아야 검색 순위를 안정적으로 재현할 수 있습니다.
텍스트와 이미지 특징 비교
서로 다른 입력에서 나온 특징 벡터의 크기 차이를 줄이고 상대적 방향을 비교할 때 씁니다. 한 모델 안에서도 텍스트와 이미지 출력의 규칙이 다를 수 있으므로 모델 문서가 정규화된 벡터를 이미 반환하는지 먼저 확인합니다. 이미 단위 노름인 값을 다시 처리할 필요는 적습니다.
분류·클러스터링 전처리
표본 행을 단위 노름으로 맞춘 뒤 거리나 방향에 민감한 알고리즘에 넣을 수 있습니다. scikit-learn은 normalize 함수와 파이프라인에서 쓸 수 있는 Normalizer를 제공합니다. 전체 크기에 의미가 있는 데이터라면 원본과 정규화본의 검증 성능을 비교해야 합니다.
모델 내보내기와 추론 엔진 변환
ONNX에는 LpNormalization 연산자 정의가 있어 정규화 단계를 그래프에 남길 수 있습니다. 변환 도구가 별도 연산으로 유지하는지, 여러 기본 연산으로 풀어 쓰는지, 영벡터 출력과 축이 같은지 확인합니다. 연산자 이름이 같아도 opset과 런타임 구현을 함께 봐야 합니다.
실전 팁: 검색 시스템에서는 문서 벡터와 질의 벡터의 노름 분포를 따로 기록하세요. 한쪽만 길이 1이 아니라면 파이프라인 누락을 빨리 찾을 수 있습니다.
적용 전후를 어떻게 점검하나요?
1. 입력 모양과 벡터 축을 기록합니다
배치·토큰·특징·채널 차원이 어떤 순서인지 적고 어느 축의 노름을 1로 만들지 정합니다. 코드의 음수 축은 차원 수가 달라지면 다른 위치를 가리킬 수 있으므로 실제 입력 모양으로 확인합니다.
2. 손으로 계산할 예시를 넣습니다
[3, 4]처럼 결과를 아는 벡터와 [0, 0] 영벡터를 사용합니다. 정상 벡터가 [0.6, 0.8]에 가까운지, 영벡터에서 NaN이나 무한대가 생기지 않는지 봅니다. 배치라면 각 행이 독립적으로 처리되는지도 확인합니다.
3. 출력 노름의 분포를 확인합니다
0이 아닌 벡터의 출력 L2 노름이 허용 오차 안에서 1인지 측정합니다. 평균만 보면 일부 축 오류가 가려질 수 있으므로 최솟값·최댓값과 영벡터 개수도 함께 봅니다. 저정밀 자료형에서는 허용 오차를 현실적으로 정합니다.
4. 검색 순위와 모델 품질을 비교합니다
수학 검사가 통과해도 업무 결과가 좋아진다고 단정할 수 없습니다. 정규화 전후의 검색 재현율, 분류 정확도, 클러스터 품질과 지연 시간을 같은 검증 데이터에서 비교합니다. 벡터 크기에 담긴 정보가 사라져 품질이 떨어질 수도 있습니다.
5. 변환 전후 출력을 대조합니다
PyTorch·TensorFlow·ONNX 사이에서 모델을 옮긴다면 같은 고정 입력으로 벡터 값과 노름을 비교합니다. 축, p 값, eps 적용 방식, 영벡터 처리, 자료형을 따로 기록하면 조용한 수치 차이를 찾기 쉽습니다.
한 줄 정리: 입력 축, 손계산 예시, 출력 노름, 실제 품질, 변환 전후 수치를 차례로 확인합니다.
사용할 때 무엇을 주의해야 하나요?
첫째, L2 규제와 혼동하지 않습니다. 이름에 L2가 들어가도 하나는 벡터를 직접 나누는 연산이고 다른 하나는 학습 손실이나 가중치 업데이트에 관여하는 방법입니다.
둘째, 축을 기본값에 맡기지 않습니다. PyTorch, TensorFlow, scikit-learn, ONNX는 축 인자와 기본 동작이 다릅니다. 모델 입력 모양에 맞춰 명시적으로 지정하고 출력 노름을 확인합니다.
셋째, 영벡터를 정상 임베딩처럼 쓰지 않습니다. 출력이 0으로 안전하게 남아도 방향이 생기는 것은 아닙니다. 검색 색인에 넣기 전에 빈 입력·실패한 전처리·영벡터를 별도로 표시합니다.
넷째, 벡터 크기의 의미를 먼저 판단합니다. 크기가 신뢰도, 빈도, 신호 세기 같은 정보를 담는다면 단위 노름 변환이 그 정보를 지웁니다. 목적 지표로 전후 성능을 비교합니다.
다섯째, 양쪽 파이프라인을 같은 규칙으로 맞춥니다. 임베딩 검색에서는 저장 벡터와 질의 벡터의 모델·정규화·자료형이 일치해야 합니다. 한쪽만 바뀌면 순위가 예상과 달라질 수 있습니다.
주의: L2 정규화가 실행됐다는 사실만 확인하지 말고 어떤 축이 길이 1이 됐는지와 영벡터가 몇 개인지까지 검증해야 합니다.
자주 묻는 질문
Q1. L2는 무엇을 뜻하나요?
L은 길이나 노름을 나타내는 표기에서 쓰이며 2는 성분을 제곱해 합한 뒤 제곱근을 구하는 차수를 뜻합니다. L2 노름은 유클리드 노름이라고도 부릅니다.
Q2. L2 정규화 뒤 모든 값의 합이 1이 되나요?
아닙니다. 각 값의 제곱을 더한 결과가 1이 됩니다. 값 자체의 합을 1로 만드는 방식과 다르며 음수 성분도 그대로 남을 수 있습니다.
Q3. 영벡터도 길이 1로 바뀌나요?
아닙니다. 영벡터는 방향이 없고 0으로 나눌 수 없습니다. ONNX는 이 경우 출력을 0으로 정의하며 프레임워크는 eps나 epsilon 같은 안전 규칙을 둡니다. 사용 중인 API의 동작을 확인해야 합니다.
Q4. L2 정규화를 하면 코사인 유사도와 내적이 같아지나요?
두 벡터가 모두 0이 아니고 각각 L2 정규화됐다면 내적은 코사인 유사도와 같습니다. 영벡터가 있거나 한쪽만 정규화했다면 같은 관계를 그대로 적용할 수 없습니다.
Q5. 임베딩은 항상 L2 정규화해야 하나요?
항상 그렇지는 않습니다. 모델이 이미 정규화된 임베딩을 반환할 수 있고 벡터 크기에 유용한 정보가 담길 수도 있습니다. 모델 문서와 검색 방식, 검증 결과를 보고 결정합니다.
출처
마무리
L2 정규화는 벡터를 제곱합의 제곱근으로 나누어 길이 1의 단위 벡터로 바꾸는 연산입니다. 방향은 유지하고 전체 크기는 없애므로 임베딩 검색과 특징 비교에 유용하지만 벡터 크기가 중요한 작업에는 맞지 않을 수 있습니다.
실전에서는 네 가지만 기억하면 됩니다. 어느 축이 하나의 벡터인지 명시하고 eps 또는 epsilon의 적용 방식을 확인하며 영벡터를 따로 다루고 정규화 전후의 실제 품질을 비교하세요. 모델을 다른 프레임워크로 옮길 때는 같은 입력으로 출력값과 노름까지 대조해야 안전합니다.
