IssuesにNLP(自然言語処理)に関連するの論文を読んだまとめを書いています.雑です.🚧 マークは編集中の論文です(事実上放置のものも多いです).🍡 マークは概要のみ書いてます(早く見れる的な意味で団子).
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
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つのサブワードセグメンテーションアルゴリズムを採用している
SentencePieceでは生の文から直接学習できるため,真のe2e学習が,言語独立でできる
システムオーバービュー
SentencePieceは4つのメインコンポーネント,Normalizer, Trainer, Encoder, Decoderから構成される.
SentencePieceでは,語彙とidの管理を行っており,テキスト列を入力してもよいし,idを入力しても良い.出力もテキストでもidでもどちらも対応.実行例を以下に示す.
ライブラリデザイン
この章では,SentencePieceの設計と実装の詳細を説明する
ロスなしトークン化
下記の例を考える.Detokenization(トークン化ー>生文への復元)を行うためには,言語依存の知識が必要となる.英語だと単語間は普通スペースがあるが,ピリオドとトークンの間には不要.日本語や中国語ではトークン間には基本的にスペース不要,など.こういったものはルールベースで作られており,人手でメンテされている.
SentencePieceでは,下記のように可逆的に変換できるようにしている.この設計を,ロスなしトークン化,と呼ぶことにする.
Decode(Encode(Normalize(text))) = Normalize(text)
またSentencePieceでは,最初に空白文字をメタ文字"▁"(U+2581)で置き換えている.トークン化した際にも空白情報を損なわないので,Detokenizationしたときに, ▁と空白を全置換するだけで元の文字列に復元できる.
効率的なサブワード学習とセグメンテーション
既存のサブワード分割ツールは,事前にトークン化されているデータを用いてセグメンテーションを学習する.しかしその場合,ロスなしトークン化は難しい.
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)もパッケージに含まれて確認できる
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つの問題がある.
文の内部表現をランダムに変更することによる,入力文へのノイズ混入の研究はいくつかある.
オフライン事前処理において,このような動的サンプリングやノイズ注入は難しい
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多言語構造に向かう手助けをできることを願う.
コメント
参考
190