글쓰기 화면에서 카테고리 자동 추천하는 모델 만들기

Young
Young
Aug 27, 2019 · 9 min read
Image for post
Image for post
https://knowtechie.com/machine-learning-in-smartphones/

안녕하세요. 당근마켓 머신러닝 엔지니어 Young입니다. 이번에 글쓰기 화면에 들어간 카테고리 추천 기능의 모델을 개발한 과정을 정리해 봤습니다.

아래의 순서로 정리해 봤습니다.

  • 카테고리 추천 모델 개발의 목적
  • 카테고리 분류 방법들
  • 카테고리 추천 모델 개발을 위한 데이터셋
  • 카테고리 추천 모델 개발
  • 카테고리 추천 모델 서비스 적용

카테고리 추천 모델 개발의 목적

당근마켓에서 사용자는 중고거래 게시글을 올릴 때 다음 카테고리 중에 하나를 선택해야 합니다. 카테고리에 익숙하지 않은 사용자들은 어떤 물건에 어떤 카테고리를 선택하는 것이 좋은지 잘 모를 수 있습니다.

Image for post
Image for post
당근마켓 카테고리

앱을 사용하기 쉽다는 것이 당근마켓의 큰 장점입니다. 실제 사용자 인터뷰에서도 당근마켓이 사용하기 쉬워서 좋다고 말씀하시는 분들이 많았습니다. 더 좋은 서비스를 만들기 위해 장점을 강화하는 것이 중요하다고 생각합니다. 따라서 사용자들이 지금보다 더 쉽게 글을 쓸 수 있는 방법을 고민했습니다. 글을 쓸 때 사용자는 카테고리를 매번 선택해야 하는데 머신러닝 모델이 자동으로 카테고리를 추천하면 좋겠다고 생각했습니다.

사용자가 얼마나 카테고리 선택을 어려워 하는지를 확인하기 위해 카테고리 선택이 틀리는 비율을 확인했습니다. 전체 게시글에서 일부만 샘플링해서 카테고리가 틀리는 경우가 얼마나 되는지 확인했을 때 20%정도로 굉장히 높았습니다. 20%라는 높은 비율을 봤을 때카테고리를 자동으로 추천해주는 기능이 필요하다고 판단했습니다.

카테고리 분류 방법들

카테고리를 분류하는 방법에는 여러가지가 있습니다. 사진을 이용해서 이미지로 카테고리를 분류할 수도 있고 글의 제목이나 내용을 이용해서 카테고리를 분류할 수도 있습니다. 혹은 두 가지 방법을 모두 이용해서 카테고리를 분류할 수 있습니다.

머신러닝 모델을 서비스에 적용할 때 고려해야 할 것들이 많습니다. 다음은 Tensorflow Extended를 설명하는 그림인데 머신러닝 모델을 서비스화할 때 고려해야 할 점이 얼마나 많은지 보여줍니다. 실제 서비스에 적용한다면 실시간으로 서빙이 가능해야 함으로 속도, 계산량 등을 고려해야 합니다. 사용자들이 직접적으로 성능을 느낄 정확도도 당연히 중요 고려 대상입니다. 이 외에도 상황에 따라 UI / UX 적인 부분들도 고려해야 할 수 있습니다.

Image for post
Image for post
https://www.slideshare.net/FlinkForward/flink-forward-san-francisco-2019-tensorflow-extended-an-endtoend-machine-learning-platform-for-tensorflow-robert-crowe

이미지는 차원이 상당히 높기 때문에 실시간으로 카테고리를 분류하는 것은 효율적이지 않고 속도가 느립니다. 이미지가 아닌 글의 제목과 내용을 가지고 카테고리 분류를 한다면 더 빠르게 분류할 수 있습니다. 글의 내용을 제목과 함께 사용해서 카테고리 분류에 사용할 수 있습니다. 하지만 실제로 글의 제목만 가지고 분류를 했을 때 서비스에 적용할 만한 성능이 나왔습니다. 따라서 글의 제목만으로 카테고리를 분류하는 기능을 개발했습니다.

