論文読みメモ: Neural Architectures for Named Entity Recognition

以下の論文を読みます。

Guillaume Lample, Miguel Ballesteros, Sandeep Sub-ramanian, Kazuya Kawakami, and Chris Dyer. Neural architectures for named entity recognition. In Proceedings of the 2016 Conference of the North American Chapter of the Association for Computa-tional Linguistics: Human Language Technologies, 2016. Neural Architectures for Named Entity Recognition - ACL Anthology
※ 固有表現抽出とIOBエンコーディングについての雑な説明はこちら

まとめ

  • 固有表現抽出タスク(正解ラベル付きのデータが正解ラベルなしのデータに対して限られていることが多い)で高精度を達成するには往々にして人間が設計したルールや外部辞書を要するが、それらの事前知識を用いることなく事前知識を用いたモデルに匹敵する/凌駕する LSTM-CRF モデルを考案した。要点はおそらく以下である。
    • 各単語の埋め込みは、文字レベル bi-LSTM による埋め込みと単語レベルの埋め込みを concat したものを用いる。ここで、単語レベルの埋め込みは固有表現ラベルなしのデータで事前学習しておくことができる。
    • 各単語の埋め込みを bi-LSTM にかけて各単語に対するラベル(IOBESエンコーディングによる)を予測するが、無効なラベル系列が予測されることを防ぐために最後に CRF 層を追加する。
  • なお、この論文では上記の LSTM-CRF モデルとは別に、遷移ベース依存構造解析っぽい手法も提案しており、これも(言語によるが)事前知識を用いた既存手法の性能を上回っているが、LSTM-CRF が勝っている。
    • 遷移ベース依存構造解析っぽい手法は Stack-LSTM(stacked LSTM ではない)を用いて遷移ベース依存構造解析っぽいことをやる。
所感
  • 「正解ラベル付きデータが少量しかないとき、タスクを定性的に分割して、個々のタスクでは別のデータの助けも借りられるようにするとよい」というのと「CRF層で出力間の整合性を取るとよい」というのは可搬性がある知見のように思う。
  • 「人間の知識でヘルプしない」という制約は実用的には意味が薄いかもしれない。ただ、一つ前の記事のように人間の弱い知識が既に統合されたラベルを学ぶときはこれでいいのかもしれない。
  • LSTM-CRF が Stack-LSTM に勝っているのは、LSTM が双方向か一方向かという違いが効いていそうに思う。しかし、Stack-LSTM は双方向での実装はかなり高コストになりそうなのでそれも含めて LSTM-CRF が見通しがよいということだとは思う。
※ キャラクターは架空のものです。私の誤りは私に帰属します。お気付きの点がありましたらコメントでご指摘ください。
f:id:cookie-box:20200531131544p:plain:w60

ドメイン外の弱いモデルたちを統合して固有表現抽出を学習する論文を読んでいた(前の記事参照)のですが、いざアノテーションを統合したら最終的な固有表現抽出モデルをこちらの論文にしたがったアーキテクチャで学習するようなので、こちらの論文も読んでおきたいです。

f:id:cookie-box:20200531131606p:plain:w60

どれどれ…あれ、この論文って Speech and Language Processing の 9.2.2 節の最後で言及されてたやつだよね? じゃあ、この論文のエッセンスはニューラル系列ラベリングモデルにCRF層を組み合わせたところにあるのかな?

f:id:cookie-box:20200531131544p:plain:w60

うおおお2セリフで記事を終わらせないでください! とりあえず一通り読みますからね。…アブストラクトを読むと、この論文で導入された新しいアーキテクチャは2つとあります。

  • bidirectional LSTMs and conditional random fields
  • transition-based approach inspired by shift-reduce parsers
前者はCRF層付きモデルのことのようですが、この論文で新規に提案されたモデルはCRF層付きモデルだけではなかったんですね? ただ、イントロダクションの最後部を読むと、後者のモデルも既存手法より優れていたが、より優れていたのは前者だったということのようですね…。それで、この論文の手法では2種類の単語分散表現を併用するようですね。これらを concat して bi-LSTM に流すんでしょうか?
  • 正解ラベル付きデータから学んだ文字ベースの単語分散表現
  • 正解ラベルなしデータから学んだ単語分散表現
