Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

2018: SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing #186

Open
jojonki opened this issue Jan 15, 2019 · 1 comment

Comments

@jojonki
Copy link
Owner

jojonki commented Jan 15, 2019

SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing
Taku Kudo, John Richardson
Accepted as a demo paper at EMNLP2018
https://arxiv.org/abs/1808.06226
著者本人の解説(日本語) https://qiita.com/taku910/items/7e52f1e58d0ea6e7859c
Github: https://github.com/google/sentencepiece

概要

言語に依存しないサブワードによるTokenizer/Detokenizer(トークン化/脱トークン化)であるSentencePieceの提案.NMTなどニューラルベースのNLPに利用することを想定としている.これまでのサブワードベースのTokenizerは,事前にトークン化された単語系列のデータを想定するのに対して,SentencePieceでは,そのような処理は不要で直接生の文をトークン化できるため,本当の意味でのend-to-endを実現できる.
評価として,日英機械翻訳で実験した.
C++とPythonで書かれており,OSSである.

イントロ

DNNはNLPでも大きなインパクトを与えており,特にNMT(Neural Machien Translation)はNLPにおいて,もっともメジャーなタスクである.シンプルなe2eで実現できる.しかし多くのNMTは,言語依存の事前・事後の処理が必要になっており,それらは伝統的な統計的機械翻訳(SMT)で利用されている.MosesはSMTのためのデファクトなツールではあるが,手作業で言語依存のルールで作られている.またそれらのツールはスペース区切りのヨーロッパ系の言語用にデザインされているが,非セグメンテーション言語である中国語,韓国語,日本語のような言語の場合,言語毎に事前・事後の処理が必要になってしまう.

本論ではシンプルで言語独立のテキストTokenizer/DetokenizerであるSentencePieceを提案.ニューラルモデルの学習の前に,語彙数が決まっている,ニューラルネットベースのテキスト生成システム(翻訳やNLG)を主なターゲットにしている.
SentencePieceは2つのサブワードセグメンテーションアルゴリズムを採用している

  1. Byte-Pair-Encoding (BPE) (Sennrich et al,. 2016)
  2. Unigram Language Model (Kudo, 2018)

SentencePieceでは生の文から直接学習できるため,真のe2e学習が,言語独立でできる

システムオーバービュー

SentencePieceは4つのメインコンポーネント,Normalizer, Trainer, Encoder, Decoderから構成される.

  1. Normalizer
    意味的に等価なユニコード文字列を標準形式に正規化する
  2. Trainer
    正規化コーパスから,サブワードのセグメンテーションを学習する.Trainerのパラメタとして,サブワードモデルのタイプを指定する
  3. Encoder
    入力テキストをNormalizerを使って正規化し,Trainerで学習したモデルを利用して,サブワードにトークン化する.事前処理(トークン化)に対応.
  4. Decoder
    サブワードの系列データを,正規化テキストに変換する.事後処理(脱トークン化)に対応.

SentencePieceでは,語彙とidの管理を行っており,テキスト列を入力してもよいし,idを入力しても良い.出力もテキストでもidでもどちらも対応.実行例を以下に示す.

ライブラリデザイン

この章では,SentencePieceの設計と実装の詳細を説明する

ロスなしトークン化

下記の例を考える.Detokenization(トークン化ー>生文への復元)を行うためには,言語依存の知識が必要となる.英語だと単語間は普通スペースがあるが,ピリオドとトークンの間には不要.日本語や中国語ではトークン間には基本的にスペース不要,など.こういったものはルールベースで作られており,人手でメンテされている.

  • 英語
    • 生文:Hello world.
    • トークン化:[Hello][world][.]
  • 日本語
    • 生文:こんにちは世界。
    • トークン化:[こんにちは][世界][。]

SentencePieceでは,下記のように可逆的に変換できるようにしている.この設計を,ロスなしトークン化,と呼ぶことにする.

  • Decode(Encode(Normalize(text))) = Normalize(text)

またSentencePieceでは,最初に空白文字をメタ文字"▁"(U+2581)で置き換えている.トークン化した際にも空白情報を損なわないので,Detokenizationしたときに, ▁と空白を全置換するだけで元の文字列に復元できる.

  • 生文:Hello ▁world.
  • トークン化:[Hello][▁wor][ld][.]

