TL;DR — 는 입력 상대오차가 해의 상대오차에서 얼마나 증폭될 수 있는지 주는 상한이며, 알고리즘보다 문제 자체의 민감도를 말합니다.
왜 배우나요? — 반올림 오차가 계산을 통과하며 얼마나 커질 수 있는지 판단해야 알고리즘 문제와 입력 문제를 구분할 수 있습니다.
AI 어디에 쓰이나요? — 특성 스케일링과 normalization은 입력 축척을 맞추고, regularization은 문제 자체를 바꿔 불안정성을 줄입니다. 두 처방을 구분하는 기준이 됩니다.
오차가 몇 배로 커지는가
앞 섹션에서 float로 정확히 표현되지 않는 값과 일부 연산 결과에는 반올림 오차가 생길 수 있음을 보았습니다. 이제 그 작은 상대오차가 해의 상대오차에서 얼마나 커질 수 있는지 묻습니다. 그 상한을 주는 숫자가 condition number(조건수)입니다.
연립방정식의 해는 두 직선의 교점입니다. 두 직선이 크게 벌어져 있으면 조금 흔들어도 교점은 조금만 움직이지만, 거의 평행하면 작은 흔들림에도 교점이 멀리 미끄러집니다. condition number는 이 민감도를 노름에 기반한 상대오차 척도로 잽니다.
아래 그림은 그 차이를 보여줍니다. 원래 두 직선은 거의 평행하고, 교차점은 (1, 1)입니다. 여기서 두 번째 식의 우변만 2.0001에서 2.0002로 아주 조금 바꿉니다. 식은 거의 그대로지만, 교차점은 (1, 1)에서 (0, 2)로 크게 이동합니다. 계산에 들어간 변화는 만분의 일 수준이지만, 답은 한 칸이나 움직였습니다. 작은 입력 오차가 큰 출력 오차로 증폭된 것입니다.
직선은 거의 그대로, 교점만 멀리 튄다 — 입력 티끌이 답에서는 화면을 가로지른다
위 그림은 교점 이동을 먼저 보고, 같은 현상을 상대오차로 검산하는 두 단계입니다.
[직선과 해의 이동] 실제 좌표계에서 세 직선은 거의 한 줄처럼 겹칩니다. 선의 미세한 차이를 찾기보다, 두 해와 그 사이의 이동 화살표를 보세요. 입력 식은 거의 그대로인데 해는 에서 로 이동합니다.
[상대오차 비교] condition number의 정의와 같은 상대오차 척도로 비교합니다. 상대 입력 오차는 약 , 상대 해 오차는 이므로 실제 증폭은 약 배입니다. 이는 가 주는 상한 안에 있습니다. 절대 변화량 비율과 상대오차 조건수를 섞지 않으므로 np.linalg.cond(A)의 값과 모순되지 않습니다.
한 줄 정리 — 두 직선이 거의 평행할수록 condition number가 크고, 입력의 작은 흔들림이 답에서 크게 증폭됩니다.
condition number의 수학적 정의 — 카파
그림으로 감을 잡았으니, 이제 이 증폭 배율에 정확한 이름과 정의를 달아 주겠습니다. 수학에서는 condition number를 그리스 문자 카파를 써서 라고 적습니다. 행렬 는 벡터를 방향마다 다른 배율로 늘리거나 누르는 변환이었죠. 그중 가장 크게 늘리는 배율이 , 가장 세게 누르는 배율이 인데, condition number는 바로 이 두 배율의 격차입니다.
격차가 크다는 것은 어떤 방향의 정보는 크게 확대되는데 어떤 방향의 정보는 거의 뭉개진다는 뜻입니다. 뭉개진 방향을 계산에서 되살리려는 순간, 그 방향에 실려 있던 티끌만 한 오차까지 함께 뻥튀기됩니다. 앞의 그림에서 교점이 직선을 따라 멀리 미끄러지던 방향이 바로 이 '거의 뭉개지는 방향'이었습니다.
단위 원이 행렬을 통과하면 — 균형이면 둥글고, 찌그러지면 납작합니다
그림은 3차원 공 대신 길이 비율을 가림 없이 읽을 수 있는 2차원 단면을 두 상태 모두 같은 좌표축에 놓았습니다. 회색 점선은 모든 방향의 단위 입력 원이고, 파란 타원은 변환 결과입니다. 먼저 와 화살표의 길이를 비교한 뒤 화면의 값을 확인하세요.
[균형 잡힌 변환 — κ ≈ 1] , 이라 두 길이가 비슷하고 입니다.
[찌그러뜨리는 변환 — κ = 25] 한 방향은 배, 다른 방향은 배가 되어 파란 타원이 납작해지고 가 됩니다. 이 0에 가까워질수록 눌린 방향의 정보가 사라지며, 0이면 앞 절의 rank 붕괴로 이어집니다.
: 가 가장 크게 늘리는 방향의 배율(최대 특이값)
: 가 가장 세게 누르는 방향의 배율(최소 특이값)
늘리는 배율과 누르는 배율의 격차 — 격차가 클수록 예민한(ill-conditioned) 문제
제일 세게 늘리는 배율 ÷ 제일 세게 누르는 배율
부동소수점 오차와 만나면
이 그림이 앞 섹션의 부동소수점 오차와 곧바로 이어집니다. 컴퓨터가 우변의 을 저장할 때 이미 티끌만 한 반올림 오차가 들어가는데, condition number가 큰 문제에서는 그 티끌이 답에서 condition number만큼 뻥튀기됩니다. 방금 본 행렬의 condition number는 약 이라, 입력의 상대오차가 답에서 최대 약 4만 배로 커질 수 있다는 뜻입니다. condition number가 에 가까우면 건강한 문제, 수만·수억이면 ill-conditioned(악조건) 문제라 부르고, 무한대면 아예 역행렬이 없는(정보가 완전히 사라지는 rank-deficient 행렬, 즉 특이행렬) 경우입니다. '역행렬이 있냐 없냐'는 흑백 질문을, '얼마나 아슬아슬하게 있냐'는 눈금으로 바꾼 것이 condition number입니다.
: 의 condition number — 오차 증폭의 최대 배율
: 우변(입력) 의 흔들림
: 해(출력) 의 흔들림
해의 상대오차 입력의 상대오차
답이 흔들리는 폭 = 입력 흔들림 × 증폭배율
한 줄 정리 — condition number는 알고리즘이 아니라 '문제 자체가 얼마나 예민한가'를 재는 숫자입니다.
AI 연결: 길쭉한 골짜기와 지그재그 하강
AI에서 이 개념은 왜 학습이 튀거나 느려지는지를 설명하는 수학적 배경 중 하나입니다. 손실 함수의 골짜기가 한쪽으로만 길쭉하게 찌그러져 있으면(= 관련 행렬의 condition number가 크면) 경사하강법이 좁은 골을 따라 지그재그로 헤매느라 잘 못 내려갑니다. 입력 특성들의 크기(스케일)가 제각각일 때도 같은 일이 벌어지죠. 그래서 학습률을 조심스럽게 고르고, 데이터를 정규화하고, 배치 정규화를 끼워 넣는 관행들은 결국 condition number를 낮춰 지형을 둥글게 펴는 처방이라고 볼 수 있습니다.
같은 깊이의 골짜기 — 둥글면 곧장 내려가고, 길쭉하면 지그재그로 헤맨다
두 상태는 같은 좌표 범위·같은 출발점·같은 반복 횟수를 사용합니다. 등고선의 모양을 본 뒤, 주황 경로가 최저점까지 어떻게 움직이는지 비교하세요. 두 경로 모두 실제 경사하강법을 반복 계산한 결과입니다.
[둥근 골짜기 — 곧장 하강] condition number가 에 가까운 건강한 지형입니다. 등고선이 동심원이라 어느 방향이나 경사가 비슷하고, 주황 경로가 출발점에서 최저점까지 거의 일직선으로 내려갑니다.
[길쭉한 골짜기 — 지그재그] 같은 깊이지만 한쪽으로만 길쭉하게 찌그러진, condition number가 큰 지형입니다(). 가파른 벽 쪽으로는 조금만 내디뎌도 반대편 벽으로 튕겨서, 경로가 좁은 골을 지그재그로 가로지르며 걸음을 낭비합니다. 정작 최저점을 향한 긴 방향으로는 조금씩밖에 못 나아가서, 같은 걸음 수를 쓰고도 min 근처에 도착하지 못했습니다. 학습률을 줄이면 튕김은 줄지만 전진은 더 느려집니다 — 그래서 실무의 처방은 걸음을 조이는 것이 아니라, 정규화·배치 정규화로 지형 자체를 둥글게 펴서 condition number를 낮추는 것입니다.
코드로 확인하기
개념은 카파 , 코드는 함수 한 번입니다. 넘파이에서는 np.linalg.cond(A)가 condition number를 바로 계산해 줍니다 — 수학의 ↔ 코드의 np.linalg.cond(A)로 기억하면 됩니다. 연립방정식 를 푸는 것도 를 손으로 계산하는 대신 np.linalg.solve(A, b) 한 줄이면 충분합니다. 아래 코드로 그림에서 본 '널뜀'을 숫자로 직접 확인해 봅시다.
A = ([[1., 1.],
[1., 1.0001]]) # 두 열이 거의 평행
b1 = ([2., 2.0001])
b2 = ([2., 2.0002]) # 우변 마지막 숫자만 0.0001 바꿈
x1 = (A, b1)
x2 = (A, b2)
("kappa(A) =", (A))
("x1 =", x1)
("x2 =", x2)kappa(A) = 40002.00007491523 x1 = [1. 1.] x2 = [0. 2.]
np.linalg.cond(A)가 곧 이고, 출력 40002.0...가 위 그림의 '약 4만 배 증폭'의 정체입니다. 진짜 널뜀은 두 solve 결과에서 드러납니다 — 우변을 에서 로 끝자리만 0.0001 바꿨을 뿐인데, 답이 x1 = [1. 1.]에서 x2 = [0. 2.]로 통째로 옮겨 갑니다. 위 공식 에서, 작은 가 큰 를 만나 큰 가 되는 장면을 그대로 눈으로 본 셈입니다.
실무에서는 정규화로 지형을 편다
그렇다면 condition number가 큰 문제는 실무에서 어떻게 다룰까요? 서로 다른 처방을 구분해야 합니다. 특성 스케일링·normalization은 입력 열의 단위를 맞춰 지형의 축척을 고릅니다. 반면 regularization(규제)은 목적함수나 선형 시스템 자체를 바꿉니다.
선형 회귀에서 가 불안정할 때 를 푸는 릿지(Ridge)는 regularization입니다. 가 작은 특이값을 들어 올려 condition number를 낮출 수 있고, 딥러닝의 weight decay도 이 계열입니다. BatchNorm 같은 normalization과 weight decay 같은 regularization은 이름이 비슷해도 같은 연산이 아닙니다.