後者は単語レベルの埋め込みを skip-gram か何かで学ぶといったようなものなんでしょうか。なぜこのような2種類の分散表現が必要なんでしょうか? 正解ラベルなしデータではあえて文字ベースでは学ばないというのは理由があるんでしょうか?

f:id:cookie-box:20200531131606p:plain:w60

読んでみなきゃだけど、正解ラベル付きデータから文字ベースで学ぶってことは、「こんな文字の並びは人名っぽい」「こんな文字の並びは地名っぽい」というパターンを利用したいってことだよね。で、これだけで識別し切れればいいけど、「人名なのか地名なのか判別しにくい」って場合もきっとたくさんあるよね。そのときは文脈が必要になる。例えば、「宮崎社長は語った」なら宮崎はきっと人名だし、「宮崎に向けて出発した」ならきっと地名だよね。そのときは文章全体を考慮して、「どうも社長が語ったという話をしている」「どうもどこかに出発したという話をしている」という文脈特徴を拾って組み合わせて判断しないといけないよね。純粋に文脈をみる目的なのが後者の分散表現だと思うよ。固有表現モデルのヒントとしての文脈を抽出したいならカンニングしちゃだめだからラベルは剥がした方がよさそうだし、文字ベースで学んじゃ駄目ってことはなさそうだけど労多くして功少なしだったとか、文字ベースという制約が強くて文脈が効果的に学べないとかあるんじゃないのかな。

f:id:cookie-box:20200531131544p:plain:w60

宮崎…日本三大名字っぽい県名、最後の刺客ですね。

f:id:cookie-box:20200531131606p:plain:w60

私の話の何を聞いてたの!?

f:id:cookie-box:20200531131544p:plain:w60

まあそれで、言語特有の知識や外部リソースを使用することなく、4言語(英語、オランダ語、ドイツ語、スペイン語)のデータで SOTA を達成した(但し英語だけは SOTA ではなく SOTA に匹敵する性能)とあります。イントロダクションに入ると、冒頭に、「概して正解ラベル付きデータが少ない」「固有表現になりうる言葉というのに制約が少ない」点で固有表現抽出はチャレンジングだとありますね。確かに、会社名や人名のファーストネームなんかは好きに付けられますものね。だから gazetteer や綿密な手作りルールなどの人間の知見で精度を上げることになってきますが、未知言語や未知ドメインでもまたモデルが必要となったときコストがかかりすぎます。…えっと、そもそもこの論文が達成したことは「限られた正解ラベル付きデータしかない状況で、人間が設計した特徴によるヘルプなしに、高精度な固有表現抽出を達成した」ということでいいんでしょうか?

f:id:cookie-box:20200531131606p:plain:w60

イントロダクションの第2段落をみるとより正確には「少量の正解ラベル付きデータと大量の正解ラベルなしデータがある状況で、人間が設計した特徴によるヘルプなしに、高精度な固有表現抽出を達成した」かな。人間が入れ知恵しないというところにはこだわってるみたいだね。今回のモデルは以下の2つの知見を利用しようとしているみたいだよ。

  • 固有表現は往々にして複数トークンからなるので、個々のトークンを判定するのではなく同時に全てのトークンを判定する必要がある。
    • このことはこの論文以前から考慮されていたんじゃないかと思うけど…これを実現するために、「bi-LSTM + CRF モデル」と「Stack-LSTM によってチャンクを構築しラベリングするモデル」の2つのモデルを考案して比較したんだね。
    • トークンが固有表現がどうかは字面(文字の並び方のパターン)にも文脈(そのトークンがコーパス内のどんなところに出現するか)にも依存する。
      • これを実現するために2種類の単語分散表現を用いるんだね。
もしかしてこの論文には「固有表現抽出には字面の特徴も文脈の特徴も要するが、文脈を表現するための単語分散表現を学ぶだけなら正解ラベル付きデータは要らないから正解ラベルなしデータでどんどん学習すればいい」という含みもあるのかな? 「単語分散表現については事前学習されたものを用いる」というのは常套手段っぽい気もするけど、手元にラベリングされているデータとされていないデータが混在していて文脈だけは全体から学べるよ、っていうのはちょっと切り口が違う気もするし。

