Recipes in {lambda}

의견 형성 동역학 / 경제 물리학 / 전산 물리학에 대한 소소한 이야기들.

컴퓨터 불신하기

물리학은 컴퓨터가 처음 개발될 때 부터 컴퓨터를 이용하기 시작한 분야입니다. 지금은 모든 분야에 컴퓨터가 사용되고 있어서 과학자들이 컴퓨터를 사용하는 것이 예전만큼 두드러져 보이지는 않습니다만, 과학자들은 예전처럼 여전히 컴퓨터를 가장 많이 쓰는 집단입니다. 과학의 컴퓨터에 대한 의존도는 해가 갈수록 높아집니다.

처음 개발된 컴퓨터들은 지금의 기준으로 보면 그냥 거대한 계산기였습니다. 당시 그만한 계산기를 써야만 하는 분야는 불행하게도 전쟁이었습니다. 포탄의 궤적을 계산하거나 암호문을 풀기 위해서는 계산기 뿐 아니라 그걸 다룰 수 있는 사람들도 필요했었습니다. 그런 이유로 당시의 물리학자들은 컴퓨터를 이용하여 전쟁에 필요한 수많은 계산을 하였습니다.

20세기 중반의 컴퓨터는 지금과 비교하면 훨씬 더 날것이었습니다. 그래서 원하는 계산을 하기 위해서는 지금보다 더 많이 알아야 했습니다. 반면 기기의 특징을 바로 접할 수 있던 시대였기 때문에 지금보다 직접적인 면을 바로 알 수 있던 시대이기도 했습니다. 과학자들은 수많은 테스트를 통해 새로운 기계의 좋은 점과 함께 문제점들도 배워 나갔습니다. 오늘 이야기해 보려는 것은 컴퓨터로부터 배운 컴퓨터의 문제점들입니다.

*

일단 막을 수 없는 오류에 대한 이야기를 해 봅시다. 컴퓨터는 '대개' 올바른 계산을 수행합니다만, 의외로 잘 틀리기도 합니다. 초창기의 컴퓨터들은 지금은 상상하기 어려운 자연적인 문제로 발생하는 오류들을 뱉곤 했습니다. 같은 계산을 수행해도 가끔 틀리는 경우들이 있었습니다. 컴퓨터에서 프로그램의 오류등이 아니라 태생적으로 어쩔 수 없이 발생하는 오류들은 크게 두 가지로 나눌 수 있는데, 그 중 이러한 종류의 오류를 무작위적 오류(random error) 라고 부릅니다. 물리학자들은 그러한 오류를 만드는 문제가 무엇인지 고민했었고, 결국 그러한 오류들은 우주선 (타고 다니는 우주선이 아니라, 우주로부터 날아오는 방사선입니다) 이나 낙뢰등에 의한 전기적인 원인으로 결론 내렸습니다. 지금에 와서는 이러한 오류는 '거의' 일어나지 않습니다.

굉장히 희소한 경우이기는 하지만, 하드웨어로부터 발생하는 오차들도 있습니다. 인텔이 1994년 펜티엄 프로세서를 처음 시장에 내놓았을 때 수학자들은 펜티엄 프로세서가 부동 소숫점을 처리할 때 어마어마하게 낮은 확률이지만 약간 다른 답을 내놓는 것을 발견했습니다. 그 발견은 당시 굉장한 뉴스거리가 되었고, 인텔은 5억 달러에 가까운 비용을 들여 리콜을 해야 했습니다. 이러한 오류는 당시 한 번만 있던 것은 아니었습니다. 새 플랫폼이 나오면 대개 아주 약간의 버그들을 가지고 있습니다. 이러한 문제들은 새 버전의 플랫폼이나 CPU에서 교정되어 나오지만 대개 공개되지 않고 넘어갑니다.

무작위적 오류나 CPU의 결함 이외에도 결과값을 바꾸는 요소들은 굉장히 많습니다. 프로그램 코드를 기계어로 바꾸는 컴파일러의 종류, 최적화 옵션, 수치해석 라이브러리, CPU 기종 및 사용하는 알고리듬의 수치적 안정성에 의해 오류들이 발생하고 누적됩니다.

*

실질적으로 우리가 주의해야 하는 것은 막을 수 있는 오류입니다. 이러한 오류들은 대개 컴퓨터가 수를 다룰 때의 한계 때문에 발생하므로 어림 오류(approximate error) 이라고 부릅니다. 주로 아주 긴 자릿수의 숫자를 계산할 경우 어림 오류가 자주 나타납니다.

어림 오류들은 굉장히 여러 종류가 있지만, 처음 컴퓨터를 이용하여 수치 해석이나 물리학 계산을 할 때 가장 많이 만드는 오류는 반올림 오류(round-off error) 입니다. 반올림 오류는 유효 숫자의 한계나 표현 방식의 한계때문에 생기는 오류입니다. 사람은 십진법을 사용하지만 컴퓨터는 이진법을 사용합니다. 십진법으로 표현되는 간단한 수들을 이진법으로 표현하지 못하는 경우들이 있습니다. 간단한 예를 들어 봅시다.

In [1]: a = 0.3

In [2]: a

Out[2]: 0.29999999999999999

In [3]: a = 0.5

In [4]: a

Out[4]: 0.5

