Skip to main content
Summary

추천 시스템 다음에 만나는 더 큰 벽

앞 장에서 우리는 추천 시스템을 맛보았다. 비슷한 사용자를 찾고, 비슷한 상품을 찾고, 사용자가 좋아할 만한 항목을 예측했다. 이 과정에는 지금까지 배운 머신러닝의 핵심 구조가 거의 모두 들어 있었다. 데이터를 준비하고, 특징을 만들고, 모델이 예측하고, 실제 반응과 비교하고, 더 나은 추천을 하도록 고치는 과정 말이다.

그런데 추천 시스템을 조금만 더 현실적으로 생각해 보면 곧 어려운 질문이 나타난다.

사용자가 본 영화의 장르, 평점, 클릭 횟수만으로 충분할까? 영화 포스터의 분위기, 예고편의 음악, 배우의 표정, 리뷰 문장의 뉘앙스는 어떻게 다룰까? 사용자가 "재미있긴 한데 다시 보진 않을 듯"이라고 남긴 리뷰는 긍정일까, 부정일까? 어떤 노래를 10초 듣고 넘긴 것과 끝까지 듣고 다시 재생한 것 사이의 차이는 어떻게 숫자로 표현할까?

전통 머신러닝은 강력하다. 선형회귀, 로지스틱 회귀, 결정트리, 랜덤포레스트, 그래디언트 부스팅은 많은 현실 문제에서 여전히 훌륭하게 작동한다. 특히 행과 열로 정리된 표 형식 데이터에서는 놀라울 만큼 좋은 결과를 낸다. 하지만 데이터가 이미지, 음성, 긴 문장, 영상처럼 복잡한 원본 형태로 들어오기 시작하면 이야기가 달라진다.

이 장의 핵심은 전통 머신러닝을 깎아내리는 것이 아니다. 오히려 반대다. 전통 머신러닝이 어디에서 강한지 알아야 하고, 동시에 어디에서 힘들어하는지도 알아야 한다. 그래야 다음 장에서 신경망이 왜 등장했는지 자연스럽게 이해할 수 있다.

전통 머신러닝의 한계

전통 머신러닝은 보통 잘 정리된 표를 좋아한다

지금까지 우리가 다룬 많은 예시는 표 형식 데이터였다. 집값 예측에서는 면적, 방 개수, 위치, 건축 연도 같은 열이 있었다. 고객 이탈 예측에서는 최근 접속일, 결제 횟수, 사용 시간, 고객 등급 같은 열이 있었다. 스팸 메일 분류에서도 메일 길이, 특정 단어의 등장 횟수, 링크 개수 같은 특징을 만들어 모델에 넣었다.

이런 데이터는 머신러닝 모델이 이해하기 좋다. 각 행은 하나의 사례이고, 각 열은 그 사례를 설명하는 숫자나 범주다. 모델은 이 열들을 보면서 "면적이 커질수록 집값이 오르는 경향이 있구나", "최근 접속이 줄고 문의가 늘면 이탈 가능성이 높아지는구나", "무료, 당첨, 긴급 같은 단어가 많으면 스팸일 확률이 올라가는구나" 같은 규칙을 배운다.

물론 모델이 실제로 사람처럼 문장을 떠올리는 것은 아니다. 하지만 데이터 안에서 입력과 정답 사이의 관계를 숫자적으로 조정한다. 이 구조에서는 우리가 어떤 정보를 열로 제공하느냐가 매우 중요하다. 좋은 열을 주면 모델은 비교적 쉽게 배운다. 엉뚱한 열을 주면 아무리 좋은 알고리즘이라도 헤맨다.

전통 머신러닝은 이런 환경에서 특히 강하다. 데이터의 크기가 아주 거대하지 않아도 쓸 수 있고, 학습 속도가 빠른 편이며, 결과를 해석하기도 비교적 쉽다. 예를 들어 결정트리는 어떤 질문을 순서대로 던졌는지 볼 수 있고, 선형 모델은 어떤 특징이 예측값을 얼마나 밀어 올리거나 내리는지 살펴볼 수 있다. 그래서 금융, 제조, 의료 운영, 마케팅, 리스크 관리처럼 설명 가능성이 중요한 분야에서는 지금도 전통 머신러닝이 널리 쓰인다.

