배우고 나누는 사람

모두에게 더 넓고 더 깊은 세상을 향해

박사과정/연구 빌드업

[빌드업] 민감도 분석 Fundamentals

Jeongwon Seo 2022. 10. 4. 12:52

이번 포스팅에서는 제 첫번째 연구주제였던 민감도 분석의 기본적인 내용들을 쉽게 다뤄볼까해요. 사실 쉽게 다뤄보고 할 필요도 없는게 제가 연구를 시작할때 만해도 아무 배경지식도 없는 사람들과 마찬가지였으니까요. 그럼 천천히 둘러보실까요?


민감도는 영어로 Sensitivity로 쓰는데요. 미분계수 민감도와 중요도 민감도로 분류가 되는데 저도 후자는 개념만 알고 실제 연구에 사용해 본적이 없어서 생략하고 전자에 대해서 먼저 설명드릴게요. 미분계수 민감도는 종종 경사도(Gradient)로 표현이 되고 dy/dx 이런 식으로 많이 쓰죠. 기하학적 의미으로는 y의 변화를 최대로 이끌 수 있는 x의 방향이라고 이해하시면 좋을 것 같네요. 수학적으로는 간단히 탄젠트로 구할 수 있고요. 아래 그림이 조금 더 이해를 도울 수 있으면 좋겠네요. 

 

 

보통 우리가 풀어야 하는 문제들은 x와 y사이의 관계가 쉬운 공식으로 표현이 되지 않을 때가 많습니다. 그러면 이런 민감도를 구하는 건 더더욱 어렵겠죠. 그래서 기본x값을 중심으로 가까운 거리에서는 x와 y의 관계가 선형이라고 추측할 때가 많아요. 이를 1차 미분계수 First-order derivative라 하죠. 위의 이름에서는 탄젠트 theta의 값이 1차 미분계수가 됩니다.

 

그래서 함수 계산에 들어가는 입력값이 갯수가 적다면 하나씩 조금씩 바꿔가면서 민감도를 얻을 수 있겠죠. 이 방법을 Forward 방법이라고 부른답니다. 그러니 Forward 방법으로 N개의 입력값이 갯수를 가진 모든 입력값의 민감도를 구하려면 N+1번의 모델을 실행시켜야 할 거에요. 근데 N이 엄청 큰 경우가 있겠죠. 예를 들면 핵공학 계산에 들어가는 대부분의 것들은 입력값으로 단면적(cross-section)을 받는데, 이 수가 몇 백만개가 되기도 해서 매번 모델을 실행시키는 것도 굉장히 시간이 많이 걸리는 일이죠.

 

이와 같은 문제를 해결하기 위해 나온 것이 Adjoint 방법인데 입력값이 갯수와 상관없이 딱 두 번의 실행으로 모든 민감도를 구할 수 있어요. 참 대단하죠!? Ajoint 방법에 대해서 조금 더 수학적으로 자세하게 설명할 수 있지만 그러면 재미가 없어지니까 (벌써 재미없는 건 알지만 더 재미없게 할 순 없잖아요) Forward와 간단하게 비교할 수 있는 예시를 들어 설명드릴게요, 기회를 주세요. 예를 들어 사과 두 개와 배 세 개를 사면 1300원이고 사과 세 개와 배 두 개를 사면 1200원이고요. 이 문제를 Forward 방법으로 풀려면 둘 중 한개의 케이스에 과일 한 종류만 변화시킨다면 쉽게 답을 구하실 수 있을거에요. 예를 들어 첫 번째 케이스에서 사과를 세 개로 올렸을때 가격이 200원 증가했다면 사과 한개가 가격에 미치는 영향은 200이라고 볼 수 있죠. 마찬가지로 배에도 똑같이 적용해 보면 배 한개가 가격에 미치는 영향은 300이라고 계산하실 수 있을 겁니다. 근데 Adjoint 방법은 달라요. 먼저 우리가 관심있는 목표를 정해야 해요. 여기서는 사과 한 개와 배 한 개라고 해보죠. 사과 한 개와 배 한개의 총 가격을 계산할 때 Forward 방법으로도 계산할 수 있지만 간단하게 두 식을 더하면 사과 다섯 개, 배 다섯 개가 2500원이라는 것을 알 수 있고, 이를 5로 나누면 쉽게 사과 한개와 배 한개는 500원이라고 알 수 있죠. 이를 조금 복잡한 행렬식에 넣어서 우리가 원하는 민감도를 찾을 수 있게 해주는게 Adjoint 방법의 핵심입니다. Adjoint 방법의 단점은요. 저희가 구하고자 하는 답에 대한 식을 정확히 알고 있어야만 접근이 가능하다는 겁니다. 여튼 그럼에도 불구하고 단 두번만에 모든 입력값의 민감도를 구할 수 있고 핵공학의 대부분의 결과값들의 수식은 잘 알려져 있기에 저희 분야에서는 자주 쓰이는 방법이에요. 

 

대체 민감도 분석을 통해 나온 값들은 어디에 쓰이길래 중요한 걸까요? 각각의 입력값이 갖는 중요도를 아는 게 그렇게 중요할까요? 사실 수백만개나 되는 핵공학 입력값의 모든 민감도를 저희가 다 안다고 좋을 건 별로 없을 겁니다. 그보다도 입렵값의 공분산 행렬과 이 민감도를 안다면 출력값의 불확실성 혹은 여러 출력값이 있다면 출력값의 공분산 행렬을 간단한 행렬/벡터 곱으로 (샌드위치 법칙이라고도 함) 나타낼 수 있습니다. 다음과 같아요. 

 

$$C_o = S_{oi} \times C_i \times S_{io}$$

 

$C_i$는 입력값의 공분산 $C_o$는 출력값의 공분산, 그리고 $S_{oi}$는 출력값에 대한 입력값의 민감도 벡터 (하나의 출력값) 또는 행렬 (여러개의 출력값)입니다. 민감도 벡터/행렬 밑에 써있는게 뒤 바뀐 것은 행렬 전치 (Matrix transpose)를 의미 하고요. 가우스 분포와 공분산에 대해서도 다음에 간략하게 다뤄보도록 하면 좋을 것 같네요. 여튼 이번에 준비한 내용은 여기까지이고요. 박사 학위 논문을 작성하면서 쓰는거라 거의 쉬운 요약 번역본 정도가 되버렸네요. 다음에 또 쓸모 있을만한 내용으로 다시 오도록 할게요. 읽어주셔서 감사합니다.

728x90
반응형