AIㆍML / 개발자

“더 쉽고 가까워진” 머신 러닝을 시작하는 소프트웨어 엔지니어를 위한 조언

Ted Dunning | InfoWorld 2017.09.15
오래 전인 1950년대 중반, 로버트 하인라인은 유능한 기계 엔지니어가 패턴 매칭 메모리와 “판단을 추가하기 위한” 몇 가지 측면 회로를 만들기 위해 “토르센 튜브(Thorsen Tubes)”를 연결한다는 “여름으로 가는 문”이란 제목의 작품을 썼으며 지능형 로봇이라는 하나의 산업 분야를 창조해냈다. 그는 이야기를 좀 더 그럴듯하게 만들기 위해, 미래를 잘 설정해 놓았다. 1970년이라는 미래다. 이 로봇들은 시연된 접시 닦기 같은 임무를 완벽하게 복제했다.

굳이 말할 필요는 없겠지만, 20년 후 현실은 그렇게 되지 않았다. 1956년에는 타당한 것처럼 보였지만, 1969년이 되자 1970년에는 로봇이라는 미래가 오지 않으리라는 것이 확실해졌다. 그리고 얼마 뒤인 1980년이나 1990년 또는 2000년이 되어도 그런 미래가 오지 않으리라는 것이 확실해졌다. 10년마다, 평범한 엔지니어가 인공 지능(Artificial Intelligence) 머신을 구축할 능력이 최소한 지나간 시간만큼이나 빠르게 후퇴하는 것처럼 보인다. 기술이 진보함에 따라, 어려운 사항들이 한 꺼풀씩 드러남에 따라, 이 문제가 엄청나게 어려운 문제라는 점이 더욱 명확해지고 있다.

머신 러닝이 중요한 문제들을 해결하지 않고 있었다는 것이 아니다, 해결하고 있었다. 예를 들면, 90년대 중반에도 모든 신용 카드 거래가 금융사기 여부를 판단하기 위해 신경망을 이용해서 스캔되고 있었다. 90년대 후반 구글은 검색을 개선하기 위해 웹에서 고급 신호를 분석하고 있었다. 그렇지만 일반적인 엔지니어는 박사학위를 받기 위해 학교로 돌아가거나 똑같은 일을 할 수 있는 생각이 비슷한 친구를 여럿 찾기 전에는 그런 시스템을 구축할 수 있는 기회를 얻지 못했다. 머신 러닝은 어려웠으며, 각각의 새로운 영역은 많은 신기원을 필요로 했다. 최고의 연구원들조차도 현실 세계에서는 이미지 인식 같은 어려운 문제를 깰 수 없었다.

비로소 상황이 극적으로 바뀌었다고 말할 수 있어서 기쁘다. 우리 중 누구도 가까운 장래에 하인라인 스타일의, 마술처럼 자동으로 이루어지는, 전부가 로봇인 엔지니어링 회사가 등장할 것이라고 생각하지는 않지만, 이제는 별다른 고급 교육을 받지 않고도 소프트웨어 엔지니어가 정말로 멋진 일들을 해내는 시스템을 만들 수 있다. 놀라운 부분은 컴퓨터가 이런 일들을 할 수 있다는 것이 아니다. (이 사실은 1956년 이래로 언제든지 가능할 것으로 알려져 있었다!) 놀라운 점은 지난 10년간 우리 인간이 얼마나 발전했는가 하는 것이다. 10년 전에는 정말로 훌륭한 박사학위 논문이었을 주제가 이제는 주말 동안 할 수 있는 가볍고 멋진 프로젝트가 된 것이다.

머신 러닝은 더욱 쉽고 액세스하기 편한 주제가 되었다
곧 발간될 “머신 러닝 실행 계획(Machine Learning Logistics)”(오라일리(O’Reilly)에서 2017년 9월 말에 발간 예정)이라는 책에서, 엘렌 프리드먼과 필자는 친구이자 소프트웨어 엔지니어인 이안 다우나드가 심심풀이 홈 프로젝트로 구축한 텐서치킨(TensorChicken)이라는 시스템을 설명한다. 해결할 문제는 커다란 어치 새가 친구의 닭장 안으로 들어와서 달걀을 쪼아댄다는 것이다. 친구는 큰 어치새를 인식하는 컴퓨터 비전 시스템을 구축해서 쪼아대는 것을 막기 위한 어떤 조치가 취해질 수 있기를 원했다.