문제는 세상의 모든 데이터가 이렇게 친절한 표로 태어나지 않는다는 데 있다.

이미지 한 장은 수많은 숫자의 숲이다

고양이 사진을 분류하는 문제를 생각해 보자. 사람에게는 쉬워 보인다. 우리는 사진을 보고 금방 "고양이네"라고 말한다. 귀가 뾰족하고, 눈 모양이 있고, 수염이 있고, 털의 질감이 있으며, 전체적인 자세가 익숙하기 때문이다.

하지만 컴퓨터에게 사진은 처음부터 "고양이"가 아니다. 사진은 픽셀이라는 작은 점들의 배열이다. 각 픽셀에는 밝기와 색을 나타내는 숫자가 들어 있다. 가로 1,000픽셀, 세로 1,000픽셀짜리 컬러 사진이라면 이미 수백만 개의 숫자가 있다. 컴퓨터가 처음 보는 것은 귀도 아니고 눈도 아니고 수염도 아니다. 그저 숫자의 거대한 격자다.

전통 머신러닝 모델에 이 사진을 그대로 넣는다고 해 보자. 모델은 각 픽셀의 숫자와 "고양이인지 아닌지" 사이의 관계를 배워야 한다. 그런데 고양이는 사진마다 위치가 다르다. 어떤 사진에서는 왼쪽에 있고, 어떤 사진에서는 오른쪽에 있다. 어떤 고양이는 앉아 있고, 어떤 고양이는 누워 있다. 조명이 밝을 수도 있고 어두울 수도 있다. 털 색도 다르고 배경도 다르다. 심지어 고양이의 절반만 보이는 사진도 있다.

사람은 이런 변화를 크게 어렵게 느끼지 않는다. 고양이가 오른쪽으로 조금 이동해도 여전히 고양이로 본다. 하지만 단순한 모델에게는 픽셀 위치가 조금만 바뀌어도 완전히 다른 숫자 배열처럼 보일 수 있다. "왼쪽 위 픽셀이 어두우면 고양이" 같은 규칙은 거의 쓸모가 없다. 고양이는 항상 같은 위치에 있지 않기 때문이다.

그래서 전통적인 이미지 처리에서는 사람이 직접 특징을 설계했다. 가장자리, 모서리, 색 분포, 질감, 특정 모양 같은 정보를 계산해서 모델에 넣었다. 원본 픽셀을 그대로 주는 대신 "이 사진에는 이런 종류의 선이 많다", "이 영역에는 특정 방향의 윤곽이 있다"처럼 조금 더 의미 있는 특징을 만들어 준 것이다.

이 접근은 매우 중요한 발전이었다. 하지만 한계도 분명했다. 사람이 어떤 특징을 만들어야 하는지 미리 잘 알아야 했다. 고양이와 강아지를 구분하는 특징, 손글씨 숫자를 구분하는 특징, 암세포 이미지를 구분하는 특징, 도로 위 보행자를 찾는 특징은 모두 다르다. 문제마다 전문가의 고민이 필요했다.

음성은 시간 위에 흐르는 데이터다

음성 데이터도 만만치 않다. 사람은 "안녕하세요"라는 말을 듣고 자연스럽게 문장으로 이해한다. 하지만 컴퓨터에게 음성은 시간에 따라 변하는 파형이다. 공기의 진동이 숫자로 기록된 것이다.

같은 "안녕하세요"라도 사람마다 목소리가 다르다. 말하는 속도도 다르고, 억양도 다르고, 주변 소음도 다르다. 어떤 사람은 또박또박 말하고, 어떤 사람은 빠르게 말한다. 감기에 걸리면 목소리가 변하고, 전화 통화에서는 음질이 나빠진다. 카페에서는 배경 음악과 사람들의 대화 소리가 섞인다.

전통 머신러닝으로 음성을 다루려면 보통 원본 파형에서 특징을 뽑아야 한다. 예를 들어 특정 주파수 성분이 얼마나 강한지, 짧은 시간 구간마다 소리의 에너지가 어떻게 변하는지, 발음의 패턴이 어떤지 등을 계산한다. 이렇게 만든 특징을 바탕으로 모델이 단어, 화자, 감정, 명령어 등을 분류한다.