카테고리 추천 모델 개발을 위한 데이터 셋

당근마켓에는 이미 많은 게시글이 있고 각 게시글에는 사용자가 선택한 카테고리가 달려있습니다. 카테고리 분류 모델을 만들기 위해 해야 할 일은 데이터베이스에서 제목, 카테고리를 뽑아서 활용하는 것입니다. 다음은 데이터베이스에서 추출한 데이터셋의 일부입니다. 그림처럼 카테고리와 제목으로 되어있는 수많은 데이터를 뽑는데 이 때 카테고리를 index만 사용합니다.

Image for post
Image for post

데이터는 총 1000만개를 뽑아서 사용했습니다. 1000만개 데이터를 뽑고 간단히 카테고리 분포를 확인했습니다. 게시글이 가장 많은 카테고리는 [유아동/유아도서] 카테고리와 [여성의류] 카테고리였습니다. 그리고 가장 적은 카테고리는 [반려동물용품]과 [스포츠/레저] 였습니다. 카테고리 별로 분포가 다른 것이 학습에 영향을 미칠 수 있기 때문에 미리 확인을 해 보았습니다.

Image for post
Image for post

데이터베이스에서 뽑은 데이터를 training set과 validation set으로 9:1로 나눴습니다. 따라서 900만개의 training set과 100만개의 validation set으로 만들었습니다.

이제 최종적인 모델의 성능을 측정하기 위해 test set을 구성해야 합니다. 사용자들이 카테고리를 잘못 설정한 경우가 많아서(약 20%) test set을 구성할 때 기존 데이터를 그대로 이용할 수 없었습니다. 따라서 소량이지만 사용자들이 틀린 카테고리들을 직접 고쳐서 정확한 카테고리로 만들어 새로운 test set을 구성했습니다.

카테고리 추천 모델 개발

카테고리 추천 모델을 개발하기 위해 몇가지 모델을 생각했습니다. 자연어처리 모델인 CharCNN, LSTM-CNN, 이전에 저희 팀원인 매튜가 동네생활에 적용했던 BERT등 모델들을 생각해 볼 수 있었습니다. 이런 후보들을 제치고 실제 서비스에 적용하게 된 모델은 fasttext입니다. fasttext는 facebook research에서 공개한 오픈소스 라이브러리로 여러가지 트릭들을 사용해서 속도와 성능을 끌어올린 라이브러리입니다. 자세한 내용은 아래 논문들에 나와있습니다.

fasttext는 상당히 빠르고 성능도 잘 나오는 편이어서 실시간 서비스에 적합했습니다. 또 당근마켓 머신러닝 팀에서는 fasttext를 사용해서 개발한 경험이 있기 때문에 서빙하는 부분을 다시 만들어야 하는 번거로움도 적었습니다.

Image for post
Image for post

이전에 뽑은 1000만개 데이터를 이용해서 카테고리 분류 학습을 했고 결과는 아래와 같이 나왔습니다.

Image for post
Image for post

validation set에 대해서 79.1%의 정확도가 나왔습니다. 하지만 validation set은 사용자가 선택한 카테고리가 정답으로 들어있기 때문에 학습한 모델의 성능을 측정하는 것이 어렵습니다. 따라서 test set에서 각 카테고리별로 정확도를 측정해 봤습니다. quantize 모델은 학습한 모델을 quantize한 이후의 모델 정확도 입니다.

Image for post
Image for post

위의 정확도를 계산 할 때는 실제로 사용자가 느낄 성능을 그대로 측정하기 위해 노력했습니다. 2개 이상의 추천 카테고리를 보여줄 것이기 때문에 top-2 정확도를 측정했습니다. top-2 정확도는 모델이 추천해준 카테고리가 실제 카테고리가 있을 때 모델이 맞은 것으로 하고 하나도 없는 경우에만 틀린 것으로 했습니다.

