앞서 1, 2편을 통해 범용으로 쓸 인공지능 모델의 전반적인 틀을 잡기 위한 저희 블럭스 개발팀의 고민과 ‘인텐시티 함수(Intensity Function)’ 정의 방법에 대해 설명했습니다. 시리즈 마지막 편인 이번 글에서는 인공지능 모델의 자세한 부분을 설계하고, 행동 데이터를 제대로 학습할 수 있도록 저희가 목적함수를 정의한 내용을 설명하고자 합니다. 또한 모델의 성능을 측정할 수 있는 실험을 어떻게 설계하고, 무슨 실험을 진행했는지 공유해 보겠습니다.
고객을 어떻게 표현해야 할까?
첫 번째로 고려할 부분은 ‘고객($u$)을 어떻게 표현할 것’인지 설계하는 것입니다. 고객을 표현하는 데 있어 인구통계학적인 정보와 더불어 개인정보 역시 최대한 배제하기 때문에 가용할 수 있는 데이터인 고객 로그 데이터에서 여러 ‘특성(Feature)’을 추출하여 처리하였습니다. 기본적으로 포함한 정보들은 아래와 같습니다.
아이템(Item): 어떤 상품들을 상호작용했는지
이벤트 타입(Event Type): 상품들을 어떻게 상호작용했는지 (상품 클릭, 구매,…)
어제이슨트 타임델타(Adjacent Timedelta): 재방문시 바로 이전 상호작용과 얼마나 시간 차가 나는지
비짓 넘버(Visit Number): 얼마나 재방문을 하였는지
라이프타임 밸류(Lifetime Value): 단위 기간 동안 얼마나 소비하였는지
Item, Event Type과 같이 ‘범주형 특성(Categorical Feature)’은 ‘벡터(Vector)’로 ‘임베딩(Embedding)’하여 처리하였고, Timedelta, Visit Number, Lifetime Value와 같은 ‘수치형 특성(Numeric Feature)’의 경우는 해외 학술자료인 ‘CTR 예측의 수치형 특성을 위한 임베딩 학습 프레임워크(An Embedding Learning Framework for Numerical Features in CTR Prediction)’를 참고하여 처리하였습니다. 이때 고객 특성은 클라이언트의 도메인 혹은 데이터 특성에 따라 달라질 수 있습니다.
특히 어떤 상품을 어떻게 상호작용했는지의 정보를 포착하는 것은 블럭스(Blux)에서 고도화하고 있는 추천 모델을 통해 진행할 수 있었습니다.
모델 학습과 오프라인 평가(Offline Evaluation)
이제 목적함수만 정의하면 모델을 훈련할 수 있습니다. 훈련 과정에서 인공지능 모델이 학습해야 하는 파라미터는 다음과 같습니다.
추천 모델의 파라미터(Parameter)
인텐시티 함수(Intensity Function)의 파라미터(Parameter)
일반적으로 추천 모델을 ‘최대우도법(Maximum Likelihood Estimation, MLE)’ 방식으로 훈련을 시킨다면 ‘Stochastic Gradient Descent(SGD)’를 이용해 -log(P(I=i|u))를 Minimize합니다. 한편, 상품 추천과 더불어 고객의 재방문 시간을 예측해야 하는 이번 모델의 경우, 고객이 다음으로 상호작용한 상품뿐만 아니라 마지막 상호작용과 다음 상호작용의 시간차에 대한 확률도 함께 추론할 수 있어야 합니다. 즉, 추천과 시간차에 대한 결합확률분포를 학습해야 합니다. 이를 수식으로 표현하면 다음과 같습니다.
이제 강하게 가정해서 해외 학술자료인 ‘소셜 이벤트 시퀀스를 위한 변형 포인트 프로세스 모델(A Variational Point Process Model for Social Event Sequences)’에 따라 고객의 ‘컨텍스트(Context)’ 정보(u)가 주어졌을 때, 다음으로 상호작용할 상품과 시간은 조건부 독립이라 생각했습니다. 이에 따라 다음과 같이 목적함수를 설정할 수 있습니다.
이렇게 훈련이 완료된 모델의 성능을 테스트하기 위해 다음과 같은 ‘오프라인 평가(Offline Evaluation)’를 진행해 보았습니다.
방법(Method): 과거 데이터를 기반으로 ‘생존 분석(Survival Analysis) 기반 모델과 RFM Score 기반 모델을 기반으로 특정 날짜에 구매를 진행한 사용자를 얼마나 잘 예측하였나?
지표(Metric): *AUC-ROC Curve
* ‘AUC-ROC’ 곡선은 분류 모델의 성능을 평가하는 그래프입니다. ROC 곡선은 모델의 ‘True Positive Rate(모델이 True라고 예측한 값 중 실제 True값의 비중)’와 ‘False Positive Rate(모델이 True라고 예측했지만 False인 값의 비중)’를 다양한 기준값에서 계산해 나타낸 그래프이고, AUC는 이 곡선 아래의 면적을 의미합니다. AUC 값이 1에 가까울수록 모델이 예측을 잘한다는 뜻이며, 0.5에 가까울수록 랜덤으로 예측한 것과 같다는 의미합니다.
평가 결과, AUC 값은 RFM Score 기반 모델이 0.69, ‘생존 분석(Survival Analysis) 기반 모델이 0.75가 도출되어 RFM Score 기반 모델에 비해 생존 분석 기반 모델이 10% 더 좋은 성능을 보여주었습니다.
아래는 ROC Curve를 시각화한 것입니다. 이번 평가에서 ROC Curve의 경우 확률값(혹은 RFM Score)을 기준으로 정렬 후 전체 X% 고객을 추출하여 ‘타겟 유저(Target User)’의 몇%를 커버했는지 표현했습니다. 즉, 전체 20%의 고객을 추출했을 때 RFM Score 모델의 경우에는 구매 고객의 40%를, 생존 분석 모델의 경우 60%를 커버한 것으로 해석할 수 있습니다.
추가적으로 임의로 N명을 추출하여 Intensity Function을 시각화해 보았습니다.
모델 추론의 결과 대다수 고객이 지수분포를 따르는 결과가 도출되었습니다. 이는 모델이 많은 고객이 동질적인(Homogeneous) 패턴을 보인다고 판단한 것으로 해석할 수 있습니다. 저희는 해당 모델의 훈련 결과에 의구심이 들었습니다. 왜냐하면 이전 데이터 분석에서 나타난 ‘Long Term Effect’를 표현해내지 못했기 때문입니다.
결론적으로 성능은 RFM 기반 모델보다 좋지만, 과연 이 모델이 매우 다양하게 나타나는 고객의 행동 패턴을 잘 표현했는지 확답을 내릴 수 없었습니다.
더 좋은 방법을 위해 한 걸음 더
일차적으로 훈련 데이터의 분포와 관련이 있을 것으로 생각하였습니다. 위에서 제시한 재접속에 대한 분포를 살펴보면 대부분의 값이 ShortTerm Effect 구간에 집중된 것을 알 수 있습니다. 즉, LifeTime Effect를 학습하기에 데이터가 부족할 수 있었습니다. 블럭스 개발팀은 고객의 Intensity를 표현할 때, 과거 LifeTime Effect가 더 명시적으로 반영될 수 있다면 이 문제를 해결할 수 있을 것이라 생각했습니다. 이에 또 다른 방법인 ‘호크스 프로세스(Hawkes Process)를 통해 Intensity Function을 정의해보기로 결정했습니다.
호크스 프로세스는 각 사건의 발생이 미래에 더 많은 사건이 발생할 확률을 증가시킨다는 아이디어에 기초합니다. 이는 사건이 연쇄적으로 다른 사건을 유발할 수 있음을 의미합니다. 기본적으로 이 프로세스는 과거의 모든 사건이 현재 시점에서 사건 발생률에 미치는 영향을 모델링합니다. 이에 과거 LifeTime Effect의 영향을 더 명시적으로 Intensity Function에 반영할 수 있을 것이라 판단했습니다.
호크스 프로세스에 기반한 Intensity Function의 경우, 다음과 같이 정의됩니다.
mu(u) : Base Intensity로 정의되며, 과거 사건의 영향을 받지 않는 고객의 고유한 Intensity를 나타냅니다. Visit Number, Lifetime Value 등으로 표현하였습니다.
t : 현재시간($t$) 이전에 발생한 모든 사건에 대한 Time을 나타냅니다.
K : 과거 사건이 현재의 사건 발생률에 미치는 영향을 나타내는 ‘커널(Kernel)’입니다. 보통 시간에 따라 감소하는 함수를 사용하지만 이번 모델에는 지수분포와 정규분포의 혼합분포 형태로 관련 파라미터들이 학습될 수 있도록 설계했습니다.
이에 따라 목적함수에서 log(P(T|u))에 대한 표현을 다음과 같이 변경했습니다.
이러한 노력 끝에 최종적으로 학습한 모델의 오프라인 평가를 실시했습니다. 그 결과, AUC 값은 0.82로 다른 두 방식보다 좋은 성능을 보여주었습니다. 특히 RFM Score 기반 모델보다 20% 좋은 성능을 보여주었습니다.
위 이미지를 보면 이전 모델과 같은 고객을 대상으로 ROC Curve를 시각화하였을 때, 모든 구간에 두 모델을 앞서는 성능을 보여주었습니다. 또한 Intensity Function 값 역시 사용자마다 다양하게 표현되어 동적인 사용자 행동을 잘 표현하고 있다고 판단하였습니다.
블럭스의 AI 혁신과 함께할 동료를 찾아서
이번 시리즈 마지막 편을 통해 다양한 도메인에 합리적 방식으로 이탈 위험 고객을 추출할 수 있는 모델 개발에 대한 블럭스 개발팀의 노력과 성과를 소개했습니다. 이 외에도 블럭스는 CRM 마케터들이 고민하는 많은 부분을 인공지능이 도움을 줄 수 있는 다양한 기능을 개발하고 있습니다. 또한 이번에 소개한 ‘범용 인공지능 모델’ 개발 외에도 모델 성능 모니터링, 파라미터 튜닝 등 더 좋은 성능을 위해 블럭스의 여러 개발자가 함께 고생하고 있습니다.
이처럼 블럭스는 머신러닝을 이용하여 비즈니스 의사 결정을 혁신하기 위해 수많은 도전적인 문제들을 고민하고, 이를 AI로 해결하기 위해 노력하고 있습니다. 저희는 업계의 새로운 패러다임을 함께 만들어 갈 분들을 찾고 있습니다. 이번 시리즈를 보면서 블럭스의 머신러닝 개발에 관심이 생기셨다면 아래 버튼을 통해 언제든지 편하게 연락해 주시면 감사하겠습니다!
글쓴이 김회인(Simon) Machine Learning Engineer 새로운 미션에 거침 없이 도전하고, 폭풍처럼 성장하는 미래가 목표인 블럭스의 ML 엔지니어로, AI 시대로 급변하는 마케팅 시장의 문제를 구성원들과 함께 고민하고 해결하며 나아가고 있습니다. |