상세 컨텐츠

본문 제목

[논문 리뷰 스터디] SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing

심화 스터디/논문 리뷰

by 남르미누 2022. 11. 10. 20:04

본문

💡 2018년, Google에서 공개한 SentencePiece에 관한 논문으로, BERT에 대표적으로 활용되는 Subword Segmentation인 SentencePiece를 소개하는 논문이다. (지금까지 1972회 인용됨)

본 논문은 신경망 기반의 언어 처리를 위해 고안된 언어에 의존하지 않는(language-independent) subword tokenizer와 detokenizer인 SentencePiece를 소개한다. 기존에 있던 subword segmentation tool들은 input을 단어들로 pre-tokenized하는 것을 가정하고 있지만, SentencePiece는 raw 문장에서 subword 모델을 직접 학습할 수 있다. 영어-일본어 기계번역 실험을 통해 검증 과정을 거쳤으며, raw 문장에서 높은 정확도를 학습할 수 있는 것이 밝혀졌다.

 

Introduction

많은 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)을 활용)

System Overview

SentencePiece는 Normalizer, Trainer, Encoder, Decoder 4가지로 구성되어 있음

  • Normalizer : Unicode 문자를 의미적으로 동일한 표준(canonical) 형태로 변환
  • Trainer : Normalized된 말뭉치에서 subword segmentation 모델을 학습
  • Encoder : 내부적으로 Normalizer를 사용하여 input text를 normalize하고 Trainer를 통해 학습된 subword sequece로 tokenize 진행
  • Decoder : Subword sequence를 normalized text로 되돌림

(Encoder와 Decoder : 각각 preprocessing(tokenization)과 postprocessing(detokenization) 역할)

Library Design

Lossless Tokenization

(언어 의존적인 전처리의 예시)

'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로 복원 가능

Efficient subword training and segmentation

(기존)

기존의 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))

 

Vocabulary id management

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.

 

Customizable character normalization

Character normalization은 의미적으로 동일한 Unicode 단어들로 이루어진 실제 text data를 다루기 위해 매우 중요한 전처리 과정임

Lowercasing(소문자로 모두 바꾸는 과정)은 효과적인 normalization의 하나

  • SentencePiece는 기본적으로 Unicode NFKC normalization을 활용하여 input text를 normalize진행

⚠️ The normalization rules are specified with the --normalization_rule_name=nfkc flag of spm_train.

 

  • SentencePiece의 normalization은 string-to-string mapping과 leftmost longest matching을 통해 이루어짐
  • SentecePiece는 TSV 파일을 통해 정의된 규칙을 기반으로 하는 custom normalization을 활용할 수 있음

Self-contained models

최근 많은 연구가들이 본인들의 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 >> 뭔지 모르겠음…)

Library API for on-the-fly processing

Text preprocessing is usually considered as offline processing.

main NMT 학습 이전에 raw input은 전처리된 후 standalone preprocessor를 통해 id sequence로 변환되는 과정을 거침

이때 발생하는 문제점 2가지)

  1. 사용되는 standalone preprocessor는 user-facing NMT에 바로 합쳐질 수 없다는 문제점
  2. sub-sentence level data augmentation과 noise injection(모델의 성능과 robustness를 높이기 위한 noise injection)을 어렵게 한다는 문제점

 💡 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 코드의 예)

Experiments

Comparison of different preprocessing

영어-일본어 번역을 통해 서로 다른 preprocessing의 성능을 비교한 실험

  • subword segmentation with SentencePiece는 word model과 비교하였을 때 항상 좋은 성능을 보여주고 있음
  • BLEU 점수를 올리기 위해서 항상 사전 토큰화(pre-tokenization)가 필요한 것은 아님을 알 수 있음 (영어에서 일본어로 변환할 때 check)

Segmentation performance

  • 영어 데이터 셋에 대한 결과는 학습 및 분할 속도가 사전 토큰화의 상관없이 거의 비슷한 결과
  • SentencePiece 사용시 사전 토큰화를 진행하지 않은 일본어에 대해 더 큰 성능 향상을 보여줌
    • 이 결과로 SentencePiece가 원시 데이터에 적용될 수 있을 만큼 충분히 빠르며 사전 토큰화가 항상 필요한 것은 아니라는 본 논문 저자들의 주장을 뒷받침함

결과적으로, SentencePiece는 데이터 중심적이고 언어 독립적 시스템을 구축하는 데 있어 도움을 줌

또한 SentencePiece의 분할 속도는 fast enough to be executed on-the-fly.

Conclusions

  • 신경만 기반의 text processing을 위해 고안된 open-source subword tokenizer and detokenizer인 SentencePiece를 소개
  • SentecePiece는 subword tokenization을 수행할뿐만 아니라 text를 id sequece로 바꿔주기도 함
  • Normalization과 subword segmentaion의 완벽한 재현을 위해 SentencePiece의 모델 파일은 self-contained되도록 구성되었음

(참고자료)

서브워드 토크나이저로, 내부 단어 분리를 위한 유용한 패키지로 구글의 센텐스피스(Sentencepiece)가 있습니다. 구글은 BPE 알고리즘과 Unigram Language Model Tokenizer를 구현한 센텐스피스를 깃허브에 공개하였습니다.

내부 단어 분리 알고리즘을 사용하기 위해서, 데이터에 단어 토큰화를 먼저 진행한 상태여야 한다면 이 단어 분리 알고리즘을 모든 언어에 사용하는 것은 쉽지 않습니다. 영어와 달리 한국어와 같은 언어는 단어 토큰화부터가 쉽지 않기 때문입니다. 그런데, 이런 사전 토큰화 작업(pretokenization)없이 전처리를 하지 않은 데이터(raw data)에 바로 단어 분리 토크나이저를 사용할 수 있다면, 이 토크나이저는 그 어떤 언어에도 적용할 수 있는 토크나이저가 될 것입니다. 센텐스피스는 이 이점을 살려서 구현되었습니다. 센텐스피스는 사전 토큰화 작업없이 단어 분리 토큰화를 수행하므로 언어에 종속되지 않습니다.

pip install sentencepiece

 

 

관련글 더보기

댓글 영역