BPE, SentencePiece 간단 정리

데이터 여행자·2021년 4월 3일
0

오늘 처음 시작한 논문 읽기 스터디. 오늘 하는 줄 몰랐다가 슬랙에 올라온 글을 읽고 오늘인줄 알았다. 다행히 미리 읽는 것이 아니라 같이 읽는 것이라 부담을 버리고 참석했다. 논문 읽기 스터디에서는 Abstract와 Introduction만 읽었다. 앞 부분만 읽기 때문에 논문이 무엇을 말하고자 하는 것은 알지만 세부적인 내용을 알 수 없었다.

논문을 직접 읽어봐야 하지만 시간은 부족하고 논문을 읽는다고 내용을 정확히 파악할 수 있을지 의문이 들어 BPE에 대한 자료를 찾아 간단히 정리하고자 한다. 나머지 word2vec과 SentencePiece는 스터디 시간에 읽은 내용을 정리하였다.

word2vec

word2vec은 단어 사이의 유사도(문법적/문맥적 유사도)를 계산할 수 있다.

예: vector("King") - vector("Man") + vector("Woman") = vector("Queen")

BPE(Byte Pair Encoding)

기계 번역을 할 때 단어 사전을 만들고 그 사전을 토대로 번역을 한다. 그러나 단어 사전에 없는 단어가 나오는 경우는 번역을 할 수 없다. 이런 상황을 OOV(Out-Of-Vocabulary) 문제라고 한다.

서브워드 분리(Subword segmentation) 작업은 단어를 더 작은 단위의 의미 있는 서브워드로(예: teacher = teach + er)로 분리하여 단어를 인코딩 및 임베딩하는 전처리 작업이며, 이 작업을 통해 OOV, 희귀 단어, 신조어 등의 문제를 완화시킬 수 있다.

BPE는 1994년에 제안된 데이터 압축 알고리즘이며, 자연어 처리의 서브워드 분리 알고리즘으로 응용되었다. BPE는 연속적으로 가장 많이 등장한 글자의 쌍을 찾아 하나의 글자로 병합한다.

  • 기본적인 BPE
  1. 주어진 문자열 aaabdaaabac에서 가장 많이 등장한 글자(바이트)의 쌍은 'aa'이므로 이를 'Z'로 치환한다.
  2. 치환된 문자열 ZabdZabac 중 가장 많이 등장한 바이트의 쌍이 'ab'이므로 이를 'Y'로 치환한다.
  3. 2에 의해 치환된 문자열 ZYdZYac이고, 이 문자열 중 가장 많이 등장한 바이트의 쌍이 'ZY'이므로 이를 'X'로 치환한다.
  4. 3에 의해 치환된 문자열은 XdXac이며 더이상 병합할 바이트의 쌍이 없으므로 BPE의 최종 결과는 XdXac이다.

정리하면 aaabdaaabac -> ZabdZabac -> ZYdZYac -> XdXac

  • 자연어 처리에서의 BPE
    훈련 데이터의 단어를 글자(character) 또는 유니코드(unicode) 단위로 단어집합을 만들고 가장 많이 등장하는 글자 2개를 찾아 하나로 통합하는 과정을 반복한다.
# 훈련 데이터에 있는 단어와 등장 빈도수
low : 5, lower : 2, newest : 6, widest : 3\

# dictionary
l o w : 5,  l o w e r : 2,  n e w e s t : 6,  w i d e s t : 3

# vocabulary
l, o, w, e, r, n, w, s, t, i, d

가장 빈도수가 높은 유니그램의 쌍을 하나의 유니그램으로 통합하는 과정을 몇 번 반복할지 사용자가 정한다. 총 10번 한다고 가정하고, 딕셔너리에 따르면 가장 높은 유니그램의 쌍은 (e, s)이다. (newest가 6번, widest가 3번 나왔으므로 (e, s)는 총 9번 나온 것)

# dictionary update!
l o w : 5,
l o w e r : 2,
n e w es t : 6,
w i d es t : 3

# vocabulary update!
l, o, w, e, r, n, w, s, t, i, d, es

2회차에는 빈도수가 9번으로 가장 높은 (es, t)를 쌍으로 est로 통합한다.

# dictionary update!
l o w : 5,
l o w e r : 2,
n e w est : 6,
w i d est : 3

# vocabulary update!
l, o, w, e, r, n, w, s, t, i, d, es, est

같은 방식으로 10회 반복하면 딕셔너리와 단어집합은 아래와 같다.

# dictionary update!
low : 5,
low e r : 2,
newest : 6,
widest : 3

# vocabulary update!
l, o, w, e, r, n, w, s, t, i, d, es, est, lo, low, ne, new, newest, wi, wid, widest

새로운 단어가 나오면 그 단어를 글자 단위로 분리하고 위의 단어 집합에서 매칭되는 단어들을 찾고 그 단어들을 인코딩한다.

SentencePiece

기존의 NMT 시스템은 통계학적 기계번역에서 사용되었던, Moses(언어 종속적인 pre- and postprocessor)를 사용한다. 하지만 이 방식은 NMT에서 효과적인지 증명되지 않은 언어 종속적인 방식을 사용하며, 유럽계 언어에 맞게 설계되었기 때문에 한국어, 일본어, 중국어 같은 non-segmented 언어에는 맞지 않는다. 또한 이 방식은 multilingual NMT 모델을 훈련시키기 어렵다는 단점이 있다.

그러나 센텐스피스는 사전 토큰화 작업 없이 단어 분리 토큰화를 수행하므로 언어에 종속되지 않는다. 센텐스피스는 BPE와 unigram이라는 2개의 서브워드 분리 알고리즘을 사용하여 말뭉치 그대로 집어 넣어 단어 분리 토큰화를 수행한다.

0개의 댓글