여기서도 핵심은 같다. 모델이 잘 배우려면 사람이 먼저 좋은 표현을 만들어 주어야 한다. 음성이라는 복잡한 원본 데이터를 모델이 이해하기 쉬운 표 형태로 바꾸는 일이 필요하다. 문제는 이 변환이 쉽지 않다는 것이다. 소리에는 시간적 흐름이 있고, 앞뒤 맥락이 있으며, 잡음과 변형이 많다. 단순히 평균, 최대값, 빈도 몇 개로는 충분하지 않은 경우가 많다.

음성은 한순간의 값보다 흐름이 중요하다. "밥 먹었어?"라는 문장과 "밥 먹었어!"라는 문장은 글자로는 비슷해도 억양에 따라 느낌이 달라진다. 명령인지 질문인지, 화가 났는지 장난인지, 확신하는지 망설이는지까지 소리에 담길 수 있다. 이런 섬세한 패턴을 사람이 규칙으로 모두 설계하기는 어렵다.

자연어는 단어만 세어서는 부족하다

문장은 더 흥미로운 난관을 만든다. 스팸 메일 분류기를 만들 때 우리는 특정 단어의 등장 여부나 횟수를 특징으로 사용할 수 있다고 했다. "무료", "당첨", "긴급", "클릭" 같은 단어가 많으면 스팸일 가능성이 올라갈 수 있다. 이런 방식은 실제로 꽤 유용하다.

하지만 자연어를 깊게 이해하려면 단어 세기만으로는 부족하다. 다음 두 문장을 보자.

"이 영화는 지루하지 않았다."

"이 영화는 지루했다."

두 문장에는 "이", "영화", "지루" 같은 비슷한 단어가 등장한다. 하지만 뜻은 반대에 가깝다. "않았다"라는 표현 하나가 감정을 뒤집는다. 단어의 등장 횟수만 세는 모델은 이런 차이를 놓칠 수 있다.

조금 더 어려운 예도 있다.

"배터리는 오래가는데 카메라는 별로예요."

이 문장은 전체적으로 긍정일까, 부정일까? 제품 리뷰 점수를 예측해야 한다면 배터리에 대한 긍정과 카메라에 대한 부정을 함께 이해해야 한다. 어떤 사용자에게는 배터리가 더 중요하고, 어떤 사용자에게는 카메라가 더 중요하다. 문장 속 단어들이 서로 어떤 관계를 맺는지 보아야 한다.

자연어에서는 순서도 중요하다. "강아지가 사람을 물었다"와 "사람이 강아지를 물었다"는 같은 단어를 사용하지만 의미가 완전히 다르다. 단어 목록만 보면 둘은 거의 비슷해 보인다. 하지만 실제 의미는 단어의 순서와 문법적 관계에서 나온다.

전통 머신러닝은 이런 문제를 해결하기 위해 다양한 특징을 만들었다. 단어 빈도, 연속된 단어 조합, 문장 길이, 품사 정보, 사전 기반 감정 점수 같은 것들이 대표적이다. 이 특징들은 여전히 유용하다. 그러나 사람이 미리 정한 방식으로 문장을 숫자로 바꾸는 데에는 한계가 있다. 언어는 예외가 많고, 비유가 많고, 맥락에 따라 뜻이 바뀐다.

"대단하다"는 칭찬일 수도 있고 비꼼일 수도 있다. "이걸 돈 받고 판다고?"는 단어만 보면 질문이지만 실제로는 강한 부정일 수 있다. 사람은 상황과 맥락을 함께 읽지만, 단순한 특징 기반 모델은 그런 뉘앙스를 잡기 어렵다.

특성 엔지니어링은 강력하지만 비용이 든다

이 책에서 특성 엔지니어링을 따로 다룬 이유가 있다. 머신러닝에서 특징은 모델이 세상을 보는 창이다. 좋은 특징은 모델을 똑똑하게 만들고, 나쁜 특징은 모델을 엉뚱한 방향으로 이끈다.

