모델에 학습을 시켰지만 정작 테스트 할 때 모르는 단어가 나오면 문제를 해결하는 데 힘들어질 수 밖에 없다.
이러한 상황을 OOV(Out-of-Vocabulary) 문제라고 한다.
OOV의 문제를 최소화하기 위해서 하나의 단어를 여러 서브워드로 분리하는 작업을 하는 데 이를 서브워드 분리(Subword segmentation)이라고 한다.
ex) birthplace = birth + place
대표적인 서브워드 분리 알고리즘인 BPE에 대해 알아보자.
BPE(Byte Pair Encoding)
BPE는 기본적으로 데이터 압축 알고리즘이다.
간단한 작동 방법에 대해 알아보자.
아래와 같은 문자열이 주어졌다고 하자.
aaabdaaabac
aa가 반복되어 나온다.
aa를 Z로 치환하자.
ZabdZabac
ab가 반복되어 나온다.
ab를 Y로 치환하자.
ZYdZYac
이런식으로 BPE는 위의 문자열을 최종 결과로 하여 종료된다.
자연어 처리에서의 BPE
1) BPE를 사용하지 않았을 경우
각 단어와 빈도수를 나타내는 딕셔너리가 다음과 같이 있다고 하자.
# 딕셔너리
{low : 5, lower : 2, newest : 6, widest : 3}
low가 5회, lower가 2회, ... 이런식이다.
그리고 딕셔너리로부터 얻은 단어의 집합은 아래와 같다.
# 단어 집합
low, lower, newest, widest
이 경우 테스트 과정에서 lowest와 같은 단어가 나온다면 처음에 언급한 OOV 문제가 발생하여 제대로 대응하지 못한다.
2) BPE를 사용한 경우
위 딕셔너리에 BPE를 적용해보자. 이때 딕셔너리를 글자 단위로 분리한다.
# 딕셔너리
{l o w : 5, l o w e r : 2, n e w e s t : 6, w i d e s t : 3}
그리고 딕셔너리로부터 얻은 단어의 집합은 아래와 같고, 이 역시 글자 단위로 분리한다.
# 단어 집합
l, o, w, e, r, n, s, t, i, d
이제 가장 빈도 수가 높은 유니그램의 쌍을 하나의 유니그램으로 통합하는 과정을 반복한다.
이때 몇 회 반복할 것인지는 사용자가 직접 정한다. 여기서는 10회를 반복한다고 가정하자.
1회 - 딕셔너리를 참고로 하였을 때 빈도수가 9로 가장 높은 (e, s)의 쌍을 es로 통합
# 딕셔너리
l o w : 5
l o w e r : 2
n e w es t : 6
w i d es t : 3
l, o, w, e, r, n, s, t, i, d, es
2회 - 빈도수가 9로 가장 높은 (es, t)의 쌍을 est로 통합
# 딕셔너리
l o w : 5
l o w e r : 2
n e w est : 6
w i d est : 3
# 단어 집합
l, o, w, e, r, n, s, t, i, d, es, est
위와 같이 10회를 반복한 후에 얻은 딕셔너리와 단어집합은 아래와 같다.
# 딕셔너리
low : 5,
low e r : 2,
newest : 6,
widest : 3
# 단어 집합
l, o, w, e, r, n, s, t, i, d, es, est, lo, low, ne, new, newest, wi, wid, widest
기존과 달리 단어의 집합이 위와 같이 된다면 lowest를 만났을 때 'low'와 'est' 두 단어로 인코딩하여 나타낼 수 있다.
위 BPE 동작 과정을 아래 그림으로 나타낼 수 있다.
'AI > 자연어 처리' 카테고리의 다른 글
[자연어처리] 간단한 시퀀스-투-시퀀스(Sequence-to-Sequence, seq2seq) (0) | 2023.02.17 |
---|---|
[자연어처리] Word2Vec, Skip-gram (0) | 2023.02.13 |
[자연어 처리] 코사인 유사도(Cosine Similarity) (0) | 2023.02.09 |