메뉴 바로가기 검색 및 카테고리 바로가기 본문 바로가기

한빛출판네트워크

IT/모바일

전통적인 프로그래밍의 한계: 개발자 관점에서 본 머신러닝

한빛미디어

|

2023-01-26

|

by 로런스 모로니

9,735

최근들어 더욱 자주 접하게 되는 머신러닝이란 무엇을 의미할까요? 이번 시간에는 '개발자'의 관점에서 머신러닝에 대해 생각해 보려고 합니다. 

 

전통적인 프로그래밍과 머신러닝

머신러닝에 대해 알아보기 전에 머신러닝이 전통적인 프로그래밍에서 어떻게 발전했는지 생각해 볼 필요가 있습니다.

 

전통적인 프로그래밍은 프로그래밍 언어로 표현된 규칙을 작성하고 데이터에 이 규칙을 적용해 정답을 제공합니다. 이는 코드로 프로그래밍할 수 있는 거의 모든 곳에 적용됩니다.

 

예를 들어 '브레이크아웃(Breakout)'이란 게임에서는 코드로 공의 움직임, 점수, 게임의 승패 같은 여러 가지 상황을 결정합니다. [그림 1-1]처럼 공이 벽돌에 반사되어 나오는 경우를 봅시다.

 

1-1a.jpg

 

[그림 1-1. '브레이크아웃'의 코드]

 

여기에서 공의 움직임은 dx와 dy 속성에 의해 결정됩니다. 공이 벽돌에 부딪힐 때 벽돌이 삭제되고 공의 방향이 바뀌고 속도는 증가합니다. 코드는 이런 게임 상황 데이터를 보고 작동합니다.

 

다른 예로 금융 서비스 시나리오도 한 번 보겠습니다. 한 회사와 관련된 현재 주가와 이익과 같은 주식 데이터를 가지고 있다면 [그림 1-2]의 코드로 주가수익률 P/E(주식 가격/주당순이익)를 계산할 수 있습니다.

 

 

1-2a.jpg

 

[그림 1-2. 금융 서비스의 코드]

 

코드는 주가와 이익 데이터를 가져와 주가를 이익으로 나눈 값을 반환합니다. 이런 전통적인 프로그래밍을 하나의 그림으로 요약하면 [그림 1-3]과 같습니다.

 

 

1-3a.jpg

 

[그림 1-3. 전통적인 프로그래밍]

 

여기서 확인할 수 있듯이 규칙은 프로그래밍 언어로 표현됩니다. 이런 규칙은 데이터에 적용되고 결과를 반환합니다.

 

전통적인 프로그래밍의 한계

개발의 중심에는 [그림 1-3]과 같은 구조가 있었습니다. 하지만 이 방식에는 한계가 존재합니다. 전통적인 프로그램으로 구현할 수 있는 시나리오는 규칙을 유도할 수 있어야만 했습니다. 그렇지 않은 시나리오는 어떨까요? 

 

코드가 너무 복잡해지므로 개발하기가 매우 어렵습니다. 다시 말해 이런 시나리오를 다루기 위한 코드는 (굳이...) 작성할 수 없습니다.

 

예를 들어 활동 감지를 생각해봅시다. (신체 활동을 감지하는 피트니스 모니터는 최신 혁신 기술의 집약체라고 할 수 있는데요. 저렴하고 소형화된 하드웨어뿐만 아니라 이전에는 불가능했던 감지 알고리즘 덕분에 지금의 발전이 가능했습니다.) 

 

[그림 1-4]는 '걷기'를 감지하는 단순한 활동 감지 알고리즘입니다. 이 알고리즘은 사람의 보행 속도를 데이터로 사용합니다. 이 속도가 특정 값보다 작으면 걷고 있다고 판단합니다.

 

 

1-4.jpg

 

[그림 1-4. 활동 감지 알고리즘]

 

데이터가 속도라는 점을 고려하면 알고리즘을 확장해 '달리기'도 감지할 수 있습니다.

 

 

1-5.jpg

 

[그림 1-5. 달리기로 확장된 알고리즘]

 

코드에서 확인할 수 있듯이 속도에 따라 특정 값(예를 들면 4km/h) 이하면 '걷기'이고 아니면 '달리기'라고 할 수 있습니다. 여전히 이전 방식이 유효해 보입니다. 

 

이를 또 다른 피트니스 활동인 자전거 타기에 적용한다고 가정해봅시다. 이 알고리즘은 [그림 1-6]과 같습니다.

 

 