전통 머신러닝에서는 특히 이 특징 설계가 중요하다. 모델 자체가 비교적 단순한 경우, 사람이 데이터의 의미를 잘 정리해서 넣어 주어야 한다. 집값 예측에서 단순히 주소 문자열을 넣는 것보다 역세권 여부, 주변 학교 수, 도심까지의 거리, 최근 거래가 변화 같은 특징을 만들어 주면 모델이 훨씬 잘 배울 수 있다. 고객 이탈 예측에서도 전체 접속 횟수보다 최근 7일 접속 감소율, 마지막 결제 이후 경과일, 고객 지원 문의 후 미접속 여부 같은 특징이 더 날카로울 수 있다.

이런 특징 설계는 장점이 많다. 사람이 도메인 지식을 반영할 수 있고, 모델이 왜 그런 예측을 했는지 설명하기 쉬워진다. 데이터가 많지 않아도 좋은 특징이 있으면 꽤 괜찮은 모델을 만들 수 있다.

하지만 비용도 크다. 좋은 특징을 만들려면 문제를 깊이 이해해야 한다. 데이터가 어떻게 생성되었는지, 예측 시점에 어떤 정보를 사용할 수 있는지, 어떤 특징이 누수를 일으킬 수 있는지, 어떤 값이 현실적으로 의미 있는지 따져야 한다. 프로젝트마다 이 과정을 반복해야 한다.

특히 이미지, 음성, 자연어처럼 원본 데이터 자체가 복잡한 경우에는 사람이 특징을 직접 설계하는 부담이 급격히 커진다. 고양이를 알아보는 특징을 만들었다고 해서 자동차 번호판 인식에 그대로 쓸 수 있는 것은 아니다. 스팸 메일 분류에 유용한 단어 특징이 법률 문서 요약에 그대로 통하지도 않는다. 문제의 종류가 바뀌면 특징 설계도 크게 바뀐다.

결국 전통 머신러닝의 많은 성능은 "알고리즘이 얼마나 좋은가"뿐 아니라 "사람이 얼마나 좋은 특징을 만들어 주었는가"에 달려 있었다. 이 말은 전통 머신러닝이 약하다는 뜻이 아니다. 다만 복잡한 원본 데이터를 다룰 때 사람의 준비 작업에 크게 의존한다는 뜻이다.

단순한 모델은 복잡한 관계를 담기 어렵다

또 하나의 중요한 한계는 표현력이다. 표현력이란 모델이 얼마나 다양한 관계를 나타낼 수 있는지를 말한다. 쉽게 말해, 모델이 그릴 수 있는 규칙의 모양이 얼마나 풍부한가에 관한 문제다.

선형회귀를 떠올려 보자. 선형회귀는 데이터 속 관계를 직선 또는 평면처럼 단순한 형태로 표현한다. 이런 모델은 이해하기 쉽고 빠르며 안정적이다. 실제로 많은 문제에서 좋은 출발점이 된다. 하지만 세상의 모든 관계가 직선은 아니다.

예를 들어 공부 시간이 늘수록 시험 점수가 어느 정도까지는 오르지만, 일정 수준을 넘으면 더 이상 크게 오르지 않을 수 있다. 운동량과 건강 지표의 관계도 단순히 "많을수록 좋다"가 아닐 수 있다. 너무 적어도 문제고, 너무 많아도 문제가 될 수 있다. 가격과 판매량의 관계도 상품 종류, 계절, 경쟁사 상황, 사용자 취향에 따라 복잡하게 변한다.

결정트리나 랜덤포레스트, 그래디언트 부스팅은 이런 비선형 관계를 훨씬 잘 다룬다. 그래서 전통 머신러닝 안에서도 단순 선형 모델보다 복잡한 패턴을 잘 잡는 방법들이 발전했다. 특히 그래디언트 부스팅 계열은 표 형식 데이터에서 매우 강력한 성능을 보인다.

그럼에도 복잡한 원본 데이터에서는 한계가 남는다. 이미지에서 낮은 수준의 선, 중간 수준의 모양, 높은 수준의 사물 개념이 단계적으로 결합되는 구조를 생각해 보자. 자연어에서 글자, 단어, 구, 문장, 문단의 의미가 쌓이는 구조를 생각해 보자. 음성에서 짧은 소리 조각이 음소가 되고, 음절이 되고, 단어와 문장이 되는 구조를 생각해 보자.