텐서플로우 팀 소속 구글 엔지니어의 딥 러닝 프레젠테이션을 본 뒤, 이안은 서둘러 일에 착수해서 바로 그 시스템을 구축했다. 그는 인셉션-v3(Inception-v3)라 알려진 부분 모델을 가지고 시작해서 자신의 닭장에 있는 웹캠이 찍은 수천 장의 새로운 이미지로 큰 어치새 발견이란 임무에 맞춰 교육을 실시했다. 결과물을 라스베리 파이에 배포할 수도 있었지만, 현실적으로 효과를 낼 수 있는 빠른 반응 시간을 확보하려면 인텔 코어 i7 프로세서 같은 좀 더 강력한 것을 필요로 했다.

그리고 이안은 혼자가 아니다. 데이터 과학자로 훈련되지 않은 사람이 다수였지만, 오만 가지 일을 하는 멋진 봇을 구축하는 많은 사람들이 주변에 있다. 그리고 머신 러닝 그리고 심지어는 딥 러닝까지 더욱 액세스하기 쉬워지면서, 점점 더 많은 수의 개발자들이 여러 가지 상이하고 깊이 있는 머신 러닝 프로젝트에서 작업하기 시작했다. 개발자들은 “데이터 옵스(Data Ops)” 스타일의 작업에서 데이터 엔지니어로 역할을 채워가기 시작하고 있으며, 이런 환경에서는 머신 러닝 시스템을 구축하기 위해 데이터 중심적인 기술들(데이터 엔지니어링, 아키텍트, 데이터 과학자)이 데브옵스 접근방식과 결합된다.

이미지 인식 모델을 사용해, 큰 어치새를 알아채도록 컴퓨터를 교육하는 과정이 아주 쉬워졌다는 점이 인상적이다. 많은 경우, 보통 사람들은 앉아서 단순히 이 프로젝트뿐 아니라 훨씬 더 많은 것을 할 수 있게 되었다. 필요한 것이라곤 유용한 기법들에 대한 몇 가지 조언뿐이고, 특히 중요한 것은 소프트웨어 개발자의 경우 마음 상태를 약간 리셋하는 것이다.

모델을 구축한다는 것은 설계 주도가 아니라 데이터 주도적이라는 면에서 일반적인 소프트웨어를 구축하는 것과 다르다. 시스템을 실증적 관점에서 봐야 하며 단위 시험과 통합 시험이 수반되는 훌륭한 설계의 조심스러운 구현보다는 기능의 실험적 증거에 생각보다 조금 더 많이 의지해야만 한다. 문제 영역이 쉬워지면 머신 러닝도 놀라울 정도로 쉬워진다는 것도 명심하라. 그렇지만, 바로 그 옆에 여전히 어렵고 더욱 복잡한 데이터 과학기술을 절실하게 필요로 하는 문제들이 있다. 시험하라. 문제가 쉬운 범주 또는, 최소한 그다지 최첨단 범주에 속해있지 않다는 것을 거듭 확인하기 전에는 절대 확신하지 말라. 처음으로 동작하는 것처럼 보인다고 확신하지 말라. 다른 훌륭한 데이터 과학자들처럼, 결과가 좋아보인다면 더더욱 의심하라.

머신 러닝 초보자들을 위한 필수 데이터 기술
이제부터는 머신 러닝을 효과적으로 사용하기 위해 개발자에게 필요한 몇 가지 기술과 요령을 설명한다.

데이터가 말하게 하라
훌륭한 소프트웨어 엔지니어링에서, 개발자는 종종 설계를 도출해내고, 소프트웨어를 작성하며, 솔루션의 정확성을 직접적으로 그리고 독립적으로 검증한다. 몇몇 경우에는, 소프트웨어가 정확하다는 것을 수학적으로 입증할 수도 있다. 현실은 특히, 인간이 관련되어 있을 때 조금은 제멋대로이지만, 좋은 설계도를 가지고 있다면 정확한 솔루션을 구현할 수 있다.

일반적으로 머신 러닝에서는 개발자가 엄격한 설계도를 가지고 있지 않다. 어떤 시스템에 대해 과거의 경험을 대표하는 데이터를 가지고 있고, 미래에 작동할 시스템을 구축해야만 한다. 시스템이 정말로 동작할 수 있는지를 판단하기 위해서는, 현실적인 상황에서 성능을 측정해야만 한다. 이렇게 데이터 주도적이고, 설계 명세서가 취약한 스타일의 개발로 전환하는 것이 어려울 수 있지만, 머신 러닝을 내부에 탑재한 시스템을 구축하고 싶다면 이것은 중요한 단계이다.