1-6.jpg

 

[그림 1-6. 자전거 타기에 확장된 알고리즘]

 

속도만 감지하는 방법은 매우 단순합니다. 예를 들어 사람마다 자전거를 타는 속도가 다르고, 오르막보다 내리막에서 더 빨리 달립니다. 일반적으로는 이 방법이 나쁘지 않습니다. 하지만 골프와 같은 다른 시나리오에 대응한다면 어떨까요?

 

 

1-7.jpg

 

[그림 1-7. 골프 감지 알고리즘은...?]

 

여기서 난관에 부딪힙니다. 기존의 방법으로 골프를 치고 있다는 것을 어떻게 판단할 수 있을까요? 골프를 치는 사람은 걷다가 멈추고, 어떤 활동을 하고, 조금 더 걷고, 멈추는 등의 행동을 합니다. 하지만 이 움직임이 골프라고 어떻게 판단할 수 있을까요?

 

전통적인 규칙으로 활동을 감지하는 것에는 한계가 있습니다. 하지만 더 나은 방법이 있을지 모릅니다. 이제 머신러닝에 대해 언급해야겠습니다.

 

프로그래밍에서 학습으로

전통적인 프로그래밍을 나타낸 [그림 1-8]을 다시 살펴보겠습니다. 이 그림에서 '데이터에 대해 작동해 정답을 제공한다'는 규칙을 확인할 수 있습니다. 

 

활동 감지 예제의 경우 데이터는 사람이 움직이는 속도였습니다. 이를 통해 걷기, 달리기, 자전거 타기와 같은 활동을 감지하는 규칙을 작성했습니다. 하지만 골프 예제에서는 활동을 판단할 수 있는 규칙을 만들 수 없어 한계에 봉착하게 됩니다.

 

 

1-8.jpg

 

[그림 1-8. 전통적인 프로그래밍]

 

그렇다면, 이 그림에서 기준을 뒤집으면 어떻게 될까요? 규칙을 만드는 대신 데이터와 정답을 제공하고 규칙이 무엇인지 찾아내는 방법이 있다면 어떨까요?

 

[그림 1-9]에 이런 방식을 표현했습니다. (머신러닝을 정의하는 고수준의 개념도로 생각할 수도 있겠습니다.)

 

 

1-9.jpg

 

[그림 1-9. 기준을 뒤집은 머신러닝]

 

이 그림이 의미하는 바는 무엇일까요? 이제 규칙을 직접 찾지 않습니다. 대신 상황에 맞는 많은 데이터를 준비하고 데이터에 레이블(label)을 부여합니다. 그러면 컴퓨터가 어떤 데이터는 이 레이블에 일치하고 다른 데이터는 저 레이블에 일치하도록 하는 규칙을 찾게 됩니다.

 

활동 감지 예제에는 어떻게 적용될까요? 여러 센서를 사용해 한 사람에 대한 데이터를 모을 수 있습니다. 

 

심박수, 위치, 속도 등과 같은 정보를 감지하는 웨어러블 기기를 착용해 여러 활동을 하는 동안 많은 데이터가 축적된다면 ‘이 활동은 걷기다’, ‘이 활동은 달리기다’라고 표현된 데이터를 가진 문제가 됩니다.

 

 

1-10.jpg

 

[그림 1-10. 코딩에서 머신러닝으로: 데이터를 모으고 레이블링하기]

 

이제 개발자의 일은 활동을 판단하는 '규칙'을 찾는 것이 아니라 데이터와 레이블을 매칭하는 '코드'를 작성하는 것으로 바뀝니다. 이 작업을 통해 코드로 구현할 수 있는 시나리오를 확장할 수 있습니다. 

 

머신러닝은 이런 작업을 위한 기술입니다. 하지만 시작하기 전에 프레임워크가 필요합니다. '텐서플로(TensorFlow)'가 바로 이런 프레임워크 중 하나입니다. 

 

인공지능 분야는 매우 크고 추상적입니다. 컴퓨터를 사람처럼 생각하고 행동하도록 만드는 모든 작업을 포함합니다. 사람이 새로운 행동을 익히는 한 가지 방법은 예시를 통해서 배우는 것입니다. 

 

따라서 머신러닝 분야는 인공지능 개발을 위한 도입부라고 생각할 수 있습니다. 머신러닝을 통해 기계는 사람처럼 보고(컴퓨터 비전), 텍스트를 읽는(자연어 처리) 방법 등을 배울 수 있습니다. 

 

텐서플로 머신러닝

