조건수가 큰 문제와 해법 전략
조건수의 개념과 민감도
수치해석 전반에서 매우 중요한 개념 중 하나가 조건수다. 정방행렬 $\mathbf{A}$에 대해 고전적으로 정의되는 조건수는 일반적으로 특정 노름 $|\cdot|$에 대해
로 나타난다. 이 조건수는 $\mathbf{A}\mathbf{x} = \mathbf{b}$ 문제를 풀 때, 입력인 $\mathbf{b}$ 또는 계수행렬 $\mathbf{A}$에 대한 오차(또는 작은 변화)가 해 $\mathbf{x}$에 미치는 영향을 정량적으로 평가한다. 예를 들어 2-노름에서 조건수가 매우 큰 행렬은, $\mathbf{b}$가 조금만 변해도 $\mathbf{x}$가 큰 폭으로 요동치는 민감한 시스템이다. 이러한 민감도는 실제 계산 과정에서 수치적 부동소수점 연산의 영향을 증폭시키므로, 많은 경우에서 해를 안정적으로 구하기 어려워진다.
행렬 $\mathbf{A}$의 조건수가 클 때, 예를 들어 $\mathrm{cond}(\mathbf{A})$가 $10^7$ 이상 수준이라면, 단순 가우스 소거법 혹은 기본 LU 분해 등으로는 매우 큰 반올림 오차가 발생할 수 있다. 따라서, 조건수가 큰 문제를 접했을 때는 단순 알고리즘으로 해를 구하는 대신 적절한 전처리나 안전장치가 요구된다. 문제 자체가 내재적으로 민감하다는 것은 근본적으로 해결하기 어렵지만, 알고리즘적 혹은 수치적 관점에서 오차 전파를 최소화하는 기법이 존재한다.
조건수는 특정 노름에서 정의되므로, 노름을 다르게 잡으면 조건수의 값도 달라진다. 그러나 보통은 2-노름이 이론적·실무적으로 분석이 잘 맞아떨어지므로 $|\cdot|_2$ 기준의 조건수가 가장 흔히 사용된다. $\mathbf{A}$가 대칭행렬이고 고윳값 분해가 가능하면, 2-노름 조건수는 $\max|\lambda_i| / \min|\lambda_i|$로도 표현된다. 이때 $\lambda_i$는 $\mathbf{A}$의 고윳값이다. 만약 $\mathbf{A}$가 양의 정부호 대칭행렬이면 모든 고윳값이 양이므로, 고윳값들의 비율이 매우 크다면 그 행렬은 수치적으로 불안정한 행렬로 본다.
예시: 힐베르트 행렬
조건수가 매우 크다고 하면 자주 예로 드는 것이 힐베르트 행렬이다. 힐베르트 행렬은
와 같이 정의되는데, 이 행렬은 급격하게 커지는 조건수로 악명이 높다. 예를 들어 $10\times 10$ 크기만 되어도 $cond(\mathbf{H})$는 매우 커져서, 정밀도가 한정된 컴퓨터 환경에서는 계산이 불안정해진다. 이때 해를 구하는 과정에서 사소한 반올림 오차가 최종 해에 크게 반영된다.
전치 또는 대칭 여부와 조건수
행렬 $\mathbf{A}$가 대칭행렬이 아니라면, 실제 계산에서 반드시 부분 피벗팅(partial pivoting) 또는 완전 피벗팅(full pivoting) 기법을 고려해야 한다. 그 이유는 비대칭행렬 $\mathbf{A}$를 단순 LU 분해로 풀면 수치 안정성이 크게 저하될 수 있기 때문이다. 피벗팅 기법은 기본적으로 행렬 요소 중에 '안정적인 피벗'을 골라내어, 가우스 소거 중 발생할 수 있는 큰 반올림 오차를 완화한다. 이것은 조건수가 큰 문제에서도 어느 정도 효과가 있다. 다만, 문제 자체가 매우 불안정하다면 피벗팅만으로는 완벽히 해를 안정화하기 어렵고, 추가적으로 다른 해법 전략이 필요하다.
스케일링과 정규화
스케일링(scaling) 기법은 계수행렬이나 미지수 벡터를 적절히 정규화(normalization)하거나 행렬의 행 혹은 열을 재조정(rescaling)하여, 수치적으로 불안정한 문제를 상대적으로 안정화하는 방식이다. 행렬의 각 열(혹은 행)에 대해 최대값이나 노름을 1 정도로 맞춰놓으면, 소거 과정에서 너무 큰 수 혹은 너무 작은 수가 등장하는 사태를 줄일 수 있다. 이 과정에서 문제의 본질이 바뀌지는 않지만, 수치 구현 차원에서는 연산 순서나 반올림 오차의 형태를 바꿔서 좀 더 유리한 국면으로 문제를 전환시킬 수 있다.
스케일링의 가장 흔한 예로는, 전체 행렬의 요소들을 어떤 스칼라로 곱하거나 나누어 절대값이 1 이하, 혹은 1 수준에 가깝게 만드는 방법이 있다. 실제로 $\mathbf{x}$를 구하고 나서는, 다시 스케일링 이전 상태로 되돌리는 보정을 해주면 된다. 수치기법 라이브러리에서는 대개 이런 스케일링을 내부적으로 수행하는 경우가 많다.
기본적인 해법 전략 개관
조건수가 큰 문제를 해결하기 위한 접근방식 중 하나는, 해 자체를 직접 구하기보다 문제를 적절히 변형하여, 더 잘-conditioned된(상대적으로 안정적인) 형태로 만들어 푸는 것이다. 예를 들어 선형시스템 $\mathbf{A}\mathbf{x} = \mathbf{b}$가 잘 안 풀린다면, QR 분해나 SVD(특이값 분해)를 이용해 $\mathbf{A}$를 안정적으로 분해한 뒤 역으로 해 $\mathbf{x}$를 구성하면, 단순 가우스 소거보다 훨씬 나은 안정성을 얻기도 한다. 특히 SVD를 이용하면 작은 특이값이 문제를 심각하게 악화시키는 현상에 대응하여, 특정 임계값 이하인 특이값들을 제거(Truncated SVD)함으로써 근사해를 구할 수도 있다.
조건수가 큰 문제를 풀 때는 수치오차가 쉽게 증폭되므로, 해를 구한 뒤에도 반드시 잔차(residual)를 검토하거나, 필요하다면 반복 보정(Iterative Refinement)을 활용한다. 반복 보정 기법은 초기에 구한 해가 완전히 틀리지 않다는 전제에서, 선형시스템의 잔차를 재계산한 후 다시 풀어 오차를 보정하는 절차를 반복하여 점진적으로 정확도를 높인다.
단순 Python 예제: 조건수 계산과 스케일링
아래 예제는 작은 크기의 랜덤 행렬을 만들고, 그 조건수를 직접 계산한 후, 행 단위 스케일링을 수행하여 다시 조건수를 측정하는 예시를 Python으로 보여준다. 실제로 문제 규모가 매우 커지면, 라이브러리의 고급 함수들을 쓰는 것이 현명하다.
이 예시에서는 $5\times5$ 정도로 매우 작은 행렬을 생성한다. 일반적으로 랜덤 행렬은 무작위 특성 때문에 조건수가 그리 크지 않을 수 있다. 하지만 힐베르트 행렬 등 특수한 행렬을 시험해 보면, 스케일링의 영향이 훨씬 극적으로 나타난다.
간단한 흐름도 예시
조건수가 큰 문제를 만났을 때, 전형적으로 선택하는 절차를 다음과 같이 간단한 플로우차트로 표현할 수 있다.
조건수가 큰지를 우선 진단한 뒤, 스케일링이나 QR 분해, SVD 등의 전처리 또는 안정화 기법을 고려한다. 그 후, 반복 보정이나 잔차 검토를 통해 최종적으로 계산의 안정성과 정확도를 보장하려 한다.
불확실성(Uncertainty)과 민감도
현실에서 다루는 대부분의 시스템은 측정 불확실성(aleatory uncertainty)과 모델 불확실성(epistemic uncertainty)을 동시에 지니고 있다. 측정 불확실성은 본질적으로 시스템 외부에서 측정 장비 및 환경적 변동으로 인해 발생하며, 이를 통해 얻은 입력값 자체가 확률적 분포를 지닌다고 볼 수 있다. 반면 모델 불확실성은 시스템을 단순화하거나 가정된 파라메터, 혹은 해석 과정의 이상화로 인해 나타난다.
민감도 분석은 이 두 종류의 불확실성이 출력에 주는 영향 크기를 정량화하여, 전체 오차 구조를 파악하는 데 유용하다. 측정 불확실성으로 인한 분산이 큰 입력 변수는 그만큼 실제 결과의 변동을 크게 유발할 가능성이 높다. 모델 불확실성 측면에서는, 주어진 이론적 가정이나 수식화 방식이 적절치 않을 경우 예측값과 실제 결과 간의 편차가 구조적으로 발생한다.
이러한 불확실성 하에서의 민감도 분석은 다음과 같은 형태로 확장될 수 있다. 먼저 입력값 $\mathbf{x}$가 확률변수로 정의된다고 가정하고, $f(\mathbf{x})$의 출력 역시 확률변수가 된다. 이때 전역 민감도 기법을 적용해 각 입력 변수의 분산 기여도가 어느 정도인지, 그리고 서로 다른 변수들 간의 상호 작용 항이 얼마나 큰지를 살핀다.
전역 민감도 분석을 통해 $f(\mathbf{x})$의 분산 $\mathrm{Var}(f)$를 분해하면, 단순히 국소적 편미분만으로는 알 수 없었던 변수가 갖는 영향력과 변수들 간의 상호작용까지 측정할 수 있다. 예컨대 Sobol 지표나 FAST(Fourier Amplitude Sensitivity Test) 같은 방법으로, 각 변수별 1차 영향도뿐만 아니라 다중 교호항(interaction term)의 영향도도 따져볼 수 있다.
현장에서 불확실성을 동반한 문제를 풀 때는, 입력값의 측정이 정확하다고 가정하기보다는, 실제로 가능한 분포(가우시안, 균등분포 등)를 설정해놓고 여러 시뮬레이션(몬테카를로 방식 등)을 수행해본다. 그 결과물에 대해 전역 민감도 해석을 수행하면, 특정 변수가 조금만 달라져도 최종 결과가 크게 바뀌는지를 ‘확률적’ 맥락에서 이해하게 된다. 이를 통해 설계·운영 관점에서 취약점을 파악하고, 향후 추가 측정이나 정밀도 향상에 투자할 우선순위를 정할 수 있다.
다중 스케일 문제와 민감도
불확실성이 있는 문제 가운데 다중 스케일(multi-scale)을 동시에 고려해야 하는 문제는 민감도 분석이 훨씬 까다로워진다. 예를 들어 지진 해석에서 지하 암반 구조는 큰 스케일(수 킬로미터 이상)로 거동하지만, 지진파 전파 과정은 매우 세밀한 시간·공간 해상도를 요구한다. 이런 문제에서 입력 파라메터(암반 물성치, 단층 구조, 간극률 등)는 서로 다른 스케일에서 정의될 수 있으며, 일부는 상당한 불확실성을 내포한다.
이때 민감도 분석은 각 스케일 간의 오차 전파 과정을 추적하기 위해, 부분모델별 혹은 위계적(hierarchical) 구조로 접근한다. 큰 스케일의 문제에서 입력 변화를 적용해 그 결과를 작은 스케일 하위 모델에 전달하고, 다시 그 결과가 전체 스케일에 영향을 주는 식으로 계산을 반복하여, 어떤 변수·구간에서 민감도가 폭증하거나 누적되는지를 확인한다.
불안정 구간 식별
비선형성, 불확실성, 그리고 다중 스케일이 결합된 문제에서는, 특정 구간이나 특정 파라메터 영역에서 민감도가 특히 높아지는 “불안정 구간(critical region)”이 발생하기도 한다. 예를 들어 천이(transient) 구간이나 임계현상(phase transition)이 일어나는 지점, 혹은 매개변수가 경계값에 근접해 있는 상태 등에서 오차 증폭이 두드러질 수 있다.
이를 식별하기 위해, 민감도 지표를 시간·공간·파라메터 축에 따라 모니터링하면서, 기준치를 넘으면 세밀하게 추가 해석 혹은 측정이 필요함을 경고하는 시스템을 구축하기도 한다. 시뮬레이션을 순차적으로 수행하면서, 민감도가 갑작스럽게 증가하는 시점에 대응하여 적응형 메쉬나 적응형 모델링을 도입해 오차 전파를 최소화하려는 시도도 많다.
결합 문제(Coupled Problem)에서의 민감도
다물리(multi-physics) 혹은 다분야(multi-disciplinary) 결합 문제에서는 각 물리현상 간의 상호작용으로 인해 민감도가 상호 증폭되기도 한다. 예를 들어 열-구조 결합(thermo-mechanical coupling) 문제에서 온도가 미세하게 변하면 구조변형이 증폭되고, 그 변형으로 인해 열전달 경계가 달라져 온도가 다시 변하는 식의 순환적 영향이 생길 수 있다.
이때 결합 문제 전체를 한꺼번에 해석할 경우, 민감도 역시 통합적으로 계산해야 한다. 단일 물리 현상에 대한 민감도와 달리, 열 방정식과 구조 방정식을 함께 풀면서, 양방향 정보 교환 과정에서 발생하는 오차 전파까지 분석해야 한다. 이를 위해 결합된 야코비 혹은 블록 행렬 형태의 민감도 행렬을 구성하고, 해당 행렬의 조건수나 고윳값 분포를 살펴볼 수 있다.
민감도와 알고리즘 복잡도
민감도 분석 자체가 계산적으로 비용이 많이 드는 경우도 있다. 문제 차원이 매우 높아지면, 전통적인 방식의 전역 민감도 분석(예: 몬테카를로 기법으로 변수 공간을 전부 탐색하는)은 기하급수적 복잡도를 띨 수 있다. 이를 완화하기 위해 스파스(Sparse) 구조나 저차원 근사 기법, 혹은 랭크 축소(rank-reduced) 기법 등을 활용하기도 한다.
예를 들어 수천 개 이상의 파라메터가 존재하는 대규모 PDE 기반 시뮬레이션에서 전역 민감도 분석을 전면적으로 수행하기는 불가능에 가깝다. 따라서 우선 지역민감도를 통해 민감도가 높아 보이는 변수들을 1차적으로 식별하고, 일부 유의미한 변수에 대해서만 집중적인 전역 민감도 분석을 수행하는 식으로 접근해야 한다.
한편, 역전파(Backpropagation)를 활용하는 알고리즘(인공신경망, 자동미분 등)에서는 내부적으로 민감도(gradient) 계산이 자동으로 이루어진다. 그러한 시스템을 이용해 많은 파라메터에 대한 편미분을 한꺼번에 구해낼 수 있으므로, 민감도 분석의 계산 비용을 상당 부분 줄일 수 있다.
불확실성(Uncertainty)과 민감도
현실에서 다루는 대부분의 시스템은 측정 불확실성(aleatory uncertainty)과 모델 불확실성(epistemic uncertainty)을 동시에 지니고 있다. 측정 불확실성은 본질적으로 시스템 외부에서 측정 장비 및 환경적 변동으로 인해 발생하며, 이를 통해 얻은 입력값 자체가 확률적 분포를 지닌다고 볼 수 있다. 반면 모델 불확실성은 시스템을 단순화하거나 가정된 파라메터, 혹은 해석 과정의 이상화로 인해 발생할 수 있다. 예를 들어, 항공기 외형을 이상적인 유선형으로 간주하거나, 기상 조건이 고정되어 있다고 가정하면 실제 상황에서 발생할 수 있는 다양한 요인을 충분히 반영하지 못하게 된다.
이런 불확실성이 있는 상황에서 민감도 분석은 더욱 중요해진다. 불확실성이 큰 입력 변수들이 해석 결과에 지배적 영향을 끼친다면, 해당 변수에 대해 측정 정밀도를 높이거나 모델링 방법을 개선함으로써 전체 결과 신뢰도를 크게 높일 수 있다. 반면 민감도가 낮은 변수에는 상대적으로 자원을 적게 투자해도 무방할 수 있다.
전역 민감도 분석(Global Sensitivity Analysis) 기법 중 하나로는 대략 다음 형태의 접근이 가능하다. 파라메터 $\mathbf{x}$가 특정 확률분포(예: 정규분포, 균등분포 등)로부터 샘플링된다고 할 때, 모델 $f(\mathbf{x})$의 출력 분산을 각 변수별로 어떻게 분해할 수 있는지 확인한다. 이를 위해 Sobol 분해나 분산분석(ANOVA) 기반 기법이 활용되기도 한다.
가령 단순화된 형태로, 스칼라 출력 $y = f(\mathbf{x})$의 전체 분산을 $\mathrm{Var}(y)$라 하고, $x_i$가 단일 변수일 때, 다음과 같은 1차 Sobol 지표를 정의할 수 있다.
이는 $x_i$만을 변동시키며 다른 변수는 고정하거나 평균화했을 때, $y$의 분산 변동이 전체 분산에서 얼마나 큰 비중을 차지하는가를 나타낸다. 이 값이 클수록 해당 변수는 출력에 대해 민감도가 높다.
복잡한 비선형 상호작용을 반영하기 위해 2차 이상의 상호작용 항을 함께 고려하는 방법도 있으며, 그런 경우에 Sobol 전체 지표가 사용된다. 전역 민감도는 단순 국소 편미분 정보로는 포착하기 어려운, 범위 전체에 걸친 상호작용까지 파악할 수 있다는 장점이 있다.
불확실성 해석 관점에서 보면, 몬테카를로 시뮬레이션으로 임의의 입력 샘플을 충분히 생성하고, 각 샘플에 대해 모델 출력을 계산한 뒤 그 통계적 분포(평균, 분산, 상관계수 등)를 관찰하는 방식을 자주 쓴다. 그 과정에서 변수 $x_i$를 고정하거나 주어진 범위에서만 변동시켜서 출력이 어떻게 달라지는지, 즉 민감도 지표가 어느 구간에서 특히 높아지는지를 비교하게 된다.
이러한 불확실성 분석을 통해, 민감도 큰 변수나 파라메터에 우선순위를 두어 측정 정밀도를 높이거나, 모델의 단순화 가정이 심각한 오류를 낳지 않는지 재검토할 수 있다. 반대로 민감도가 낮은 부분은 모델링을 조금 단순화해도 결과에 큰 차이가 없으므로, 그쪽 자원을 아껴 다른 핵심 영역에 집중할 수 있게 된다.
불확실성(Uncertainty)과 민감도
현실에서 다루는 대부분의 시스템은 측정 불확실성(aleatory uncertainty)과 모델 불확실성(epistemic uncertainty)을 동시에 지니고 있다. 측정 불확실성은 본질적으로 시스템 외부에서 측정 장비 및 환경적 변동으로 인해 발생하며, 이를 통해 얻은 입력값 자체가 확률적 분포를 지닌다고 볼 수 있다. 반면 모델 불확실성은 시스템을 단순화하거나 가정된 파라메터, 혹은 해석 과정의 이상화로 인해 나타난다.
민감도 분석은 이 두 종류의 불확실성이 출력에 어떤 영향을 주는지를 정량화할 때 필수적으로 활용된다. 입력변수가 여러 개라면, 각 변수에 할당된 분포(예: 정규분포, 균등분포 등)를 바탕으로 몬테카를로 시뮬레이션을 수행해 볼 수 있다. 이 과정에서 모델을 반복 평가하면, 출력값의 분포와 그에 기여하는 각 변수의 상대적 민감도를 추정할 수 있다.
단순 예시로, 출력이 $z=f(x,y)$ 형태인 2변수 함수라면, $(x,y)$를 확률적 샘플링(예: pseudo-random 혹은 quasi-random)하여 생성하고 각 점에서 $z$를 계산한 뒤, 그 분산 분석을 통해 어떤 변수가 불확실성 전파의 주된 원인인지 확인한다. 같은 원리로, 차원이 훨씬 높아도 기법을 확장할 수 있다. 이 경우 전역 민감도 지표(Sobol 지수, 분산기여도 등)를 써서, 상호작용 효과를 포함하여 어느 부분이 민감도에 크게 기여하는지 살핀다.
현실 모델에서 불확실성이 클수록, 민감도가 큰 변수들을 정교하게 측정하고, 상대적으로 민감도가 낮은 변수는 간략히 취급할 수 있다. 또 시뮬레이션 횟수가 매우 많아질 수 있으므로, 전역 민감도 계산에는 라틴 하이퍼큐브 샘플링(혹은 스크램블링 기법) 등 의도적으로 표본 효율을 높이는 방법이 유리하다.
민감도 결과 해석의 한계
민감도는 입력변수 변동에 대한 출력반응을 측정한 것이므로, 모델이 애초에 잘못 설정되어 있으면 민감도 결과 역시 의미가 크게 퇴색될 수 있다. 예컨대, 실제 물리계의 중요한 현상을 모델이 간과했다면, 민감도가 낮게 나타난 변수라도 실제로는 계의 거동에 더 중요한 역할을 할 수 있다. 따라서 민감도 해석은 모델 검증(model validation)과 병행되어야 한다.
국소 민감도 역시, 특정 지점 혹은 특정 시간구간에서만 유효한 결과이므로, 이를 전역적으로 일반화하면 오판을 초래할 수 있다. 비선형 시스템이나 복잡계 문제에서, 민감도는 입력 공간의 다른 부분에서 전혀 다른 양상을 보이기도 한다. 반면 전역 민감도는 전체 입력 범위에서의 거동을 종합적으로 파악한다는 장점이 있으나, 계산 비용이 커지거나, 모델 차원수에 따라 지표 해석이 복잡해질 수 있다.
민감도와 견고함(Robustness)
민감도가 높다는 것은 실제로 결과가 불안정하게 변할 여지가 크다는 의미다. 공학적 의미에서 이를 견고함의 부족이라고도 부른다. 결국 문제 해석 혹은 제품 설계에서 중요한 것은 민감도가 높은 구간을 어떻게 처리하여 전체적인 견고함을 확보하느냐 하는 점이다.
수학적으로 민감도 감소는 대체로 특정 방향에서의 기울기를 줄이거나, 상태공간에서 큰 변동에 대해 안전한 해를 확보하는 작업으로 귀결된다. 예컨대 최적화 문제에서 라그랑주 승수법을 적용했을 때, 파라메터나 제약조건에 민감도가 지나치게 크다면, 이들을 완화하거나 정규화를 통해 해가 변동에 덜 예민하도록 만든다.
견고함을 더 넓은 스케일로 보면, 출력의 오차뿐 아니라 계산 수행 과정에서도 수치적인 안정성과 민감도 억제 전략이 중요하다. 예를 들어, 입력 데이터가 노이즈를 상당히 포함하고 있거나, 수치 연산 자체가 부동소수점 한계를 갖는다면, 민감도 결과에 따라 필요시 고정소수점 연산이나 고(高)정밀도 부동소수점 방식을 고려해야 할 수도 있다.
민감도 관점에서 본 적분 및 미분 연산
수치해석에서 적분과 미분 연산은 다양한 알고리즘에 내재되어 있다. 수치 적분 시, 적분구간을 나누는 방식(메쉬)이나 적분법칙(직사각형, 트랩케이드, 가우스 적분 등)에 따라 오차 전파 양상이 달라진다. 민감도가 높은 구간을 세분화하면 적분오차를 효과적으로 줄일 수 있다. 반면 민감도가 낮은 구간은 상대적으로 덜 세밀해도 충분하다.
수치 미분의 경우에도, 차분 간격 $h$를 어떻게 설정하느냐에 따라 민감도 측정 정확도가 결정된다. $h$가 너무 크면 편미분 근사 오차가 커지고, 너무 작으면 부동소수점 반올림오차가 문제를 일으킨다. 이는 근본적으로 민감도가 높은 지점에서는 미분 근사를 더 정교하게 해야 한다는 점과 연결된다.
Last updated