수치적 불안정성 문제
확장 칼만 필터는 비선형 시스템에서의 상태 추정 문제를 해결하는 강력한 도구이지만, 비선형 함수의 선형화 과정에서 수치적 불안정성이 발생할 수 있다. 수치적 불안정성은 특히 상태 전이 행렬과 관측 행렬의 조건수가 나쁘거나, 행렬 계산 과정에서 계산 오차가 축적되는 경우 발생할 수 있다. 이를 방지하기 위한 최적화 기법이 필요하다.
1. 공분산 행렬의 안정화
공분산 행렬 \mathbf{P}는 예측과 업데이트 단계에서 지속적으로 갱신된다. 그러나 \mathbf{P}가 매우 크거나 매우 작은 값으로 수렴하게 되면 계산의 안정성이 떨어질 수 있다. 이를 방지하기 위해서는 다음과 같은 방법들이 제안된다.
-
리셋 기술: 일정한 주기마다 \mathbf{P}를 리셋하거나 제한된 값으로 클리핑하는 방식.
-
조건수 개선: 공분산 행렬 \mathbf{P}의 조건수가 나쁜 경우, 작은 값을 더해 조건수를 개선할 수 있다. 예를 들어, 작은 값 \epsilon을 추가하여 수정된 공분산 행렬을 계산할 수 있다.
여기서 \mathbf{I}는 항등 행렬이며, \epsilon은 매우 작은 양의 실수이다.
2. 상태 전이 행렬의 선형화
확장 칼만 필터에서는 상태 전이 함수가 비선형이므로, 이를 선형화하기 위해 테일러 급수를 이용하여 1차 미분 값인 야코비 행렬을 계산한다. 이때, 상태 전이 행렬 \mathbf{F}와 관측 행렬 \mathbf{H}의 계산이 정확해야 한다.
상태 전이 함수 f(\mathbf{x})에 대한 야코비 행렬 \mathbf{F}는 다음과 같이 계산된다.
이 야코비 행렬을 정확하게 계산하지 않으면 필터의 성능이 크게 저하될 수 있으며, 수치적 오차가 축적될 수 있다. 따라서 \mathbf{F}와 \mathbf{H}의 계산 과정에서 수치적 오류를 최소화하기 위한 기법들이 필요하다.
3. 시간 갱신 단계의 안정화
확장 칼만 필터의 시간 갱신 단계는 상태 변수와 공분산 행렬의 예측을 포함한다. 시간 갱신 단계에서 상태 변수 \mathbf{x}_k와 공분산 행렬 \mathbf{P}_k는 다음과 같이 업데이트된다.
여기서 \mathbf{u}_{k-1}은 입력, \mathbf{Q}_{k-1}는 시스템 노이즈 공분산 행렬이다. 시간 갱신 과정에서 \mathbf{P}_k가 비정상적으로 커지는 문제를 방지하기 위해 시스템 노이즈 공분산 행렬 \mathbf{Q}_{k-1}의 값을 적절히 설정하는 것이 중요하다.
시스템 노이즈 공분산 \mathbf{Q}_{k-1} 설정
\mathbf{Q}_{k-1}의 설정은 필터 성능에 큰 영향을 미친다. 시스템 노이즈가 과소 설정되면 필터가 실제 시스템 변화를 잘 추적하지 못하게 되고, 과대 설정되면 필터가 불안정해질 수 있다. 일반적으로, \mathbf{Q}_{k-1}는 시스템의 실제 동적 모델에 근거하여 추정된다. 최적화를 위해서는 다음과 같은 기법을 사용할 수 있다.
- 적응형 시스템 노이즈: 필터 성능에 따라 동적으로 \mathbf{Q}_{k-1}를 조정하는 방법이 있다. 예를 들어, 추정 오차가 커지면 \mathbf{Q}_{k-1}를 증가시켜 필터가 보다 유연하게 동작하도록 한다.
- 크로스 밸리데이션: \mathbf{Q}_{k-1}의 값을 시뮬레이션을 통해 실험적으로 찾는 방법으로, 다양한 값의 \mathbf{Q}_{k-1}에 대해 필터의 성능을 비교한다.
4. 업데이트 단계의 최적화
확장 칼만 필터의 업데이트 단계는 관측값을 기반으로 상태 변수와 공분산 행렬을 수정하는 과정이다. 업데이트 단계는 다음과 같이 이루어진다.
여기서 \mathbf{K}_k는 칼만 이득, \mathbf{R}_k는 측정 노이즈 공분산 행렬, \mathbf{z}_k는 관측값, h(\mathbf{x}_k)는 상태에서 관측값으로 변환하는 함수이다.
측정 노이즈 공분산 \mathbf{R}_k 설정
업데이트 단계에서 중요한 부분은 측정 노이즈 공분산 행렬 \mathbf{R}_k의 설정이다. \mathbf{R}_k가 과소 설정되면 필터가 관측값을 과신하게 되어 상태 변수의 추정이 불안정해질 수 있다. 반대로, 과대 설정되면 관측값을 무시하게 되어 필터가 느리게 반응할 수 있다.
-
적응형 측정 노이즈: 관측 오차를 동적으로 평가하여 \mathbf{R}_k를 조정하는 기법을 사용할 수 있다. 관측 데이터의 품질에 따라 \mathbf{R}_k를 동적으로 조정하여 필터의 성능을 최적화한다.
-
관측 데이터의 정규화: 관측값이 매우 큰 경우, 필터의 성능에 악영향을 줄 수 있다. 이러한 경우 관측값을 정규화하거나 스케일링하여 \mathbf{R}_k에 반영하는 기법이 사용될 수 있다.
5. 수치적 오차 감소 기법
확장 칼만 필터의 계산 과정에서 발생할 수 있는 수치적 오차를 최소화하는 것이 필수적이다. 특히, 행렬의 곱셈, 야코비 계산, 역행렬 계산 등에서 오차가 발생할 가능성이 높다. 수치적 안정성을 유지하기 위한 몇 가지 기법을 살펴보자.
1. 행렬 역행렬 계산의 안정화
칼만 이득 \mathbf{K}_k를 계산할 때, 행렬 \left( \mathbf{H}_k \mathbf{P}_k \mathbf{H}_k^T + \mathbf{R}_k \right)^{-1}의 역행렬을 구하는 과정에서 수치적 오차가 발생할 수 있다. 이를 안정화하기 위한 방법은 다음과 같다.
- 치환 기법: 역행렬 계산 대신 LU 분해나 QR 분해 등의 치환 기법을 사용하면 수치적 오차를 줄일 수 있다. 예를 들어, LU 분해를 이용한 역행렬 계산은 다음과 같다.
여기서 \mathbf{L}과 \mathbf{U}는 각각 하삼각 행렬과 상삼각 행렬이다.
- 역행렬 근사: 역행렬 대신 근사 기법을 사용하여 수치적 불안정을 방지할 수 있다. 이를 위해 반복적인 기법을 통해 근사값을 얻는 방법도 있다.
2. 야코비 계산의 정밀도 향상
확장 칼만 필터는 비선형 함수의 선형화에 의존하므로, 야코비 행렬을 정확하게 계산하는 것이 매우 중요하다. 잘못된 야코비 계산은 필터의 성능을 크게 저하시킬 수 있다. 야코비 계산의 정밀도를 높이는 방법은 다음과 같다.
-
수치 미분 대신 해석적 미분 사용: 야코비 행렬을 구할 때, 수치 미분을 사용하면 오차가 발생할 수 있다. 가능한 경우, 해석적 미분을 사용하여 보다 정확한 야코비 행렬을 구하는 것이 바람직하다.
-
중심 차분법: 수치 미분을 사용해야 하는 경우, 전진 차분법이나 후진 차분법 대신 중심 차분법을 사용하여 오차를 줄일 수 있다. 중심 차분법은 다음과 같이 계산된다.
여기서 \Delta \mathbf{x}_i는 \mathbf{x}의 작은 변화량이다.
3. 수치 안정성을 위한 스케일링
상태 변수나 공분산 행렬이 큰 값으로 수렴하면 계산 과정에서 수치적 오차가 커질 수 있다. 이를 방지하기 위해 스케일링 기법을 사용할 수 있다.
- 상태 변수의 스케일링: 상태 변수 \mathbf{x}_k의 값이 지나치게 커지는 것을 방지하기 위해 적절한 스케일링을 적용할 수 있다. 스케일링된 상태 변수 \tilde{\mathbf{x}}_k는 다음과 같이 정의된다.
여기서 \mathbf{S}는 스케일링 행렬이다. 스케일링 후의 연산은 스케일링 행렬을 반영하여 계산된다.
- 공분산 행렬의 스케일링: 공분산 행렬 \mathbf{P}_k도 마찬가지로 스케일링될 수 있다. 이를 통해 계산 오차를 줄이고 필터의 수치적 안정성을 확보할 수 있다.
6. 선형화 오차 최소화
확장 칼만 필터는 비선형 시스템을 다루기 때문에 필연적으로 선형화 과정에서 오차가 발생한다. 이 오차는 필터의 성능에 직접적인 영향을 미치므로, 이를 최소화하는 기법들이 필요하다. 선형화 오차를 줄이는 대표적인 방법은 다음과 같다.
1. 비선형 함수의 적절한 근사
확장 칼만 필터는 비선형 함수를 선형화하여 근사값을 구한다. 하지만 경우에 따라 이 근사가 적절하지 않으면 필터의 추정이 부정확해질 수 있다. 이를 해결하기 위한 방법은 비선형 함수의 정확한 근사를 찾는 것이다.
- 고차 테일러 급수: 일반적으로 1차 테일러 급수를 사용하여 선형화를 하지만, 경우에 따라 고차 테일러 급수를 사용하여 더 정확한 근사값을 구할 수 있다. 예를 들어, 2차 테일러 급수 전개는 다음과 같다.
여기서 \nabla f(\mathbf{x}_0)는 함수 f(\mathbf{x})의 야코비이고, \mathbf{H}_f는 해시안(Hessian) 행렬이다.
- 비선형 함수의 미분 가능성: 비선형 함수가 미분 불가능하거나 야코비이 비연속적인 경우, 근사 오차가 크게 발생할 수 있다. 따라서 비선형 함수를 선택할 때는 가능한 미분 가능하고 연속적인 함수를 사용하는 것이 바람직하다.
2. 선형화 간격의 최적화
확장 칼만 필터에서 비선형 시스템을 선형화할 때, 시스템의 상태 변화에 따라 일정 주기로 선형화를 수행한다. 이때 선형화 간격이 적절하지 않으면 선형화 오차가 발생할 수 있다.
- 선형화 주기의 최적화: 선형화를 너무 자주 수행하면 계산 비용이 증가하고, 너무 적게 수행하면 시스템의 상태 변화를 반영하지 못할 수 있다. 따라서 시스템의 동특성을 고려하여 적절한 선형화 주기를 설정하는 것이 중요하다.
3. 비선형 시스템의 모델링 개선
비선형 시스템의 모델 자체가 실제 시스템과 다르면 필터 성능이 저하될 수 있다. 이를 방지하기 위해 비선형 시스템을 보다 정확하게 모델링하는 것이 필요하다.
- 정확한 시스템 모델링: 시스템 모델을 개선하여 비선형 함수 f(\mathbf{x})와 h(\mathbf{x})가 실제 시스템을 보다 정확하게 반영하도록 한다. 모델링 과정에서 필수적인 동역학적 요소들을 고려해야 한다.
7. 상태 및 공분산의 재설정
확장 칼만 필터는 시간이 지남에 따라 상태 변수나 공분산이 잘못된 값으로 수렴하는 경우가 있을 수 있다. 이러한 상황에서는 필터를 리셋하거나 재설정하는 기법을 사용하여 필터의 성능을 유지할 수 있다.
1. 상태 변수의 재설정
상태 변수가 특정 임계값 이상으로 벗어나는 경우, 필터가 불안정해질 수 있다. 이때 상태 변수를 적절히 재설정하여 필터가 정상적인 상태로 복귀할 수 있도록 한다.
- 상태 변수 클리핑: 상태 변수 \mathbf{x}_k가 특정 범위를 벗어날 경우, 이를 강제로 제한하는 기법을 사용할 수 있다. 클리핑을 통해 상태 변수가 지나치게 커지거나 작아지는 것을 방지할 수 있다.
2. 공분산 행렬의 재설정
공분산 행렬 \mathbf{P}_k가 비현실적인 값으로 수렴하는 경우 필터의 성능이 떨어질 수 있다. 이를 방지하기 위해 공분산 행렬을 주기적으로 재설정할 수 있다.
- 공분산 행렬 초기화: 일정한 주기마다 공분산 행렬을 초기화하거나 리셋하는 방법을 사용할 수 있다. 이를 통해 필터의 수렴 특성을 개선할 수 있다.
8. 알고리즘 복잡도 감소
확장 칼만 필터의 계산 과정에서 발생하는 연산 복잡도를 줄이는 것도 중요한 최적화 기법이다. 특히, 상태 차원과 센서 데이터의 크기가 증가하면 연산 복잡도가 기하급수적으로 증가할 수 있다. 이를 해결하기 위한 몇 가지 최적화 기법이 있다.
1. 희소 행렬 기법
상태 전이 행렬 \mathbf{F}, 관측 행렬 \mathbf{H}, 공분산 행렬 \mathbf{P} 등이 대규모 상태 공간에서 희소 행렬일 수 있다. 이때 희소 행렬 특성을 활용하여 계산 효율을 높일 수 있다.
- 희소 행렬 연산 최적화: 행렬 곱셈이나 역행렬 계산에서 희소 행렬 구조를 활용하면 계산량을 크게 줄일 수 있다. 희소 행렬에서는 대부분의 요소가 0이므로, 0이 아닌 요소들만을 고려한 계산을 수행하여 연산량을 줄인다.
여기서 f_i는 0이 아닌 행렬 요소들이다.
- 희소 역행렬 계산: 희소 행렬의 역행렬 계산 또한 매우 복잡할 수 있지만, 희소 행렬 특성을 이용하면 계산량을 줄일 수 있다. 특정 희소 행렬에 대해 최적화된 알고리즘들이 존재한다.
2. 차원 축소 기법
상태 변수의 차원이 매우 큰 경우, 필터의 계산량이 크게 증가할 수 있다. 이를 방지하기 위해 차원 축소 기법을 적용할 수 있다.
- 주성분 분석(PCA): 공분산 행렬을 주성분 분석(PCA)을 통해 차원을 축소하여 중요한 요소들만 남기고, 나머지 노이즈를 제거할 수 있다. 이를 통해 상태 변수의 차원을 줄이고 연산량을 줄일 수 있다.
여기서 \mathbf{W}는 주성분 분석을 통해 얻은 변환 행렬이다.
- 가우시안 프로세스 회귀(GPR): 상태 변수의 차원을 축소하는 또 다른 방법으로, 가우시안 프로세스 회귀를 사용할 수 있다. 이를 통해 필터가 처리해야 할 변수의 수를 줄임으로써 연산 효율을 높일 수 있다.
3. 병렬 처리
확장 칼만 필터의 계산 과정은 병렬화가 가능한 연산들이 많이 포함되어 있다. 병렬 처리를 통해 계산 속도를 크게 향상시킬 수 있다.
-
행렬 연산의 병렬화: 행렬 곱셈, 덧셈, 역행렬 계산 등은 병렬 처리가 가능한 연산이다. 여러 프로세서를 사용하여 행렬 계산을 병렬화하면 연산 속도를 크게 향상시킬 수 있다.
-
GPU 가속: 행렬 연산을 GPU에서 수행하여 계산 성능을 극대화할 수 있다. 특히 대규모 상태 공간에서 GPU를 활용한 병렬 처리는 매우 유용하다.
9. 정규화 기법
확장 칼만 필터의 계산 과정에서 발생할 수 있는 오버플로우나 언더플로우 문제를 방지하기 위해 정규화 기법을 적용할 수 있다. 상태 변수나 공분산 행렬의 값이 지나치게 커지거나 작아지는 경우, 정규화를 통해 안정적인 계산을 유지할 수 있다.
1. 상태 변수의 정규화
상태 변수 \mathbf{x}_k가 매우 큰 값으로 수렴하거나, 매우 작은 값으로 수렴하는 경우 계산 과정에서 오버플로우나 언더플로우가 발생할 수 있다. 이를 방지하기 위해 상태 변수를 정규화하는 기법을 사용할 수 있다.
- 상태 변수 스케일링: 상태 변수를 정규화하여 적절한 범위로 조정한다. 이를 통해 계산 오차를 줄이고 필터의 안정성을 유지할 수 있다.
여기서 \|\mathbf{x}_k\|는 상태 벡터의 크기이다.
2. 공분산 행렬의 정규화
공분산 행렬 \mathbf{P}_k도 유사하게 정규화할 수 있다. 공분산 행렬의 값이 지나치게 커지면 필터가 불안정해질 수 있으므로, 이를 적절히 정규화하는 것이 필요하다.
- 공분산 행렬 스케일링: 공분산 행렬의 대각 성분을 정규화하여 값이 적절한 범위 내에 있도록 조정한다.
여기서 \text{tr}(\mathbf{P}_k)는 공분산 행렬의 대각합(Trace)이다.
10. 필터의 초기화 최적화
확장 칼만 필터의 성능은 초기 상태와 공분산 행렬의 설정에 크게 의존한다. 초기 상태와 공분산 행렬을 잘못 설정하면 필터가 수렴하지 않거나 추정 성능이 매우 저하될 수 있다. 이를 해결하기 위한 몇 가지 초기화 최적화 방법이 있다.
1. 상태 변수의 초기화
상태 변수 \mathbf{x}_0는 필터가 추정을 시작하는 초기값이다. 정확한 초기값을 제공하는 것이 매우 중요하다. 초기값이 잘못 설정되면 필터가 수렴하는 데 시간이 오래 걸리거나, 전혀 수렴하지 않을 수 있다.
-
경험적 초기화: 경험적 데이터를 바탕으로 초기 상태 \mathbf{x}_0를 설정하는 방법이다. 이는 필터가 자주 사용되는 응용 분야에서 실제 데이터를 바탕으로 초기 상태를 추정하는 데 도움이 된다.
-
최소 자승법(Least Squares): 관측 데이터가 여러 개 있는 경우, 최소 자승법을 사용하여 상태 변수의 초기값을 추정할 수 있다. 이는 초기 상태의 근사값을 계산하는 효과적인 방법이다.
2. 공분산 행렬의 초기화
공분산 행렬 \mathbf{P}_0의 초기화는 필터의 불확실성을 나타낸다. 공분산 행렬의 초기값이 너무 크거나 작으면 필터의 추정 성능이 저하될 수 있다. 공분산 행렬의 초기값을 적절하게 설정하는 것이 중요하다.
- 초기 불확실성 설정: 시스템의 불확실성을 고려하여 공분산 행렬 \mathbf{P}_0의 대각 성분을 설정하는 방법이다. 시스템에 대한 정보가 충분하지 않은 경우, 불확실성을 크게 설정하여 필터가 유연하게 동작하도록 한다.
여기서 p_i^2는 각 상태 변수의 초기 불확실성이다.
- 초기 공분산 행렬 클리핑: 초기 공분산 행렬의 값이 너무 커지면 필터가 너무 느리게 수렴할 수 있다. 반대로 너무 작으면 필터가 과도하게 반응할 수 있다. 이러한 문제를 해결하기 위해 공분산 행렬의 값을 적절히 클리핑하는 방법이 사용된다.
3. 시스템 노이즈 공분산 행렬 \mathbf{Q}_0의 초기화
시스템 노이즈 공분산 행렬 \mathbf{Q}_0는 시스템 모델의 불확실성을 나타내며, 필터의 동작에 큰 영향을 미친다. 시스템 노이즈를 잘못 설정하면 필터의 성능이 저하될 수 있다.
- 시스템 노이즈의 경험적 설정: 시스템 노이즈 공분산 행렬은 실제 시스템의 불확실성에 따라 설정된다. 시스템 노이즈가 크면 필터가 빠르게 반응하지만 불안정해질 수 있고, 작으면 필터가 천천히 반응하여 추정 성능이 떨어질 수 있다. 이를 위해 시스템의 특성을 고려하여 적절한 노이즈 값을 설정한다.
여기서 q_i^2는 각 상태 변수의 시스템 노이즈를 나타낸다.
11. 고급 최적화 기법
확장 칼만 필터의 성능을 더욱 향상시키기 위해 고급 최적화 기법들이 존재한다. 이러한 기법들은 필터가 다루는 상태 공간의 크기나 시스템의 복잡도에 따라 적용할 수 있으며, 필터의 효율성과 정확성을 크게 향상시킬 수 있다.
1. 스무딩 기법
확장 칼만 필터는 실시간으로 상태를 추정하지만, 과거의 데이터에 대한 추정 성능을 향상시키기 위해 스무딩 기법을 사용할 수 있다. 스무딩은 과거 관측 데이터를 사용하여 이전 상태 추정을 개선하는 방법이다.
- 레이코비치-스트라톤비치 스무딩: 레이코비치-스트라톤비치(Kalman-Bucy) 스무딩은 현재 시점뿐만 아니라 미래 관측 데이터를 활용하여 과거 상태를 추정하는 기법이다. 이 기법을 통해 과거 상태 추정의 정확성을 높일 수 있다.
여기서 \mathbf{A}_k는 스무딩 이득이다.
2. 적응형 확장 칼만 필터
적응형 확장 칼만 필터는 필터의 파라미터(예: 시스템 노이즈 \mathbf{Q}_k 및 측정 노이즈 \mathbf{R}_k)를 실시간으로 조정하여 필터 성능을 최적화하는 기법이다. 이를 통해 환경 변화나 시스템 동특성에 따라 필터가 동적으로 변화할 수 있다.
- 파라미터 학습 기법: 적응형 확장 칼만 필터는 시스템의 동작에 따라 \mathbf{Q}_k와 \mathbf{R}_k를 실시간으로 조정한다. 이를 위해 필터가 예측한 값과 실제 측정값 사이의 차이를 학습하여 파라미터를 업데이트하는 방법이 사용된다.
여기서 \eta는 학습률이다.