머신러닝의 개념과 머신러닝 구현 과정
머신러닝이란?
우리가 쉽게 접하는 일반 소프트웨어는 언제나 똑같은 과정을 통해 똑같은 결과를 냅니다. 예를 들어, 계산기에 1+2를 입력하면 항상 3이 나옵니다. 이에 반해 머신러닝 기반 소프트웨어는 데이터와 사용된 알고리즘에 따라 때로는 다른 결과를 추론해냅니다. 추론이란 이미 알고 있는 것으로부터 논리적 결론을 도출하는 과정을 의미하죠. 머신러닝이란 데이터와 알고리즘을 기반으로 추론하는 프로그램이라고 정의할 수 있습니다.
소프트웨어라면 항상 똑같은 결과를 내야 하지 않나? 라고 생각하실 수 있습니다. 계산기라면 1+2는 항상 3이 나와야지 때로는 다른 결과를 내면 그건 버그일 것입니다. 이러한 소프트웨어를 결정론적 소프트웨어라고 분류해서 생각하면 머신러닝의 필요성을 쉽게 이해할 수 있습니다. 최근 들어 머신러닝의 발전과 함께 이미 비결정론적 소프트웨어가 많이 상용화됐습니다. 예를 들어, 스마트폰의 얼굴 인식 자동 잠금해제 같은 경우 항상 똑같은 입력에 따른 똑같 은 결과를 낸다면 세상에서 오직 한 사람의 얼굴만 스마트폰의 잠금을 해제할 수 있을 것입니다. 물론 조건문을 여러 번 적용해서 여러 명의 얼굴을 지원할 수도 있지만 사용자만큼의 조건문을 만들게 될 경우 코드가 상당히 복잡해지고, 표정이 조금만 달라져도 다른 사람으로 인식하는 문제가 발생됩니다. 이처럼 결정론적 소프트웨어로 해결하기 어려운 문제는 비결정론적 소프트웨어를 사용하면 간소한 코드로 좋은 성능을 기대할 수 있습니다. 스마트폰의 음성 비서, 위조지폐 판독기, 영화 관람 사이트의 사용자가 좋아할 만한 영화 추천 기능 등, 세상에는 이미 비결정론적 소프트웨어가 많이 상용화돼 있고 이 서비스들의 기반이 바로 머신러닝입니다.
머신러닝의 추론은 어떤 데이터를 사용하느냐, 어떤 알고리즘을 사용하느냐에 따라 달라질 수 있습니다. 다양한 머신러닝 알고리즘의 이론을 학습하고 구현해봄으로써 각 알고리즘이 데이터를 이해하는 방식과 그에 따라 어떻게 다른 추론이 결정되는지 알아보겠습니다. 또한 다양한 머신러닝 알고리즘을 배우는 것을 넘어서 상황에 따라 알맞은 알고리즘을 선택할 수 있는 능력을 키우는 데 집중하면 더욱 효과적으로 머신러닝을 공부할 수 있을 것입니다.
머신러닝 구현 과정
머신러닝 구현은 크게 문제 정의, 데이터 획득, 모델 구현, 검증, 테스트 단계로 진행됩니다.
문제 정의
프로젝트의 목표를 정의하고 그에 따른 계획을 세우는 단계입니다. 대략적으로 어떤 데이터를 수집해서 어떤 머신러닝 알고리즘으로 문제를 해결할지 결정합니다.
데이터 획득
머신러닝 모델 학습에 필요한 데이터를 수집하는 단계입니다. 데이터는 데이터베이스 테이블, 엑셀 파일, 로그 파일 등 다양한 포맷으로 존재할 수 있으며, 가능하면 머신러닝 학습에 용이하도록 하나의 포맷으로 통일해서 데이터를 한 곳에 수집합니다. 요리를 할 때 요리 실력보다 얼마나 좋은 원재료를 사용했느냐가 더 중요한 것처럼, 성공적인 머신러닝 프로젝트는 뛰어난 머신러닝 실력보다도 얼마나 충분히 데이터를 획득했느냐에 의해 결정되므로 절대 소홀히 해서는 안 되는 단계입니다. 획득된 데이터는 학습 데이터, 검증 데이터, 테스트 데이터로 구분되어 사용됩니다.
모델 구현
학습 데이터를 기반으로 한 개 이상의 머신러닝 모델을 구현합니다.
검증
검증 데이터를 사용해 구현된 머신러닝 모델들의 성능을 검증합니다. 검증 결과를 바탕으로 머신러닝 모델을 튜닝해서 더욱 최적화된 머신러닝 모델을 만들 수 있습니다. 최종적으로 검증 결과가 가장 높은 모델 하나를 선택합니다.
테스트
검증 결과를 통해 선택된 모델의 성능을 테스트 데이터로 측정합니다. 테스트 결과에 따라 프로젝트를 마무리할지, 아니면 이전 단계로 돌아가서 모델을 개선할지를 결정하게 됩니다.
실습의 중요성
머신러닝 개발자 역시 소프트웨어 개발자입니다. 소프트웨어 개발자에게 가장 필요한 능력은 바로 “문제를 해결하기 위한 코드를 구현하는 능력”이라고 생각합니다. 그럼 “머신러닝 문제를 해결하기 위한 코드를 구현하는 능력”은 어떻게 키울 수 있을까요? 이론만 한번 훑어보는 것으로 머신러닝 코드를 구현하는 능력이 생기지는 않습니다. 오로지 실습만이 코드를 구현하는 능력을 향상해줍니다.