Ahogrammer

Deep Dive Into NLP, ML and Cloud

固有表現認識にはどのサブワードの分散表現が有効なのか?

ACL 2019より以下の論文を紹介。

この論文では、2つの系列ラベリングタスク(固有表現認識と品詞タグ付け)に対して、3つのサブワードの分散表現(FastText、BPEmb、BERT)のどれが有効なのかを調査している。最近の自然言語処理タスクでは事前学習済みの分散表現が使われる。特に2018年以降はELMoやBERTなどの文脈を考慮した分散表現が使われるようになってきている。しかし、どの分散表現を使うのが良いのか包括的に調査した研究はなく、実務者が分散表現の選択を行うのを難しくしている。そういうわけで、265言語に対して調査を行った。

調査の結果、以下の示唆を得られた。

  1. 大規模データを利用できる場合、サブワードのボキャブラリ数を大きくしたほうが良い
  2. 低リソースな場合、サブワードのボキャブラリ数は小さい方が良い
  3. 計算資源が限られている場合は、BPEmbと文字分散表現の組み合わせが良い
  4. 異なるサブワード表現を組み合わせると良い
  5. 低リソースな場合、サブワードを共有して多言語で事前学習を行うと良い
  6. 多言語BERTはタスクや言語によらず、そレなりに良い性能が出るのでロバストな選択

まず、1番目と2番目について説明しよう。データセットのサイズとBPEのボキャブラリ数の関係については以下の図で説明されている。以下の図は、200を超える言語の固有表現認識のデータセットに対して、BPEのボキャブラリ数を変えた時にベストなボキャブラリ数がいくつだったかを調査した結果となっている。結果を見ると、傾向としてはデータセットの規模が大きいほど、BPEのボキャブラリ数を大きくしたほうが良い結果となることがわかる。

f:id:Hironsan:20190917082014p:plain
データセットのサイズとBPEのボキャブラリ数の関係

次に、3〜5番目について説明する。以下にBPEを使った場合の結果を示した。表では様々な分散表現を使った場合の結果を示している。ここで、MultiBPEmbというのは、265言語のサブワードを共有して学習を行った場合を指している。Finetuneの有無は、有の場合は多言語で学習した後、対象言語で再学習、無の場合は多言語だけで学習した場合を指す。この結果を見ると、BPEに文字分散表現を組み合わせるとFastTextなどと比べて性能が向上することがわかる。また、低リソースな場合は多言語での学習の効果が大きいことがわかる。

f:id:Hironsan:20190917082722p:plain
WikiAnnに対する固有表現認識の結果

最後に多言語BERTの結果を示す。以下は101の言語に対して固有表現認識を行った結果を示している。結果を見ると、BERTを使った場合、MultiBPEmbには負けるが、それなりに良い性能を出すことがわかる。また、BERTを単体で使うよりも、文字分散表現とBPEmbを組み合わせるほうが性能が向上することが示されている。ただ、MultiBPEmbをFinetuneした場合よりは性能が劣る。

f:id:Hironsan:20190917082834p:plain
固有表現認識の結果(BERT)

実務的に興味深い論文であった。ただ、注意しなければならないのはこの結果はあくまで数百言語の平均としてこうなったという話であって、個別の言語を見ていくと当てはまらないことがある。たとえば、論文の表9に載っている結果を見ると、FastTextとBPEmbはほとんど性能差はなく、BERTはそれらよりも悪い結果となることが示されている。これは、多言語BERTのボキャブラリを使うと日本語の場合はほとんど文字で分割されてしまうことによる影響を受けていると考えられる。数百言語を扱っているので、一つずつに手間を掛けていられないという事情はあると思うが、日本語の場合は京大で公開しているBERT日本語Pretrainedモデルを使うと、違う結果を得られるのではないかな、と思った。

TensorFlow Textを使ってテキストのトークン化をする

自然言語処理で欠かせない処理にテキストのトークン化があります。テキストをトークン化することで、その後のボキャブラリの構築やID化の処理を行うことができるようになります。本記事では、トークン化をTensorFlow Textの機能を使って実現する方法について紹介します。

準備

本記事ではTensorFlow Textを使ってテキストのトークン化を行います。TensorFlow TextはTensorFlow 2.0向けにテキスト操作のためのクラスや関数を提供してくれるパッケージです。その中のメインの機能として、テキストのトークン化をするための機能を提供しています。使い始めるために、以下のようにしてTensorFlow Textをインストールしておく必要があります。

$ pip install tensorflow-text

方法