f:id:cookie-box:20200531131544p:plain:w60

一般化すると、「正解ラベル付きデータが少量しかないとき、タスクを定性的に分割して、個々のタスクでは別のデータの助けも借りられるようにすればよい」という教訓にまとめることができるでしょうか。…でも、skip-gram って「単語が数値ベクトルではないのでどうにかして数値ベクトルにしなければならない」という向きのものですよね。自然言語処理外への応用は難しいでしょうか?

f:id:cookie-box:20200531131606p:plain:w60

「一変量時系列の予測」とかだったら表現の学習とかなさそうだね。というか予測タスクだと「手元のデータの一部にしか正解ラベルがない」という状況がないしね。ただ、超高次元時系列なら逆に低次元の文脈ベクトルにするとかなくもない気もするんだけどな。でも正解ラベルがつかない状況っていうのがな…観測に欠損が多いとか? 時系列がすかすかになっちゃいそうだけど。もっとも、離散系列の学習は自然言語処理に限らないけどね。詳しくないけど、化学物質の構造とか、将棋の対局の状態推移とかも離散系列(として扱える)だよね。

f:id:cookie-box:20200531131544p:plain:w60

…教訓の使い道は宿題ですかね。2節の LSTM-CRF モデルに移ると… 2.1 節は LSTM の説明なのですっ飛ばしますか。というか、前向きLSTMの特徴を \overrightarrow{h_t}、後ろ向きLSTMの特徴を \overleftarrow{h_t} と表す流儀なんですね。なんというか表記がフリーダムですね。それで純粋に h_t = \overrightarrow{h_t} \oplus \overleftarrow{h_t} を特徴にして学習すると、品詞タグ付けのようなタスクならまだ上手くいくが、固有表現抽出のように正解ラベル系列への制約がきついときは上手くいかないのでCRF層を導入するんですよね(品詞タグ付けであってもCRF層を導入した方がよいとSLPで読んだ覚えはありますが)。そのCRF層というのは、入力 x = (x_1, x_2, \cdots, x_n) とそれに対応する何らかの出力 y = (y_1, y_2, \cdots, y_n) (各要素は正解ラベルのインデックス)があったときに、x を bi-LSTM に通した P \in \mathbb{R}^{n \times k}(ただし k は正解ラベルの種類の数)を用いて、以下をスコアと定義すると。

 \displaystyle  s(x, y) = \sum_{i=0}^n A_{y_i, y_{i+1}} + \sum_{i=1}^n P_{i, y_i}
A_{i, j} はラベル i からラベル j への推移スコアとでもいうべきものですね。この表式から明らかなように、今回は隣接する2つのタグの間の整合性しかみていません。しかしIOBエンコーディングの整合性をみるのはそれでじゅうぶんですよね。それで、 s(x,y)x に割り当てうる全てのラベル系列 y \in Y_x 上でソフトマックスしたものをモデルの予測とするようです。…この Y_x には無効なラベル系列も含むんですね? であれば、A_{i, j}i \to j が無効な推移だったとき A_{i,j} = -100(適当)のような大きな負のペナルティを課すということなんでしょうか。…有効な場合は A_{i,j} = 1、無効な場合は A_{i,j} = 0 なり A_{i, k} = -1 なりその都度掛け算して、スコアが正になった有効な系列上でソフトマックスするとかの方がすっきりしませんか? 無効なラベル系列も含めてソフトマックスするなんて無駄のように思えますが。

f:id:cookie-box:20200531131606p:plain:w60

推論時だったら有効な系列だけ考えてもいいと思うよ。でも、訓練時は駄目かな。だって、部長がいうように「bi-LSTM が示唆するラベル系列のうち、有効な系列であって、確率最大のもの」をモデルの判断として汲み取っちゃったら、「無効な系列に大きな確率を割り当てちゃってるよ! 考え直して!」って bi-LSTM に伝える術がないよね。無効な系列のスコアは握りつぶしちゃってるんだからさ。

f:id:cookie-box:20200531131544p:plain:w60