이런 데이터는 단순한 특징 몇 개로 설명하기 어렵다. 낮은 수준의 패턴이 모여 높은 수준의 의미를 만들고, 그 의미가 다시 맥락에 따라 달라진다. 복잡한 관계가 여러 층으로 쌓여 있는 셈이다.

전통 머신러닝 모델도 특징을 잘 만들면 이런 문제에 도전할 수 있다. 하지만 "어떤 낮은 수준의 패턴을 뽑을지", "그 패턴들을 어떻게 조합할지", "어떤 조합이 더 높은 의미를 나타내는지"를 사람이 일일이 설계해야 한다면 곧 한계에 부딪힌다.

데이터가 커질수록 문제는 쉬워지기만 할까

직관적으로는 데이터가 많으면 모델이 더 잘 배울 것 같다. 어느 정도는 맞다. 데이터가 많으면 우연한 패턴에 속을 가능성이 줄고, 다양한 사례를 볼 수 있다. 고양이 사진이 100장보다 100만 장 있으면 고양이의 다양한 자세와 배경, 조명을 더 많이 배울 수 있다.

하지만 데이터가 커진다고 해서 모든 모델이 자동으로 좋아지는 것은 아니다. 모델이 너무 단순하면 많은 데이터 속의 복잡한 관계를 담지 못한다. 아무리 많은 점을 보여 주어도 직선 하나만 그릴 수 있는 모델은 구불구불한 패턴을 제대로 따라가지 못한다.

반대로 모델이 너무 복잡한데 평가와 검증이 부실하면 과적합에 빠질 수 있다. 우리는 이미 과적합과 일반화에서 이 문제를 보았다. 학습 데이터에서만 잘 맞고 새로운 데이터에서는 실패하는 모델은 좋은 모델이 아니다.

복잡한 데이터에서는 두 가지가 동시에 필요하다. 많은 데이터를 활용할 수 있어야 하고, 그 데이터 안의 복잡한 패턴을 표현할 수 있어야 한다. 이미지, 음성, 자연어 같은 데이터에서는 이 요구가 특히 강하다. 단순히 열 몇 개를 보고 판단하는 문제가 아니라, 수많은 작은 신호를 조합해 의미 있는 구조를 찾아야 하기 때문이다.

전통 머신러닝은 데이터가 적거나 중간 규모일 때, 그리고 사람이 좋은 특징을 만들 수 있을 때 매우 강하다. 그러나 데이터가 아주 커지고, 원본 데이터가 복잡하며, 사람이 모든 특징을 설계하기 어려워질수록 새로운 접근이 필요해졌다.

전통 머신러닝이 실패했다는 뜻은 아니다

여기서 오해하면 안 된다. 딥러닝이 등장했다고 해서 전통 머신러닝이 낡고 쓸모없어진 것은 아니다. 오히려 많은 현업 문제에서는 전통 머신러닝이 가장 합리적인 선택이다.

예를 들어 회사의 고객 이탈을 예측한다고 해 보자. 데이터는 고객 ID별로 정리되어 있고, 열에는 가입 기간, 최근 접속일, 결제 횟수, 문의 횟수, 사용량 변화, 할인 쿠폰 사용 여부 등이 들어 있다. 이런 표 형식 데이터에서는 랜덤포레스트나 그래디언트 부스팅 같은 전통 머신러닝 모델이 강력한 성능을 낼 수 있다.

또한 전통 머신러닝은 해석 가능성에서 장점이 있다. 금융 대출 심사나 의료 위험 예측처럼 "왜 이런 판단을 했는가"가 중요한 문제에서는 예측 성능만큼 설명도 중요하다. 모델이 고객을 고위험으로 판단했다면, 그 이유가 연체 이력인지, 소득 대비 부채 비율인지, 최근 거래 패턴인지 설명할 수 있어야 한다.

