티스토리 뷰
2017년의 어느 수요일 아침이었다. 모든 아침 중 무작위로 하나를 뽑아도 14%의 확률로 뽑히는 게 수요일 아침이니 그 자체가 딱히 특별할 것은 없었다. 모니터를 들여다보고 한숨 좀 쉬다가 뭔가 쳐보고 살짝 클릭했다가 원하지 않는 결과가 나와서 다시 한숨 쉬고 하는 루틴도 딱히 특별할 것이 없었다. 다만 공휴일도 아닌 평일에 회사도 아닌 곳에서 주어진 업무가 아닌 코드를 들여다보는 것은 살짝 특별한 일이었다.
아침 일찍 찾은 도서관은 시험 기간임에도 빈자리가 꽤 있었다. 연차 휴가까지 쓰고 출근하듯이 집을 나선 보람이 있었다. 오늘은 뭔가 빨리 끝내고 집에 일찍 갈 수 있을 것 같았다. 하지만 주변의 빈자리가 모두 가득 찰 때까지 모니터 속 코드는 다섯 줄을 넘기기 어려웠다. 자정까지 과제를 제출해야 하는데 이러다가 완성을 못 하면 어쩌지라는 생각 때문에 조금 무서워졌다.
코드를 써나가기 어려울 때면 목표를 다시 되새겨본다. 자, 지금 내가 하려는 게 뭐지? 언제나 그렇듯이 목표야 간단했다. 심전도 그래프를 생성해주는 프로그램을 만드는 것. 그러니까 P,Q,R,S,T의 특성이 뚜렷이 나타나는 심전도 그래프를 만들어낼 것. 다만 좌표를 직접 찍지도 말고, 알고리즘을 만들지도 말고 프로그램이 알아서 만들어내도록 할 것.
일하면서도 심전도 그래프는 꽤 많이 봤지만, 나의 주 관심사는 그것들이 얼마나 빨리 화면에 출력되느냐 였지 그것들이 어떻게 생겼는지 관심을 가져본 적은 별로 없었다. 그래서 나도 잘 이해하지 못하는 내용을 프로그램이 이해해서 그려내도록 한다는 것은 뭔가 거대한 기만처럼 느껴졌다. 그래도 이런 프로그램을 상상이라도 하고 만들려고 시도라도 할 수 있는 시대가 된 것이 얼마나 놀라운 일일까 생각하면서 다시 코드를 봤다. 그리고 여섯 줄째의 코드를 작성하는 데 또 실패했다. 도대체 레이어를 어떻게 초기화해야 될지 감이 오지 않았다.
세상에 돌아가는 원리도 잘 모르는 채로 프로그램을 만들어야 한다니. 거기에 결과가 확률적으로 나오는 프로그램? 심지어 결과를 잘 나오게 하려면 곳곳에 난수를 집어넣어야 했고, 실행할 때마다 결과가 다르게 나오는데, 잘 짜면 그 결과가 비교적 그리고 확률적으로 균일하게 나온다고 했다.
지난 25년간 내가 구축했던 프로그래밍에 대한 세계관이 무너지는 기분이었다. 내가 아는 프로그래밍은 단 하나의 오차도 없어야 하고, 난수 같은 것은 게임 만들 때 말고는 잘 안 쓰는데. 알고리즘 시험 볼 때 100개 중 하나만 틀려도 불합격이었는데, 지금 보고 있는 코드는 100개 중 90개만 맞아도 놀라운 성능이었다.
도무지 진전이 없어서 자리에서 일어났다. 그리고 주변을 한 바퀴 돌면서 차분하게 해야 되는 것들을 정리해봤다. 일단 초기화를 잘하자. 아무리 분야가 다르다지만 개발자가 초기화도 못하고 무슨 부끄러운 꼴이냐. 그리고 데이터를 잘 쪼개자. 그다음에는 생성기와 분류기에 데이터를 던져넣고 결과가 잘 나오기를 기도하자.
특히나 마지막 단계가 마음에 들지 않는다고 생각했다. 심전도 수백 개를 던져주면 프로그램이 알아서 심전도가 뭔지 이해하고 그걸 흉내 내서 그려준다니. 가장 마음에 들지 않았던 것은 데이터를 넣는 것 - 결과가 나오는 것 사이의 중간단계가 나의 노력이 아닌 컴퓨터의 노력이라는 점이었다.
소위 인공지능이라고 불리는 것들은 사용할 때뿐만이 아니라 만들 때도 놀라움이 있기는 있구나 라고 생각하며 레이어 초기화 코드를 검색하기 시작했다. 도대체 나는 레이어를 몇 개 만들어야 할까. 다른 사람들은 어떻게 만들까.
익숙하지 않은 언어와 환경에서 악전고투하며 레이어 초기화 코드를 완성했다. 초기화가 잘 되었는지 확인해보려면 결과가 나와봐야 하니까 사실 완성했다는 말에는 조금 어폐가 있었다. 그리고 인터넷을 뒤져서 깨끗한 심전도 그래프를 받은 뒤 배열로 변환했다. 그리고 그 배열에서 피크 지점을 찾아서 하나하나의 심박으로 분리하는 코드를 만들었다.
매우 고전적인 코딩이었다. 잘하는 사람은 이것도 인공지능이 자르게 만들지 모르겠지만 내가 보기에 그 기능은 고전적인 알고리즘이 어울리는 분야였고, 파이썬에 익숙하지는 않지만 배열을 자르고 붙이는 것은 지난 25년간 계속해오던 일이었다. 데이터 준비는 순식간에 끝났다.
그리고 만든 데이터를 분류기와 생성기에 던져넣었다. 분류기와 생성기에서 데이터를 받아서 반복 학습하는 코드는 인터넷에 공개된 다른 코드들을 많이 참고했는데, 인터넷을 보고 짰다는 사실에 양심의 가책을 느끼기 어려울 정도로 짧은 코드였다. 그리고 중간중간 진행 상황을 그래프로 출력하는 코드와 결과를 표시하는 코드를 집어넣고, 잘 되기를 기도하며 시작 버튼을 눌렀다.
나는 왜 사양 좋은 노트북이 무겁다는 핑계로 GPU도 없는 태블릿 노트북을 가져왔을까 원망하며 느릿느릿 실행되는 학습 과정을 지켜보았다. 속도로 봤을 때 십 분은 넘게 기다려야 결과를 확인할 수 있을 것 같았다. 그래서 느긋하게 모니터를 보면서 수업 때 배운 내용을 되새겨봤다. 생성기는 처음에는 랜덤 함수로 아무 그래프나 만들어서 분류기에 전달한다. 분류기는 내가 미리 준비한 깨끗한 심전도와 생성기가 만들어서 던진 그래프를 무작위로 전달받는다. 그리고 분류기가 실제 데이터와 생성기가 만든 데이터를 구분하라는 목표를, 생성기는 자신이 만든 데이터를 분류기가 실제 데이터를 착각하도록 하라는 목표를 적절히 부여해주면 이제 생성기가 실제 데이터에 가까운 그래프를 그릴 것이다.
말은 그럴 듯한데, 정말 그게 가능할까 초조한 마음으로 모니터에 느릿느릿 갱신되는 그래프를 바라보았다. 수천 번이 넘는 반복과정 중간중간마다 일정하게 생성기가 만들어낸 그래프를 화면에 표시하도록 코드를 작성하였는데, 가장 처음 생성한 데이터는 시작부터 끝까지 모든 점을 난수로 표시한 정말 지저분한 그래프였다. 그리고 반복이 진행될수록 뭔가 변화가 생기기를 기대해야 됐다.
이 코드에는 내 노력이 거의 들어가지 않은 것 같은데, 사양도 별로 안 좋은 컴퓨터가 팬을 열심히 돌려가며 노력하는 것을 보니 살짝 미안해졌다. 일단 뭐라도 나와라, 뭔가 나올 가능성이라도 보여주면 이 코드 비싼 클라우드로 올려서 순식간에 돌릴 테니 이번만 좀 참아라.
학습 과정이 진행되면서 그래프가 추가로 계속 출력되기 시작했다. 그리고 뭔가 변화가 보였다. 아직 심전도 그래프라고 보기는 어려웠지만, 노이즈가 선의 형태로 바뀌고 있었다. 설마 이게 진짜 되는 건가? 지금 이게 자기가 그려야 되는 게 본질적으로는 선이라는 것을 이해한 걸까?
그리고 수백 번의 반복이 진행되고 몇 개의 그래프가 더 나왔다. 그래프는 슬슬 R 피크를 그리기 시작했다. 그러니까 심전도에서 가장 높이 튀어 나가는 부분이었다. 사람이 심전도 그래프를 그린다고 해도 머릿속에는 R 피크가 가장 먼저 떠오르겠지 라고 생각하니 살짝 무서워졌다.
그리고 반복이 1,000번을 넘어설 무렵 이제 화면에는 누가 봐도 심전도 그래프라고 할 수 있는 그래프가 그려졌다. 연필로 소묘한 것처럼 살짝 지저분하기는 했지만 심전도 그래프가 가져야 할 모든 것이 다 있었다.
반복을 중단시키고, 코드를 정리해서 클라우드에 올리면서 뭔가 허무한 감정을 느꼈다. 어려운 줄 알았던 과제가 너무 쉽게 풀려서인지, 내가 지난 25년간 해왔던 것들이 부정당해서인지 잘 모르겠다는 생각이 들었다.
다른 학생들을 위해서 자리를 비워줘야겠다는 생각에 자리를 정리하고 일어났다. 노트북을 가방에 넣기 전에 화면을 다시 켜서 가짜 심장이 만들어낸 그래프를 다시 한번 쳐다봤다. 얄미울 정도로 잘 그려진 그래프를 보고 있으려니 허무하기는 해도 뭔가 재미있다는 느낌이 들었다. 참으로 오랜만에 느껴보는 감정이라 이게 진짜 재미있는지 스스로 되물어봤는데, 진심이었다.
'에세이' 카테고리의 다른 글
Build, Pray, Run (0) | 2018.08.06 |
---|---|
스윙바이 (1) | 2018.07.28 |
참는 것과 남는 것 (0) | 2018.07.27 |
올림, 내림, 반올림 (0) | 2018.07.26 |
한겨울 밤의 컴파일 (0) | 2018.07.23 |