README   SanghyukChun's Blog

당신이 수학을 공부해야만 하는 이유

| Comments

학부를 들어와서 선배들이나 교수님들에게 들었던 많은 잔소리가 있지만 그 중에서 가장 이해가 안되던 잔소리는 ‘수학공부 열심히 해라’ 였다. 학부 입학부터 지겹게 듣던 얘기지만 그 당시 나는 ‘아니 나는 전자공학을 공부할건데 도대체 수학이랑 무슨 상관이지?’ 라는 생각을 가지고 있었다. 학부 4년 동안 전공 공부를 해봐도 내 전공은 수학과 전혀 상관이 없어보였다. 그러다가 학부 5학년이 되어 내 진로가 컴퓨터 쪽으로 바뀌게 되면서 그때부터 다시 그 잔소리가 나를 따라오기 시작했다. ‘프로그래밍을 잘하려면 수학을 잘 해야해’ 음.. 도대체 프로그래밍이랑 수학은 또 무슨 관계란 말인가. 그리고 이제 학부의 마지막을 바라보고 석사에 진학하기 직전인 지금 돌이켜 생각해보니 역시 학부 떄는 수학 공부를 열심히 해야한다.

수학을 잘 해야하는 이유는 사실 굉장히 단순하다. 대부분의 engineering 문제를 수학으로 접근하면 접근 자체가 쉬워지거나, 혹은 확신할 수 없었던 문제를 확신할 수 있다. 예를 하나 들어보자. 어느 멀리 떨어진 지점과 디지털 신호로 통신을 해야하는 상황이다. 그런데 통신망에 어느 정도인지는 모르지만 노이즈가 존재해서 가끔씩 데이터가 제대로 도달할 수 없는 상황이라고 해보자. 만약 데이터가 제대로 도달하지 않았다면? 그렇다면 보내는 쪽에서 데이터를 다시 보내야 할 것이다. 그런데 문제는, 이렇게 재전송을 통해서 내가 보내고 싶은 모든 정보를 안전하게 유한한 시간 안에 보낼 수 있는지에 대한 확신이 없다는 점이다. 실제로 1950년 이전에는 노이즈가 존재하는 통신망에서 정보를 안전하게 유한한 시간 내로 보낼 수 있다는 사실이 증명이 되지 않아 통신을 위한 디지털 신호처리 분야가 존재하지 않았다. 그런데 1949년 클로드 섀넌이 ‘화기 제어 시스템에서 데이터의 예측과 평활’ 이라는 논문을 통해 방금 말한 상황에서 유한하게 잡음이 있는 통신망으로 디지털 신호를 보낼 수 있음을 수학적으로 증명해내었다. 만약 섀넌이 이를 수학적으로 증명하지 않았다면 신호 처리 분야는 존재하지 않았거나 매우 늦게 시작되었을 것이다. 이전에 내가 적었던 포스트 중에서 Gradient Descent Method에 대해 간략하게 다룬 글이 있었다. 그 글에서도 언급했듯, 경우에 따라서는 Gradient Descent Method Algorithm자체가 converge하지 않을 수도 있다. 이를 알지 못한다면 아직 optima를 향해 계속 step이 진행 중인 것인지 아니면 정말 converge하지 않는 것인지 알 수 있는 방법이 없다. (Gradient descent method는 local한 method이기 때문에 전체 function의 모양 등을 알 수가 없다.) 따라서 만약 우리가 이 method가 converge하는 조건을 미리 알 수 있다면 쓸데없는 계산없이 필요할 때에만 해당 method를 적용하는 것이 가능할 것이다. (혹시 그 정답을 궁금해 하는 사람이 있을까봐 정답을 적어주자면 l-Lipschitz & Strongly Convex function이면 Gradient descent method가 반드시 Global optima로 수렴하게 된다.)

