비음수 행렬 분해(NMF)란? AI가 음이 아닌 데이터를 부분 특징으로 나누는 방법
TL;DR
비음수 행렬 분해(Non-negative Matrix Factorization, NMF)는 음이 아닌 행렬 X를 음이 아닌 두 행렬 W와 H의 곱으로 가깝게 나타내는 저랭크 분해입니다. 값의 덧셈만으로 원본을 설명하므로 이미지의 부분 모양이나 문서의 단어 묶음처럼 해석하기 쉬운 성분을 찾는 데 쓰일 수 있습니다. 다만 입력에 음수가 없어야 하고, 랭크와 초기값에 따라 결과가 달라질 수 있으므로 재구성 오차와 반복 안정성을 함께 확인해야 합니다.
핵심 3줄 요약
- 핵심 1
X를 W×H로 근사합니다. X, W, H의 모든 원소를 0 이상으로 제한하는 행렬 분해입니다. - 핵심 2
성분을 더해서 원본을 설명합니다. 음수 성분의 상쇄가 없어 부분 특징과 가중치를 읽기 쉬운 경우가 있습니다. - 핵심 3
하나의 정답이 보장되지는 않습니다. 랭크·초기화·손실 함수에 따라 다른 해가 나올 수 있어 여러 실행과 재구성 검사가 필요합니다.
이 글에서 다룰 내용
- 비음수 행렬 분해의 한 문장 정의
- 고객 문서와 단어 묶음으로 이해하는 쉬운 예시
- AI에서 부분 기반 표현과 차원 축소가 중요한 이유
- W와 H를 번갈아 갱신하는 작동 흐름
- 랭크·초기화·손실 함수와 재구성 오차의 뜻
- SVD·PCA·군집화·LDA·비음수 최소제곱과의 차이
- 텍스트·이미지·오디오에서의 실전 사용처
- 입력 검사부터 반복 실행까지의 체크리스트
- AI 초보자가 자주 묻는 질문
비음수 행렬 분해를 한 문장으로 정의하면 무엇인가요?
비음수 행렬 분해는 원소가 모두 0 이상인 데이터 행렬 X를, 원소가 모두 0 이상인 낮은 차원의 행렬 W와 H의 곱 X≈WH로 나타내는 근사 분해입니다.
등호가 아니라 근사 기호를 쓰는 이유는 WH가 보통 X와 정확히 같지 않기 때문입니다. 알고리즘은 X와 WH의 차이를 나타내는 손실을 줄이는 방향으로 두 행렬을 찾습니다. k가 원래 차원보다 작으면 데이터의 세부 차이를 일부 버리고 적은 성분으로 압축한 표현을 얻습니다.
비음수라는 말은 행렬의 각 원소가 0 이상이라는 뜻입니다. 행렬 자체가 양의 정부호라는 뜻도 아니고, 고유값이 모두 양수라는 뜻도 아닙니다. 음수가 있는 입력을 그대로 넣는 대신 문제에 맞는 변환이나 다른 분해를 선택해야 합니다.
한 줄 정리: NMF는 음이 아닌 데이터를 음이 아닌 성분과 가중치의 곱으로 근사해, 적은 수의 더하기 조합으로 설명하는 방법입니다.
쉬운 예시로 이해해 볼까요?
감자나라ai님이 고객 문의 1,000건에서 주제를 찾는다고 가정해 보겠습니다. 행은 문서, 열은 단어로 두고 각 칸에는 TF-IDF나 출현 횟수처럼 0 이상인 값을 넣습니다. 이 문서-단어 행렬 X를 성분 수 k=5로 분해하면 다섯 개의 단어 묶음과 문서별 묶음 가중치를 얻습니다.
- H의 한 성분에서 배송·택배·도착의 가중치가 크면 배송 주제로 해석할 수 있습니다.
- 다른 성분에서 환불·취소·결제의 가중치가 크면 환불 주제로 읽을 수 있습니다.
- W의 한 문서 행에서 배송 성분 0.8, 환불 성분 0.2라면 두 주제가 더해져 그 문서를 설명합니다.
- WH는 원래 단어 가중치를 완벽히 복사하기보다 다섯 성분으로 가까운 값을 재구성합니다.
쉬운 예시: NMF는 문서마다 배송 80%, 환불 20%처럼 음이 아닌 재료의 양을 배합해 원래 문서를 다시 만드는 조리표에 가깝습니다.
왜 AI에서 비음수 행렬 분해가 중요한가요?
더하기 조합으로 성분을 읽을 수 있습니다
Lee와 Seung의 Nature 논문은 비음수 제약이 빼기가 아닌 더하기 조합만 허용한다고 설명합니다. 얼굴 이미지 실험에서는 국소적인 부분 모양이, 텍스트 실험에서는 의미 있는 단어 특징이 나타났습니다. 모든 데이터에서 반드시 사람이 이해할 성분이 나오는 것은 아니지만 음수와 양수의 상쇄가 없다는 점은 결과를 해석할 단서를 줍니다.
차원을 줄여 적은 성분으로 표현합니다
특징이 수천 개인 행렬을 수십 개 성분으로 근사하면 학습과 탐색에 사용할 표현을 줄일 수 있습니다. W를 새 특징 행렬로 쓰거나 H를 성분 사전으로 살필 수 있습니다. 압축률만 높이면 중요한 구조가 사라질 수 있으므로 k에 따른 재구성 오차와 후속 작업 성능을 함께 비교해야 합니다.
희소하고 음이 아닌 데이터와 잘 맞습니다
단어 빈도, TF-IDF, 픽셀 밝기와 음향 스펙트럼 크기처럼 0 이상인 측정값은 NMF의 입력 조건과 자연스럽게 맞습니다. L1 규제를 더하면 일부 가중치를 0에 가깝게 만들어 성분을 더 희소하게 할 수도 있습니다. 희소성이 자동으로 보장되는 것은 아니며 규제와 데이터에 따라 달라집니다.
핵심 인사이트: NMF의 가치는 모든 데이터를 더 정확히 압축하는 데 있지 않습니다. 음이 아닌 데이터가 어떤 양의 성분을 얼마씩 더해 만들어졌는지 살피는 데 있습니다.
비음수 행렬 분해는 어떻게 작동하나요?
1. 음이 아닌 데이터 행렬 X를 준비합니다
행과 열이 무엇을 뜻하는지 정하고 모든 값이 유한한 0 이상인지 검사합니다. 텍스트에서는 문서-단어 행렬, 이미지에서는 샘플-픽셀 행렬, 오디오에서는 주파수-시간 크기 행렬을 만들 수 있습니다. 결측값이나 음수를 임의로 0으로 바꾸기 전에 그 처리가 문제의 의미를 훼손하지 않는지 확인합니다.
2. 성분 수 k와 초기 W·H를 정합니다
k는 결과의 압축 정도와 해석 단위를 정합니다. 너무 작으면 서로 다른 구조가 한 성분에 섞이고, 너무 크면 비슷한 성분이 쪼개지거나 잡음까지 따라갈 수 있습니다. 초기값은 무작위 값이나 NNDSVD 계열 방법으로 정할 수 있으며 같은 설정을 다시 만들려면 난수 시드를 기록합니다.
3. W와 H를 번갈아 갱신합니다
W를 고정하고 H를 개선한 뒤 H를 고정하고 W를 개선하는 식으로 반복합니다. scikit-learn은 좌표 하강과 곱셈 갱신 솔버를 제공합니다. Lee와 Seung의 NeurIPS 논문은 최소제곱 오차와 일반화된 Kullback-Leibler 발산을 줄이는 곱셈 갱신 규칙을 분석했습니다.
4. 정지 조건과 결과를 검사합니다
손실의 개선이 허용 오차보다 작아지거나 최대 반복 횟수에 도달하면 계산을 멈춥니다. 수렴 경고가 없는지, X와 WH의 차이가 충분히 작은지, 여러 초기화에서도 비슷한 성분이 나오는지 봅니다. 계산이 끝났다는 사실만으로 k와 해석이 타당해지는 것은 아닙니다.
실전 팁: NMF는 한 번 실행한 W와 H만 저장하지 말고 k, 초기화 방식, 솔버, 손실 함수, 규제, 난수 시드와 반복 횟수도 함께 기록하세요.
W·H·랭크와 손실 함수는 무엇을 뜻하나요?
W는 샘플별 성분 가중치입니다
scikit-learn의 일반적인 배열 배치에서는 fit_transform이 W를 반환합니다. W의 각 행은 한 샘플이 각 성분을 얼마만큼 사용하는지 나타냅니다. 새 데이터는 학습한 H를 고정한 상태에서 W를 구해 같은 성분 공간으로 변환할 수 있습니다.
H는 성분별 특징 가중치입니다
H의 각 행은 한 성분을 이루는 특징의 가중치입니다. 텍스트라면 큰 값을 가진 단어, 이미지라면 밝게 나타나는 픽셀, 오디오라면 강한 주파수 구간을 살핍니다. 성분의 순서는 중요도 순서라고 단정할 수 없으며 구현이 정규화하는 방식도 문서로 확인해야 합니다.
k는 남길 성분의 수입니다
k는 사용자가 정하거나 탐색해야 하는 하이퍼파라미터입니다. MathWorks 문서는 모델링 맥락이 가능한 k 범위를 제시하는 경우가 많다고 설명합니다. 후보 k마다 재구성 오차, 성분 안정성, 희소성, 후속 분류·검색 성능과 사람이 해석할 수 있는지를 비교합니다.
손실 함수는 가까움의 기준입니다
프로베니우스 노름은 X와 WH의 칸별 차이를 제곱해 합치는 대표적인 기준입니다. 곱셈 갱신에서는 일반화된 Kullback-Leibler 발산 같은 베타 발산도 선택할 수 있습니다. 손실 값은 정의와 데이터 크기에 따라 척도가 달라지므로 다른 설정의 숫자를 맥락 없이 비교하지 않습니다.
비음수 행렬 분해와 헷갈리는 용어는 무엇이 다른가요?
SVD와 NMF의 차이
SVD는 실수나 복소수 행렬을 직교·유니터리 방향과 음이 아닌 특이값으로 분해합니다. 입력과 두 방향 행렬에는 음수가 있어도 됩니다. NMF는 X와 두 인수의 원소를 0 이상으로 제한하지만 직교성이나 닫힌 형태의 최적해를 요구하지 않습니다. 저랭크 근사라는 목적은 겹쳐도 제약과 계산법이 다릅니다.
PCA와 NMF의 차이
PCA는 보통 특징별 평균을 빼 중심화한 뒤 분산이 큰 직교 축을 찾습니다. 중심화된 데이터와 주성분 점수에는 음수가 생길 수 있습니다. NMF는 음이 아닌 입력을 더하기 조합으로 근사하며 성분이 직교할 필요가 없습니다. PCA의 설명 분산 비율과 NMF의 재구성 손실을 같은 지표처럼 읽지 않습니다.
군집화와 NMF의 차이
군집화는 비슷한 샘플을 그룹으로 묶는 작업입니다. NMF는 한 샘플을 여러 성분의 가중치 조합으로 표현합니다. W에서 가장 큰 성분만 골라 그룹처럼 사용할 수는 있지만 이는 후처리 규칙이며 NMF 자체가 배타적인 군집 라벨을 보장하지는 않습니다.
LDA 토픽 모델과 NMF의 차이
잠재 디리클레 할당(LDA)은 문서의 토픽 혼합과 토픽별 단어 분포를 확률 모형으로 표현합니다. NMF는 문서-단어 행렬을 음이 아닌 두 행렬의 곱으로 근사하는 최적화 문제입니다. 둘 다 단어 묶음을 찾을 수 있지만 입력 가중치, 목적 함수와 결과 해석이 다릅니다.
비음수 최소제곱과 NMF의 차이
비음수 최소제곱은 보통 한 인수나 계수행렬을 알고 있을 때 음이 아닌 다른 계수를 구합니다. NMF는 W와 H를 모두 모르는 상태에서 번갈아 추정합니다. 한쪽을 고정하면 각 단계가 비음수 최소제곱 문제와 연결될 수 있지만 전체 NMF는 두 인수를 함께 찾는 문제입니다.
비교 정리: SVD·PCA는 부호 있는 직교 방향, NMF는 음이 아닌 더하기 성분, 군집화는 그룹, LDA는 확률적 토픽, 비음수 최소제곱은 한쪽이 주어진 계수 문제를 다룹니다.
실전에서는 어디에 쓰이나요?
문서의 주제와 단어 묶음 추출
TF-IDF 문서-단어 행렬을 분해해 H에서 성분별 상위 단어를 찾고 W에서 문서별 성분 가중치를 확인합니다. scikit-learn의 공식 예시는 NMF와 LDA로 문서 모음의 주제 구조를 추출합니다. 결과를 고객 문의 분류 체계로 쓰려면 사람이 주제 이름과 대표 문서를 검토해야 합니다.
이미지의 부분 특징 탐색
픽셀 값이 0 이상인 이미지 모음을 분해하면 눈·코·윤곽처럼 국소적인 패턴이 성분에 나타날 수 있습니다. Lee와 Seung의 원 논문은 얼굴 이미지에서 부분 기반 표현을 보고했습니다. 다른 이미지 데이터에서도 같은 모양이 자동으로 나온다고 일반화하지 말고 성분 시각화와 재현성을 확인합니다.
실전 팁: NMF가 잘 맞는지는 데이터 값이 0 이상인지뿐 아니라 더하기 성분이라는 해석이 문제에 자연스러운지로 판단하세요.
구현할 때 어떤 순서로 확인하나요?
1. 행·열의 뜻과 음수 여부를 확인합니다
X의 한 행과 한 열이 무엇을 뜻하는지 데이터 사전에 적습니다. 최솟값, 결측값, NaN과 무한대를 검사하고 학습·검증 분리를 먼저 끝냅니다. 검증 데이터 정보를 이용해 전처리 범위나 단어 사전을 정하면 데이터 누수가 생길 수 있습니다.
2. 여러 k를 같은 기준으로 비교합니다
너무 좁은 후보 하나만 고르지 말고 업무에서 해석할 수 있는 범위의 k를 시험합니다. 각 k에서 재구성 오차가 얼마나 줄었는지, 성분이 지나치게 겹치지 않는지, 새 데이터의 후속 성능이 나아지는지 기록합니다. 가장 작은 오차만 보고 가장 큰 k를 고르면 압축 목적을 잃습니다.
3. 초기화와 난수 시드를 고정합니다
무작위 초기화는 실행마다 다른 지역해로 갈 수 있습니다. 재현 가능한 비교에는 난수 시드를 고정하고, 필요하면 여러 시드나 반복 실행 중 좋은 결과를 선택합니다. NNDSVD 계열 초기화와 무작위 초기화도 같은 반복 횟수와 손실 기준에서 비교합니다.
4. 수렴과 재구성 오차를 검사합니다
최대 반복 횟수에 도달했다는 경고가 있으면 값을 무작정 늘리기 전에 손실 변화와 초기화를 살핍니다. X와 WH의 차이를 절대값과 상대값으로 기록하고 훈련 데이터만 잘 재구성하는지 검증 데이터 변환 결과도 확인합니다.
5. 성분의 안정성과 의미를 검토합니다
여러 실행에서 비슷한 단어·픽셀·주파수 묶음이 다시 나타나는지 봅니다. 성분 순서가 바뀔 수 있으므로 같은 행 번호만 비교하지 말고 유사도를 이용해 대응시킵니다. 사람이 붙인 성분 이름, 대표 샘플과 예외 사례를 함께 남기면 과도한 해석을 줄일 수 있습니다.
한 줄 정리: 입력 조건, 후보 k, 초기화, 수렴, 재구성 오차, 성분 안정성, 사람 검토를 차례로 확인하면 우연히 그럴듯한 한 번의 결과를 걸러낼 수 있습니다.
사용할 때 무엇을 주의해야 하나요?
첫째, 음수가 있는 입력을 그대로 넣지 않습니다. 평균 중심화한 데이터나 부호가 중요한 잔차에는 NMF가 맞지 않을 수 있습니다. 상수 이동으로 음수를 없애면 거리와 의미가 바뀌므로 변환 근거를 기록합니다.
둘째, 성분 수 k를 정답처럼 고정하지 않습니다. k가 달라지면 성분의 범위와 재구성 오차가 함께 바뀝니다. 여러 후보를 업무 해석, 검증 성능과 안정성으로 비교합니다.
셋째, 한 번의 실행을 유일한 분해로 믿지 않습니다. 목적 함수에는 지역해가 있을 수 있고 초기값에 따라 W와 H가 달라집니다. 시드와 반복 횟수를 기록하고 여러 실행을 비교합니다.
넷째, 성분에 붙인 이름을 모델의 확정 판단으로 보지 않습니다. 상위 단어 몇 개가 비슷해 보여도 대표 문서와 반례를 읽어야 합니다. 사람의 해석이 들어갔다는 사실을 결과에 표시합니다.
다섯째, 재구성 오차만으로 활용 품질을 판단하지 않습니다. 작은 오차가 좋은 분류·검색·추천이나 공정한 결과를 보장하지 않습니다. 실제 사용 목적의 평가 지표, 데이터 편향과 개인정보 위험을 따로 점검합니다.
주의: NMF는 음이 아닌 값을 보장하지만 결과의 정확성·공정성·인과성까지 보장하지는 않습니다. 수학적 제약과 AI 서비스 품질을 구분하세요.
자주 묻는 질문
Q1. NMF는 한국어로 어떻게 부르나요?
비음수 행렬 분해 또는 비음수 행렬 인수분해라고 부릅니다. 영어로는 Non-negative Matrix Factorization과 Nonnegative Matrix Factorization 표기가 모두 쓰입니다. 검색할 때는 약어 NMF와 두 영문 표기를 함께 확인하면 좋습니다.
Q2. 입력 행렬에 0이 있어도 되나요?
기본 비음수 조건은 0을 허용합니다. 다만 선택한 손실 함수와 솔버에 따라 0 값에 추가 제약이 생길 수 있습니다. scikit-learn은 일부 베타 손실 설정에서 입력에 0이 있으면 안 된다고 안내하므로 API 문서를 확인합니다.
Q3. 음수 값을 모두 0으로 바꾸면 되나요?
자동으로 권장할 수 없습니다. 음수의 크기와 부호에 정보가 있다면 0으로 자르는 순간 그 정보가 사라집니다. 데이터의 생성 과정과 활용 목적을 검토하고 부호 있는 분해가 더 맞는지 비교해야 합니다.
Q4. NMF 결과는 실행할 때마다 같나요?
무작위 초기화를 쓰면 달라질 수 있습니다. 같은 난수 시드와 같은 라이브러리·설정을 사용하면 비교를 재현하기 쉬워집니다. 그래도 서로 다른 시드의 결과를 확인해야 성분이 안정적인지 판단할 수 있습니다.
Q5. NMF와 PCA 중 무엇이 더 좋은가요?
항상 더 좋은 방법은 없습니다. 음이 아닌 데이터에서 더하기 성분의 해석이 중요하면 NMF가 유용할 수 있습니다. 분산이 큰 직교 축과 설명 분산이 필요하거나 음수 입력을 유지해야 한다면 PCA가 더 자연스러울 수 있습니다. 실제 목적의 검증 결과로 고릅니다.
Q6. NMF의 성분은 자동으로 주제 이름을 알려 주나요?
아닙니다. 알고리즘은 숫자 가중치를 반환합니다. 텍스트에서는 성분별 상위 단어와 대표 문서를 사람이 읽고 이름을 붙입니다. 이름을 정한 근거와 애매한 문서를 함께 남겨야 결과를 과신하지 않습니다.
출처
- Lee and Seung, Algorithms for Non-negative Matrix Factorization, NeurIPS 2000
- Lee and Seung, Learning the parts of objects by non-negative matrix factorization, Nature 1999
- scikit-learn API Reference, sklearn.decomposition.NMF
- MathWorks Documentation, Nonnegative Matrix Factorization
- scikit-learn Example, Topic extraction with NMF and LDA
마무리
비음수 행렬 분해는 음이 아닌 데이터 행렬 X를 음이 아닌 W와 H의 곱으로 근사하는 저랭크 분해입니다. 음수 성분의 상쇄 없이 여러 성분을 더해 원본을 설명하므로 문서의 단어 묶음, 이미지의 부분 특징과 오디오의 스펙트럼 패턴을 살피는 데 쓰입니다.
초보자라면 여섯 가지를 기억하면 충분합니다. 입력에 음수가 없는지 먼저 봅니다. 성분 수 k는 여러 후보를 비교합니다. 초기화와 난수 시드를 기록합니다. 수렴 경고와 재구성 오차를 확인합니다. 여러 실행에서 성분이 안정적인지 살핍니다. 마지막으로 성분 이름과 AI 활용 품질은 사람이 별도의 데이터와 지표로 검토해야 합니다.
