論文紹介: SentencePieceの原著論文+α

はじめに

2018年に登場したニューラル言語処理のための教師なしサブワード分割モジュール,SentencePiece。

開発意図や仕様を確認するために原著論文を読みました。 github.com

論文は2018年8月にarXivに投稿されています。 arxiv.org

著者・開発者はMeCab開発者でもある工藤拓さん。自然言語処理に関心のある方で知らない人はいないでしょう。 github.com

1冊まるごと形態素解析という驚異的な本も執筆されています。

背景

基本的事項をいくつか確認します。

SentencePieceは与えられた文章をサブワードに分割するモデルであり, コーパスからの教師なし学習が可能です。
単語を分かち書きしない日本語, 韓国語, 中国語などの文章を自動で分割してくれるのはもちろんですが, 単語が分かち書きされている文章に対しても単語より小さな単位(subword)に分割してくれます。

ただし, SentencePieceは言語の文法体系や言語学的観点からみて妥当な分割をするとは限りません(そのような設計を目指していません)。
したがって, SentecePieceによって分割された単位は「形態素」ではなく単に「サブワード」と呼ばれることが多いようです。

そもそも, サブワード分割モデルが登場した背景には
「open-domainなニューラル機械翻訳(NMT, Neural Machine Translation)におけるout-of-vocabularyをできるだけ少なくしたい」
という動機があります。

SentencePieceが"形態素"分割を目指していないのも同様の理由です。
論文もNMTへの応用を主軸として書かれています。

サブワード分割モデル自体はすでに多数存在ありますが(Mosesなど), rule-basedであったり単語の分かち書きを前提としたりしている点に問題があります。 statmt.org

特徴

Sencentepieceの特徴はいくつか挙げられますが,大きなものとして次の3つがあります:

  • 可逆的なTokenizationの実現(Lossless Tokenization)
  • Unicode正規化のカスタマイズ性
  • 確率的な振る舞い
特徴(1): 可逆的なTokenizationの実現(Lossless Tokenization)
[raw corpus]  [normalized corpus]  [tokens]  [ids]
encode
=================================================>
character normalization
-------------------------------->
              subword segmentation
              ---------------------------->
                                   covert to id
                                   -------------->                                   
                                            decode
              <===================================
                                        detokenize
              <-----------------------------------

SentencePieceの特徴はその可逆性にあります。
一見当たり前のように思えますが, そうではありません。

たとえば単語の分かち書きを前提としたモデルで

Hello world. -> [Hello][world][.]

のように分割したとします。このとき, 「white spaceがHelloの後ろにはあるが, worldの後ろにはない」という情報は分割結果だけをみても分かりません。

つまり, white spaceに関する情報が分割の前後で失われています。
このように既存のモデルでは, 分割結果からもとの文書の完全な復元はしばしば不可能です。

一方, SentencePieceではtokenize-detokenizeの可逆性が担保されています。これは, 入力文をUnicode文字の羅列として扱うと同時に, white spaceにもトークンを割り当てているためです。

特徴(2): Unicode正規化のカスタマイズ性

SentencePieceはサブワード分割前にUnicode正規化を行います。 qiita.com

正規化手法にはNFKCにwhite space関連の処理を加えたものがデフォルトとして使用されていますが, 手動でカスタマイズすることもできます。
つまり, 例えば目的タスクで解消しておきたい表記揺れなどをここで明示しておくことも可能です。

デフォルトではsentencepiece-master/data/nmt_nfkc.tsvの正規化ルールを採用しますが, SentencePiece訓練時に
--normalization_rule_tsv=<tsv_file_name>
オプションを与えるとオリジナルの正規化ルールを適用できます。

特徴(3): 確率的な振る舞い

従来の教師なしサブワード分割は, データ圧縮時の符号化と似たアルゴリズムを用いています(Byte-Pair-Encoding(BPE))。

コーパスを一旦文字単位にバラしたあと最頻隣接トークンのマージを繰り返し, あらかじめ設定した語彙数に達したら処理を終了するものです。
カウントベースの手法であり, 訓練, 実際の使用時ともに一意な処理結果が得られます。

f:id:radiology-nlp:20190807205043p:plain

一方, SentencePieceはまったく異なり, 確率的に振る舞います。
このため, 同一モデル同一データであっても分割結果は実行毎に異なります

これは, 「SentencePieceの確率的な振る舞いそのものがnoise injectionとして作用し, 後続のタスクのためのdata augmentationとしてはたらく」という意図によります。

さて, どのように分割しているかというと, Unigram Language Modelという言語モデルを採用しています。
詳細は工藤拓さんご自身のarXiv論文を参照してください。

arxiv.org

以下に, Unigram Language Modelの構成法の概略を示します。

  • 文をサブワード列として捉え (\boldsymbol{x}=(x_{1},...,x_{M})), その生起確率を  \begin{equation} P(\boldsymbol{x})=\Pi_{i=1}^{M}p(x_{i}) \;
\left( \, \forall{i} \, x_{i}\in \mathcal{V}, \; \sum_{x\in \mathcal{V}}p(x)=1 \, \right) \end{equation} で定義する。

  • 語彙 \mathcal{V}を「存在する全Unicode文字(正規化後)」で初期化しておく。

  • 次に, EMアルゴリズムによって語彙 \mathcal{V}トークン生起確率 p(x_{1}),...,p(x_{M})を交互に最適化していく。

  • 具体的には, 目的関数  \mathcal{L}=\sum_{X\in \mathrm{corpus}}\log\left( \sum_{\boldsymbol{x}\in \mathrm{segmentate}(X)}P(\boldsymbol{x}) \right)がなるべく大きくなるように最適化する。

すると, 最終的に文字単位, サブワード単位, 単語単位の言語モデルが混合したモデルが作られるため, 入力文からさまざまな出力が確率的に生成されうることになります。

まとめ

SentencePieceの原著論文+αについてまとめました。

SentencePieceを医療言語処理タスクに使用する場合, configをうまく設定すれば漢字の表記揺れは正規化の段階で吸収できそうです。
また, SentencePieceは独立した前処理として使うのではなく, ニューラルネットワークの訓練のEpochごとに毎回実行しなおすというのが, その挙動や開発意図から読み取れる正しい使い方といえそうです。