비지도 학습 기반의 경쟁적 신경 언어 모델로 단어 분할하기
인간의 개입 없이도 아시아 언어를 자동으로 구분하는 쿠팡의 자연어 처리 기술
By Hughes Yu and Bin Wei
본 포스트는 영문으로도 제공됩니다.
자연어 처리(Natural Language Processing, NLP)의 중요한 구성 요소인 언어 모델을 이용하면 특정 단어가 텍스트 내에 나타날 확률을 예측하는 방법을 학습할 수 있습니다. 언어 모델을 이용해 쿠팡 이커머스 앱은 상품 카탈로그를 범주화하고 고객이 입력할 단어를 예측하고, 고객이 입력한 검색어를 기반으로 검색 결과를 제공하며, 고객에게 개인 맞춤형 상품을 제안하고 있습니다. 고객이 상품명이나 별칭으로 검색 시 정확하고 적절한 검색 결과를 고객에게 제공하는 것은 매우 중요합니다. 저희는 통계적 언어 모델의 단점을 극복한 신경어 모델을 사용합니다. 그러나 이커머스에 필요한 모델링에는 기계 번역이나 일반 웹 서치에 사용을 위한 모델링과는 다른 종류의 어려움이 있습니다. 대부분의 모델은 여러가지 주제를 다루는 문장이나 대화를 이해하도록 학습이 필요하지만, 이커머스를 위한 모델의 경우, 오직 상품명, 상품 유형, 브랜드를 정확하게 식별할 수 있는 학습이 필요합니다. 예를 들면, “여드름 치료”와 같은 검색어에 대해 해결책을 마련해야 합니다.
또한 단어 분할(또는 단어 토큰화)는 사용자가 입력한 상품명이나 별칭을 기계가 이해할 수 있도록 분할하는 중요한 작업입니다. 그러나 널리 사용되는 방식인 지도학습 기반의 단어 분할은 한국어, 중국어, 일본어와 같은 문자 기반 언어에는 적합하지 않습니다. 이 글은 이런 어려움에도 불구하고, 쿠팡이 어떻게 라벨링 없이도 완전 자동화된 아시아 언어들의 단어 분할을 해낼 수 있었는지를 공유드리고자 합니다.
단어 분할의 지도학습 vs. 비지도학습
언어 모델은 일반적으로 단어 수준에서 작동합니다. 입력한 텍스트는 공백 등의 구분자가 식별될 때마다 분할됩니다. 이러한 분할 기법은 보통 지도학습 알고리즘 기반으로 이루어지는데, 수기로 분할하고 라벨링된 뉴스 기사 모음이 학습재료로 사용됩니다. 그러나, 뉴스 기사 내 사용되는 단어의 맥락이나 문법의 경우, 고객이 이커머스 애플리케이션의 검색창에 입력하는 상품명이나 키워드와는 상당히 다르기 때문에 저희의 니즈와는 맞지 않습니다.
언어 모델은 또한 영어와는 다른 규칙과 제약을 가진 동아시아 언어들에는 적용하기가 그리 쉽지 않습니다. 예를 들어, 한국어에는 명사나 대명사의 뒤에 접미사가 붙을 수 있는데 이 경우 단어들을 정확한 키워드들로 분할하는 게 어려울 수 있습니다. 중국어와 일본어는 전통적으로 구분자가 없습니다. 한국어에서는 격식을 따질 필요가 없는 글쓰기의 경우, 특히 상품명을 구성하는 문자열에서는 구분자를 생략할 수 있습니다.
쿠팡의 주요 시장은 현재 아시아에 위치하고 있어 아시아 언어의 단어가 제대로 분할되지 않으면, 검색 결과의 정확성에 영향을 미칠 수 있으며 고객 경험을 해칠 수도 있습니다. 이는 매출 기회 상실, 심지어는 매출 감소로 이어질 수도 있습니다. 그래서 사전에 분할되어 있거나 라벨이 이미 지정된 단어 뭉치에 의존하지 않는 비지도 학습 기반의 분할 방법을 채택하였습니다. 이 알고리즘은 학습을 통해 데이터(단어) 내의 구조를 발견하고 특정 문자 앞뒤로 이어질 확률이 높은 문자를 예측합니다.
시스템 개요
저희는 한국어 대상의 단어 분할 시스템을 개발했습니다. 최소한의 작업으로 중국어, 일본어와 같은 언어로 확장될 수 있도록 만들었습니다. 시스템의 전반적인 개요는 아래 그림1과 같습니다. 이 시스템은 임베딩 모델과 그 위로 2개의 언어 모델을 포함하고 있으며 인간의 수고 없이 학습하고 단어에 대한 확률 분포에 의존합니다.
1. 카탈로그: 쿠팡 카탈로그의 모든 상품명, 즉 라벨이 지정되지 않은 1조 개가 넘는 상품명을 문자 임베딩 모델 학습에 이용하였습니다.
2. 임베딩 모델: 임베딩 모델에 데이터를 입력됩니다. 모델은 문자를 수신하고 그에 해당하는 임베딩 벡터를 출력합니다. 이는 많이 쓰이는 사전 학습 임베딩 기법인 워드투벡터(Word2Vec)와 유사합니다.
3. 순방향 언어 모델과 역방향 언어 모델: 언어 모델은 임베딩 벡터와 컨텍스트 임베딩 벡터 시퀀스를 수신하고 문자-컨텍스트 쌍의 확률을 출력합니다. 순방향 언어모델과 역방향 언어모델 사이에서 확률을 비교하고 필요한 경우 분할을 수행합니다.
시스템 적용 예시
단어 분할 시스템의 작동 방식을 “사생활보호필름”이라는 상품명을 예시로 설명드리겠습니다. 이 상품명은 “사생활”과 “보호필름”으로 분할되어야 합니다.
우선 제품명 중간 쯤에 위치한 문자 “활”을 순방향 언어모델에 입력하고 문자 “활”이 “사생” 뒤에 붙을 확률을 예측합니다. 이 확률이 0.57이라고 가정해 봅니다. 그리고 “활”이 “보호필름” 앞에 붙을 확률이0.03으로 나옵니다. 그러면 시스템은 이제 “활”이라는 문자가 “사생활”이라는 단어의 일부분임을 알게 됩니다.
그런 뒤 “사생활”을 순방향 언어모델에 입력해 “보”가 “사생활”을 뒤따를 확률을 예측합니다. “호필름”을 역방향 언어모델에 입력해 “보”라는 문자가 “호필름” 앞에 붙을 확률을 예측합니다. “보호필름”이 하나의 완전한 단어이므로 후자의 확률이 전자의 확률보다 높게 나옵니다. 따라서 이 위치, “보"부터 분할이 적용되어 “사생활보호필름"이 “사생활"과 “보호필름" 두 개의 단어로 분할됩니다.
임베딩 모델
임베딩 모델은 개별 문자들을 균일한 사이즈의 벡터 공간 내 상응하는 벡터로 매핑합니다. 이 모델은 서로 근접해서 자주 나타나는 문자들을 유사한 벡터들로 매핑할 수 있어서 언어 모델에 대한 무작위 매핑보다 더 높은 정밀도를 제공합니다. 그리고 모델이 라벨링 없이 비지도학습에 의해 동작할 수 있도록, 주어진 맥락에서 단어를 예측하게끔 설계했습니다.
먼저 특정 언어의 사전에서 사용되는 문자들로 구성된 D라는 데이터셋이 있다고 가정해보겠습니다.
D= c1, c2, c3, … cn
상품명 T를 아래와 같이 나타낼 수 있고 q는 상품명의 문자 순서를 가리키는 인덱스입니다.
T = cq1, cq2, cq3, …, cqn
D에서 특정 문자는 원-핫(One-Hot) 벡터 ci가 되고, i 는 문자 데이터셋 D내의 인덱스입니다. ci의 디멘전은 단어 시퀀스에서 문자의 개수입니다. ci 의 i-th 디멘전은 값 1로 할당되고 나머지는 0으로 할당됩니다.
상품명의 원-핫 벡터는 합산되어 프로젝션 레이어에 cqi-2, cqi-1, cqi+1, cqi+2 로 입력됩니다. cqi 는 상품명 T에서 그 문자의 컨텍스트 정보를 포함합니다. 그리고 나서 프로젝션 레이어는 원-핫 벡터를 균일한 사이즈의 밀집 벡터에 매핑합니다. 마지막으로 밀집 벡터가 소프트맥스(SoftMax) 함수에 적용되어 임베딩 벡터를 예측합니다.
순방향/역방향 언어 모델
언어 모델은 단어들의 시퀀스(sequence of words, sentence)를 벡터 공간 내 대응하는 벡터로 받아들이고, 인풋 시퀀스(input sequence)의 벡터를 예측하는 순차적 모델입니다. 저희는 모델이 문자열을 받아 인풋 시퀀스의 앞뒤 문자를 예측하도록 수정했습니다. 예측된 문자를 바탕으로 인풋 시퀀스의 앞에 오거나 뒤에 오는 실제 문자의 확률을 측정할 수 있습니다.
2개의 문자 수준 언어 모델을 사용해 텍스트를 양방향으로 검토하고 높은 정확성을 갖는 결과를 얻습니다. 이 두 모델은 순환신경망(Recurrent Neural Network, RNN)을 기반으로 합니다. 저희는 더 적은 훈련 파라미터로도 좋은 성능을 보이고 장단기 메모리(Long Short-Term Memory, LSTM)와 같은 다른 RNN보다 리소스를 적게 사용하는 게이트순환 유닛(Gated Recurrent Unit, GRU)을 선택했습니다.
이 언어 모델은 동일한 데이터셋과 윈도우 범위(window size) m을 이용해 학습되었습니다. 순방향 모델은 시퀀스의 앞부분에 오는 문자의 확률을 예측하고, 역방향 모델은 뒷부분에 이어지는 문자의 확률을 예측합니다. 순방향 언어 모델에서 cqi 앞에 문자의 m 임베딩은 먼저 cqi-m, cqi-m-1, … , cqi-2, cqi-1를 사용한 임베딩 모델에 의해 벡터로 변환됩니다. 그런 뒤 벡터 시퀀스로서 언어 모델에 입력됩니다. 이 모델의 예상되는 출력 값은 cqi 의 임베딩된 벡터입니다. 이 모델의 손실 함수는 cqi 임베딩 벡터와 모델의 예측사이의 유클리드(Euclidian) 거리입니다. 역방향 모델도 마찬가지로 cqi 뒤에 문자의 m 임베딩을 cqi+1, cqi+2, … , cqi+m-1, cqi+m 로서 입력하고 또 다른 cqi를 출력합니다.
시퀀스 내 다음 문자나 이전 문자의 예측해 확률로 표현할 때, 이 확률은 예측값과 실제 문자 임베딩 사이의 유클리드 거리의 역지수를 사용해 계산됩니다.
예를 들어 실제 임베딩이 cqi이고 모델의 예측이 cqi’라고 가정해 봅니다. cqi의 컨텍스트는 con_i이고 con_i를 모델에 입력하면 cqi’가 출력됩니다. 그러면 순방향 모델에서 con_i를 대체하는 cqi의 확률은 다음과 같은 공식으로 계산할 수 있습니다.
exp(-sqrt((cqi-cqi’)²))
단어 분할 알고리즘
그 다음에는 문자의 확률들을 비교(즉, 경쟁)합니다. 만약 확률이 역방향 모델에서 더 높다면 그 문자는 뒤의 단어와 연결되는 것으로 보여 그 위치에서 분할이 수행됩니다. 이 프로세스는 상품명에 있는 모든 문자가 하나의 단어에 속할 때까지 반복됩니다. 아래는 분할 알고리즘 보여주는 예시 코드입니다.
Input: product title T=cq0, cq1, cq2, …, cqn-1.Output: a word boundary sequence S of T0 forward_start_pos = 0, reverse_start_pos = n-11 for i : 1<i<n-12 if F(SUB_SEQ(forward_start_pos, i-1)) - R(SUB_SEQ(i+1, reverse_start_pos)) > seg_score_threshold3 forward_start_pos = i4 S ← i5 end for6 return S
라인 2에서 F는 순방향 모델을 의미하고 R은 역방향 모델을 의미합니다. 코드는 시퀀스에 있는 모든 문자를 살펴보고 두 모델의 확률을 비교합니다. 두 모델의 확률 차이 즉 seg_score가 나오면 seg_score_threshold를 얻기 위해 임계값을 적용합니다. 역방향 모델의 확률이 정방향 모델의 확률보다 유의미하게 높게 나오면 분할이 적용됩니다. 동시에 임계값을 사용하여 세그먼트의 최대 개수가 예상했던 수준보다 작은지 확인합니다.
예를 들어 상품명에 30개의 문자가 있고 평균적으로 단어는 3개로 이루어졌다는 것을 기준으로 잡으면 한 단어의 문자는 10보다 작을 것입니다.
결론
단어 분할은 자연어 처리에서 가장 근본적인 작업입니다. 아시아 언어를 대상으로 한 다른 문자 단어 분할 기법들도 있지만 쿠팡의 솔루션은 상품명의 원천 데이터만 요구되며 라벨링 작업 노력이 전혀 필요하지 않은 완전 자동화 방식입니다.
이 글을 통해 카탈로그의 지식 그래프를 작성하고, 검색, 추천, 광고와 같은 영역에 도움을 주는 쿠팡의 업무 일부분을 소개하였습니다. 현재 쿠팡은 전세계 시장으로 서비스를 확장하면서 다국어 지원과 관련해 점점 더 많은 과제에 도전하고 있습니다.
전세계 각국에 위치한 쿠팡 오피스에서 쿠팡의 다음 단계로의 성장에 동참하고 성장을 견인하고 싶으신 분은 현재 채용중인 포지션을 확인해보세요.
쿠팡 엔지니어링의 최신 소식을 이제 트위터로 업데이트 받으실 수 있습니다! 팔로우부탁드려요!