効率的なサブワード学習とセグメンテーション

既存のサブワード分割ツールは,事前にトークン化されているデータを用いてセグメンテーションを学習する.しかしその場合,ロスなしトークン化は難しい.

SentencePieceでは,ロスなしトークン化を実現するための,学習とセグメンテーションにおいて,いくつかの速度向上技術を採用している.
ある長さNの入力文を与えた場合,BPEによるセグメンテーションはO(N^2)と計算コストが高い一報,SentencePieceではO(N log(N))をバイナリヒープ(priority queue)で実現.大規模な生文から直接学習・分割が可能.更に,unigramモデルでの学習とセグメンテーションは,入力データに比例する.

語彙IDの管理

SentencePieceは語彙とIDのマッピングを双方向で管理できる.また語彙数は学習時に指定できる.subword-nmtではmerge数で指定する.
SentencePieceは特別なシンボルを予約済み:UNK, BOS, EOS, PAD.また仮想トークンとして,コンテキスト情報をエンコードするため,カスタムのシンボルも定義している.例として,<2ja>と<2de>はマルチ言語モデルのための,言語インジケーターになっている.

文字正規化のカスタマイズ

文字の正規化は,非常に重要な事前処理のステップ.というのも文字にはゆらぎがあり,その中には同意味のものも含んでいる.これまでは,NFCやNFKCという手作業でメンテされているツールがNLPで使われてきた(issue下部に正規化例の参考あり).
SentencePieceはデフォルトでは,NFKCを利用して正規化する.またユーザー定義の正規化ルールもtsvファイルで記述して取り込める.またSentencePieceのデフォルトの正規化ルール(tsv)もパッケージに含まれて確認できる
image

Self-contained models

最近の提案されているNMTモデルは,追試のために公開されている場合が多いが,僅かな設定の違いによりBLEUスコアが大きく変わる可能性があると提案されている.Mosesのようなツールを使う場合でも,パラメタはすべて明示的に公開されている必要がある.またNFKC正規化はUnicodeのバージョンによって異なる結果を生成する時がある.

理想的には,再現性のために,モデルはルールとパラメタをモデル内に埋め込みで持っているのが好ましい.
SentencePieceのモデルは,語彙とセグメンテーションのパラメタのみならず,文字正規化のための事前コンパイル済み有限状態トランスデューサーのパラメタも含んでいる.つまり,SentencePieceはself-containedにデザインされている.そのためSentencePieceの振る舞いは,外部ファイルなど不要で,そのモデルファイルのみで決定づけられる.また開発者はデフォルトの正規化ルールを書き換えることも可能である.SentencePieceのモデルはProtocol Bufferと呼ばれる形式で管理されており,安全に構造データをシリアライズできる.// Protocol BufferはGoogleが開発したスキーマ言語,らしい

on-the-fly処理のためのAPI

テキストの事前処理は通常オフラインで行われる.NMTの学習の前に,生文はidの時系列データするような処理である.このようなオフライン事前処理は2つの問題がある.

  1. スタンドアロンツールは,ユーザーが利用するNMTアプリ(ユーザーの入力文をon-the-flyで処理する必要がある)には,直接統合されない
  2. オフライン事前処理は,subsentenceレベルのデータ拡張やノイズ注入を困難にする(これらは,accuracyやロバスト性の改善に利用される)

文の内部表現をランダムに変更することによる,入力文へのノイズ混入の研究はいくつかある.

  • NMT学習中に,ランダムにサブワード分割を変更する,サブワード 正則化(Kudo, 2018)
  • seq2seqタイプのdenoising autoencoder.入力文の単語順序をランダムに変更し,元の文を復元できるようにする(Lample 2017; Artetxe 2017)

オフライン事前処理において,このような動的サンプリングやノイズ注入は難しい

SentencePieceでは,オフライン事前処理のためのスタンドアローンのコマンドラインツールの提供だけでなく,on-the-fly処理のためのC++,Python,Tensorflowのライブラリも提供している.

Figure 6にはサブワード正則化のPythonコードを載せる.1つのサブワード列は,unigram言語モデルに従いサンプルされ,異なるトークン化列を確認できる.サブワード正則化についての詳細は(Kudo 2018)参照.

実験

異なる事前処理の比較