FastText Quantization
마지막으로 모델 성능과는 별개로 속도와 모델의 크기 등의 이슈로 fasttext에 있는 quantize를 이용해 봤습니다. quantize는 모델의 크기를 줄이고 연산속도를 높일 수 있는 방식입니다. 주로 floating-point를 줄이거나 neural network의 몇몇 노드들을 잘라내는 방식으로 모델 사이즈를 줄이게 됩니다. fasttext의 quantization 방식은 아래 논문에 나와있습니다.

FastText. zip: Compressing text classification models (https://arxiv.org/pdf/1612.03651.pdf)

quantization은 아래와 같이 진행했습니다. validation set에 대한 정확도는 0.3%, test set에 대한 정확도는 0.4% 손해를 봤지만 모델 크기가 무려 739MB에서 3.3MB로 줄어든 것을 확인 할 수 있었습니다.

Image for post
Image for post

카테고리 추천 모델 서비스 적용

Fasttext를 사용해서 개발한 카테고리 추천 모델을 다음 화면과 같이 글쓰기 화면에 적용했습니다. 글쓰기 화면에 적용할 때 유의했던 점은 다음과 같습니다. 다음과 같은 사항에 대해서는 당근마켓의 앱 개발자 분과 디자이너와 상의하면서 사용자에게 더 좋은 경험을 주도록 노력했습니다.

  • 사용자가 제목을 쓰다가 지웠을 때 모델이 어떻게 행동해야 할지
  • 2 ~3 글자 정도 짧은 제목을 쓸 경우 어떻게 추천을 해야할지
  • 추천한 카테고리를 어떤 식으로 보여줄지
Image for post
Image for post
기존 화면과 새롭게 바뀐화면

기존 사진을 올리고 카테고리를 선택하게 배열된 화면에서 오른쪽과 같이 제목을 먼저 쓰게 되고 카테고리 추천으로 카테고리가 선택된 후에 넘어가는 배열로 바뀌었습니다.

성능이 좋지만 제목만으로 카테고리를 알 수 없는 제목(ex. 1만원에 팔아요.)은 카테고리 추천이 잘 안되는 단점이 있습니다. 반면 머신러닝을 이용한 카테고리 추천은 룰 베이스로 하기 힘든 것들(세세한 상품명이 포함된 제목)도 잘 한다는 장점을 갖고 있었습니다.

배포된 후에 1주일이 지났을 때 추천된 카테고리를 눌러 게시글을 작성하는 비율이 얼마나 되는지 확인해 보았습니다. 카테고리 추천 기능이 들어간 버전에 대해 비교를 했습니다. 전체 올라온 게시글 중에서 카테고리 추천기능만을 이용해서 게시글을 생성한 비율은 25% 정도 됐습니다. 1주일 밖에 안됐지만 전체 게시글 중 최소 1/4 정도가 추천 기능을 이용해서 생성된 것입니다.

앞으로 최종적인 개발의 목표는 사용자가 카테고리를 신경 쓰지 않게끔 하고 자동으로 카테고리를 선택 하는 것 입니다. 따라서, fasttext 모델을 더 다듬거나 내부적으로 모델을 새로 만드는 것이 앞으로 할 일이라고 생각합니다. 또 사용자가 카테고리를 잘못 만든 경우가 많아서 이런 노이즈를 잘 처리하는 방법, 노이즈에 강한 모델을 만드는 것이 앞으로 해야할 일입니다.

당근마켓 팀블로그

당근마켓은 동네 이웃 간의 연결을 도와 따뜻하고 활발한 교류가 있는 지역 사회를 꿈꾸고 있어요.

Medium is an open platform where 170 million readers come to find insightful and dynamic thinking. Here, expert and undiscovered voices alike dive into the heart of any topic and bring new ideas to the surface. Learn more

Follow the writers, publications, and topics that matter to you, and you’ll see them on your homepage and in your inbox. Explore

If you have a story to tell, knowledge to share, or a perspective to offer — welcome home. It’s easy and free to post your thinking on any topic. Write on Medium

Get the Medium app

A button that says 'Download on the App Store', and if clicked it will lead you to the iOS App store
A button that says 'Get it on, Google Play', and if clicked it will lead you to the Google Play store