cb
[Do It! 자연어 처리] Chapter 02 - 문장을 작은 단위로 쪼개기 본문
본 게시물은 <Do It! BERT와 GPT로 배우는 자연어 처리>의 1장을 보고 정리한 글입니다. 실습에서 사용되는 오픈소스 패키지는 아래의 링크를 참고하시길 바랍니다.
GitHub - ratsgo/ratsnlp: tools for Natural Language Processing
tools for Natural Language Processing. Contribute to ratsgo/ratsnlp development by creating an account on GitHub.
github.com
토큰화
토큰화(tokenization)란 문장을 토큰 시퀀스로 나누는 과정이다. 문장을 나눌 때에는 아래와 같이 여러 방식이 존재한다.
1. 단어 단위 토큰화
문장을 공백으로 분리하는 단어(어절) 단위 토큰화이다.
ex) 나 방금 베이글 먹었어 -> 나, 방금, 베이글, 먹었어
공백으로 분리하면 별도의 토크나이저를 쓰지 않아도 된다는 장점이 있지만, 어휘 집합(vocabulary)의 크기가 매우 커질 수 있다.
같은 의미를 가지는 말이더라도 표현이 살짝 바뀌면 바뀐 표현들도 모두 경우의 수에 포함되어야 하기 때문이다.
ex) 먹었어, 먹었는데, 먹었다, etc.
2. 문자 단위 토큰화
문장을 문자 단위로 토큰화하는 방법이다.
ex) 나 방금 베이글 먹었어 -> 나, 방, 금, 베, 이, 글, 먹, 었, 어
이는 문자를 모두 어휘 집합에 포함하기 때문에, 신조어와 같이 어휘 집합에 없는 토큰(미등록 토큰)이 들어오더라도 큰 문제가 발생하지 않는다.
하지만 각 문자 토큰은 의미를 가지지 않기 때문에 다른 의미를 가졌던 같은 문자를 구분할 수 없다는 문제가 있다.
또, 토큰 시퀀스가 너무 길어져 모델이 해당 문장을 학습하기가 어려워진다는 단점도 존재한다.
3. 서브워드 단위 토큰화
서브워드(subword) 단위 토큰화는 단어와 문자 단위 토큰화의 중간에 있는 형태이다.
이는 어휘 집합 크기가 지나치게 커지지 않으면서도 미등록 토큰 문제를 피하고, 분석된 토큰 시퀀스가 너무 길어지지 않게 한다. 대표적인 서브워드 단위 토큰화에는 바이트 페어 인코딩이 있다.
바이트 페어 인코딩(Byte Pair Encoding; BPE)
바이트 페어 인코딩은 정보 압축 알고리즘으로, 데이터에서 가장 많이 등장한 문자열을 병합해서 데이터를 압축하는 기법이다.
ex) aaabdaaabac
-> ZabdZabac
-> ZYdZYac
-> XdXac
BPE는 데이터에 등장한 글자 (a, b, c, d)를 초기 사전으로 구성한다. 이때, 두 글자가 연속되게 등장한다면 한 글자로 병합한다. 위의 예시에서는 aa가 가장 많이 나타났으므로 이를 Z로 병합하면 둘째 줄처럼 변환이 가능하다.
이 과정을 여러 번 반복하다보면 계속해서 병합을 진행할 수 있다.
BPE 수행 이전에는 원래 데이터를 표현하기 위한 사전 크기가 4개(a, b, c, d)였지만 수행 이후에는 그 크기가 7개(a, b, c, d, Z, Y, X)로 늘 수 있다.
반면 데이터의 길이는 11에서 5로 줄었기 때문에, BPE는 사전의 크기를 지나치게 늘리지 않으면서도 데이터 길이를 효율적으로 압축할 수 있다는 장점이 있다.
실제로 BPE 기반 토큰화를 진행하기 위해서는 다음과 같은 절차가 필요하다.
1. 어휘 집합 구축
자주 등장하는 문자열을 병합하고 이를 어휘 집합에 추가한다.
먼저, 어휘 집합의 모든 문장을 공백으로 나눠 준다. 이 과정을 프리토크나이즈(pre-tokenize)라고 한다. 물론 공백 말고 다른 기준으로 프리토크나이즈를 수행할 수도 있다.
먼저, BPE를 문자 단위로 수행한다면 초기의 어휘 집합은 아래와 같다.
b, g, h, n, p, s, u
표 2-1은 공백에 따라 말뭉치의 문장을 나눈 결과이고, 2-2는 어휘 집합에 해당하는 문자들로 다시 작성한 빈도표이다.
이제 이렇게 나눈 토큰들을 2개씩 묶어서 나열해 보자. 토큰을 2개씩 묶는 과정을 바이그램(bigram)이라고 한다.
여기서 가장 많이 등장한 바이그램 쌍은 20회로 나타난 u,g이 된다. 따라서 u와 g를 합친 ug를 어휘 집합에 추가한다.
b, g, h, n, p, s, u, ug
u, g를 병합했으므로 표 2-2의 각 빈도는 그대로인 채 hug, pug, hugs가 다음과 같이 바뀐 것을 확인할 수 있다.
이번에 가장 많이 등장한 바이그램은 16회의 u, n이므로 un을 합쳐 어휘 집합에 추가한다.
b, g, h, n, p, s, u, ug, un
이와 같은 과정을 사용자가 정한 어휘 집합의 크기가 될 때까지 반복한다.
어휘 집합을 구축할 때 가장 많이 등장한 바이그램 쌍을 병합하는 방식으로 BPE 어휘 집합을 만들었으므로, 이 바이그램 쌍들을 서브워드 병합 우선순위를 정하는 데에 활용할 수 있다.
다음과 같이 병합한 순서대로 병합 이력을 모은다.
2. 토큰화
토큰화 대상 문장의 각 어절에서 어휘 집합에 있는 서브워드가 포함되었을 때 해당 서브워드를 어절에서 분리한다.
어휘 집합과 병합 우선순위를 통해 토큰화를 수행한다.
예를 들어 pug bug mug라는 문장이 있다. 이를 공백 단위로 분리하면 다음과 같이 프리토크나이즈를 수행할 수 있다.
pug bug mug -> pug, bug, mug
여기서 가장 먼저 토큰화를 수행할 대상은 pug이다.
우선 pug를 다음과 같이 문자 단위로 분리한다.
pug -> p, u, g
이후 병합 우선순위 이력을 토대로 병합 우선순위를 부여한다.
p,u -> 우선순위 없음
u,g -> 1순위
둘 중 u, g의 우선순위가 높으므로 이들을 먼저 합쳐 준다.
p, u, g -> p, ug
우선순위 이력을 한번 더 참고해 병합 우선순위를 부여한다.
p, ug -> 우선순위 없음
더 이상 병합 대상이 없으므로 병합을 그만둔다.
그 다음으로 p, ug가 각각 어휘 집합에 있는지 검사하고, 둘 모두 존재한다면 최종 토큰화 결과를 p, ug로 한다.
같은 방법으로 bug 또한 b, ug가 된다.
mug를 토큰화하는 방법은 이와 같다.
병합 우선순위를 따졌을 때 ug를 먼저 합치게 되어, 병합 결과는 m, ug가 된다.
하지만 m은 어휘 집합에 존재하지 않으므로 최종 토큰화 결과는 <unk>, ug가 된다.
unk는 미등록 토큰(unknown token)을 의미한다.
최종적으로 pug bug mug라는 문장의 BPE 토큰화 결과는 다음과 같다.
pug bug mug -> p, ug, m, ug, <unk>, ug
일반적으로 알파벳 등 개별 문자들은 BPE 어휘 집합을 구축할 때 초기 사전에 들어가므로 미등록 토큰이 발생하는 경우는 많지 않다.
워드피스(word piece)
워드피스 또한 말뭉치에서 자주 등장한 문자열을 토큰으로 인식한다. BPE와 비슷하지만, 문자열을 병합하는 기준에서 차이가 있다.
워드피스는 병합했을 때 말뭉치의 우도(likelihood)를 높이는 쌍을 병합한다.
병합 후보가 a, b일 때 워드피스의 병합 기준은 위 식과 같다.
#a, #b, #ab는 각각 a, b, ab라는 문자열의 빈도수, n은 전체 글자 수를 의미한다. 즉, 분자는 가 연이어 등장할 확률, 분모는 a, b가 각각 등장할 확률의 곱이 된다.
위 수식의 값이 거치려면 두 문자열이 각각 등장할 때보다 연이어 등장할 때가 많아야 한다. 그렇기 때문에 워드피스는 병합 대상 전체 후보들을 계산해 보고, 그 값이 가장 높은 쌍을 합치게 된다.
BPE는 어절별로 병합 우선순위가 높은 바이그램 쌍을 반복해서 병합한 후, 병합된 토큰이 어휘 집합에 있는지 확인해 최종 결과를 도출했다. 하지만 워드피스는 어휘 집합만을 가지고 토큰화한다는 차이가 있다.
워드피스는 분석 대상 어절에 어휘 집합에 있는 서브워드가 포함돼 있을 때 해당 서브워드를 어절에서 분리한다. 서브워드 후보가 여럿 있을 경우에는 가장 긴 서브워드를 선택한다. 이후 어절의 나머지에서 어휘 집합에 있는 서브워드를 다시 찾고, 또 분리한다. 분석 대상 문자열에서 서브워드 후보가 하나도 없으면 해당 문자열 전체를 미등록 단어로 취급한다.
'ai - study' 카테고리의 다른 글
[Do It! 자연어 처리] Chapter 03 - 숫자 세계로 떠난 자연어 下 (0) | 2024.04.01 |
---|---|
[Do It! 자연어 처리] Chapter 03 - 숫자 세계로 떠난 자연어 上 (1) | 2024.03.27 |
[Do It! 자연어 처리] Chapter 01 - 처음 만나는 자연어 처리 (0) | 2024.03.13 |
[혼공머신] Chapter 07, 08, 09 딥러닝 (0) | 2024.03.13 |
[혼공머신] Chapter 06 - 비지도 학습 (1) | 2024.02.26 |