본문 바로가기

딥러닝/자연어(NLP)

Byte Pair Encoding 방법

Bype Pair Encoding

How to encode

1. Learn - BPE operation

1. 띄어씌기로 단어를 선정하고 캐릭터 레벨로 단어를 분리합니다.

현재 4개의 단어가 있으며, : 뒤의 숫자는 횟수를 나타냅니다.

'l o w </w>': 5
'l o w e r </w>': 2
'n e w e s t </w>': 6
'w i d e s t </w>': 3

2. 가장 많이 나오는 Pair를 찾고, 두 케릭터를 바꿔줍니다.

best :  ('e', 's')
vocab :  {'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w es t </w>': 6, 'w i d es t </w>': 3}
paris : dict_items([(('l', 'o'), 7), (('o', 'w'), 7), (('w', '</w>'), 5), ... ])

(e s)조합이 가장 많이 나오므로, es를 하나의 쌍으로 만들어 줬습니다..


 

3. Vocab 상태에서 다시 가장 많이 나오는 Pair를 찾습니다.

best :  ('es', 't')
vocab :  {'l o w </w>': 5, 'l o w e r </w>': 2, 'n e w est </w>': 6, 'w i d est </w>': 3}
paris : dict_items([(('l', 'o'), 7), (('o', 'w'), 7), (('w', '</w>'), 5), (('w', 'e'), 2), ...)])

(es t)조합이 가장 많이 나오므로, est를 하나의 쌍으로 만들어 줬습니다.


4. 반복.

이런 식으로 계속해나간다면, Vocab의 사이즈는 줄어들게 되고, 계속 새로운 Pair를 생성하게 됩니다.

3번까지 했을 경우, 초기 상태인

e l o n r w i s t 

에서 다음 상태로 단어 사전이 확장됩니다.

e l o n r w i s t es est 

 


2. Encoding

'l o w </w>': 5
'l o w e r </w>': 2
'n e w e s t </w>': 6
'w i d e s t </w>': 3

위의 예제에서, 초기 상태의 사전은 다음과 같습니다.

e l o n r w i s t 

Learn BPE oepration을 10번 진행한다면, 각 operation마다 다음 단어들이 사전에 추가됩니다.

best :('e', 's')          --> es
best :('es', 't')         --> est
best :('est', '</w>')     --> est</w>
best :('l', 'o')          --> lo
best :('lo', 'w')         --> low
best :('n', 'e')          --> ne
best :('ne', 'w')         --> new
best :('new', 'est</w>')  --> newest</w>
best :('low', '</w>')     --> low</w>
best :('w', 'i')          --> wi

최종적으로 corpus에는 다음 단어들이 있습니다.

e l o n r w i s t es est est<\w> lo low ne new newest</w> low</w> wi

with Byte-Level Subwords

위의 방법의 단점은 영어에 적합한 character level이라는 것 입니다.

이 방법은 효율적이지만 unicode를 필요로 하는 언어들에는 적용하기 어려운 구석이 있습니다.

이를 개선한 것이 Byte-Level subwords입니다. 해당 Operation을 Unicode Byte에 대해서 진행한 것 입니다.

References