あっ…確かに、出力に制約があるとき、そもそも制約を満たすものを出すようにしてくださいとモデルにお伝えしなければなりませんね。よかったときに褒めるだけでは不十分なんですね。モデルの育成は人間の育成のようにはいかないものですね。

f:id:cookie-box:20200531131606p:plain:w60

知らないよ…。あと、このやり方だとラベリングのミスにも対応できるっぽいかな。訓練時は「正解ラベル系列に割り当てる確率」を最大化するように訓練するけど、もしラベリングが誤ったデータがあったらペナルティによってそのデータの影響は小さくなるしね。…と思ったんだけど、もしかして A って学習対象なのかな。まあ学習対象だとしても無効な推移にペナルティすることは期待されるから同じ機能をもつと思うけど…。

f:id:cookie-box:20200531131544p:plain:w60

2.3 節を読むと A は学習対象パラメータっぽく感じますね。確かに、A が一律に有効な推移に 0、無効な推移に -100 を割り当てたものだとしたら、CRF層ってもはや層というよりちょっと特殊なソフトマックスじゃん、という気はしたんですよね。まあ A も学習対象なのだろうと思っておきます。それで、実際には、bi-LSTM と CRF の間には全結合層を一層挟んだようですね。その方が性能がよかったと。2.4 節にはラベリング方法の話がありますが…IOBならぬIOBESエンコーディングを採用していたんですね? IOBエンコーディングはこうでした。I と B を区別しなければならない理由は、「O O I I O O O」となったとき、「 I I 」が2トークンからなる1つの固有表現なのか、1トークンからなる固有表現が2つ連続しているのか区別できないからですね。

  • I ― このトークンは固有表現スパンの内側である(但し先頭ではない)。
  • O ― このトークンは固有表現スパンの外側である。
  • B ― このトークンは固有表現スパンの先頭である。
IOBESエンコーディングはこうですね。
  • I ― このトークンは固有表現スパンの内側である(但し先頭でも末尾でもない)。
  • O ― このトークンは固有表現スパンの外側である。
  • B ― このトークンは2トークン以上からなる固有表現スパンの先頭である。
  • E ― このトークンは2トークン以上からなる固有表現スパンの末尾である。
  • S ― このトークンは1トークンからなる固有表現である。

f:id:cookie-box:20200531131606p:plain:w60

どこからどこまでが固有表現かという情報をトークンごとのラベルに変換するなら IOB でじゅうぶんだけど…IOBES 式だと「I の次は I か E に絞り込める」か…。IOBES 式の方がラベルが細かく情報がリッチになっているけど、その分ラベルごとのデータ数は減るし、bi-LSTM(の後に噛ませる全結合層)の出力の次元を3から5にしないといけない。それに、B と S は「固有表現内であって先頭である」、I と E は「固有表現内であって先頭ではない」、という視点では同一視できるけどその情報も失われている。それでもCRF層でラベル推移を考慮できるような場合はちょっと細かくラベリングした方がいいんだろうか…って、「IOB から IOBES にしたことで決定的な改善は見込めなかった」のか…。

f:id:cookie-box:20200531131544p:plain:w60

それでも導入したというからには僅かには改善したんだとは思いますが…。3節は LSTM-CRF じゃない方のモデルですね。Stack-LSTM による遷移ベースチャンキングモデルとでもいうのでしょうか。

f:id:cookie-box:20200531131606p:plain:w60

遷移ベース依存構造解析(transition-based dependencyparsing)に似た方法だとあるね。Speech and Language Processing の15.4 節でやったよね。

f:id:cookie-box:20200531131544p:plain:w60

ああ…依存構造解析の手法として遷移ベースとグラフベースと2つ出てきたうちの前者でしたね。15.4 節でやった例では、Book me the morning flight. という文章の構造を以下の手順でパースしていました(以下の表は Figure 15.7 の転記です)。まず文章全体をバッファに積んで、左端からスタックに移動させながら、スタックの右端2つが矢印で結べるなら結んでまとめてしまう感じですよね? 矢印が交差しない構造ならこれで解析できます。状況に応じてアクションというお告げを出してくれる神託者さんを用意しないといけないわけですが。

