jojonki / arXivNotes

IssuesにNLP(自然言語処理)に関連するの論文を読んだまとめを書いています.雑です.🚧 マークは編集中の論文です(事実上放置のものも多いです).🍡 マークは概要のみ書いてます(早く見れる的な意味で団子).
https://github.com/jojonki/arXivNotes/issues
194 stars 8 forks source link

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

Open jojonki opened 5 years ago

jojonki commented 5 years ago

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

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

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

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

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やロバスト性の改善に利用される)

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

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

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で分割.

結果はTable 1に.

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

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

結論

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

コメント

参考

jojonki commented 5 years ago

Podcastでも解説しました. https://anchor.fm/lnlp-ninja/episodes/ep19-SentencePiece-A-simple-and-language-independent-subword-tokenizer-and-detokenizer-for-NLP-e2vnnb