텐서플로는 머신러닝 모델을 만들고 사용하기 위한 오픈 소스 플랫폼입니다. 머신러닝에 필요한 많은 알고리즘과 패턴을 텐서플로에 구현해놓았기 때문에 이면에 있는 수학이나 로직을 모두 배울 필요가 없고 당면한 문제에만 집중할 수 있습니다. 

 

취미로 코딩하는 개발자부터 전문 개발자, 인공지능의 영역을 넓히는 연구자까지 모두가 대상입니다. 웹, 클라우드, 모바일, 임베디드 시스템으로 모델을 배포하는 것까지 지원합니다.

 

머신러닝 모델을 만드는 과정은 훈련(training)이라고 부릅니다. 컴퓨터가 일련의 알고리즘을 사용해 입력에 대해 학습하고 입력 사이의 차이점을 구별하는 것이죠. 

 

예를 들어 고양이와 강아지를 구별하도록 컴퓨터를 훈련하고 싶다면, 고양이와 강아지 이미지 여러 개를 사용해 모델을 만듭니다. 컴퓨터는 이 모델을 사용해 고양이와 강아지를 구별하는 '특징'을 찾아냅니다. 

 

 

animals-gde8b0c14f_640(2).jpg

 

 

모델이 훈련되고 나면 이를 사용해 새로운 입력을 인식하거나 분류하는데, 그 과정을 추론(inference)이라고 부릅니다.

 

모델 훈련을 위해 몇 가지 필요 사항이 있습니다. 첫째, 모델 자체를 설계하기 위한 API입니다. 텐서플로에서는 다음 세 가지 방법으로 모델을 설계합니다.

 

1. 모든 것을 직접 코딩합니다. 

2. 컴퓨터가 학습하는 로직을 파악해 코드로 구현합니다(권장하지 않음). 

3. 텐서플로에 내장된 추정기(estimator)를 사용합니다. 

 

추정기는 사전에 구현된 신경망(neural network)이며 커스터마이징할 수 있습니다. 또는 고수준 API인 케라스(Keras)를 사용해 일반적인 머신러닝 개념을 코드로 캡슐화할 수도 있습니다. 

 

모든 모델의 핵심은 데이터입니다. 앞서 언급했듯이 고양이와 강아지를 구별하는 모델을 만들고 싶다면 고양이와 강아지 샘플 여러 개로 훈련해야 합니다. 하지만 이런 샘플을 어떻게 관리할 수 있을까요? 모델 자체를 만드는 것보다 더 많은 코딩이 필요한 경우가 많습니다. 

 

텐서플로는 이런 과정을 쉽게 처리하기 위해 ‘텐서플로 데이터 서비스’라는 API를 제공합니다. 훈련을 위해 한 줄의 코드로 사용할 수 있는 전처리된 데이터셋을 많이 제공하며 원시 데이터를 쉽게 사용하도록 처리하는 도구도 제공합니다. 

 

모델을 만드는 것을 넘어서 사람들이 사용할 수 있도록 제공해야 합니다. 이를 위해 텐서플로는 클라우드나 웹에서 HTTP 연결을 통해 모델 추론을 제공할 수 있는 서빙(serving) API를 제공합니다. 

 

모바일이나 임베디드 시스템에서 실행하는 모델의 경우 안드로이드와 iOS, 라즈베리 파이 같은 리눅스 기반 임베디드 시스템에서 모델 추론을 수행할 수 있는 텐서플로 라이트(TensorFlow Lite)를 제공합니다. 

 

텐서플로 라이트의 포크(fork)인 텐서플로 라이트 마이크로(TensorFlow Lite Micro, TFLM)를 사용하면 마이크로컨트롤러에서 추론을 수행할 수도 있습니다. 이 분야를 TinyML이라 부르는데요, 새롭게 떠오르고 있는만큼 주목할 필요가 있습니다. 

 

마지막으로 브라우저나 Node.js로 모델을 서비스하고 싶다면 TensorFlow.js를 사용해 모델을 훈련하고 실행할 수 있습니다.

 


 

이 글은 <개발자를 위한 머신러닝&딥러닝> 도서 내용 일부를 발췌 편집하여 작성되었습니다. 수학이 어려운 개발자에게 바치는 코드 실습형 머신러닝 가이드에 대한 보다 자세한 내용은 하기 링크의 도서에서 만나보실 수 있습니다. 

 

M_012_1_300.jpg

 개발자를 위한 머신러닝&딥러닝』

댓글 입력
자료실