더 나은 모델을 알아보는 능력을 키워라
두 개의 숫자를 비교하는 것은 쉽다. 두 숫자 모두 올바른 것이라고 가정하면(NaN(Not a Number)이 아니라면), 어느 것이 더 큰지를 확인하면, 그것으로 끝이다. 그렇지만, 머신 러닝 모델의 정확도에 대해서는 그렇게 간단하지가 않다. 비교 모델에 대한 결과가 많으며, 대개는 깔끔하게 떨어지는 정답이 없다. 머신 러닝 시스템 구축에 있어서 가장 기본 기술이라 할 수 있는 것은 두 가지 모델이 행한 의사결정 이력을 보고 어떤 모델이 현 상황에 더 적합한지를 결정하는 능력이다. 이런 판단은 단일 값보다는 전체 값들의 집합을 갖는 값에 대해서 생각하기 위한 기본적인 기법을 필요로 한다. 일반적으로, 데이터를 잘 가시화하는 능력도 필요로 한다. 히스토그램과 산포도 그리고 많은 관련 기법들이 요구된다.

본인의 결론을 의심하라
시스템의 어떤 변형이 더 나은 작업을 할 수 있을지를 판단하기 위한 능력과 함께, 본인의 결론을 의심하는 것도 정말로 중요하다. 이 결과는 더 많은 데이터가 추가되면 다른 방향으로 흘러갈 수 있는 통계적 우연인가? 평가 이후 세상이 바뀌었는가, 그래서 어느 세상이 더 나아졌는가? 머신 러닝을 내장한 시스템을 구축한다는 것은 애초에 하고자 했던 것을 여전히 하고 있는지를 확인하기 위해 시스템에서 눈을 떼지 말아야 한다는 것을 의미한다. 변화하는 세상에서 퍼지 비교(Fuzzy Comparison)를 처리할 때는 이런 의심 많은 성격이 필요하다.

여러 가지 모델을 구축하고, 다시 내던져버려라
단지 버리기 위해서 한 가지 버전의 시스템을 구축하라는 것은 소프트웨어 개발에서 잘 알려진 격언이다. 동작하는 시스템을 실제로 구축하기 전까지는, 해당 시스템을 잘 구축할 수 있을 정도로 문제를 제대로 이해할 수 없을 거라는 의미이다. 학습을 위해서는 하나의 시스템을 구축하고 그 다음에는 실제 시스템을 설계하고 구축하기 위해 배운 것을 활용해야 한다.

머신 러닝에서도 상황은 똑같지만, 이 격언이 더욱 어울린다. 단 하나의 일회용 시스템을 구축하기보다는, 수십 또는 수백 가지의 변형을 구축할 각오를 해야만 한다. 이런 변형 중 일부는 상이한 학습 기술을 사용하거나 러닝 엔진을 위해 상이한 설정만을 사용하는 것일 수도 있다. 다른 변형은 문제나 모델을 훈련할 때 사용하는 데이터를 완전히 다르게 재해석하는 일일 수 있다. 예를 들면, 어떤 신호가 예측하려는 대상은 아닐지라도 모델을 훈련하기 위해 사용할 수 있는 대리 신호(Surrogate Signal)라고 판단할 수도 있다. 이런 결정을 내리면, 훈련에 사용할 수 있는 데이터를 10배 더 많이 제공할 수도 있다. 혹은 해결하기에 더 쉬운 방식으로 문제를 재해석할 수도 있다.

세상은 바뀔 수도 있다. 예를 들면, 사기를 잡아내기 위해 모델을 구축하고 있는 경우라면, 더더욱 그렇다. 성공적인 시스템을 구축했더라도, 미래에는 바꿀 필요가 있을 것이다. 사기꾼들이 대응책을 알아낼 것이고, 그들은 행태를 바꿀 것이다. 그러면 새로운 대응책으로 대답해야만 할 것이다.

성공적인 머신 러닝을 위해, 버리기 위한 모델을 많이 구축할 계획을 하라. 영원히 정답으로 남아있는 유일한 정답 모델을 찾기를 바라지 말라.

판을 바꾸는 것을 두려워하지 말라
머신 러닝을 사용해서 해결하려는 첫 번째 질문은 대개는 올바른 것이 아니다. 흔히 아주 잘못된 질문이다. 잘못된 질문을 한 결과는 거의 훈련하기 불가능한 모델이거나, 혹은 수집하기 불가능한 훈련 데이터일 수 있다. 아니면, 최고의 답을 찾은 모델이지만 그다지 가치가 없는 경우일 수 있다.