本記事では以下の2つのトークナイザーについて紹介します。

  • WhitespaceTokenizer
  • UnicodeScriptTokenizer

WhitespaceTokenizer

WhitespaceTokenizerは、最もシンプルなトークナイザーであり、スペースやタブ、改行記号といった空白記号によってテキストを分割します。

import tensorflow_text as text

tokenizer = text.WhitespaceTokenizer()
tokens = tokenizer.tokenize(['everything not saved will be lost.', u'Sad☹'])

トークン化した結果はRaggedTensorで得られます。RaggedTensorは可変長テンソルを表しており、テキストを表すのに適したテンソルです。詳細は、RaggedTensorsを参照してください。

>>> tokens
<tf.RaggedTensor [[b'everything', b'not', b'saved', b'will', b'be', b'lost.'], [b'Sad\xe2\x98\xb9']]>

RaggedTensorではなく、Pythonリストが欲しい場合もあります。そのような場合は、to_listメソッドを使って、テンソルをリストに変換することができます。

>>> tokens.to_list()
[[b'everything', b'not', b'saved', b'will', b'be', b'lost.'], [b'Sad\xe2\x98\xb9']]

UnicodeScriptTokenizer

UnicodeScriptTokenizerは、Unicodeスクリプトの境界でテキストを分割するトークナイザーです。スクリプト)というのは文字の集合のことであり、たとえば、ラテン文字の集合やアラビア文字の集合などがあります。UnicodeScriptTokenizerはこれらの境界でテキストを分割するわけです。

tokenizer = text.UnicodeScriptTokenizer()
tokens = tokenizer.tokenize(['everything not saved will be lost.', u'Sad☹'])

トークン化した結果は以下のようになります。WhitespaceTokenizerの場合と比べると、"Sad"の後の絵文字でテキストが分割されていることを確認できます。

>>> tokens.to_list()
[[b'everything', b'not', b'saved', b'will', b'be', b'lost', b'.'], [b'Sad', b'\xe2\x98\xb9']]

参考文献

アクティブラーニングを使って固有表現のアノテーション数を25%にする

ICLR 2018より以下の論文を紹介。

Deep Active Learning for Named Entity Recognition

この論文では、固有表現認識向けのアクティブラーニング手法を提案している。最近の固有表現認識ではディープなモデルが使われる。そういったモデルではラベル付きのデータが大量に必要だが、その作成コストが高いという問題がある。そういった場合、アクティブラーニングを使って作成コストを減らす戦略が有効だが、モデルを繰り返し学習させる必要があるため学習コストが高いという問題がある。そこで、論文では学習方法とモデルを工夫することで問題を解決している。実験の結果、従来の25%のデータ量でデータを減らさない場合と同等の性能を出すことを示した。

ディープなモデルを使ってアクティブラーニングを行う際には、学習時間が問題になるが、この論文では2つの方法を使って解決している。一つは、モデルをインクリメンタルに学習させるという手法。これにより、重みを一から学習せずに済むため、計算時間を減らすことができる。加えて、CNNを使った計算の速いモデルを使うことで学習時間をおさえている。このモデルで面白いのは、一般的によく使われるCRFでは計算量が多いため、予測にLSTMを使っている点。図にすると以下になる。

f:id:Hironsan:20190916102930p:plain
タグのデコーダ

アクティブラーニングでは、不確実さに基づく手法を使って文選択を行っている。より具体的に説明すると、モデルから出力された確率の対数を計算し、その和を文の長さで正規化した後、最も低い値の文を選択している。簡単に言うと、モデルが最も自身のなさそうな予測をした文を選択して、その文に関してはオラクル(人間)にラベル付けしてもらおうという戦略になっている。ランキングの手法としては、LC、MNLP、BALDの3つを使っている。これらの詳細は論文を参照。

実験結果は以下の通り。以下はOntoNotes 5.0の英語と中国語のデータセットに対してアクティブラーニングを使った結果を示している。この図を見ると、アクティブラーニングを使っていない"Best Deep Model"に対して、アクティブラーニングを使った場合は、おおよそ25%〜30%のデータ量で"Best Deep Model"に匹敵する性能を出していることが確認できる。

f:id:Hironsan:20190916104048p:plain
実験結果

現在では言語モデルを使うことで、スモールデータであっても良い性能が出ることはわかっているが、この論文の手法と組み合わせることで、さらに少ないデータ量でモデルを学習させることができるようになる可能性がある。その場合は、固有表現を学習させるモデルだけでなく、言語モデルの方にも軽さが求められるので、そのあたりに研究の余地があるかもしれない。