アクションスタックバッファ抽出された依存関係
[ ][book, me, the, morning, flight]
SHIFT[book][me, the, morning, flight]
SHIFT[book, me][the, morning, flight]
RIGHTARC[book][the, morning, flight]book → me
SHIFT[book, the][morning, flight]
SHIFT[book, the, morning][flight]
SHIFT[book, the, morning, flight][ ]
LEFTARC[book, the, flight][ ]morning ← flight
LEFTARC[book, flight][ ]the ← flight
RIGHTARC[book][ ]book → flight
RIGHTARC[ ][ ]root → book
今回の固有表現抽出のための遷移ベースチャンキングモデルは、論文 264 ページの FIgure 3 を転記するとこうですね。依存構造解析と似ていますが、OUT といってスタックに移動させずに捨ててしまうというような操作があるようです。固有表現の一部だと考えられる単語のみをスタックに溜めて、まだ溜め続けるべきか/ここまでで固有表現になっているかを判定するようですね。
アクションスタックバッファ抽出された依存関係
[ ][Mark, Watney, visited, Mars]
SHIFT[Mark][Watney, visited, Mars]
SHIFT[Mark, Watney][visited, Mars]
REDUCE(PER)[ ][visited, Mars](Mark, Watney)-PER
OUT[ ][Mars]
SHIFT[Mars][ ]
REDUCE(LOC)[ ][ ](Mars)-LOC
これを実現するモデルですが、[1505.08075] Transition-Based Dependency Parsing with Stack Long Short-Term Memory の4枚目の図を参考にするなら、「スタック」「バッファ」「アクションの履歴」がそれぞれ Stack-LSTM の対象になるんですかね。それら3つの特徴を concat して全結合層にかけて次のアクションを決めるはずです…と思いましたが、上の表では省いた Output(Figure 3 参照)も Stack-LSTM 対象のようですね。…うーん、遷移ベース手法って、何をやっているかはわかりますが、なぜそうしなければならなかったのかが腑に落ちづらいです。

f:id:cookie-box:20200531131606p:plain:w60

依存構造解析はさておき、固有表現抽出で「前から順に固有表現部分をもぎとっていきたい」というのは1つの素朴な考え方なんじゃないのかな。そのためにやることは、固有表現候補のみをスタックに入れていくってことになると思うし。

f:id:cookie-box:20200531131544p:plain:w60

そうでしょうか…それで、4節は各単語の埋め込みについてですね。…文字レベルの埋め込みも単語レベルの埋め込みも学習対象のようですね。文字レベルの埋め込みは bi-LSTM です。単語レベルの埋め込みについては初期値に事前学習された単語分散表現を用いるようですね。この事前学習は正解ラベルがないデータでやればいいわけです。埋め込み方法は skip-n-gram によるとあります。4.3 節に Dropout training とありますが、これは、文字レベルの埋め込みと単語レベルの埋め込み(事前学習済み)の concat をそのまま用いて学習しようとすると文字レベルの埋め込みが機能しないということのようですね。なので concat したベクトルに対して Dropout するようです。…確かに、一方の埋め込みが最初から優れていたらそれを利用するように最適化されてしまってもう一方の埋め込みが育たなさそうですね。モデルの育成は人間の育成のように工夫がいるものですね。

f:id:cookie-box:20200531131606p:plain:w60

もういいよ。

f:id:cookie-box:20200531131544p:plain:w60

まあでも結局、LSTM-CRF も Stack-LSTM もよかったが LSTM-CRF の方がよりよかったんですよね。LSTM-CRF の勝因は何だったんでしょうか。

f:id:cookie-box:20200531131606p:plain:w60

うーん… 5.3 節の最後の段落には、Stack-LSTM の方が文字レベルの特徴に依存しやすいってあるね。LSTM-CRF は bi-LSTM だからより文脈情報がリッチに取れるからではと考察されているけど…だとしたら、Stack-LSTM もバッファやスタックの特徴抽出を bi-LSTM で実装したらもっと高精度になるんじゃないかな? ただ、ポインタを移動して巻き戻しとかが気軽にできなくなっちゃうけどね。

5節以降は省略しておわり