QR 분해(QR Decomposition)란? AI 행렬을 직교행렬과 삼각행렬로 나누는 방법
TL;DR
QR 분해(QR Decomposition)는 행렬 A를 직교행렬 Q와 위 삼각행렬 R의 곱 A=QR로 나타내는 행렬 분해입니다. 복소수 행렬에서는 Q가 유니터리 행렬이 됩니다. AI에서는 최소제곱 회귀, 직교 기저 생성과 반복 선형대수 계산에 쓰입니다. 직사각행렬에도 적용할 수 있지만 출력 모드, 열 피벗팅, 랭크와 자동미분 조건을 확인해야 합니다.
핵심 3줄 요약
- 핵심 1
직교 기저와 삼각 구조로 나눕니다. Q의 열은 서로 직교하고 길이가 1입니다. R은 주대각선 아래가 0인 위 삼각 또는 위 사다리꼴 행렬입니다. - 핵심 2
직사각행렬에도 사용할 수 있습니다. K=min(M,N)을 기준으로 축소 QR을 쓰면 필요한 열과 행만 남겨 저장량과 후속 계산을 줄입니다. - 핵심 3
최소제곱과 수치 검증에 유용합니다. A의 역행렬이나 AᵀA를 직접 만들지 않고 문제를 풀 수 있지만 랭크와 잔차를 따로 점검해야 합니다.
이 글에서 다룰 내용
- QR 분해의 한 문장 정의
- 3×2 행렬을 직교 기저와 삼각행렬로 나누는 예시
- AI의 최소제곱·직교화 계산에서 중요한 이유
- 완전 QR·축소 QR·R만 반환하는 모드의 차이
- 하우스홀더 반사와 열 피벗팅의 역할
- SVD·LU·촐레스키·고유값 분해와의 차이
- 모양·직교성·재구성 잔차·랭크를 확인하는 순서
- AI 초보자가 자주 묻는 질문
QR 분해를 한 문장으로 정의하면 무엇인가요?
QR 분해는 M×N 행렬 A를 직교 또는 유니터리 열을 가진 행렬 Q와 위 삼각 구조의 행렬 R로 나누어 A=QR로 표현하는 분해입니다.
실수 행렬에서 Q의 열끼리 내적하면 서로 다른 열은 0이고 같은 열은 1입니다. 이를 QᵀQ=I로 씁니다. 복소수 행렬에서는 단순 전치가 아니라 켤레전치 Qᴴ를 사용해 QᴴQ=I를 만족하는 유니터리 행렬로 설명합니다.
입력 A가 정사각형일 필요는 없습니다. 행이 열보다 많거나 적은 직사각행렬도 분해할 수 있습니다. 출력 크기는 라이브러리의 reduced, complete, full, economic 같은 모드와 입력 모양에 따라 달라집니다.
한 줄 정리: QR 분해는 행렬의 열 방향을 서로 직각인 기준 Q로 정리한 뒤 원래 열을 그 기준으로 조합하는 계수 R을 남기는 방법입니다.
쉬운 예시로 이해해 볼까요?
세 행과 두 열을 가진 행렬 A를 생각해 보겠습니다. 첫째 열은 (1, 0, 0), 둘째 열은 (1, 1, 0)입니다. 두 열은 서로 직각이 아니지만 QR 분해를 하면 같은 열 공간을 나타내는 직교 기저 Q와 위 삼각행렬 R로 바뀝니다.
- Q의 첫째 열은 (1, 0, 0)으로 둘 수 있습니다. 길이가 1인 첫 방향입니다.
- 둘째 열에서 첫 방향과 겹치는 부분을 빼면 (0, 1, 0)이 남습니다. 이것이 Q의 둘째 열이 됩니다.
- R에는 원래 두 열이 Q의 첫째·둘째 방향을 얼마나 포함하는지 위 삼각 형태로 기록됩니다.
Q의 두 열은 서로 직교하고 길이가 1입니다. Q와 R을 곱하면 원래 A가 나옵니다. 실제 라이브러리는 손계산보다 안정적인 하우스홀더 반사를 주로 쓰지만 직교 방향과 조합 계수를 구한다는 해석은 같습니다.
쉬운 예시: 비스듬히 놓인 두 자를 서로 직각인 기준자로 다시 잡은 뒤 원래 위치를 되살릴 거리표를 R에 적는 과정에 가깝습니다.
왜 AI에서 QR 분해가 중요한가요?
최소제곱 문제를 안정적으로 정리합니다
AI 회귀와 데이터 적합에서는 방정식 Ax=b가 정확히 맞지 않는 경우가 많습니다. 이때 예측값 Ax와 관측값 b의 차이가 가장 작아지는 x를 찾습니다. A=QR이면 Q의 직교성을 이용해 문제를 Qᵀb와 위 삼각행렬 R의 풀이로 바꿀 수 있습니다. AᵀA를 먼저 만드는 정규방정식보다 수치 오차가 커질 위험을 줄이는 데 도움이 됩니다.
서로 겹치는 특징 방향을 직교 기저로 바꿉니다
신경망과 머신러닝 계산에는 여러 특징 벡터가 비슷한 방향을 가리키는 상황이 생깁니다. QR 분해는 입력 열이 만드는 공간을 서로 직교하는 기저로 표현합니다. 차원을 줄이는 목적 자체보다 같은 부분공간을 계산하기 쉬운 좌표계로 바꾸는 데 초점이 있습니다.
반복 선형대수 알고리즘의 기반 연산이 됩니다
고유값을 구하는 QR 알고리즘, 부분공간 반복, 직교 반복처럼 벡터 방향을 계속 갱신하는 계산에서는 새 방향들이 서로 겹치지 않도록 다시 직교화해야 합니다. QR 분해는 이런 단계에서 기저를 정리한 뒤 다음 반복에서 사용할 삼각 구조를 제공합니다.
핵심 인사이트: QR 분해는 행렬을 보기 좋게 나누는 데 그치지 않습니다. 겹친 방향을 직교화해 최소제곱과 반복 계산이 수치 오차에 덜 흔들리도록 돕습니다.
QR 분해는 어떻게 작동하나요?
1. 첫 열이 가리키는 방향을 정규화합니다
입력 행렬의 첫 열에서 길이가 1인 방향을 만들면 Q의 첫 열 후보가 됩니다. 첫 열이 영벡터이거나 다른 열과 선형 종속 관계라면 단순한 과정만으로는 고유한 방향을 정하기 어렵습니다. 이때 랭크와 구현 방식이 중요해집니다.
2. 다음 열에서 앞선 방향 성분을 제거합니다
다음 열이 이미 만든 Q의 방향을 얼마나 포함하는지 내적으로 구하고 그 성분을 뺍니다. 남은 벡터를 정규화하면 새 직교 방향이 됩니다. 이 설명은 그람-슈미트 관점이며 실제 고성능 구현은 반올림 오차를 줄이기 위해 다른 계산 순서를 사용할 수 있습니다.
3. 하우스홀더 반사로 아래쪽 값을 0으로 만듭니다
LAPACK의 DGEQRF는 Q를 여러 기본 반사행렬의 곱으로 표현합니다. 각 반사는 현재 열의 대각선 아래 원소를 0으로 보냅니다. 이 작업을 다음 열에 반복하면 위 삼각 또는 위 사다리꼴 R이 남습니다. Q를 항상 큰 행렬로 바로 만들지 않고 반사 벡터와 계수로 저장할 수도 있습니다.
4. Q와 R을 곱해 원본을 확인합니다
분해가 끝나면 QᵀQ가 단위행렬에 가까운지, QR이 A에 가까운지 검사합니다. 부동소수점 계산에서는 완전한 0이나 1 대신 허용 오차를 사용합니다. 열 피벗팅을 썼다면 A가 아니라 열 순서를 바꾼 A[:,P]와 QR을 비교해야 합니다.
실전 팁: 재구성 검사에서 열 피벗팅 순열 P를 빼먹으면 정상 결과도 실패로 보입니다. 사용한 식이 A=QR인지 A[:,P]=QR인지 먼저 기록하세요.
Q와 R은 각각 무엇을 뜻하나요?
Q는 직교 또는 유니터리 기저입니다
실수 행렬의 Q는 열벡터가 서로 직교하고 길이가 1인 행렬입니다. 완전 QR에서는 Q가 M×M 정사각 직교행렬이지만, 축소 QR에서는 필요한 K개의 열만 남긴 M×K 행렬입니다. 여기서 K는 M과 N 가운데 작은 값입니다.
R은 위 삼각 또는 위 사다리꼴 계수입니다
R은 주대각선 아래의 값이 0인 구조를 가집니다. 행이 열보다 많은 입력의 축소 QR에서는 보통 K×N 모양입니다. M이 N보다 크거나 같고 열이 독립이면 N×N 위 삼각행렬이 됩니다. 이 구조 덕분에 뒤에서부터 값을 구하는 후진 대입을 사용할 수 있습니다.
완전 QR과 축소 QR은 저장 크기가 다릅니다
NumPy와 PyTorch 문서는 reduced와 complete 모드를 구분합니다. 큰 세로형 행렬에서 완전 Q의 나머지 열은 A의 열 공간을 설명하는 데 필요하지 않을 수 있습니다. 축소 QR이 충분하다면 메모리와 계산량을 줄일 수 있습니다.
QR 분해와 헷갈리는 용어는 무엇이 다른가요?
SVD와 QR 분해의 차이
SVD는 A를 왼쪽 특이벡터, 특이값, 오른쪽 특이벡터로 나누며 랭크 부족과 작은 특이값을 직접 해석하기 좋습니다. QR은 직교 기저와 위 삼각 인수를 빠르게 얻는 데 초점을 둡니다. 정밀한 랭크 판정이나 저랭크 근사가 목적이면 SVD가 더 직접적입니다. 최소제곱과 직교화가 목적이면 QR을 먼저 검토할 수 있습니다.
LU 분해와 QR 분해의 차이
LU 분해는 주로 정사각행렬을 아래 삼각행렬 L과 위 삼각행렬 U로 나눕니다. Q처럼 직교성을 보장하는 인수가 없고 안정적인 계산을 위해 행 피벗팅이 필요할 수 있습니다. QR은 직사각행렬과 최소제곱 문제에 자연스럽지만 같은 크기의 정사각 선형계를 풀 때 계산량은 더 클 수 있습니다.
촐레스키 분해와 QR 분해의 차이
촐레스키 분해는 대칭 양의 정부호 행렬을 LLᵀ 또는 UᵀU로 표현합니다. 조건이 맞으면 저장과 계산이 단순하지만 입력 범위가 엄격합니다. QR 분해는 대칭이나 양의 정부호 조건이 없고 직사각행렬에도 적용합니다. 최소제곱에서 AᵀA를 만들어 촐레스키를 쓰는 방식과 A를 바로 QR 분해하는 방식은 수치 특성이 다릅니다.
고유값 분해와 QR 분해의 차이
고유값 분해는 정사각행렬의 변하지 않는 방향과 배율을 구하는 결과입니다. QR 분해는 입력 열을 직교 기저와 삼각 구조로 나누는 중간 표현입니다. 이름이 비슷한 QR 알고리즘은 QR 분해를 반복해 고유값을 구합니다. 한 번의 QR 분해 자체와는 다릅니다.
직교화와 QR 분해의 차이
직교화는 주어진 벡터 집합을 서로 직교하는 벡터 집합으로 바꾸는 넓은 작업입니다. QR 분해는 그 결과 Q와 원래 행렬을 재구성할 계수 R을 함께 제공합니다. Q만 필요하더라도 라이브러리가 내부적으로 R 또는 하우스홀더 정보를 함께 계산할 수 있습니다.
비교 정리: QR은 직교 기저와 삼각 인수, SVD는 좌우 특이방향과 크기, LU는 두 삼각 인수, 촐레스키는 양의 정부호 행렬의 대칭 삼각 인수를 다룹니다.
실전에서는 어디에 쓰이나요?
선형회귀와 최소제곱 적합
샘플 수가 특징 수보다 많은 회귀 설계행렬 A에서 Q와 R을 구한 뒤 위 삼각행렬 R로 계수를 풉니다. 절편 열, 특징 스케일과 서로 거의 같은 열이 있는지를 함께 확인해야 합니다.
신경망 가중치와 표현의 직교화
학습 과정에서 가중치나 표현 벡터를 직교 기저로 정리해야 하는 알고리즘은 QR 분해를 사용할 수 있습니다. PyTorch와 TensorFlow는 배치 행렬 QR과 자동미분을 지원하지만 모든 모드와 입력 모양에서 기울기가 같은 방식으로 정의되지는 않습니다. 훈련 코드에서는 순전파 재구성뿐 아니라 기울기 유한값도 검사합니다.
고유값·부분공간 반복 계산
여러 벡터를 반복해서 행렬에 곱하면 가장 강한 방향으로 몰릴 수 있습니다. 각 반복에서 QR 분해로 열을 다시 직교화하면 여러 방향을 분리해 유지할 수 있습니다. 고유값과 주부분공간을 찾는 수치 알고리즘에서 이런 재직교화가 사용됩니다.
열 피벗팅을 이용한 랭크 진단
SciPy의 pivoting 옵션은 열 순서를 바꾼 A[:,P]=QR 형태를 반환합니다. 중요한 열을 앞쪽에 배치하고 R 대각 원소의 크기를 살펴 거의 종속인 열을 진단하는 데 쓸 수 있습니다. 다만 임계값에 따른 랭크 판정은 자료형과 스케일에 민감하므로 SVD 결과와 비교할 필요가 있습니다.
실전 팁: 최소제곱 해만 필요하면 전용 lstsq 함수도 검토하세요. NumPy의 lstsq는 해와 함께 잔차·랭크·특이값을 반환하므로 직접 QR 단계를 조립할 때 놓치기 쉬운 진단 정보를 제공합니다.
구현할 때 어떤 순서로 확인하나요?
1. 입력 모양과 축의 의미를 확인합니다
A가 M×N인지, 배치 입력이라면 마지막 두 축이 행렬인지 먼저 봅니다. 샘플이 행이고 특징이 열인지 반대로 저장했는지에 따라 Q와 R의 의미가 달라집니다. 전치된 데이터를 실수로 분해하면 계산은 성공해도 다른 공간을 분석하게 됩니다.
2. reduced와 complete 모드를 명시합니다
K=min(M,N)을 계산하고 필요한 출력 모양을 먼저 정합니다. NumPy의 reduced는 Q가 M×K, R이 K×N이고 complete는 Q가 M×M, R이 M×N입니다. 라이브러리마다 full과 economic의 이름이 다르므로 이름만 같다고 출력 크기까지 같다고 가정하지 않습니다.
3. 랭크 부족과 열 피벗팅 필요성을 봅니다
열이 서로 같거나 한 열이 다른 열의 조합이면 R의 대각 원소가 0에 가까워질 수 있습니다. 단순 QR 결과만으로 해를 나누면 작은 값 때문에 오차가 커집니다. 열 피벗팅 QR, SVD 또는 전용 최소제곱 함수 가운데 문제에 맞는 방법을 선택합니다.
4. 직교성과 재구성 잔차를 측정합니다
QᵀQ와 단위행렬의 차이, QR과 A의 차이를 각각 측정합니다. 복소수 입력은 QᴴQ를 사용합니다. 피벗팅이 있으면 A[:,P]와 비교합니다. 절대 오차 하나만 보지 말고 입력 행렬 크기에 대한 상대 잔차도 기록합니다.
5. 자동미분과 자료형을 별도로 시험합니다
PyTorch는 reduced 모드를 미분 가능하다고 설명하지만 complete 모드는 입력 모양에 따라 제한이 있고 r 모드는 미분되지 않는다고 명시합니다. TensorFlow도 첫 K개 열의 선형 독립성이 기울기 정의에 중요하다고 안내합니다. 자료형별 잔차와 기울기를 작은 행렬에서 비교합니다.
한 줄 정리: 입력 축, 출력 모드, 랭크, 피벗팅 식, 직교성, 재구성 잔차와 기울기를 차례로 확인하면 모양만 맞는 잘못된 QR 사용을 줄일 수 있습니다.
사용할 때 무엇을 주의해야 하나요?
첫째, Q와 R의 부호가 다르다고 오류로 단정하지 않습니다. Q의 한 열과 R의 대응 행에 동시에 -1을 곱해도 QR의 곱은 같습니다. 라이브러리나 실행 환경이 다른 부호를 반환할 수 있으므로 인수 자체보다 직교성과 재구성 결과를 비교합니다.
둘째, 축소 QR과 완전 QR을 섞지 않습니다. 두 결과는 모두 A를 재구성할 수 있지만 Q와 R의 모양이 다릅니다. 저장한 인수를 다른 서비스나 모델 코드로 넘길 때 mode, 입력 모양과 K 값을 메타데이터에 남깁니다.
셋째, 랭크 부족을 작은 대각값 하나로만 판정하지 않습니다. 0에 가깝다는 기준은 자료형, 특징 스케일과 허용 오차에 따라 달라집니다. 열 피벗팅 결과와 SVD 특이값, 후속 최소제곱 잔차를 함께 확인합니다.
넷째, 정규방정식을 습관적으로 만들지 않습니다. AᵀA는 행렬의 조건 문제를 더 악화시킬 수 있습니다. 최소제곱이 목적이면 A를 직접 QR 분해하거나 검증된 lstsq 함수를 사용한 뒤 해의 잔차와 랭크를 기록합니다.
다섯째, 자동미분 지원을 함수 존재와 같은 뜻으로 보지 않습니다. QR 연산이 GPU에서 실행된다고 모든 모드와 랭크 부족 입력의 기울기가 안정적인 것은 아닙니다. 실제 학습 모양으로 순전파·역전파 테스트를 모두 통과시킵니다.
주의: QR 분해의 재구성 오차가 작다고 AI 모델의 예측이 정확하다는 뜻은 아닙니다. 행렬 연산 검증과 모델 평가 지표는 별도로 확인해야 합니다.
자주 묻는 질문
Q1. QR의 Q와 R은 무엇의 약자인가요?
Q는 직교행렬을 나타내는 관례적인 기호이고 R은 위 삼각행렬을 나타냅니다. 문헌에서 QR factorization과 QR decomposition은 같은 분해를 가리키는 경우가 많습니다. 복소수 입력에서는 Q를 유니터리 행렬로 해석합니다.
Q2. QR 분해는 정사각행렬에만 쓸 수 있나요?
아닙니다. M×N 직사각행렬에도 적용할 수 있습니다. 행이 많은 세로형 데이터 행렬에서는 축소 QR로 Q의 필요한 열과 R의 필요한 행만 남기는 방식이 자주 쓰입니다. 함수별 출력 모양을 문서에서 확인하세요.
Q3. reduced와 complete 중 무엇을 선택해야 하나요?
A를 재구성하고 최소제곱이나 열 공간만 다룬다면 reduced가 충분한 경우가 많습니다. Q를 완전한 M×M 직교 기저로 확장해야 하는 계산이면 complete를 검토합니다. 큰 M에서는 complete Q가 메모리를 많이 쓸 수 있습니다.
Q4. QR 분해 결과가 실행할 때마다 부호가 달라도 되나요?
가능합니다. QR 인수는 부호나 복소수 위상 선택에 따라 여러 표현이 나올 수 있습니다. Q와 R의 원소를 그대로 비교하기보다 QᵀQ 또는 QᴴQ, 그리고 QR 재구성 오차를 확인하는 편이 안전합니다.
Q5. 열 피벗팅은 왜 사용하나요?
열 순서를 바꿔 수치적으로 중요한 열을 앞쪽에 두고 거의 종속인 열을 드러내기 위해 사용합니다. 이때 재구성 식은 A=QR이 아니라 A[:,P]=QR이 됩니다. 순열 P를 저장하지 않으면 원래 특징 순서를 복원할 수 없습니다.
Q6. QR 분해만으로 최소제곱을 항상 안전하게 풀 수 있나요?
항상 그런 것은 아닙니다. 열이 독립이고 스케일이 적절한 문제에서는 효과적이지만 랭크가 부족하거나 매우 불안정한 행렬은 피벗팅 QR, SVD 또는 전용 lstsq 함수가 더 적합할 수 있습니다. 해를 구한 뒤 b-Ax의 잔차와 랭크 진단을 함께 봅니다.
출처
마무리
QR 분해는 행렬을 직교 또는 유니터리 기저 Q와 위 삼각 구조 R의 곱으로 바꾸는 방법입니다. AI에서는 최소제곱 회귀, 특징 직교화, 반복 고유값·부분공간 계산과 랭크 진단에 쓰입니다.
초보자라면 다섯 가지를 기억하면 충분합니다. A=QR이라는 재구성 식과 Q의 직교성을 확인하세요. 입력 모양에 맞춰 reduced와 complete를 구분해야 합니다. 열 피벗팅을 쓰면 순열 P를 식에 포함하고 랭크가 부족한 행렬은 SVD나 전용 최소제곱 함수와 비교합니다. 마지막으로 재구성 잔차와 후속 해의 잔차, 자동미분 기울기까지 따로 검증하면 QR 결과를 더 안전하게 사용할 수 있습니다.