위의 코드는 파이썬에서 a라는 공간에 0.3과 0.5를 넣고 어떤 값이 들어있는지 다시 출력해 본 결과입니다. 사람에게는 간단하지만 컴퓨터는 손가락 하나로 0.3을 표현할 수가 없습니다. 그래서 그 값과 가장 가까운 값으로 어림하여 값들을 저장합니다. 나중에 더 본격적으로 다루겠지만 이러한 오류들은 물리학 모의 실험에 굉장히 큰 영향을 주기 때문에 미리 막는 것은 굉장히 중요합니다.

덧셈이나 곱셈 과정에서는 반올림 오류가 비교적 적게 발생하지만, 뺄샘과 나눗셈에서는 반올림 오류가 결과에 두드러진 영향을 주게 됩니다. 또한 바로 인접한 수를 서로 뺄 경우 반올림 오류는 굉장히 자주 발생합니다. 이러한 경우를 막기 위해서는 가급적이면 모의 실험에 쓰이는 식을 미리 단순화하는 습관이 필요합니다. 가령 (2/a) x (3ab/4) 라는 식을 모의 실험 중간에 집어 넣는다고 한다면, 약분을 통해 미리 3b/2 으로 단순화 한 후 모의 실험 코드를 만드는 습관을 들여 놓는 것이 좋습니다.

*

여 부분은 조금 어려운 이야기입니다. 물리학 모의 실험 코드를 만드는 학생이나 연구자 분들을 위한 부분입니다.

모의 실험을 만드는 경우, 수의 종류을 바꾸는 것 (type conversion) 은 최대한 자제해야 합니다. 컴퓨터는 수를 다양한 방식으로 다룹니다. 또한 그 방식에 따라 사용하는 메모리의 크기 및 다루는 수의 범위가 다릅니다. 방식에 따라 범위 안에서도 수의 밀도가 다르기때문에 수의 종류를 바꾸는 것은 컴퓨터의 관점에서는 단순히 종류를 바꾸는 것 이상의 의미가 됩니다.

소숫점 아래의 수를 계속 변화시켜 나가는 종류의 실험이나, 앞의 결과가 다음 단계의 결과에 영향을 주는 종류의 모의 실험의 경우 (마르코브 과정을 따르는 경우 특히 그러합니다) 편의를 위하여 계산 도중에 수의 종류를 바꾸는 것이 결과에 영향을 주는 경우가 자주 발생합니다. 특히 C 언어를 사용하여 모의 실험을 만드는 경우 이러한 경우가 많으므로 모의 실험 프로그램을 만들기 전에 미리 주의해야 합니다. C 언어를 사용하는 경우에는 함께 사용할 언어나 라이브러리에서 유리수를 다루는 일반적인 방법이 무엇인지를 고려하여 미리 변수의 형태를 결정하는 것이 좋습니다. (라이브러리의 경우 Numerical recipes 및 GSL, ROOT를 사용할 경우 float형을권장합니다. GSL은 어떤쪽도 무방하긴 하지만 무작위수 생성기가 single floating을 기준으로 만들어져 있습니다. 언어의 경우 FORTRAN과 연동할 경우 single precision floating number를, Python및 MATLAB과 연동할 경우 double을 권장합니다.)

최근 CPU의 확장 명령어 및 GPU 가속을 통한 수치 해석 라이브러리 및 코드들이 널리 사용되고 있습니다. SSE 명령어 셋 및 CUDA는 single precision floating point 에서만 수치적 정확도를 보장하므로 single floating을 사용해야 합니다. 최근 라이브러리들은 double precision을 지원하기는 하지만, 하드웨어가 아닌 소프트웨어 차원에서의 처리이므로 속도를 굉장히 희생합니다. 요구되는 정확도에 따라 선택을 해야 하겠지만 명령어 셋이나 하드웨어 가속기를 쓰는 주요한 이유는 속도이므로 double precision을 쓰는 것은 손해가 아닐까 합니다.

*

모의 실험 프로그램이 돌아가지 않는 대부분의 경우는 대개 프로그램을 짠 사람이 실수한 경우입니다. 이러한 오류는 잘못 만든 부분을 고쳐 대응하면 됩니다. 그렇지만 연구하는 입장에서 정말 주의해야 하는 것은 잘 돌아가는 모의 실험 프로그램의 결과가 실은 오류를 담고 있었을 경우입니다. 코드가 간단할 경우 문제점을 우연히 발견할 수도 있고, 결과의 이상한 점으로부터 코드의 문제점을 찾아낼 수 있습니다. 그렇지만 모의 실험 프로그램이 커질수록 문제점은 숨어버리기 쉬워지고 그 경우 잘못된 결과를 믿게 됩니다. 드러나지 않은 문제점이 있는 경우는 과학자들의 연구 결과나 공개된 코드에서 어렵지 않게 찾아볼 수 있습니다.

컴퓨터는 생각보다 불안정하고 섬세한 계산기입니다. 위에서 따로 이야기하지는 않았지만 컴퓨터의 태생적인 오류 이외에도 공개되거나 언어에 내장된 수치해석 라이브러리들에서도 오류가 항상 발견됩니다. 이러한 경우를 최대한 줄이는 것은 습관입니다. 습관을 위해 필요한 것은 컴퓨터에 대한 불신입니다.

Trackback URL
//reciphys.nubimaru.com/trackback/5
Trackback ATOM Feed
//reciphys.nubimaru.com/atom/trackback/5

Comments

Leave your comment