문제 재구성은 때로 구축하기 아주 간단한 모델이 아주 높은 가치를 제공하는 상황을 제시할 수 있다. 예전에 필자는 판매 항목에 대한 권고를 해야 하는 문제가 있었다. 아주 강력한 기법을 여러 개 사용해도 아주 작은 결과조차 얻을 수 없었다. 결과적으로, 높은 가치의 문제는 좋은 항목들이 판매된 시점을 결정하는 것이었다. 일단 시점을 알고 나면, 권고할 제품이 많았기 때문에 어떤 제품을 권고할 것인가라는 문제는 사소한 것이 되었다. 잘못된 시기에는 권고할 만한 제품이 전혀 없었다. 질문을 바꾸자 문제가 엄청나게 쉬워졌다.

작게 시작하라
단 몇 가지의 사례나 단일 하부 문제로만 국한된 초기 시스템을 배포할 수 있는 것이 매우 중요하다. 이는 노력을 집중하고 문제 영역에 대한 전문성을 얻고, 모델을 구축해 가면서 회사에서 지원을 받을 수 있게 해준다.

크게 시작하라
충분한 훈련 데이터를 확보하고 있는지 확인하라. 실제로, 할 수만 있다면, 필요하다고 생각한 것보다 10배 많은 데이터를 반드시 확보하라.

도메인 지식은 여전히 중요하다
머신 러닝에서, 모델이 어떻게 의사결정 또는 예측을 할 수 있는지를 이해하는 것도 한 가지 방편이 된다. 정말 중요한 질문이 무엇인지를 알아내는 것이 훨씬 더 중요하다. 그런 의미에서, 이미 많은 도메인 지식을 가지고 있다면, 적절한 질문을 하고 머신 러닝을 실행 가능한 제품에 포함할 가능성이 훨씬 더 크다. 도메인 지식은 판단 감각을 추가할 부분과 그 가능성이 타당하게 추가될 부분을 찾아내는 데 극히 중요하다.

코딩 기술은 여전히 중요하다
끌어 놓기(Drag-and-Drop) 작업만으로 머신 러닝 모델을 구축할 수 있게 해준다고 주장하고 있는 여러 가지 도구가 있다. 실상은, 머신 러닝 시스템 구축에 있어서 대부분의 작업은 머신 러닝이나 모델과 전혀 관계가 없으며 훈련 데이터 수집, 모델의 출력물을 사용하기 위한 시스템 구축과 관련되어 있다. 이는 훌륭한 코딩 기술을 엄청나게 값지게 만든다. 데이터 조작을 위해 작성되는 코드에는 다른 가치가 있지만, 배우기는 어렵지 않다. 개발자의 기본적인 기술은 수많은 다양한 머신 러닝 분야에서도 유용한 것으로 판명되었다.

이제는 실질적으로 모든 소프트웨어 엔지니어들이 머신 러닝을 활용해서 놀라운 일을 할 수 있는 시스템을 구축할 수 있는 도구와 새로운 기법을 더 쉽게 사용할 수 있게 되었다. 이런 시스템을 구축하는 데는 기본적인 소프트웨어 엔지니어링 기술이 매우 중요하지만, 데이터에 조금 더 초점을 맞추면서 보완해야 한다. 새로운 기술을 습득하기 위한 최고의 방법은 바로 지금부터 재미있는 것을 구축하기 시작하는 것이다.

*이 글을 쓴 테드 더닝은 맵알 테크놀로지(MapR Technologies)의 수석 애플리케이션 설계자이자 아파치 소프트웨어 재단 이사회 소속이다. 또, PMC 회원이며 아파치 Mahout, 아파치 주키퍼, 아파치 드릴 프로젝트의 공여자이자 다양한 인큐베이터 프로젝트의 멘토로 활동하고 있다. 더닝은 야후 뮤직, 베오(Veoh) 추천 시스템의 수석 설계자이며 ID 애널리틱스(LifeLock)용 사기 탐지 시스템을 구축했다. 또, 머신 러닝과 빅데이터를 주제로 여러 권의 책을 공동 집필한 데이터 전문가로 활동하고 있다. editor@itworld.co.kr 

회사명 : 한국IDG | 제호: ITWorld | 주소 : 서울시 중구 세종대로 23, 4층 우)04512
| 등록번호 : 서울 아00743 등록발행일자 : 2009년 01월 19일

발행인 : 박형미 | 편집인 : 박재곤 | 청소년보호책임자 : 한정규
| 사업자 등록번호 : 214-87-22467 Tel : 02-558-6950

Copyright © 2024 International Data Group. All rights reserved.