


‘소비학습’은 지출을 기록하는 개인용 가계부 앱입니다. 하나의 지출은 하나의 카테고리가 선택되며, 선택적으로 메모를 남길 수 있는 구조입니다. 이 카테고리는 기본 10개가 주어지지만, 사용자가 언제든 새로 만들거나 지울 수 있게 설계했습니다.
매번 앱을 열고 금액과 카테고리를 하나씩 눌러 입력하는 방식이 번거로워서, "말로 기록할 수 있는" 음성 추가 기능을 함께 넣기로 했습니다. ”스타벅스 4500원”처럼 말만 하면 금액과 메모는 물론, 카테고리까지 알아서 골라주는 걸 목표로 했습니다.
그런데 여기서 걸리는 부분이 있었습니다. 텍스트를 보고 카테고리를 골라주는 분류기를 만들려면, 먼저 “어떤 카테고리들 중에서 고를지”부터 정해져 있어야 합니다.
하지만 ‘소비학습’은 그 카테고리 목록 자체가 고정되어 있지 않습니다. 사용자가 언제든 새 카테고리를 만들거나 기존 카테고리를 편집할 수 있기 때문에, 처음부터 “카테고리 N개짜리 모델 하나”를 고정해서 만들어 넣는 방식은 쓸 수 없었습니다.
정리하면 목표는 다음 조건들을 만족시키는 것이었습니다.
카테고리를 예측하는 분류기를 만들기로 정한 뒤, 먼저 CreateML.app에서 시도해보려 했습니다.
메모 텍스트를 벡터로 바꿔 테이블 형태로 넣고 카테고리를 라벨 컬럼으로 지정하는
Tabular Classification 템플릿이 메모 텍스트를 테이블 형태로 넣고, 카테고리를 컬럼으로 지정하는 이 구조가 좋아보였습니다.


이 템플릿에서 고를 수 있는 알고리즘은
Automatic, Random Forest, Boosted Tree, Decision Tree, Support Vector Machine, Logistic Regression
여섯 가지가 있었는데, 모두 학습이 끝나면 하나의 고정된 규칙으로 굳어지는 방식이었습니다.
그런데, 사용자가 임의로 카테고리를 추가하거나 지울 수 있게 했기 때문에
"카테고리가 N개"라는 걸 모델 구조 자체에 못박아 두는 이 방식으로는 쓸 수 없다는 걸 깨달았습니다.
그래서 온디바이스에서 모델을 계속 갱신할 수 있는 방법을 찾아봤고,
coremltools 문서의 Updatable Models 가이드에 따르면, 온디바이스에서 계속 업데이트 가능한 모델 타입은
신경망(Neural Network), 파이프라인 모델(Pipeline), kNN(Nearest Neighbor Classifier) 세 가지뿐이었습니다.
앞서 CreateML Tabular Classification에서 봤던 여섯 가지 알고리즘 중에는 이 셋 어디에도 해당하는 게 없었습니다.