그러나 사실 모든 연구자들이 문제를 수학적으로 접근하지는 않는다. 수학으로 문제를 해결하는 것은 이론을 연구하는 연구자들이 주로 하는 일이지 시스템을 디자인하거나 새로운 회로를 설계하는 등의 연구를 하는 경우에는 수학을 사용해 문제를 해결하지는 않는다. 나 역시 수학을 직접 사용하지 않는 사람 중 하나였고 (연구를 하는 것은 아니었지만) 수학이 나에게 필요한 이유를 이해하지 못했었다. 하지만 수학은 단순히 문제를 푸는 수단일 뿐 아니라 문제를 접근하고 해결하는 좋은 이념이 되기도 한다. 무슨 얘기이냐 하면, 수학 자체가 좋은 문제 해결 수단으로 쓰일 수 있기 때문에 수학 공부를 열심히 해야하는 것은 맞지만, 수학 문제를 직접적으로 푸는 것이 아니더라도, 수학적 문제 해결 방식을 많이 접하다보면 다른 문제를 해결할 때에도 도움이 된다는 의미이다. 수학으로 문제를 해결하게 되면 반드시 논리가 성립해야 다음 단계로 진행할 수 있다. z = x + y 라는 것이 확실해야 a + z = a + x + y 라고 할 수 있는 것이지, 갑자기 아무 조건도 없이 a + z = x가 될 수는 없다. 즉, 수학적으로 문제를 해결한다면 (과정이 옳다면) 논리에 빈틈이 없어지고 그 문제는 반박할 여지 없이 완벽한 해답을 가지게 되는 것이다. 꼭 위에서 언급했던 대로 수학으로 문제를 해결하지 않더라도 이런 문제 해결 방법을 많이 접하는 것 만으로도 자연스럽게 논리적으로 사고하는 훈련이 된다는 의미이다. 그리고 대부분의 연구자들은 논리적인 사고력이 매우 중요하다.

마찬가지 이유에서 프로그래밍에서도 수학이 중요하다. 사실 프로그래밍이라는 것이 별게 아니고 어떤 로직을 만들고 그 로직을 컴퓨터가 이해할 수 있는 언어로 옮겨적는 것일 뿐이다. 간단한 Hello World 프로그램부터 복잡한 OS까지 모든 프로그래밍에 가장 중요한 것은 흔히 말하는 ‘코딩 스킬’ 이 아니라 ‘로직’ 이다. 내가 무엇을 프로그래밍해야하는지 이해하고 코딩을 시작해야지, 내가 무엇을 만들어야하는지 이해도 못한 상태에서 코딩을 해서는 좋은 프로그램이 나올 수가 없다. 그리고 프로그래밍에서 매우 중요한 문제 중 하나가 ‘성능 (performance)’인데, 좋은 성능을 가지는 프로그램을 만들기 위해서는 반드시 좋은 설계가 필요하다. 같은 역할을 하는 프로그램을 만들더라도 어떻게 설계하느냐에 따라서 그 결과가 크게 달라진다. 흔히 알고리듬 수업에서 많이 배우는 Sorting에 대해서 잠깐 살펴보자. 우리가 가장 간단하게 생각할 수 있는 무작위로 주어진 숫자들을 순서대로 배열하는 방법은 맨 앞에서부터 하나하나 비교하면서 값을 swap하는 방법일 것이다. 이렇게 sorting algorithm을 설계하게 되면 최악의 경우 n개의 element가 있을 때 n^2번 연산을 수행해야만한다. 하지만 보다 좋은 알고리듬을 사용하면 n^2를 n log n으로까지 줄일 수 있다. 즉, 같은 역할 (순서대로 정렬) 을 하는 두 개의 프로그램이 해당 역할을 전부 수행하기까지 걸리는 시간이 아주 크게 차이가 날 수 있는 것이다. 이는 프로그램 설계 뿐 아니라 데이터베이스 설계에도 마찬가지이고 더 좋은 설계를 통해 더 빠르고 더 좋은 프로그램을 만들 수 있게 된다. ‘과연 지금 설계가 가장 최선의 설계인가?’, ‘지금 설계를 개선시키기 위해서 필요한 것은 무엇이지?’, ‘지금 프로그램에서 문제가 되는 부분은 어디지?’ 이런 질문을 할 수 있느냐 없느냐 그리고 그에 대한 답을 내릴 수 있느냐 없느냐가 프로그래머의 입장에서 더 좋은 프로그램을 할 수 있느냐 없느냐 혹은 얼마나 더 좋은 로직을 설계할 수 있느냐 없느냐의 차이가 되는 것이다. 그리고 바로 전 단락에서 설명했듯, 이런 능력을 훈련할 수 있는 가장 좋은 방법은 수학이다.