운영 측면에서도 장점이 있다. 전통 머신러닝 모델은 딥러닝 모델보다 학습과 예측에 필요한 자원이 적은 경우가 많다. 작은 서버에서도 빠르게 돌릴 수 있고, 데이터가 아주 크지 않아도 실험하기 쉽다. 모델 구조가 단순할수록 디버깅도 쉽다. 이상한 예측이 나왔을 때 원인을 추적하기가 상대적으로 수월하다.

그래서 실제 프로젝트에서는 다음과 같은 판단이 중요하다.

  • 데이터가 행과 열로 잘 정리되어 있는가

  • 사람이 의미 있는 특징을 만들 수 있는가

  • 예측 결과를 설명해야 하는가

  • 데이터의 규모와 운영 비용은 어느 정도인가

  • 이미지, 음성, 자연어처럼 원본 데이터의 구조가 복잡한가

이 질문에 따라 전통 머신러닝이 적합할 수도 있고, 딥러닝이 더 적합할 수도 있다. 좋은 실무자는 유행하는 기술을 무조건 고르지 않는다. 문제의 모양을 보고 알맞은 도구를 고른다.

한계는 다음 기술이 태어나는 자리다

기술의 발전은 종종 한계에서 시작된다. 전통 머신러닝은 데이터를 표로 정리하고, 사람이 좋은 특징을 만들고, 모델이 그 특징과 정답 사이의 관계를 배우는 방식으로 많은 문제를 해결했다. 이 방식은 여전히 중요하고 강력하다.

하지만 이미지, 음성, 자연어처럼 복잡한 데이터에서는 질문이 달라졌다.

"사람이 특징을 잘 만들어서 모델에 넣어 주자"에서 "모델이 원본 데이터로부터 필요한 특징을 스스로 배울 수는 없을까?"로 질문이 이동한 것이다.

이 질문이 딥러닝의 핵심으로 이어진다. 딥러닝은 단순히 모델을 더 크게 만든 기술이 아니다. 중요한 변화는 특징을 배우는 방식에 있다. 낮은 수준의 패턴에서 높은 수준의 의미까지, 여러 단계의 표현을 모델이 데이터로부터 학습하도록 만든다.

사진에서 처음에는 선과 색의 대비를 보고, 그다음에는 모서리와 질감을 보고, 더 나아가 눈, 귀, 바퀴, 창문 같은 부분을 보고, 마지막에는 고양이, 자동차, 사람 같은 개념을 구분하는 식이다. 자연어에서도 단어의 표면적 등장 횟수만 보는 것이 아니라 단어 사이의 관계, 문맥, 의미의 가까움을 점점 더 풍부하게 표현하려고 한다.

물론 이것도 마법은 아니다. 딥러닝에는 더 많은 데이터, 더 많은 계산 자원, 더 어려운 학습 관리가 필요할 수 있다. 하지만 복잡한 원본 데이터에서 사람이 직접 특징을 설계해야 하는 부담을 줄이고, 모델이 표현을 함께 학습하도록 만든다는 점에서 중요한 전환점이 되었다.

전통 머신러닝의 한계를 이해하면 딥러닝이 갑자기 하늘에서 떨어진 기술처럼 보이지 않는다. 오히려 아주 자연스러운 다음 단계로 보인다. 데이터는 점점 더 복잡해졌고, 우리가 풀고 싶은 문제도 더 어려워졌다. 그래서 모델도 단순히 주어진 특징을 사용하는 수준을 넘어, 특징 자체를 배워야 했다.

다음 장에서는 바로 이 질문에서 출발한다. 신경망은 왜 등장했을까? 그리고 신경망은 어떤 방식으로 기존 머신러닝의 한계를 넘어서려 했을까?

책 목록

처음 만나는 머신러닝: 데이터가 스스로 규칙을 배우는 법

전체 목차 보기

이 노트는 보도·비평·교육·연구 목적으로 작성되었습니다. 저작권 문의가 있으시면 에서 알려주세요.

틸노트는 사용자가 AI를 활용해 노트를 쉽게 작성하거나 편집할 수 있는 서비스입니다.

AI 스퀘어 단톡방에 함께해요

AI 활용과 틸노트 사용 팁을 나누는 오픈채팅방입니다. 입장 비밀번호는 tilnote입니다.

참여하기