以下の論文を読みます。
まとめ
- 固有表現抽出タスク(正解ラベル付きのデータが正解ラベルなしのデータに対して限られていることが多い)で高精度を達成するには往々にして人間が設計したルールや外部辞書を要するが、それらの事前知識を用いることなく事前知識を用いたモデルに匹敵する/凌駕する 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 が見通しがよいということだとは思う。
ドメイン外の弱いモデルたちを統合して固有表現抽出を学習する論文を読んでいた(前の記事参照)のですが、いざアノテーションを統合したら最終的な固有表現抽出モデルをこちらの論文にしたがったアーキテクチャで学習するようなので、こちらの論文も読んでおきたいです。
どれどれ…あれ、この論文って Speech and Language Processing の 9.2.2 節の最後で言及されてたやつだよね? じゃあ、この論文のエッセンスはニューラル系列ラベリングモデルにCRF層を組み合わせたところにあるのかな?
うおおお2セリフで記事を終わらせないでください! とりあえず一通り読みますからね。…アブストラクトを読むと、この論文で導入された新しいアーキテクチャは2つとあります。
- bidirectional LSTMs and conditional random fields
- transition-based approach inspired by shift-reduce parsers
- 正解ラベル付きデータから学んだ文字ベースの単語分散表現
- 正解ラベルなしデータから学んだ単語分散表現
読んでみなきゃだけど、正解ラベル付きデータから文字ベースで学ぶってことは、「こんな文字の並びは人名っぽい」「こんな文字の並びは地名っぽい」というパターンを利用したいってことだよね。で、これだけで識別し切れればいいけど、「人名なのか地名なのか判別しにくい」って場合もきっとたくさんあるよね。そのときは文脈が必要になる。例えば、「宮崎社長は語った」なら宮崎はきっと人名だし、「宮崎に向けて出発した」ならきっと地名だよね。そのときは文章全体を考慮して、「どうも社長が語ったという話をしている」「どうもどこかに出発したという話をしている」という文脈特徴を拾って組み合わせて判断しないといけないよね。純粋に文脈をみる目的なのが後者の分散表現だと思うよ。固有表現モデルのヒントとしての文脈を抽出したいならカンニングしちゃだめだからラベルは剥がした方がよさそうだし、文字ベースで学んじゃ駄目ってことはなさそうだけど労多くして功少なしだったとか、文字ベースという制約が強くて文脈が効果的に学べないとかあるんじゃないのかな。
宮崎…日本三大名字っぽい県名、最後の刺客ですね。
私の話の何を聞いてたの!?
まあそれで、言語特有の知識や外部リソースを使用することなく、4言語(英語、オランダ語、ドイツ語、スペイン語)のデータで SOTA を達成した(但し英語だけは SOTA ではなく SOTA に匹敵する性能)とあります。イントロダクションに入ると、冒頭に、「概して正解ラベル付きデータが少ない」「固有表現になりうる言葉というのに制約が少ない」点で固有表現抽出はチャレンジングだとありますね。確かに、会社名や人名のファーストネームなんかは好きに付けられますものね。だから gazetteer や綿密な手作りルールなどの人間の知見で精度を上げることになってきますが、未知言語や未知ドメインでもまたモデルが必要となったときコストがかかりすぎます。…えっと、そもそもこの論文が達成したことは「限られた正解ラベル付きデータしかない状況で、人間が設計した特徴によるヘルプなしに、高精度な固有表現抽出を達成した」ということでいいんでしょうか?
イントロダクションの第2段落をみるとより正確には「少量の正解ラベル付きデータと大量の正解ラベルなしデータがある状況で、人間が設計した特徴によるヘルプなしに、高精度な固有表現抽出を達成した」かな。人間が入れ知恵しないというところにはこだわってるみたいだね。今回のモデルは以下の2つの知見を利用しようとしているみたいだよ。
- 固有表現は往々にして複数トークンからなるので、個々のトークンを判定するのではなく同時に全てのトークンを判定する必要がある。
- このことはこの論文以前から考慮されていたんじゃないかと思うけど…これを実現するために、「bi-LSTM + CRF モデル」と「Stack-LSTM によってチャンクを構築しラベリングするモデル」の2つのモデルを考案して比較したんだね。
- めちゃくちゃ紛らわしいけど、Stack-LSTM というのは stacked LSTM のことではないね。以下の論文が原論文で、3枚目の絵にあるように、先頭ポインタ付きで巻き戻しができるLSTMってことだね。[1505.08075] Transition-Based Dependency Parsing with Stack Long Short-Term Memory
- 各トークンが固有表現がどうかは字面(文字の並び方のパターン)にも文脈(そのトークンがコーパス内のどんなところに出現するか)にも依存する。
- これを実現するために2種類の単語分散表現を用いるんだね。
一般化すると、「正解ラベル付きデータが少量しかないとき、タスクを定性的に分割して、個々のタスクでは別のデータの助けも借りられるようにすればよい」という教訓にまとめることができるでしょうか。…でも、skip-gram って「単語が数値ベクトルではないのでどうにかして数値ベクトルにしなければならない」という向きのものですよね。自然言語処理外への応用は難しいでしょうか?
「一変量時系列の予測」とかだったら表現の学習とかなさそうだね。というか予測タスクだと「手元のデータの一部にしか正解ラベルがない」という状況がないしね。ただ、超高次元時系列なら逆に低次元の文脈ベクトルにするとかなくもない気もするんだけどな。でも正解ラベルがつかない状況っていうのがな…観測に欠損が多いとか? 時系列がすかすかになっちゃいそうだけど。もっとも、離散系列の学習は自然言語処理に限らないけどね。詳しくないけど、化学物質の構造とか、将棋の対局の状態推移とかも離散系列(として扱える)だよね。
…教訓の使い道は宿題ですかね。2節の LSTM-CRF モデルに移ると… 2.1 節は LSTM の説明なのですっ飛ばしますか。というか、前向きLSTMの特徴を 、後ろ向きLSTMの特徴を と表す流儀なんですね。なんというか表記がフリーダムですね。それで純粋に を特徴にして学習すると、品詞タグ付けのようなタスクならまだ上手くいくが、固有表現抽出のように正解ラベル系列への制約がきついときは上手くいかないのでCRF層を導入するんですよね(品詞タグ付けであってもCRF層を導入した方がよいとSLPで読んだ覚えはありますが)。そのCRF層というのは、入力 とそれに対応する何らかの出力 (各要素は正解ラベルのインデックス)があったときに、 を bi-LSTM に通した (ただし は正解ラベルの種類の数)を用いて、以下をスコアと定義すると。
推論時だったら有効な系列だけ考えてもいいと思うよ。でも、訓練時は駄目かな。だって、部長がいうように「bi-LSTM が示唆するラベル系列のうち、有効な系列であって、確率最大のもの」をモデルの判断として汲み取っちゃったら、「無効な系列に大きな確率を割り当てちゃってるよ! 考え直して!」って bi-LSTM に伝える術がないよね。無効な系列のスコアは握りつぶしちゃってるんだからさ。
あっ…確かに、出力に制約があるとき、そもそも制約を満たすものを出すようにしてくださいとモデルにお伝えしなければなりませんね。よかったときに褒めるだけでは不十分なんですね。モデルの育成は人間の育成のようにはいかないものですね。
知らないよ…。あと、このやり方だとラベリングのミスにも対応できるっぽいかな。訓練時は「正解ラベル系列に割り当てる確率」を最大化するように訓練するけど、もしラベリングが誤ったデータがあったらペナルティによってそのデータの影響は小さくなるしね。…と思ったんだけど、もしかして って学習対象なのかな。まあ学習対象だとしても無効な推移にペナルティすることは期待されるから同じ機能をもつと思うけど…。
2.3 節を読むと は学習対象パラメータっぽく感じますね。確かに、 が一律に有効な推移に 、無効な推移に を割り当てたものだとしたら、CRF層ってもはや層というよりちょっと特殊なソフトマックスじゃん、という気はしたんですよね。まあ も学習対象なのだろうと思っておきます。それで、実際には、bi-LSTM と CRF の間には全結合層を一層挟んだようですね。その方が性能がよかったと。2.4 節にはラベリング方法の話がありますが…IOBならぬIOBESエンコーディングを採用していたんですね? IOBエンコーディングはこうでした。I と B を区別しなければならない理由は、「O O I I O O O」となったとき、「 I I 」が2トークンからなる1つの固有表現なのか、1トークンからなる固有表現が2つ連続しているのか区別できないからですね。
IOBESエンコーディングはこうですね。どこからどこまでが固有表現かという情報をトークンごとのラベルに変換するなら IOB でじゅうぶんだけど…IOBES 式だと「I の次は I か E に絞り込める」か…。IOBES 式の方がラベルが細かく情報がリッチになっているけど、その分ラベルごとのデータ数は減るし、bi-LSTM(の後に噛ませる全結合層)の出力の次元を3から5にしないといけない。それに、B と S は「固有表現内であって先頭である」、I と E は「固有表現内であって先頭ではない」、という視点では同一視できるけどその情報も失われている。それでもCRF層でラベル推移を考慮できるような場合はちょっと細かくラベリングした方がいいんだろうか…って、「IOB から IOBES にしたことで決定的な改善は見込めなかった」のか…。
それでも導入したというからには僅かには改善したんだとは思いますが…。3節は LSTM-CRF じゃない方のモデルですね。Stack-LSTM による遷移ベースチャンキングモデルとでもいうのでしょうか。
遷移ベース依存構造解析(transition-based dependencyparsing)に似た方法だとあるね。Speech and Language Processing の15.4 節でやったよね。
ああ…依存構造解析の手法として遷移ベースとグラフベースと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 |
アクション | スタック | バッファ | 抽出された依存関係 |
---|---|---|---|
[ ] | [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 |
依存構造解析はさておき、固有表現抽出で「前から順に固有表現部分をもぎとっていきたい」というのは1つの素朴な考え方なんじゃないのかな。そのためにやることは、固有表現候補のみをスタックに入れていくってことになると思うし。
そうでしょうか…それで、4節は各単語の埋め込みについてですね。…文字レベルの埋め込みも単語レベルの埋め込みも学習対象のようですね。文字レベルの埋め込みは bi-LSTM です。単語レベルの埋め込みについては初期値に事前学習された単語分散表現を用いるようですね。この事前学習は正解ラベルがないデータでやればいいわけです。埋め込み方法は skip-n-gram によるとあります。4.3 節に Dropout training とありますが、これは、文字レベルの埋め込みと単語レベルの埋め込み(事前学習済み)の concat をそのまま用いて学習しようとすると文字レベルの埋め込みが機能しないということのようですね。なので concat したベクトルに対して Dropout するようです。…確かに、一方の埋め込みが最初から優れていたらそれを利用するように最適化されてしまってもう一方の埋め込みが育たなさそうですね。モデルの育成は人間の育成のように工夫がいるものですね。
もういいよ。
まあでも結局、LSTM-CRF も Stack-LSTM もよかったが LSTM-CRF の方がよりよかったんですよね。LSTM-CRF の勝因は何だったんでしょうか。
うーん… 5.3 節の最後の段落には、Stack-LSTM の方が文字レベルの特徴に依存しやすいってあるね。LSTM-CRF は bi-LSTM だからより文脈情報がリッチに取れるからではと考察されているけど…だとしたら、Stack-LSTM もバッファやスタックの特徴抽出を bi-LSTM で実装したらもっと高精度になるんじゃないかな? ただ、ポインタを移動して巻き戻しとかが気軽にできなくなっちゃうけどね。