[논문 리뷰 스터디] SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing
💡 2018년, Google에서 공개한 SentencePiece에 관한 논문으로, BERT에 대표적으로 활용되는 Subword Segmentation인 SentencePiece를 소개하는 논문이다. (지금까지 1972회 인용됨)
본 논문은 신경망 기반의 언어 처리를 위해 고안된 언어에 의존하지 않는(language-independent) subword tokenizer와 detokenizer인 SentencePiece를 소개한다. 기존에 있던 subword segmentation tool들은 input을 단어들로 pre-tokenized하는 것을 가정하고 있지만, SentencePiece는 raw 문장에서 subword 모델을 직접 학습할 수 있다. 영어-일본어 기계번역 실험을 통해 검증 과정을 거쳤으며, raw 문장에서 높은 정확도를 학습할 수 있는 것이 밝혀졌다.
많은 NMT 시스템들은 여전히 전통적인 통계학 기반 기계 번역(SMT)에 활용되던 언어 의존적인(language-dependent) pre- and postprocessor(전, 후처리)를 사용하고 있음
(ex) Moses : SMT에 있어서 대표적인 도구
단점1) 수작업으로 만들어졌으며 언어 의존적인 특성이 있기 때문에 NMT에서도 좋은 성능을 보이는지는 밝혀진 바가 없다는 단점
단점2) 공백을 기준으로 나뉘어지는 European 언어에 특화되어 개발되었기 때문에 중국어, 한국어, 일본어와 같은 non-segment 언어에는 제대로 적용할 수 없다는 단점
NMT가 표준화되고, 특정 언어에 국한되지 않은 구조로 나아가고 있는 추세
NLP community에서 단순하고 효과적이며 신경망 기반 NLP 시스템에 쉽게 통합될 수 있는 언어에 의존하지 않는 pre- and post-processor에 대한 중요도가 높아지고 있음
본 논문에서는 단순하며 언어에 독립적인 text tokenizer and detokenizer인 SentencePiece를 소개
SentencePiece는 신경망 모델이 학습되기 전에 미리 정해진 단어의 수를 갖는 사전을 바탕으로 한 신경만 기반 text generation 시스템에 주로 활용됨
(SentencePiece는 2개의 subword segmentation 알고리즘(BPE, uni-gram language model)을 활용)
SentencePiece는 Normalizer, Trainer, Encoder, Decoder 4가지로 구성되어 있음
(Encoder와 Decoder : 각각 preprocessing(tokenization)과 postprocessing(detokenization) 역할)
(언어 의존적인 전처리의 예시)
'word'와 '.' 사이에 공백이 없다는 정보가 Tokenized된 결과에서는 알 수 없음
Tokenized된 결과를 원본으로 되돌리는 과정인 Detokenization에서 위와 같은 되돌릴 수 없는 작업(irreversible operation) 때문에 언어 의존적이게 됨
SentencePiece에서는 Decoder는 Encoder의 역변환 역할을 함
(Lossless tokenization)
위와 같은 구조를 Lossless tokenization라고 함
Lossless tokenization에서 normalized text를 복원할 때 필요한 모든 정보들이 사라지지 않음
Lossless tokenization의 기본 아이디어는 input text를 Unicode 단어들의 sequence로 생각하는 것
SentencePiece에서 공백은 meta symbol ‘_’ 를 붙여 표현
공백의 위치가 유지되기 때문에 명백하게 원본 text로 복원 가능
(기존)
기존의 subword segmentation tool들은 subword 모델을 pre-tokenized sentence로부터 학습했음
(SentencePiece)
SentencePiece를 사용한다면 pre-tokenization을 반드시 사용할 필요는 없음
SentecePiece는 학습과 segmentation의 속도를 높이기 위한 다양한 기술들을 사용
⚠️ Input sentence of length = N,
BPE segmentation >> O(N^2)
SentencePiece >> O(Nlog(N))
SentencePiece는 단어를 id로 바꾸거나, 반대로 id를 단어로 바꾸는 과정도 가능하게 하도록 사전을 id로 mapping하는 것을 다룸
기존의 subword-nmt들이 merge operation의 횟수를 정해둔 반면, SentencePiece는 사전의 최종 크기를 미리 정해두고 실행
⚠️ The size of vocabulary is specified with the --vocab_size=<size> flag of spm_train.
Character normalization은 의미적으로 동일한 Unicode 단어들로 이루어진 실제 text data를 다루기 위해 매우 중요한 전처리 과정임
Lowercasing(소문자로 모두 바꾸는 과정)은 효과적인 normalization의 하나
⚠️ The normalization rules are specified with the --normalization_rule_name=nfkc flag of spm_train.
최근 많은 연구가들이 본인들의 experiment 재현을 위해 pre-trained NMT 모델들을 제공함
하지만, 실험을 위해 data를 어떻게 preprocess 했는지는 밝히지 않는 경우가 많음
(data에 대한 사소한 preprocess의 차이가 BLEU 점수에 큰 차이가 발생할 수 있음)
이상적으로는 동일한 모델 파일을 사용한다면 언제든지 동일한 실험 세팅을 재현할 수 있도록 preprocessing을 위한 규칙과 파라미터들이 self-contained manner 방식으로 model file에 포함되도록 해야 함
SentencePiece는 self-contained되도록 구성되었음
모델 파일은 사전과 segmentation parameters, 그리고 pre-compiled finite state transducer 또한 포함하고 있음
(pre-compiled finite state transducer >> 뭔지 모르겠음…)
Text preprocessing is usually considered as offline processing.
main NMT 학습 이전에 raw input은 전처리된 후 standalone preprocessor를 통해 id sequence로 변환되는 과정을 거침
이때 발생하는 문제점 2가지)
💡 SentencePiece not only provides a standalone command line tool for off-line preprocessing but supports a C++, Python and Tensorflow library API for on-the-fly processing, which can easily be integrated into existing NMT frameworks.
Python API 사용의 예)
Unigram 언어 모델에 따라 subword regularization에 대한 python 코드의 예)
영어-일본어 번역을 통해 서로 다른 preprocessing의 성능을 비교한 실험
결과적으로, SentencePiece는 데이터 중심적이고 언어 독립적 시스템을 구축하는 데 있어 도움을 줌
또한 SentencePiece의 분할 속도는 fast enough to be executed on-the-fly.
(참고자료)
서브워드 토크나이저로, 내부 단어 분리를 위한 유용한 패키지로 구글의 센텐스피스(Sentencepiece)가 있습니다. 구글은 BPE 알고리즘과 Unigram Language Model Tokenizer를 구현한 센텐스피스를 깃허브에 공개하였습니다.
내부 단어 분리 알고리즘을 사용하기 위해서, 데이터에 단어 토큰화를 먼저 진행한 상태여야 한다면 이 단어 분리 알고리즘을 모든 언어에 사용하는 것은 쉽지 않습니다. 영어와 달리 한국어와 같은 언어는 단어 토큰화부터가 쉽지 않기 때문입니다. 그런데, 이런 사전 토큰화 작업(pretokenization)없이 전처리를 하지 않은 데이터(raw data)에 바로 단어 분리 토크나이저를 사용할 수 있다면, 이 토크나이저는 그 어떤 언어에도 적용할 수 있는 토크나이저가 될 것입니다. 센텐스피스는 이 이점을 살려서 구현되었습니다. 센텐스피스는 사전 토큰화 작업없이 단어 분리 토큰화를 수행하므로 언어에 종속되지 않습니다.
pip install sentencepiece
댓글 영역