수학을 통해 문제를 해결하는 것 뿐이니라 현상을 이해하고 더 나아가 현상을 예측하는 것 또한 할 수 있다. 어느 정도 눈치가 빠른 사람이라면 눈치챘겠지만, 수학을 공부해야하는 마지막 이유는 Modeling이다. 과연 우리는 이 세상을 얼마나 많이 이해하고 있을까? 아마 모르긴 몰라도 거의 대부분의 현상들을 완벽하게는 이해할 수 없을 것이다. 예를 들어서 지구에 있는 모든 사람들은 단 7다리만 건너도 서로를 알고 있다고 한다. 이를 어떻게 증명할 수 있을까? 이런 문제를 해결하기 위해서는 모델링이라는 것이 필요하다. 모델링을 간단하게 설명하면, 어떠한 현상을 이해하기 위해 그 문제를 간단하게 바꾸어 설명하는 것이다. 예를 들어서, 방금 전 문제를 간단한 수학적 모델링을 사용해 풀어보자. 만약 모든 사람들이 10명의 친구를 가지고 있다면, 내 친구의 친구는 모두 100명이고, 내 친구의 친구의 친구는 1,000명… 이런 식으로 친구가 점점 늘어나서 일곱 번째 다리를 건너면 총 10^7의 사람과 알게 되는 것이다. 이런식으로 설명하게 된다면 전 세계 인구가 70억명일 때 모든 사람이 친구를 26명만 가지고 있다면 일곱 다리만에 세상의 모든 사람들과 연결 될 수 있는 것이다. 물론 실제 세상에서는 이와 같은 컨셉은 적용되지 않는다. 사실 이 모델은 심각한 오류가 있다 모든 사람이 친구를 동일하게 n명 가지고 있다는 가정은 틀린 것이고 실제로는 어떤 사람들은 친구가 엄청 많고 어떤 사람은 친구가 엄청 적기 때문에 방금전과 같은 방법으로 문제를 접근하면 잘못된 결과를 얻게 된다. (실제로는 거듭제곱 분포를 그린다. 자세한 내용은 추후 적게 될 단기강좌-인터넷 속의 수학 요약 포스팅에서 다루도록 하겠다.) 수학적 모델링을 통해 어떤 현상을 잘 설명할 수 있다면, 그 모델에서 일어날 수 있는 또 다른 현상들을 예측하는 것이 가능하다. 예를 들어 사람들이 서로에게 어떻게 영향을 미치는지 알 수 있고 어떤 사람이 가장 영향력이 강한지 알 수 있다면 그 사람이 무언가를 행했을 때 다른 사람들에게 어떤 영향을 끼칠지 수학적 모델링 결과를 통해 예측할 수 있게 되는 것이다.

수학공부하라고 한 마디만 하면 되는 것이, 참 길고 긴 잔소리가 되었다. 학부 5년 동안 수학 공부랑 담쌓고 지내다가 요즈음 들어 갑자기 수학 공부에 집중해야하는 상황이 되니 이제서야 내가 왜 수학을 필요로 하고 수학을 어떻게 사용해야하는지 눈에 보이기 시작했다. 하지만 수학은 어디까지나 기본적인 내용이고 내 머리에 깔려있는 내용이어야지, 수학을 주력으로 공부할 시간이 많이 없어서 요즈음 많이 고생을 하고 있다. 뒤늦게나마 깨닫고 더 늦기 전에 수학을 공부하고 있지만, 주변에 수학이 왜 필요한지 모르고 수학을 경시하거나, 수학을 공부하기는 하는데 도대체 이걸 왜 필요로 하는지 모르는 후배들이 참 많이 보인다. 그런 후배들은 이 포스트를 읽고 조금이나마 갈피를 잡을 수 있으면 한다. 만약 자신이 대학원에 진학해서 연구를 하겠다는 생각이 있거나, 논리적인 일을 필요로 하는 사람이라면 학부 동안 수학을 정말 열심히 공부해서 위에서 언급했던 능력들을 기르고 대학원을 진학해서 혹은 자신이 공부 하고 싶은 분야을 공부하면서 그 능력 들을 사용하는 것이 가장 좋은 길이 아닐까라는 생각을 해본다.