英語ー日本語の翻訳タスク,Kyoto Free Translation Task (KFTT)で実験(Wikipedia記事をベース).train/dev/testは,440k, 1166, 1160の文数.
NMTのシステムには,GNMT (Wu, 2016)を採用.比較手法は下記.評価メトリクスとして,case-sensitive BLEUスコア(Papineni, 2001)を採用.日本語出力は分割されていないので,BLEU計算前にKyTeaで分割.

  • word model (baseline)
    • サブワードを使わないモデル
    • トーカナイザは英語はMoses,日本語はKyTeaを利用
  • SentencePiece w/ 事前トークン化
    • 基本的に,subword-nmtを使用した一般的なNMT設定と同じ
    • 事前トークン化には,英語はMoses,日本語はKyTeaを利用
  • SentencePiece wo/ 事前トークン化
    • 生文から直接サブワードモデルを学習し,外部リソースを使わない

結果はTable 1に.

  • SentencePieceを使ったサブワード分割は,一貫してword modelよりも高いBLEUスコア
  • 事前トークン化は常にBLEUスコアを上げるとは限らない.日→英翻訳では,改善はわずかで明らかな際は見られない.英→日では,事前トークン化によって性能が落ちている
  • SentencePieceが日本語に適用されるとき,ターゲット言語が日本語のとき,大きく性能が改善
    • 日本語は非分割言語のため,事前トークン化は,最終的な語彙を決定するための強い制約として働いている
    • これは,生文利用による教師なし分割は,日本語におけるドメイン固有の語彙を効率よく見つけるように働いたと考えられる

セグメンテーションのパフォーマンス

Table 2に,学習とセグメンテーションのパフォーマンスを様々な設定下でまとめた.// 本来subword-nmtは事前トークン化が必要,SentencePieceは不要であるはずだが,事前トークン化のオプションでも実験している.勘違いしている可能性もあるが,subword-nmt (事前トークン化なし)は生文を入力,SentencePiece(事前トークン化あり)はトークン(単語とか)を入力,と本来のユースケースとは異なる設定で実験をしていると読み取った

  • SentencePieceとsubword-nmtの両方共,英語データにおいては,学習とセグメンテーションの速度は,事前トークン化の有無に関係なく大体同じ.// それなりに違う気がするが..
    • これは,英語は分割言語であり,語彙抽出のための検索空間はかなり限定されるため
  • SentencePieceでは,事前トークン化なしの生日本語文において大きな改善を見せた.subword-nmtと比べて380倍早い.// 桁が1つ多い気もする.この値がどこから出たのかよく分からない.216.2÷5.9 ?
    • SentencePieceは生データにおいても十分早く,事前トークン化は必ずしも必要でない,ということがわかる
    • SentencePieceは純粋なデータドリブン型であり,言語に依存しないシステムである
  • SentencePieceのセグメンテーション速度は21K/sec (英語),74K/sec(日本語)で,on-the-flyでも十分に使える速さ.// 日本語の方が圧倒的に早いのは驚き

結論

ニューラルテキスト処理のための,サブワードのTokenizer/Detokenizer,SentencePieceを紹介した.SentencePieceは生文を直接id列に変換し,事前トークン化を必要としないため言語にも依存しない.またモデルファイル内にパラメタを持つため,正規化とサブワード分割の完全な再現性を保証する.更にロスなしトークン化も実現している.我々は,SentencePieceが言語を扱う研究分野が,より言語に依存しないand多言語構造に向かう手助けをできることを願う.

コメント

  • サブワードによって未知語に対する恐怖があまりないのはすごい.ライブラリの設計ポリシーもシンプルで説得力があり,BERTの日本語モデルなどで使われて,人気の理由も頷ける
  • 日本語の問題は,興味ある人は日本人ぐらいだが,筆者が日本人ということで,日本語や中国語だから生まれる問題に取り組まれていて,素晴らしいの一言に尽きる.更に日本語に別に特化しているわけでもないのも素晴らしい
  • 論文自体はデモペーパーで細かいアルゴリズムの紹介などはなかったので,関連研究など追っていきたい

参考

@jojonki jojonki changed the title 🚧 2018: SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing 2018: SentencePiece: A simple and language independent subword tokenizer and detokenizer for Neural Text Processing Jan 17, 2019
@jojonki
Copy link
Owner Author

jojonki commented Jan 23, 2019

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

1 participant